diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000000..f11ab12e27 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,162 @@ +/* +👋 Hi! This file was autogenerated by tslint-to-eslint-config. +https://github.com/typescript-eslint/tslint-to-eslint-config + +It represents the closest reasonable ESLint configuration to this +project's original TSLint configuration. + +We recommend eventually switching this configuration to extend from +the recommended rulesets in typescript-eslint. +https://github.com/typescript-eslint/tslint-to-eslint-config/blob/master/docs/FAQs.md + +Happy linting! 💖 +*/ +module.exports = { + "env": { + "browser": true, + "es6": true, + "mocha": true, + "node": true + }, + "extends": [ + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "tsconfig.json", + "sourceType": "module" + }, + "plugins": [ + "eslint-plugin-import", + "eslint-plugin-prefer-arrow", + "eslint-plugin-jsdoc", + "@typescript-eslint" + ], + "rules": { + "prefer-rest-params": "off", + "prefer-spread": "off", + "@typescript-eslint/no-unsafe-member-access": "off", + "@typescript-eslint/no-unsafe-assignment": "off", + "@typescript-eslint/no-unsafe-member-access": "off", + "@typescript-eslint/no-unsafe-call": "off", + "@typescript-eslint/no-unsafe-return": "off", + "@typescript-eslint/no-floating-promises": "off", + "@typescript-eslint/restrict-template-expressions": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/require-await": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/unbound-method": "off", + "@typescript-eslint/no-this-alias": "off", + "@typescript-eslint/prefer-regexp-exec": "off", + "@typescript-eslint/no-misused-promises": "off", + "@typescript-eslint/restrict-plus-operands": "off", + // ---- + "@typescript-eslint/adjacent-overload-signatures": "error", + "@typescript-eslint/array-type": [ + "error", + { + "default": "array" + } + ], + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/consistent-type-assertions": "error", + "@typescript-eslint/dot-notation": "error", + "@typescript-eslint/explicit-member-accessibility": [ + "error", + { + "accessibility": "no-public" + } + ], + "@typescript-eslint/naming-convention": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-empty-interface": "error", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-parameter-properties": "off", + "@typescript-eslint/no-unused-expressions": "error", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/no-var-requires": "error", + "@typescript-eslint/prefer-for-of": "error", + "@typescript-eslint/prefer-function-type": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/quotes": [ + "error", + "single" + ], + "@typescript-eslint/triple-slash-reference": [ + "error", + { + "path": "always", + "types": "prefer-import", + "lib": "always" + } + ], + "@typescript-eslint/unified-signatures": "error", + "arrow-parens": [ + "off", + "always" + ], + "comma-dangle": "error", + "complexity": "off", + "constructor-super": "error", + "eqeqeq": [ + "error", + "smart" + ], + "guard-for-in": "error", + "id-blacklist": "off", + "id-match": "off", + "import/order": "off", + "jsdoc/check-alignment": "error", + "jsdoc/check-indentation": "error", + "jsdoc/newline-after-description": "error", + "max-classes-per-file": "off", + "max-len": "off", + "new-parens": "error", + "no-bitwise": "error", + "no-caller": "error", + "no-cond-assign": "error", + "no-console": "error", + "no-debugger": "error", + "no-empty": "off", + "no-eval": "error", + "no-fallthrough": "off", + "no-invalid-this": "off", + "no-new-wrappers": "error", + "no-shadow": [ + "off", + { + "hoist": "all" + } + ], + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-undef-init": "error", + "no-underscore-dangle": "off", + "no-unsafe-finally": "error", + "no-unused-labels": "error", + "no-var": "error", + "object-shorthand": "error", + "one-var": [ + "error", + "never" + ], + "prefer-arrow/prefer-arrow-functions": "off", + "prefer-const": "error", + "radix": "error", + "space-before-function-paren": "error", + "spaced-comment": [ + "error", + "always", + { + "markers": [ + "/" + ] + } + ], + "use-isnan": "error", + "valid-typeof": "off" + } +}; diff --git a/.github/issue_template.md b/.github/issue_template.md index 8cc783c7df..0376c2765a 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -26,4 +26,4 @@ Tell us about the applicable parts of your setup. **React Native Version**: -**Module Loader**: \ No newline at end of file +**Module Loader**: diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 72fda23bd8..1b770b7089 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x, 13.x] + node-version: [12.x, 14.x] steps: - uses: actions/checkout@v2 diff --git a/.gitignore b/.gitignore index 6309fa8f09..04761aa03e 100644 --- a/.gitignore +++ b/.gitignore @@ -40,13 +40,4 @@ dist/ .mocha-puppeteer # TypeScript compiled files -packages/adapter-commons/lib -packages/adapter-tests/lib -packages/authentication/lib -packages/authentication-local/lib -packages/authentication-client/lib -packages/authentication-oauth/lib -packages/configuration/lib -packages/commons/lib -packages/tests/lib -packages/transport-commons/lib +packages/**/lib diff --git a/.mocharc.json b/.mocharc.json index e1a11e4b7b..cf146c72d6 100644 --- a/.mocharc.json +++ b/.mocharc.json @@ -1,5 +1,6 @@ { "timeout": 20000, + "require": [ "ts-node/register", "source-map-support/register" ], "reporter": "Dot", "exit": true -} \ No newline at end of file +} diff --git a/.mocharc.ts.json b/.mocharc.ts.json deleted file mode 100644 index cf146c72d6..0000000000 --- a/.mocharc.ts.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "timeout": 20000, - "require": [ "ts-node/register", "source-map-support/register" ], - "reporter": "Dot", - "exit": true -} diff --git a/.nycrc b/.nycrc index a13ed2d88a..c7f6bc744b 100644 --- a/.nycrc +++ b/.nycrc @@ -15,7 +15,9 @@ "**/test/*", "**/dist/*", "**/*.dist.js", - "**/templates/*" + "**/templates/*", + "**/tests/*", + "**/adapter-tests/*" ], "print": "detail", "reporter": [ diff --git a/changelog.md b/changelog.md index c9bd32de3e..384d57be4c 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,49 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + +### Bug Fixes + +* **authentication-oauth:** Updated typings for projects with strictNullChecks ([#1941](https://github.com/feathersjs/feathers/issues/1941)) ([be91206](https://github.com/feathersjs/feathers/commit/be91206e3dba1e65a81412b7aa636bece3ab4aa2)) +* **errors:** Format package.json with spaces ([cbd31c1](https://github.com/feathersjs/feathers/commit/cbd31c10c2c574de63d6ca5e55dbfb73a5fdd758)) + + +### chore + +* **configuration:** Remove environment variable substitution ([#1942](https://github.com/feathersjs/feathers/issues/1942)) ([caaa21f](https://github.com/feathersjs/feathers/commit/caaa21ffdc6a8dcac82fb403c91d9d4b781a6c0a)) +* **package:** Remove @feathersjs/primus packages from core ([#1919](https://github.com/feathersjs/feathers/issues/1919)) ([d20b7d5](https://github.com/feathersjs/feathers/commit/d20b7d5a70f4d3306e294696156e8aa0337c35e9)), closes [#1899](https://github.com/feathersjs/feathers/issues/1899) + + +### Features + +* **core:** Migrate @feathersjs/feathers to TypeScript ([#1963](https://github.com/feathersjs/feathers/issues/1963)) ([7812529](https://github.com/feathersjs/feathers/commit/7812529ff0f1008e21211f1d01efbc49795dbe55)) +* **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) +* **transport-commons:** Remove legacy message format and unnecessary client timeouts ([#1939](https://github.com/feathersjs/feathers/issues/1939)) ([5538881](https://github.com/feathersjs/feathers/commit/5538881a08bc130de42c5984055729d8336f8615)) + + +### BREAKING CHANGES + +* **configuration:** Falls back to node-config instead of adding additional +functionality like path replacements and automatic environment variable insertion. +* **transport-commons:** Removes the old message format and client service timeout +* **package:** Remove primus packages to be moved into the ecosystem. + + + +## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) + + +### Bug Fixes + +* **authentication-client:** Allow reAuthentication using specific strategy ([#2140](https://github.com/feathersjs/feathers/issues/2140)) ([2a2bbf7](https://github.com/feathersjs/feathers/commit/2a2bbf7f8ee6d32b9fac8afab3421286b06e6443)) +* **socketio-client:** Throw an error and show a warning if someone tries to use socket.io-client v3 ([#2135](https://github.com/feathersjs/feathers/issues/2135)) ([cc3521c](https://github.com/feathersjs/feathers/commit/cc3521c935a1cbd690e29b7057998e3898f282db)) +* **typescript:** Fix `data` property definition in @feathersjs/errors ([#2018](https://github.com/feathersjs/feathers/issues/2018)) ([ef1398c](https://github.com/feathersjs/feathers/commit/ef1398cd5b19efa50929e8c9511ca5684a18997f)) + + + + + ## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) @@ -34,8 +77,6 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) -### Bug Fixes - * **authentication-client:** Fix storage type so it works with all supported interfaces ([#2041](https://github.com/feathersjs/feathers/issues/2041)) ([6ee0e78](https://github.com/feathersjs/feathers/commit/6ee0e78d55cf1214f61458f386b94c350eec32af)) diff --git a/lerna.json b/lerna.json index 25f0764bff..86f153b068 100644 --- a/lerna.json +++ b/lerna.json @@ -3,13 +3,16 @@ "packages": [ "packages/*" ], - "version": "4.5.11", + "version": "5.0.0-pre.1", "command": { "bootstrap": { "hoist": true }, "publish": { - "allowBranch": "crow", + "allowBranch": [ + "crow", + "dove" + ], "message": "chore(release): publish %s", "conventionalCommits": true, "createRelease": "github" diff --git a/package-lock.json b/package-lock.json index 0dd5af13cd..1304fa3bdf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,82 +4,161 @@ "lockfileVersion": 1, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "requires": { "@babel/highlight": "^7.10.4" } }, + "@babel/compat-data": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", + "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==" + }, "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dev": true, + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", + "@babel/generator": "^7.12.10", "@babel/helper-module-transforms": "^7.12.1", "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", + "@babel/parser": "^7.12.10", "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", "json5": "^2.1.2", "lodash": "^4.17.19", - "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "requires": { - "ms": "2.1.2" + "minimist": "^1.2.5" } }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, "@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", - "dev": true, + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", "requires": { - "@babel/types": "^7.12.5", + "@babel/types": "^7.12.11", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, - "@babel/helper-function-name": { + "@babel/helper-annotate-as-pure": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", + "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", + "@babel/helper-explode-assignable-expression": "^7.10.4", "@babel/types": "^7.10.4" } }, + "@babel/helper-compilation-targets": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", + "requires": { + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", + "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "requires": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-hoist-variables": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", "requires": { "@babel/types": "^7.10.4" } @@ -88,7 +167,6 @@ "version": "7.12.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", - "dev": true, "requires": { "@babel/types": "^7.12.7" } @@ -97,7 +175,6 @@ "version": "7.12.5", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", - "dev": true, "requires": { "@babel/types": "^7.12.5" } @@ -106,7 +183,6 @@ "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.12.1", "@babel/helper-replace-supers": "^7.12.1", @@ -120,55 +196,88 @@ } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz", - "integrity": "sha512-I5xc9oSJ2h59OwyUqjv95HRyzxj53DAubUERgQMrpcCEYQyToeHA+NEcUEsVWB4j53RDeskeBJ0SgRAYHDBckw==", - "dev": true, + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", "requires": { - "@babel/types": "^7.12.7" + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" } }, "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", - "dev": true, + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" } }, "@babel/helper-simple-access": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", "requires": { "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.11" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/helper-validator-option": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", + "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==" + }, + "@babel/helper-wrap-function": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } }, "@babel/helpers": { "version": "7.12.5", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", - "dev": true, "requires": { "@babel/template": "^7.10.4", "@babel/traverse": "^7.12.5", @@ -179,1567 +288,6695 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } } }, "@babel/parser": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.7.tgz", - "integrity": "sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg==", - "dev": true + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==" }, - "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" } }, - "@babel/traverse": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.9.tgz", - "integrity": "sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw==", - "dev": true, + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/types": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz", - "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==", - "dev": true, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, - "@evocateur/libnpmaccess": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz", - "integrity": "sha512-KSCAHwNWro0CF2ukxufCitT9K5LjL/KuMmNzSu8wuwN2rjyKHD8+cmOsiybK+W5hdnwc5M1SmRlVCaMHQo+3rg==", - "dev": true, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "npm-package-arg": "^6.1.0" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - } + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, - "@evocateur/libnpmpublish": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@evocateur/libnpmpublish/-/libnpmpublish-1.2.2.tgz", - "integrity": "sha512-MJrrk9ct1FeY9zRlyeoyMieBjGDG9ihyyD9/Ft6MMrTxql9NyoEx2hw9casTIP4CdqEVu+3nQ2nXxoJ8RCXyFg==", - "dev": true, + "@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "lodash.clonedeep": "^4.5.0", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "semver": "^5.5.1", - "ssri": "^6.0.1" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" } }, - "@evocateur/npm-registry-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@evocateur/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz", - "integrity": "sha512-k1WGfKRQyhJpIr+P17O5vLIo2ko1PFLKwoetatdduUSt/aQ4J2sJrJwwatdI5Z3SiYk/mRH9S3JpdmMFd/IK4g==", - "dev": true, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.1.2" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, - "@evocateur/pacote": { - "version": "9.6.5", - "resolved": "https://registry.npmjs.org/@evocateur/pacote/-/pacote-9.6.5.tgz", - "integrity": "sha512-EI552lf0aG2nOV8NnZpTxNo2PcXKPmDbF9K8eCBFQdIZwHNGN/mi815fxtmUMa2wTa1yndotICIDt/V0vpEx2w==", - "dev": true, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "bluebird": "^3.5.3", - "cacache": "^12.0.3", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.5.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.4.4", - "npm-pick-manifest": "^3.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.3", - "safe-buffer": "^5.2.0", - "semver": "^5.7.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", + "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } }, - "@lerna/add": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.21.0.tgz", - "integrity": "sha512-vhUXXF6SpufBE1EkNEXwz1VLW03f177G9uMOFMQkp6OJ30/PWg4Ekifuz9/3YfgB2/GH8Tu4Lk3O51P2Hskg/A==", - "dev": true, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", "requires": { - "@evocateur/pacote": "^9.6.3", - "@lerna/bootstrap": "3.21.0", - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "npm-package-arg": "^6.1.0", - "p-map": "^2.1.0", - "semver": "^6.2.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, - "@lerna/bootstrap": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.21.0.tgz", - "integrity": "sha512-mtNHlXpmvJn6JTu0KcuTTPl2jLsDNud0QacV/h++qsaKbhAaJr/FElNZ5s7MwZFUM3XaDmvWzHKaszeBMHIbBw==", - "dev": true, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", + "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/has-npm-version": "3.16.5", - "@lerna/npm-install": "3.16.5", - "@lerna/package-graph": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.16.5", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/symlink-binary": "3.17.0", - "@lerna/symlink-dependencies": "3.17.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "get-port": "^4.2.0", - "multimatch": "^3.0.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0", - "p-waterfall": "^1.0.0", - "read-package-tree": "^5.1.6", - "semver": "^6.2.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, - "@lerna/changed": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.21.0.tgz", - "integrity": "sha512-hzqoyf8MSHVjZp0gfJ7G8jaz+++mgXYiNs9iViQGA8JlN/dnWLI5sWDptEH3/B30Izo+fdVz0S0s7ydVE3pWIw==", - "dev": true, + "@babel/plugin-proposal-private-methods": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", "requires": { - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/listable": "3.18.5", - "@lerna/output": "3.13.0" + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/check-working-tree": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz", - "integrity": "sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ==", - "dev": true, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", "requires": { - "@lerna/collect-uncommitted": "3.16.5", - "@lerna/describe-ref": "3.16.5", - "@lerna/validation-error": "3.13.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/child-process": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.16.5.tgz", - "integrity": "sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg==", - "dev": true, + "@babel/plugin-syntax-async-generators": { + "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==", "requires": { - "chalk": "^2.3.1", - "execa": "^1.0.0", - "strong-log-transformer": "^2.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@lerna/clean": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.21.0.tgz", - "integrity": "sha512-b/L9l+MDgE/7oGbrav6rG8RTQvRiZLO1zTcG17zgJAAuhlsPxJExMlh2DFwJEVi2les70vMhHfST3Ue1IMMjpg==", - "dev": true, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.16.5", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0", - "p-waterfall": "^1.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/cli": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.18.5.tgz", - "integrity": "sha512-erkbxkj9jfc89vVs/jBLY/fM0I80oLmJkFUV3Q3wk9J3miYhP14zgVEBsPZY68IZlEjT6T3Xlq2xO1AVaatHsA==", - "dev": true, + "@babel/plugin-syntax-dynamic-import": { + "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==", "requires": { - "@lerna/global-options": "3.13.0", - "dedent": "^0.7.0", - "npmlog": "^4.1.2", - "yargs": "^14.2.2" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@lerna/collect-uncommitted": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz", - "integrity": "sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg==", - "dev": true, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "requires": { - "@lerna/child-process": "3.16.5", - "chalk": "^2.3.1", - "figgy-pudding": "^3.5.1", - "npmlog": "^4.1.2" + "@babel/helper-plugin-utils": "^7.8.3" } }, - "@lerna/collect-updates": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.20.0.tgz", - "integrity": "sha512-qBTVT5g4fupVhBFuY4nI/3FSJtQVcDh7/gEPOpRxoXB/yCSnT38MFHXWl+y4einLciCjt/+0x6/4AG80fjay2Q==", - "dev": true, + "@babel/plugin-syntax-json-strings": { + "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==", "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/describe-ref": "3.16.5", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "slash": "^2.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@lerna/command": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.21.0.tgz", - "integrity": "sha512-T2bu6R8R3KkH5YoCKdutKv123iUgUbW8efVjdGCDnCMthAQzoentOJfDeodBwn0P2OqCl3ohsiNVtSn9h78fyQ==", - "dev": true, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/package-graph": "3.18.5", - "@lerna/project": "3.21.0", - "@lerna/validation-error": "3.13.0", - "@lerna/write-log-file": "3.13.0", - "clone-deep": "^4.0.1", - "dedent": "^0.7.0", - "execa": "^1.0.0", - "is-ci": "^2.0.0", - "npmlog": "^4.1.2" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/conventional-commits": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.22.0.tgz", - "integrity": "sha512-z4ZZk1e8Mhz7+IS8NxHr64wyklHctCJyWpJKEZZPJiLFJ8yKto/x38O80R10pIzC0rr8Sy/OsjSH4bl0TbbgqA==", - "dev": true, + "@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==", "requires": { - "@lerna/validation-error": "3.13.0", - "conventional-changelog-angular": "^5.0.3", - "conventional-changelog-core": "^3.1.6", - "conventional-recommended-bump": "^5.0.0", - "fs-extra": "^8.1.0", - "get-stream": "^4.0.0", - "lodash.template": "^4.5.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "pify": "^4.0.1", - "semver": "^6.2.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@lerna/create": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.22.0.tgz", - "integrity": "sha512-MdiQQzCcB4E9fBF1TyMOaAEz9lUjIHp1Ju9H7f3lXze5JK6Fl5NYkouAvsLgY6YSIhXMY8AHW2zzXeBDY4yWkw==", - "dev": true, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "requires": { - "@evocateur/pacote": "^9.6.3", - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/validation-error": "3.13.0", - "camelcase": "^5.0.0", - "dedent": "^0.7.0", - "fs-extra": "^8.1.0", - "globby": "^9.2.0", - "init-package-json": "^1.10.3", - "npm-package-arg": "^6.1.0", - "p-reduce": "^1.0.0", - "pify": "^4.0.1", - "semver": "^6.2.0", - "slash": "^2.0.0", - "validate-npm-package-license": "^3.0.3", - "validate-npm-package-name": "^3.0.0", - "whatwg-url": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/create-symlink": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-3.16.2.tgz", - "integrity": "sha512-pzXIJp6av15P325sgiIRpsPXLFmkisLhMBCy4764d+7yjf2bzrJ4gkWVMhsv4AdF0NN3OyZ5jjzzTtLNqfR+Jw==", - "dev": true, + "@babel/plugin-syntax-object-rest-spread": { + "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==", "requires": { - "@zkochan/cmd-shim": "^3.1.0", - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@lerna/describe-ref": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.16.5.tgz", - "integrity": "sha512-c01+4gUF0saOOtDBzbLMFOTJDHTKbDFNErEY6q6i9QaXuzy9LNN62z+Hw4acAAZuJQhrVWncVathcmkkjvSVGw==", - "dev": true, + "@babel/plugin-syntax-optional-catch-binding": { + "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==", "requires": { - "@lerna/child-process": "3.16.5", - "npmlog": "^4.1.2" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@lerna/diff": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.21.0.tgz", - "integrity": "sha512-5viTR33QV3S7O+bjruo1SaR40m7F2aUHJaDAC7fL9Ca6xji+aw1KFkpCtVlISS0G8vikUREGMJh+c/VMSc8Usw==", - "dev": true, + "@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==", "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/validation-error": "3.13.0", - "npmlog": "^4.1.2" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@lerna/exec": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.21.0.tgz", - "integrity": "sha512-iLvDBrIE6rpdd4GIKTY9mkXyhwsJ2RvQdB9ZU+/NhR3okXfqKc6py/24tV111jqpXTtZUW6HNydT4dMao2hi1Q==", - "dev": true, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/profiler": "3.20.0", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "p-map": "^2.1.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/filter-options": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.20.0.tgz", - "integrity": "sha512-bmcHtvxn7SIl/R9gpiNMVG7yjx7WyT0HSGw34YVZ9B+3xF/83N3r5Rgtjh4hheLZ+Q91Or0Jyu5O3Nr+AwZe2g==", - "dev": true, + "@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", "requires": { - "@lerna/collect-updates": "3.20.0", - "@lerna/filter-packages": "3.18.0", - "dedent": "^0.7.0", - "figgy-pudding": "^3.5.1", - "npmlog": "^4.1.2" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/filter-packages": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-3.18.0.tgz", - "integrity": "sha512-6/0pMM04bCHNATIOkouuYmPg6KH3VkPCIgTfQmdkPJTullERyEQfNUKikrefjxo1vHOoCACDpy65JYyKiAbdwQ==", - "dev": true, + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", "requires": { - "@lerna/validation-error": "3.13.0", - "multimatch": "^3.0.0", - "npmlog": "^4.1.2" + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" } }, - "@lerna/get-npm-exec-opts": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.13.0.tgz", - "integrity": "sha512-Y0xWL0rg3boVyJk6An/vurKzubyJKtrxYv2sj4bB8Mc5zZ3tqtv0ccbOkmkXKqbzvNNF7VeUt1OJ3DRgtC/QZw==", - "dev": true, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", "requires": { - "npmlog": "^4.1.2" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/get-packed": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.16.0.tgz", - "integrity": "sha512-AjsFiaJzo1GCPnJUJZiTW6J1EihrPkc2y3nMu6m3uWFxoleklsSCyImumzVZJssxMi3CPpztj8LmADLedl9kXw==", - "dev": true, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.11.tgz", + "integrity": "sha512-atR1Rxc3hM+VPg/NvNvfYw0npQEAcHuJ+MGZnFn6h3bo+1U3BWXMdFMlvVRApBTWKQMX7SOwRJZA5FBF/JQbvA==", "requires": { - "fs-extra": "^8.1.0", - "ssri": "^6.0.1", - "tar": "^4.4.8" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/github-client": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.22.0.tgz", - "integrity": "sha512-O/GwPW+Gzr3Eb5bk+nTzTJ3uv+jh5jGho9BOqKlajXaOkMYGBELEAqV5+uARNGWZFvYAiF4PgqHb6aCUu7XdXg==", - "dev": true, + "@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", "requires": { - "@lerna/child-process": "3.16.5", - "@octokit/plugin-enterprise-rest": "^6.0.1", - "@octokit/rest": "^16.28.4", - "git-url-parse": "^11.1.2", - "npmlog": "^4.1.2" + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + } } }, - "@lerna/gitlab-client": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-3.15.0.tgz", - "integrity": "sha512-OsBvRSejHXUBMgwWQqNoioB8sgzL/Pf1pOUhHKtkiMl6aAWjklaaq5HPMvTIsZPfS6DJ9L5OK2GGZuooP/5c8Q==", - "dev": true, + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", "requires": { - "node-fetch": "^2.5.0", - "npmlog": "^4.1.2", - "whatwg-url": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/global-options": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-3.13.0.tgz", - "integrity": "sha512-SlZvh1gVRRzYLVluz9fryY1nJpZ0FHDGB66U9tFfvnnxmueckRQxLopn3tXj3NU1kc3QANT2I5BsQkOqZ4TEFQ==", - "dev": true - }, - "@lerna/has-npm-version": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.16.5.tgz", - "integrity": "sha512-WL7LycR9bkftyqbYop5rEGJ9sRFIV55tSGmbN1HLrF9idwOCD7CLrT64t235t3t4O5gehDnwKI5h2U3oxTrF8Q==", - "dev": true, + "@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", "requires": { - "@lerna/child-process": "3.16.5", - "semver": "^6.2.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/import": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.22.0.tgz", - "integrity": "sha512-uWOlexasM5XR6tXi4YehODtH9Y3OZrFht3mGUFFT3OIl2s+V85xIGFfqFGMTipMPAGb2oF1UBLL48kR43hRsOg==", - "dev": true, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "fs-extra": "^8.1.0", - "p-map-series": "^1.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/info": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/info/-/info-3.21.0.tgz", - "integrity": "sha512-0XDqGYVBgWxUquFaIptW2bYSIu6jOs1BtkvRTWDDhw4zyEdp6q4eaMvqdSap1CG+7wM5jeLCi6z94wS0AuiuwA==", - "dev": true, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", "requires": { - "@lerna/command": "3.21.0", - "@lerna/output": "3.13.0", - "envinfo": "^7.3.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/init": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.21.0.tgz", - "integrity": "sha512-6CM0z+EFUkFfurwdJCR+LQQF6MqHbYDCBPyhu/d086LRf58GtYZYj49J8mKG9ktayp/TOIxL/pKKjgLD8QBPOg==", - "dev": true, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/command": "3.21.0", - "fs-extra": "^8.1.0", - "p-map": "^2.1.0", - "write-json-file": "^3.2.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/link": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.21.0.tgz", - "integrity": "sha512-tGu9GxrX7Ivs+Wl3w1+jrLi1nQ36kNI32dcOssij6bg0oZ2M2MDEFI9UF2gmoypTaN9uO5TSsjCFS7aR79HbdQ==", - "dev": true, + "@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", "requires": { - "@lerna/command": "3.21.0", - "@lerna/package-graph": "3.18.5", - "@lerna/symlink-dependencies": "3.17.0", - "p-map": "^2.1.0", - "slash": "^2.0.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/list": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.21.0.tgz", - "integrity": "sha512-KehRjE83B1VaAbRRkRy6jLX1Cin8ltsrQ7FHf2bhwhRHK0S54YuA6LOoBnY/NtA8bHDX/Z+G5sMY78X30NS9tg==", - "dev": true, + "@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/listable": "3.18.5", - "@lerna/output": "3.13.0" + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/listable": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-3.18.5.tgz", - "integrity": "sha512-Sdr3pVyaEv5A7ZkGGYR7zN+tTl2iDcinryBPvtuv20VJrXBE8wYcOks1edBTcOWsPjCE/rMP4bo1pseyk3UTsg==", - "dev": true, + "@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", "requires": { - "@lerna/query-graph": "3.18.5", - "chalk": "^2.3.1", - "columnify": "^1.5.4" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/log-packed": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-3.16.0.tgz", - "integrity": "sha512-Fp+McSNBV/P2mnLUYTaSlG8GSmpXM7krKWcllqElGxvAqv6chk2K3c2k80MeVB4WvJ9tRjUUf+i7HUTiQ9/ckQ==", - "dev": true, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", "requires": { - "byte-size": "^5.0.1", - "columnify": "^1.5.4", - "has-unicode": "^2.0.1", - "npmlog": "^4.1.2" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/npm-conf": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.16.0.tgz", - "integrity": "sha512-HbO3DUrTkCAn2iQ9+FF/eisDpWY5POQAOF1m7q//CZjdC2HSW3UYbKEGsSisFxSfaF9Z4jtrV+F/wX6qWs3CuA==", - "dev": true, + "@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", "requires": { - "config-chain": "^1.1.11", - "pify": "^4.0.1" + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@lerna/npm-dist-tag": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.5.tgz", - "integrity": "sha512-xw0HDoIG6HreVsJND9/dGls1c+lf6vhu7yJoo56Sz5bvncTloYGLUppIfDHQr4ZvmPCK8rsh0euCVh2giPxzKQ==", - "dev": true, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", "requires": { - "@evocateur/npm-registry-fetch": "^4.0.0", - "@lerna/otplease": "3.18.5", - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2" + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@lerna/npm-install": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.16.5.tgz", - "integrity": "sha512-hfiKk8Eku6rB9uApqsalHHTHY+mOrrHeWEs+gtg7+meQZMTS3kzv4oVp5cBZigndQr3knTLjwthT/FX4KvseFg==", - "dev": true, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/get-npm-exec-opts": "3.13.0", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "signal-exit": "^3.0.2", - "write-pkg": "^3.1.0" + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@lerna/npm-publish": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-3.18.5.tgz", - "integrity": "sha512-3etLT9+2L8JAx5F8uf7qp6iAtOLSMj+ZYWY6oUgozPi/uLqU0/gsMsEXh3F0+YVW33q0M61RpduBoAlOOZnaTg==", - "dev": true, + "@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", "requires": { - "@evocateur/libnpmpublish": "^1.2.2", - "@lerna/otplease": "3.18.5", - "@lerna/run-lifecycle": "3.16.2", - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "pify": "^4.0.1", - "read-package-json": "^2.0.13" + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/npm-run-script": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.16.5.tgz", - "integrity": "sha512-1asRi+LjmVn3pMjEdpqKJZFT/3ZNpb+VVeJMwrJaV/3DivdNg7XlPK9LTrORuKU4PSvhdEZvJmSlxCKyDpiXsQ==", - "dev": true, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/get-npm-exec-opts": "3.13.0", - "npmlog": "^4.1.2" + "@babel/helper-create-regexp-features-plugin": "^7.12.1" } }, - "@lerna/otplease": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-3.18.5.tgz", - "integrity": "sha512-S+SldXAbcXTEDhzdxYLU0ZBKuYyURP/ND2/dK6IpKgLxQYh/z4ScljPDMyKymmEvgiEJmBsPZAAPfmNPEzxjog==", - "dev": true, + "@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", "requires": { - "@lerna/prompt": "3.18.5", - "figgy-pudding": "^3.5.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/output": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/output/-/output-3.13.0.tgz", - "integrity": "sha512-7ZnQ9nvUDu/WD+bNsypmPG5MwZBwu86iRoiW6C1WBuXXDxM5cnIAC1m2WxHeFnjyMrYlRXM9PzOQ9VDD+C15Rg==", - "dev": true, + "@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", "requires": { - "npmlog": "^4.1.2" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" } }, - "@lerna/pack-directory": { - "version": "3.16.4", - "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-3.16.4.tgz", - "integrity": "sha512-uxSF0HZeGyKaaVHz5FroDY9A5NDDiCibrbYR6+khmrhZtY0Bgn6hWq8Gswl9iIlymA+VzCbshWIMX4o2O8C8ng==", - "dev": true, + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", "requires": { - "@lerna/get-packed": "3.16.0", - "@lerna/package": "3.16.0", - "@lerna/run-lifecycle": "3.16.2", - "figgy-pudding": "^3.5.1", - "npm-packlist": "^1.4.4", - "npmlog": "^4.1.2", - "tar": "^4.4.10", - "temp-write": "^3.4.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/package": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/package/-/package-3.16.0.tgz", - "integrity": "sha512-2lHBWpaxcBoiNVbtyLtPUuTYEaB/Z+eEqRS9duxpZs6D+mTTZMNy6/5vpEVSCBmzvdYpyqhqaYjjSLvjjr5Riw==", - "dev": true, + "@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", "requires": { - "load-json-file": "^5.3.0", - "npm-package-arg": "^6.1.0", - "write-pkg": "^3.1.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/package-graph": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.18.5.tgz", - "integrity": "sha512-8QDrR9T+dBegjeLr+n9WZTVxUYUhIUjUgZ0gvNxUBN8S1WB9r6H5Yk56/MVaB64tA3oGAN9IIxX6w0WvTfFudA==", - "dev": true, + "@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", "requires": { - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/validation-error": "3.13.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "semver": "^6.2.0" + "regenerator-transform": "^0.14.2" } }, - "@lerna/prerelease-id-from-version": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-3.16.0.tgz", - "integrity": "sha512-qZyeUyrE59uOK8rKdGn7jQz+9uOpAaF/3hbslJVFL1NqF9ELDTqjCPXivuejMX/lN4OgD6BugTO4cR7UTq/sZA==", - "dev": true, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", "requires": { - "semver": "^6.2.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/profiler": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-3.20.0.tgz", - "integrity": "sha512-bh8hKxAlm6yu8WEOvbLENm42i2v9SsR4WbrCWSbsmOElx3foRnMlYk7NkGECa+U5c3K4C6GeBbwgqs54PP7Ljg==", - "dev": true, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", "requires": { - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2", - "upath": "^1.2.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/project": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/project/-/project-3.21.0.tgz", - "integrity": "sha512-xT1mrpET2BF11CY32uypV2GPtPVm6Hgtha7D81GQP9iAitk9EccrdNjYGt5UBYASl4CIDXBRxwmTTVGfrCx82A==", - "dev": true, + "@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", "requires": { - "@lerna/package": "3.16.0", - "@lerna/validation-error": "3.13.0", - "cosmiconfig": "^5.1.0", - "dedent": "^0.7.0", - "dot-prop": "^4.2.0", - "glob-parent": "^5.0.0", - "globby": "^9.2.0", - "load-json-file": "^5.3.0", - "npmlog": "^4.1.2", - "p-map": "^2.1.0", - "resolve-from": "^4.0.0", - "write-json-file": "^3.2.0" + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, - "@lerna/prompt": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-3.18.5.tgz", - "integrity": "sha512-rkKj4nm1twSbBEb69+Em/2jAERK8htUuV8/xSjN0NPC+6UjzAwY52/x9n5cfmpa9lyKf/uItp7chCI7eDmNTKQ==", - "dev": true, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", + "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", "requires": { - "inquirer": "^6.2.0", - "npmlog": "^4.1.2" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/publish": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.22.1.tgz", - "integrity": "sha512-PG9CM9HUYDreb1FbJwFg90TCBQooGjj+n/pb3gw/eH5mEDq0p8wKdLFe0qkiqUkm/Ub5C8DbVFertIo0Vd0zcw==", - "dev": true, + "@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", "requires": { - "@evocateur/libnpmaccess": "^3.1.2", - "@evocateur/npm-registry-fetch": "^4.0.0", - "@evocateur/pacote": "^9.6.3", - "@lerna/check-working-tree": "3.16.5", - "@lerna/child-process": "3.16.5", - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/describe-ref": "3.16.5", - "@lerna/log-packed": "3.16.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/npm-dist-tag": "3.18.5", - "@lerna/npm-publish": "3.18.5", - "@lerna/otplease": "3.18.5", - "@lerna/output": "3.13.0", - "@lerna/pack-directory": "3.16.4", - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/prompt": "3.18.5", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "@lerna/version": "3.22.1", - "figgy-pudding": "^3.5.1", - "fs-extra": "^8.1.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-pipe": "^1.2.0", - "semver": "^6.2.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/pulse-till-done": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-3.13.0.tgz", - "integrity": "sha512-1SOHpy7ZNTPulzIbargrgaJX387csN7cF1cLOGZiJQA6VqnS5eWs2CIrG8i8wmaUavj2QlQ5oEbRMVVXSsGrzA==", - "dev": true, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", + "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", "requires": { - "npmlog": "^4.1.2" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/query-graph": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-3.18.5.tgz", - "integrity": "sha512-50Lf4uuMpMWvJ306be3oQDHrWV42nai9gbIVByPBYJuVW8dT8O8pA3EzitNYBUdLL9/qEVbrR0ry1HD7EXwtRA==", - "dev": true, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", "requires": { - "@lerna/package-graph": "3.18.5", - "figgy-pudding": "^3.5.1" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@lerna/resolve-symlink": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-3.16.0.tgz", - "integrity": "sha512-Ibj5e7njVHNJ/NOqT4HlEgPFPtPLWsO7iu59AM5bJDcAJcR96mLZ7KGVIsS2tvaO7akMEJvt2P+ErwCdloG3jQ==", - "dev": true, - "requires": { - "fs-extra": "^8.1.0", - "npmlog": "^4.1.2", - "read-cmd-shim": "^1.0.1" + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.11.tgz", + "integrity": "sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==", + "requires": { + "@babel/compat-data": "^7.12.7", + "@babel/helper-compilation-targets": "^7.12.5", + "@babel/helper-module-imports": "^7.12.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.11", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.7", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.11", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.7", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.10", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.11", + "core-js-compat": "^3.8.0", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, - "@lerna/rimraf-dir": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.16.5.tgz", - "integrity": "sha512-bQlKmO0pXUsXoF8lOLknhyQjOZsCc0bosQDoX4lujBXSWxHVTg1VxURtWf2lUjz/ACsJVDfvHZbDm8kyBk5okA==", - "dev": true, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "requires": { - "@lerna/child-process": "3.16.5", - "npmlog": "^4.1.2", - "path-exists": "^3.0.0", - "rimraf": "^2.6.2" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" } }, - "@lerna/run": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.21.0.tgz", - "integrity": "sha512-fJF68rT3veh+hkToFsBmUJ9MHc9yGXA7LSDvhziAojzOb0AI/jBDp6cEcDQyJ7dbnplba2Lj02IH61QUf9oW0Q==", - "dev": true, + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { - "@lerna/command": "3.21.0", - "@lerna/filter-options": "3.20.0", - "@lerna/npm-run-script": "3.16.5", - "@lerna/output": "3.13.0", - "@lerna/profiler": "3.20.0", - "@lerna/run-topologically": "3.18.5", - "@lerna/timer": "3.13.0", - "@lerna/validation-error": "3.13.0", - "p-map": "^2.1.0" + "regenerator-runtime": "^0.13.4" } }, - "@lerna/run-lifecycle": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-3.16.2.tgz", - "integrity": "sha512-RqFoznE8rDpyyF0rOJy3+KjZCeTkO8y/OB9orPauR7G2xQ7PTdCpgo7EO6ZNdz3Al+k1BydClZz/j78gNCmL2A==", - "dev": true, + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", "requires": { - "@lerna/npm-conf": "3.16.0", - "figgy-pudding": "^3.5.1", - "npm-lifecycle": "^3.1.2", - "npmlog": "^4.1.2" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" } }, - "@lerna/run-topologically": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-3.18.5.tgz", - "integrity": "sha512-6N1I+6wf4hLOnPW+XDZqwufyIQ6gqoPfHZFkfWlvTQ+Ue7CuF8qIVQ1Eddw5HKQMkxqN10thKOFfq/9NQZ4NUg==", - "dev": true, + "@babel/traverse": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", + "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", "requires": { - "@lerna/query-graph": "3.18.5", - "figgy-pudding": "^3.5.1", - "p-queue": "^4.0.0" + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.10", + "@babel/types": "^7.12.10", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + } } }, - "@lerna/symlink-binary": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-3.17.0.tgz", - "integrity": "sha512-RLpy9UY6+3nT5J+5jkM5MZyMmjNHxZIZvXLV+Q3MXrf7Eaa1hNqyynyj4RO95fxbS+EZc4XVSk25DGFQbcRNSQ==", - "dev": true, + "@babel/types": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.11.tgz", + "integrity": "sha512-ukA9SQtKThINm++CX1CwmliMrE54J6nIYB5XTwL5f/CLFW9owfls+YSU8tVW15RQ2w+a3fSbPjC6HdQNtWZkiA==", "requires": { - "@lerna/create-symlink": "3.16.2", - "@lerna/package": "3.16.0", - "fs-extra": "^8.1.0", - "p-map": "^2.1.0" + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" } }, - "@lerna/symlink-dependencies": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-3.17.0.tgz", - "integrity": "sha512-KmjU5YT1bpt6coOmdFueTJ7DFJL4H1w5eF8yAQ2zsGNTtZ+i5SGFBWpb9AQaw168dydc3s4eu0W0Sirda+F59Q==", + "@eslint/eslintrc": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", + "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", "dev": true, "requires": { - "@lerna/create-symlink": "3.16.2", - "@lerna/resolve-symlink": "3.16.0", - "@lerna/symlink-binary": "3.17.0", - "fs-extra": "^8.1.0", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0" + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } } }, - "@lerna/timer": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-3.13.0.tgz", - "integrity": "sha512-RHWrDl8U4XNPqY5MQHkToWS9jHPnkLZEt5VD+uunCKTfzlxGnRCr3/zVr8VGy/uENMYpVP3wJa4RKGY6M0vkRw==", - "dev": true - }, - "@lerna/validation-error": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-3.13.0.tgz", - "integrity": "sha512-SiJP75nwB8GhgwLKQfdkSnDufAaCbkZWJqEDlKOUPUvVOplRGnfL+BPQZH5nvq2BYSRXsksXWZ4UHVnQZI/HYA==", + "@evocateur/libnpmaccess": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz", + "integrity": "sha512-KSCAHwNWro0CF2ukxufCitT9K5LjL/KuMmNzSu8wuwN2rjyKHD8+cmOsiybK+W5hdnwc5M1SmRlVCaMHQo+3rg==", "dev": true, "requires": { - "npmlog": "^4.1.2" + "@evocateur/npm-registry-fetch": "^4.0.0", + "aproba": "^2.0.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "npm-package-arg": "^6.1.0" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + } } }, - "@lerna/version": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.22.1.tgz", - "integrity": "sha512-PSGt/K1hVqreAFoi3zjD0VEDupQ2WZVlVIwesrE5GbrL2BjXowjCsTDPqblahDUPy0hp6h7E2kG855yLTp62+g==", + "@evocateur/libnpmpublish": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@evocateur/libnpmpublish/-/libnpmpublish-1.2.2.tgz", + "integrity": "sha512-MJrrk9ct1FeY9zRlyeoyMieBjGDG9ihyyD9/Ft6MMrTxql9NyoEx2hw9casTIP4CdqEVu+3nQ2nXxoJ8RCXyFg==", "dev": true, "requires": { - "@lerna/check-working-tree": "3.16.5", - "@lerna/child-process": "3.16.5", - "@lerna/collect-updates": "3.20.0", - "@lerna/command": "3.21.0", - "@lerna/conventional-commits": "3.22.0", - "@lerna/github-client": "3.22.0", - "@lerna/gitlab-client": "3.15.0", - "@lerna/output": "3.13.0", - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/prompt": "3.18.5", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.5", - "@lerna/validation-error": "3.13.0", - "chalk": "^2.3.1", - "dedent": "^0.7.0", - "load-json-file": "^5.3.0", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "p-map": "^2.1.0", - "p-pipe": "^1.2.0", - "p-reduce": "^1.0.0", - "p-waterfall": "^1.0.0", - "semver": "^6.2.0", - "slash": "^2.0.0", - "temp-write": "^3.4.0", - "write-json-file": "^3.2.0" - } - }, - "@lerna/write-log-file": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-3.13.0.tgz", - "integrity": "sha512-RibeMnDPvlL8bFYW5C8cs4mbI3AHfQef73tnJCQ/SgrXZHehmHnsyWUiE7qDQCAo+B1RfTapvSyFF69iPj326A==", - "dev": true, - "requires": { - "npmlog": "^4.1.2", - "write-file-atomic": "^2.3.0" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "@octokit/auth-token": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.4.tgz", - "integrity": "sha512-LNfGu3Ro9uFAYh10MUZVaT7X2CnNm2C8IDQmabx+3DygYIQjs9FwzFAHN/0t6mu5HEPhxcb1XOuxdpY82vCg2Q==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.10.tgz", - "integrity": "sha512-9+Xef8nT7OKZglfkOMm7IL6VwxXUQyR7DUSU0LH/F7VNqs8vyd7es5pTfz9E7DwUIx7R3pGscxu1EBhYljyu7Q==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "@evocateur/npm-registry-fetch": "^4.0.0", + "aproba": "^2.0.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "semver": "^5.5.1", + "ssri": "^6.0.1" }, "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, - "@octokit/openapi-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-2.0.0.tgz", - "integrity": "sha512-J4bfM7lf8oZvEAdpS71oTvC1ofKxfEZgU5vKVwzZKi4QPiL82udjpseJwxPid9Pu2FNmyRQOX4iEj6W1iOSnPw==", - "dev": true - }, - "@octokit/plugin-enterprise-rest": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", - "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", - "dev": true - }, - "@octokit/plugin-paginate-rest": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz", - "integrity": "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==", + "@evocateur/npm-registry-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@evocateur/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz", + "integrity": "sha512-k1WGfKRQyhJpIr+P17O5vLIo2ko1PFLKwoetatdduUSt/aQ4J2sJrJwwatdI5Z3SiYk/mRH9S3JpdmMFd/IK4g==", "dev": true, "requires": { - "@octokit/types": "^2.0.1" + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.1.2" }, "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "@types/node": ">= 8" + "yallist": "^3.0.2" } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, - "@octokit/plugin-request-log": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.2.tgz", - "integrity": "sha512-oTJSNAmBqyDR41uSMunLQKMX0jmEXbwD1fpz8FG27lScV3RhtGfBa1/BBLym+PxcC16IBlF7KH9vP1BUYxA+Eg==", - "dev": true - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz", - "integrity": "sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ==", + "@evocateur/pacote": { + "version": "9.6.5", + "resolved": "https://registry.npmjs.org/@evocateur/pacote/-/pacote-9.6.5.tgz", + "integrity": "sha512-EI552lf0aG2nOV8NnZpTxNo2PcXKPmDbF9K8eCBFQdIZwHNGN/mi815fxtmUMa2wTa1yndotICIDt/V0vpEx2w==", "dev": true, "requires": { - "@octokit/types": "^2.0.1", - "deprecation": "^2.3.1" + "@evocateur/npm-registry-fetch": "^4.0.0", + "bluebird": "^3.5.3", + "cacache": "^12.0.3", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.5.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.4.4", + "npm-pick-manifest": "^3.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.3", + "safe-buffer": "^5.2.0", + "semver": "^5.7.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" }, "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "@types/node": ">= 8" + "yallist": "^3.0.2" } - } - } - }, - "@octokit/request": { - "version": "5.4.12", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.12.tgz", - "integrity": "sha512-MvWYdxengUWTGFpfpefBBpVmmEYfkwMoxonIB3sUGp5rhdgwjXL1ejo6JbgzG/QD9B/NYt/9cJX1pxXeSIUCkg==", - "dev": true, - "requires": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.0.0", - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", - "once": "^1.4.0", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/request-error": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.4.tgz", - "integrity": "sha512-LjkSiTbsxIErBiRh5wSZvpZqT4t0/c9+4dOe0PII+6jXR+oj/h66s7E4a/MghV7iT8W9ffoQ5Skoxzs96+gBPA==", + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "@octokit/types": "^6.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "glob": "^7.1.3" } }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } }, - "@octokit/request-error": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.1.tgz", - "integrity": "sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA==", + "@feathersjs/hooks": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@feathersjs/hooks/-/hooks-0.6.1.tgz", + "integrity": "sha512-oe7iCGuEZhjoQmPh/BUx9YWssdByKmUs20XYxA99dPMsEr+k9lxWfCH70y3Hm4WeIvFPMRcTa+PswusjKqPW/Q==" + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { - "@octokit/types": "^2.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "dependencies": { - "@octokit/types": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", - "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "@types/node": ">= 8" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } - } - } - }, - "@octokit/rest": { - "version": "16.43.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.43.2.tgz", - "integrity": "sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ==", - "dev": true, - "requires": { - "@octokit/auth-token": "^2.4.0", - "@octokit/plugin-paginate-rest": "^1.1.1", - "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "2.4.0", - "@octokit/request": "^5.2.0", - "@octokit/request-error": "^1.0.2", - "atob-lite": "^2.0.0", - "before-after-hook": "^2.0.0", - "btoa-lite": "^1.0.0", - "deprecation": "^2.0.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "lodash.uniq": "^4.5.0", - "octokit-pagination-methods": "^1.1.0", - "once": "^1.4.0", - "universal-user-agent": "^4.0.0" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, - "@octokit/types": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.1.1.tgz", - "integrity": "sha512-btm3D6S7VkRrgyYF31etUtVY/eQ1KzrNRqhFt25KSe2mKlXuLXJilglRC6eDA2P6ou94BUnk/Kz5MPEolXgoiw==", + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@lerna/add": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.21.0.tgz", + "integrity": "sha512-vhUXXF6SpufBE1EkNEXwz1VLW03f177G9uMOFMQkp6OJ30/PWg4Ekifuz9/3YfgB2/GH8Tu4Lk3O51P2Hskg/A==", "dev": true, "requires": { - "@octokit/openapi-types": "^2.0.0", - "@types/node": ">= 8" + "@evocateur/pacote": "^9.6.3", + "@lerna/bootstrap": "3.21.0", + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/npm-conf": "3.16.0", + "@lerna/validation-error": "3.13.0", + "dedent": "^0.7.0", + "npm-package-arg": "^6.1.0", + "p-map": "^2.1.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "@lerna/bootstrap": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.21.0.tgz", + "integrity": "sha512-mtNHlXpmvJn6JTu0KcuTTPl2jLsDNud0QacV/h++qsaKbhAaJr/FElNZ5s7MwZFUM3XaDmvWzHKaszeBMHIbBw==", "dev": true, "requires": { - "@types/minimatch": "*", - "@types/node": "*" + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/has-npm-version": "3.16.5", + "@lerna/npm-install": "3.16.5", + "@lerna/package-graph": "3.18.5", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/rimraf-dir": "3.16.5", + "@lerna/run-lifecycle": "3.16.2", + "@lerna/run-topologically": "3.18.5", + "@lerna/symlink-binary": "3.17.0", + "@lerna/symlink-dependencies": "3.17.0", + "@lerna/validation-error": "3.13.0", + "dedent": "^0.7.0", + "get-port": "^4.2.0", + "multimatch": "^3.0.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "p-finally": "^1.0.0", + "p-map": "^2.1.0", + "p-map-series": "^1.0.0", + "p-waterfall": "^1.0.0", + "read-package-tree": "^5.1.6", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "@types/node": { - "version": "14.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", - "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@zkochan/cmd-shim": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz", - "integrity": "sha512-o8l0+x7C7sMZU3v9GuJIAU10qQLtwR1dtRQIOmlNMtyaqhmpXOzx1HWiYoWfmmf9HHZoAkXpc9TM9PQYF9d4Jg==", + "@lerna/changed": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.21.0.tgz", + "integrity": "sha512-hzqoyf8MSHVjZp0gfJ7G8jaz+++mgXYiNs9iViQGA8JlN/dnWLI5sWDptEH3/B30Izo+fdVz0S0s7ydVE3pWIw==", "dev": true, "requires": { - "is-windows": "^1.0.0", - "mkdirp-promise": "^5.0.1", - "mz": "^2.5.0" + "@lerna/collect-updates": "3.20.0", + "@lerna/command": "3.21.0", + "@lerna/listable": "3.18.5", + "@lerna/output": "3.13.0" } }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "@lerna/check-working-tree": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz", + "integrity": "sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ==", "dev": true, "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "@lerna/collect-uncommitted": "3.16.5", + "@lerna/describe-ref": "3.16.5", + "@lerna/validation-error": "3.13.0" } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "@lerna/child-process": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.16.5.tgz", + "integrity": "sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "chalk": "^2.3.1", + "execa": "^1.0.0", + "strong-log-transformer": "^2.0.0" + }, + "dependencies": { + "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" + } + } } }, - "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "@lerna/clean": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.21.0.tgz", + "integrity": "sha512-b/L9l+MDgE/7oGbrav6rG8RTQvRiZLO1zTcG17zgJAAuhlsPxJExMlh2DFwJEVi2les70vMhHfST3Ue1IMMjpg==", "dev": true, "requires": { - "humanize-ms": "^1.2.1" + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/prompt": "3.18.5", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/rimraf-dir": "3.16.5", + "p-map": "^2.1.0", + "p-map-series": "^1.0.0", + "p-waterfall": "^1.0.0" } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "@lerna/cli": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.18.5.tgz", + "integrity": "sha512-erkbxkj9jfc89vVs/jBLY/fM0I80oLmJkFUV3Q3wk9J3miYhP14zgVEBsPZY68IZlEjT6T3Xlq2xO1AVaatHsA==", "dev": true, "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "@lerna/global-options": "3.13.0", + "dedent": "^0.7.0", + "npmlog": "^4.1.2", + "yargs": "^14.2.2" } }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "@lerna/collect-uncommitted": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz", + "integrity": "sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@lerna/child-process": "3.16.5", + "chalk": "^2.3.1", + "figgy-pudding": "^3.5.1", + "npmlog": "^4.1.2" + }, + "dependencies": { + "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" + } + } } }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "@lerna/collect-updates": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.20.0.tgz", + "integrity": "sha512-qBTVT5g4fupVhBFuY4nI/3FSJtQVcDh7/gEPOpRxoXB/yCSnT38MFHXWl+y4einLciCjt/+0x6/4AG80fjay2Q==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/describe-ref": "3.16.5", + "minimatch": "^3.0.4", + "npmlog": "^4.1.2", + "slash": "^2.0.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "@lerna/command": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.21.0.tgz", + "integrity": "sha512-T2bu6R8R3KkH5YoCKdutKv123iUgUbW8efVjdGCDnCMthAQzoentOJfDeodBwn0P2OqCl3ohsiNVtSn9h78fyQ==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/package-graph": "3.18.5", + "@lerna/project": "3.21.0", + "@lerna/validation-error": "3.13.0", + "@lerna/write-log-file": "3.13.0", + "clone-deep": "^4.0.1", + "dedent": "^0.7.0", + "execa": "^1.0.0", + "is-ci": "^2.0.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/conventional-commits": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.22.0.tgz", + "integrity": "sha512-z4ZZk1e8Mhz7+IS8NxHr64wyklHctCJyWpJKEZZPJiLFJ8yKto/x38O80R10pIzC0rr8Sy/OsjSH4bl0TbbgqA==", + "dev": true, + "requires": { + "@lerna/validation-error": "3.13.0", + "conventional-changelog-angular": "^5.0.3", + "conventional-changelog-core": "^3.1.6", + "conventional-recommended-bump": "^5.0.0", + "fs-extra": "^8.1.0", + "get-stream": "^4.0.0", + "lodash.template": "^4.5.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "pify": "^4.0.1", + "semver": "^6.2.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/create": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.22.0.tgz", + "integrity": "sha512-MdiQQzCcB4E9fBF1TyMOaAEz9lUjIHp1Ju9H7f3lXze5JK6Fl5NYkouAvsLgY6YSIhXMY8AHW2zzXeBDY4yWkw==", + "dev": true, + "requires": { + "@evocateur/pacote": "^9.6.3", + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "@lerna/npm-conf": "3.16.0", + "@lerna/validation-error": "3.13.0", + "camelcase": "^5.0.0", + "dedent": "^0.7.0", + "fs-extra": "^8.1.0", + "globby": "^9.2.0", + "init-package-json": "^1.10.3", + "npm-package-arg": "^6.1.0", + "p-reduce": "^1.0.0", + "pify": "^4.0.1", + "semver": "^6.2.0", + "slash": "^2.0.0", + "validate-npm-package-license": "^3.0.3", + "validate-npm-package-name": "^3.0.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "@lerna/create-symlink": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-3.16.2.tgz", + "integrity": "sha512-pzXIJp6av15P325sgiIRpsPXLFmkisLhMBCy4764d+7yjf2bzrJ4gkWVMhsv4AdF0NN3OyZ5jjzzTtLNqfR+Jw==", + "dev": true, + "requires": { + "@zkochan/cmd-shim": "^3.1.0", + "fs-extra": "^8.1.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/describe-ref": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.16.5.tgz", + "integrity": "sha512-c01+4gUF0saOOtDBzbLMFOTJDHTKbDFNErEY6q6i9QaXuzy9LNN62z+Hw4acAAZuJQhrVWncVathcmkkjvSVGw==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "npmlog": "^4.1.2" + } + }, + "@lerna/diff": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.21.0.tgz", + "integrity": "sha512-5viTR33QV3S7O+bjruo1SaR40m7F2aUHJaDAC7fL9Ca6xji+aw1KFkpCtVlISS0G8vikUREGMJh+c/VMSc8Usw==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "@lerna/validation-error": "3.13.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/exec": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.21.0.tgz", + "integrity": "sha512-iLvDBrIE6rpdd4GIKTY9mkXyhwsJ2RvQdB9ZU+/NhR3okXfqKc6py/24tV111jqpXTtZUW6HNydT4dMao2hi1Q==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/profiler": "3.20.0", + "@lerna/run-topologically": "3.18.5", + "@lerna/validation-error": "3.13.0", + "p-map": "^2.1.0" + } + }, + "@lerna/filter-options": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.20.0.tgz", + "integrity": "sha512-bmcHtvxn7SIl/R9gpiNMVG7yjx7WyT0HSGw34YVZ9B+3xF/83N3r5Rgtjh4hheLZ+Q91Or0Jyu5O3Nr+AwZe2g==", + "dev": true, + "requires": { + "@lerna/collect-updates": "3.20.0", + "@lerna/filter-packages": "3.18.0", + "dedent": "^0.7.0", + "figgy-pudding": "^3.5.1", + "npmlog": "^4.1.2" + } + }, + "@lerna/filter-packages": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-3.18.0.tgz", + "integrity": "sha512-6/0pMM04bCHNATIOkouuYmPg6KH3VkPCIgTfQmdkPJTullERyEQfNUKikrefjxo1vHOoCACDpy65JYyKiAbdwQ==", + "dev": true, + "requires": { + "@lerna/validation-error": "3.13.0", + "multimatch": "^3.0.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/get-npm-exec-opts": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.13.0.tgz", + "integrity": "sha512-Y0xWL0rg3boVyJk6An/vurKzubyJKtrxYv2sj4bB8Mc5zZ3tqtv0ccbOkmkXKqbzvNNF7VeUt1OJ3DRgtC/QZw==", + "dev": true, + "requires": { + "npmlog": "^4.1.2" + } + }, + "@lerna/get-packed": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.16.0.tgz", + "integrity": "sha512-AjsFiaJzo1GCPnJUJZiTW6J1EihrPkc2y3nMu6m3uWFxoleklsSCyImumzVZJssxMi3CPpztj8LmADLedl9kXw==", + "dev": true, + "requires": { + "fs-extra": "^8.1.0", + "ssri": "^6.0.1", + "tar": "^4.4.8" + } + }, + "@lerna/github-client": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.22.0.tgz", + "integrity": "sha512-O/GwPW+Gzr3Eb5bk+nTzTJ3uv+jh5jGho9BOqKlajXaOkMYGBELEAqV5+uARNGWZFvYAiF4PgqHb6aCUu7XdXg==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@octokit/plugin-enterprise-rest": "^6.0.1", + "@octokit/rest": "^16.28.4", + "git-url-parse": "^11.1.2", + "npmlog": "^4.1.2" + } + }, + "@lerna/gitlab-client": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-3.15.0.tgz", + "integrity": "sha512-OsBvRSejHXUBMgwWQqNoioB8sgzL/Pf1pOUhHKtkiMl6aAWjklaaq5HPMvTIsZPfS6DJ9L5OK2GGZuooP/5c8Q==", + "dev": true, + "requires": { + "node-fetch": "^2.5.0", + "npmlog": "^4.1.2", + "whatwg-url": "^7.0.0" + } + }, + "@lerna/global-options": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-3.13.0.tgz", + "integrity": "sha512-SlZvh1gVRRzYLVluz9fryY1nJpZ0FHDGB66U9tFfvnnxmueckRQxLopn3tXj3NU1kc3QANT2I5BsQkOqZ4TEFQ==", + "dev": true + }, + "@lerna/has-npm-version": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.16.5.tgz", + "integrity": "sha512-WL7LycR9bkftyqbYop5rEGJ9sRFIV55tSGmbN1HLrF9idwOCD7CLrT64t235t3t4O5gehDnwKI5h2U3oxTrF8Q==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/import": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.22.0.tgz", + "integrity": "sha512-uWOlexasM5XR6tXi4YehODtH9Y3OZrFht3mGUFFT3OIl2s+V85xIGFfqFGMTipMPAGb2oF1UBLL48kR43hRsOg==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "@lerna/prompt": "3.18.5", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/validation-error": "3.13.0", + "dedent": "^0.7.0", + "fs-extra": "^8.1.0", + "p-map-series": "^1.0.0" + } + }, + "@lerna/info": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/info/-/info-3.21.0.tgz", + "integrity": "sha512-0XDqGYVBgWxUquFaIptW2bYSIu6jOs1BtkvRTWDDhw4zyEdp6q4eaMvqdSap1CG+7wM5jeLCi6z94wS0AuiuwA==", + "dev": true, + "requires": { + "@lerna/command": "3.21.0", + "@lerna/output": "3.13.0", + "envinfo": "^7.3.1" + } + }, + "@lerna/init": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.21.0.tgz", + "integrity": "sha512-6CM0z+EFUkFfurwdJCR+LQQF6MqHbYDCBPyhu/d086LRf58GtYZYj49J8mKG9ktayp/TOIxL/pKKjgLD8QBPOg==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "fs-extra": "^8.1.0", + "p-map": "^2.1.0", + "write-json-file": "^3.2.0" + } + }, + "@lerna/link": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.21.0.tgz", + "integrity": "sha512-tGu9GxrX7Ivs+Wl3w1+jrLi1nQ36kNI32dcOssij6bg0oZ2M2MDEFI9UF2gmoypTaN9uO5TSsjCFS7aR79HbdQ==", + "dev": true, + "requires": { + "@lerna/command": "3.21.0", + "@lerna/package-graph": "3.18.5", + "@lerna/symlink-dependencies": "3.17.0", + "p-map": "^2.1.0", + "slash": "^2.0.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "@lerna/list": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.21.0.tgz", + "integrity": "sha512-KehRjE83B1VaAbRRkRy6jLX1Cin8ltsrQ7FHf2bhwhRHK0S54YuA6LOoBnY/NtA8bHDX/Z+G5sMY78X30NS9tg==", + "dev": true, + "requires": { + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/listable": "3.18.5", + "@lerna/output": "3.13.0" + } + }, + "@lerna/listable": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-3.18.5.tgz", + "integrity": "sha512-Sdr3pVyaEv5A7ZkGGYR7zN+tTl2iDcinryBPvtuv20VJrXBE8wYcOks1edBTcOWsPjCE/rMP4bo1pseyk3UTsg==", + "dev": true, + "requires": { + "@lerna/query-graph": "3.18.5", + "chalk": "^2.3.1", + "columnify": "^1.5.4" + }, + "dependencies": { + "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" + } + } + } + }, + "@lerna/log-packed": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-3.16.0.tgz", + "integrity": "sha512-Fp+McSNBV/P2mnLUYTaSlG8GSmpXM7krKWcllqElGxvAqv6chk2K3c2k80MeVB4WvJ9tRjUUf+i7HUTiQ9/ckQ==", + "dev": true, + "requires": { + "byte-size": "^5.0.1", + "columnify": "^1.5.4", + "has-unicode": "^2.0.1", + "npmlog": "^4.1.2" + } + }, + "@lerna/npm-conf": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.16.0.tgz", + "integrity": "sha512-HbO3DUrTkCAn2iQ9+FF/eisDpWY5POQAOF1m7q//CZjdC2HSW3UYbKEGsSisFxSfaF9Z4jtrV+F/wX6qWs3CuA==", + "dev": true, + "requires": { + "config-chain": "^1.1.11", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "@lerna/npm-dist-tag": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.5.tgz", + "integrity": "sha512-xw0HDoIG6HreVsJND9/dGls1c+lf6vhu7yJoo56Sz5bvncTloYGLUppIfDHQr4ZvmPCK8rsh0euCVh2giPxzKQ==", + "dev": true, + "requires": { + "@evocateur/npm-registry-fetch": "^4.0.0", + "@lerna/otplease": "3.18.5", + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/npm-install": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.16.5.tgz", + "integrity": "sha512-hfiKk8Eku6rB9uApqsalHHTHY+mOrrHeWEs+gtg7+meQZMTS3kzv4oVp5cBZigndQr3knTLjwthT/FX4KvseFg==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/get-npm-exec-opts": "3.13.0", + "fs-extra": "^8.1.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "signal-exit": "^3.0.2", + "write-pkg": "^3.1.0" + } + }, + "@lerna/npm-publish": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-3.18.5.tgz", + "integrity": "sha512-3etLT9+2L8JAx5F8uf7qp6iAtOLSMj+ZYWY6oUgozPi/uLqU0/gsMsEXh3F0+YVW33q0M61RpduBoAlOOZnaTg==", + "dev": true, + "requires": { + "@evocateur/libnpmpublish": "^1.2.2", + "@lerna/otplease": "3.18.5", + "@lerna/run-lifecycle": "3.16.2", + "figgy-pudding": "^3.5.1", + "fs-extra": "^8.1.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "pify": "^4.0.1", + "read-package-json": "^2.0.13" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "@lerna/npm-run-script": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.16.5.tgz", + "integrity": "sha512-1asRi+LjmVn3pMjEdpqKJZFT/3ZNpb+VVeJMwrJaV/3DivdNg7XlPK9LTrORuKU4PSvhdEZvJmSlxCKyDpiXsQ==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/get-npm-exec-opts": "3.13.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/otplease": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-3.18.5.tgz", + "integrity": "sha512-S+SldXAbcXTEDhzdxYLU0ZBKuYyURP/ND2/dK6IpKgLxQYh/z4ScljPDMyKymmEvgiEJmBsPZAAPfmNPEzxjog==", + "dev": true, + "requires": { + "@lerna/prompt": "3.18.5", + "figgy-pudding": "^3.5.1" + } + }, + "@lerna/output": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/output/-/output-3.13.0.tgz", + "integrity": "sha512-7ZnQ9nvUDu/WD+bNsypmPG5MwZBwu86iRoiW6C1WBuXXDxM5cnIAC1m2WxHeFnjyMrYlRXM9PzOQ9VDD+C15Rg==", + "dev": true, + "requires": { + "npmlog": "^4.1.2" + } + }, + "@lerna/pack-directory": { + "version": "3.16.4", + "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-3.16.4.tgz", + "integrity": "sha512-uxSF0HZeGyKaaVHz5FroDY9A5NDDiCibrbYR6+khmrhZtY0Bgn6hWq8Gswl9iIlymA+VzCbshWIMX4o2O8C8ng==", + "dev": true, + "requires": { + "@lerna/get-packed": "3.16.0", + "@lerna/package": "3.16.0", + "@lerna/run-lifecycle": "3.16.2", + "figgy-pudding": "^3.5.1", + "npm-packlist": "^1.4.4", + "npmlog": "^4.1.2", + "tar": "^4.4.10", + "temp-write": "^3.4.0" + } + }, + "@lerna/package": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/package/-/package-3.16.0.tgz", + "integrity": "sha512-2lHBWpaxcBoiNVbtyLtPUuTYEaB/Z+eEqRS9duxpZs6D+mTTZMNy6/5vpEVSCBmzvdYpyqhqaYjjSLvjjr5Riw==", + "dev": true, + "requires": { + "load-json-file": "^5.3.0", + "npm-package-arg": "^6.1.0", + "write-pkg": "^3.1.0" + }, + "dependencies": { + "load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + } + } + }, + "@lerna/package-graph": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.18.5.tgz", + "integrity": "sha512-8QDrR9T+dBegjeLr+n9WZTVxUYUhIUjUgZ0gvNxUBN8S1WB9r6H5Yk56/MVaB64tA3oGAN9IIxX6w0WvTfFudA==", + "dev": true, + "requires": { + "@lerna/prerelease-id-from-version": "3.16.0", + "@lerna/validation-error": "3.13.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/prerelease-id-from-version": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-3.16.0.tgz", + "integrity": "sha512-qZyeUyrE59uOK8rKdGn7jQz+9uOpAaF/3hbslJVFL1NqF9ELDTqjCPXivuejMX/lN4OgD6BugTO4cR7UTq/sZA==", + "dev": true, + "requires": { + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/profiler": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-3.20.0.tgz", + "integrity": "sha512-bh8hKxAlm6yu8WEOvbLENm42i2v9SsR4WbrCWSbsmOElx3foRnMlYk7NkGECa+U5c3K4C6GeBbwgqs54PP7Ljg==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "fs-extra": "^8.1.0", + "npmlog": "^4.1.2", + "upath": "^1.2.0" + } + }, + "@lerna/project": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/project/-/project-3.21.0.tgz", + "integrity": "sha512-xT1mrpET2BF11CY32uypV2GPtPVm6Hgtha7D81GQP9iAitk9EccrdNjYGt5UBYASl4CIDXBRxwmTTVGfrCx82A==", + "dev": true, + "requires": { + "@lerna/package": "3.16.0", + "@lerna/validation-error": "3.13.0", + "cosmiconfig": "^5.1.0", + "dedent": "^0.7.0", + "dot-prop": "^4.2.0", + "glob-parent": "^5.0.0", + "globby": "^9.2.0", + "load-json-file": "^5.3.0", + "npmlog": "^4.1.2", + "p-map": "^2.1.0", + "resolve-from": "^4.0.0", + "write-json-file": "^3.2.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + } + } + }, + "@lerna/prompt": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-3.18.5.tgz", + "integrity": "sha512-rkKj4nm1twSbBEb69+Em/2jAERK8htUuV8/xSjN0NPC+6UjzAwY52/x9n5cfmpa9lyKf/uItp7chCI7eDmNTKQ==", + "dev": true, + "requires": { + "inquirer": "^6.2.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/publish": { + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.22.1.tgz", + "integrity": "sha512-PG9CM9HUYDreb1FbJwFg90TCBQooGjj+n/pb3gw/eH5mEDq0p8wKdLFe0qkiqUkm/Ub5C8DbVFertIo0Vd0zcw==", + "dev": true, + "requires": { + "@evocateur/libnpmaccess": "^3.1.2", + "@evocateur/npm-registry-fetch": "^4.0.0", + "@evocateur/pacote": "^9.6.3", + "@lerna/check-working-tree": "3.16.5", + "@lerna/child-process": "3.16.5", + "@lerna/collect-updates": "3.20.0", + "@lerna/command": "3.21.0", + "@lerna/describe-ref": "3.16.5", + "@lerna/log-packed": "3.16.0", + "@lerna/npm-conf": "3.16.0", + "@lerna/npm-dist-tag": "3.18.5", + "@lerna/npm-publish": "3.18.5", + "@lerna/otplease": "3.18.5", + "@lerna/output": "3.13.0", + "@lerna/pack-directory": "3.16.4", + "@lerna/prerelease-id-from-version": "3.16.0", + "@lerna/prompt": "3.18.5", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/run-lifecycle": "3.16.2", + "@lerna/run-topologically": "3.18.5", + "@lerna/validation-error": "3.13.0", + "@lerna/version": "3.22.1", + "figgy-pudding": "^3.5.1", + "fs-extra": "^8.1.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "p-finally": "^1.0.0", + "p-map": "^2.1.0", + "p-pipe": "^1.2.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@lerna/pulse-till-done": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-3.13.0.tgz", + "integrity": "sha512-1SOHpy7ZNTPulzIbargrgaJX387csN7cF1cLOGZiJQA6VqnS5eWs2CIrG8i8wmaUavj2QlQ5oEbRMVVXSsGrzA==", + "dev": true, + "requires": { + "npmlog": "^4.1.2" + } + }, + "@lerna/query-graph": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-3.18.5.tgz", + "integrity": "sha512-50Lf4uuMpMWvJ306be3oQDHrWV42nai9gbIVByPBYJuVW8dT8O8pA3EzitNYBUdLL9/qEVbrR0ry1HD7EXwtRA==", + "dev": true, + "requires": { + "@lerna/package-graph": "3.18.5", + "figgy-pudding": "^3.5.1" + } + }, + "@lerna/resolve-symlink": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-3.16.0.tgz", + "integrity": "sha512-Ibj5e7njVHNJ/NOqT4HlEgPFPtPLWsO7iu59AM5bJDcAJcR96mLZ7KGVIsS2tvaO7akMEJvt2P+ErwCdloG3jQ==", + "dev": true, + "requires": { + "fs-extra": "^8.1.0", + "npmlog": "^4.1.2", + "read-cmd-shim": "^1.0.1" + } + }, + "@lerna/rimraf-dir": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.16.5.tgz", + "integrity": "sha512-bQlKmO0pXUsXoF8lOLknhyQjOZsCc0bosQDoX4lujBXSWxHVTg1VxURtWf2lUjz/ACsJVDfvHZbDm8kyBk5okA==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "npmlog": "^4.1.2", + "path-exists": "^3.0.0", + "rimraf": "^2.6.2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "@lerna/run": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.21.0.tgz", + "integrity": "sha512-fJF68rT3veh+hkToFsBmUJ9MHc9yGXA7LSDvhziAojzOb0AI/jBDp6cEcDQyJ7dbnplba2Lj02IH61QUf9oW0Q==", + "dev": true, + "requires": { + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/npm-run-script": "3.16.5", + "@lerna/output": "3.13.0", + "@lerna/profiler": "3.20.0", + "@lerna/run-topologically": "3.18.5", + "@lerna/timer": "3.13.0", + "@lerna/validation-error": "3.13.0", + "p-map": "^2.1.0" + } + }, + "@lerna/run-lifecycle": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-3.16.2.tgz", + "integrity": "sha512-RqFoznE8rDpyyF0rOJy3+KjZCeTkO8y/OB9orPauR7G2xQ7PTdCpgo7EO6ZNdz3Al+k1BydClZz/j78gNCmL2A==", + "dev": true, + "requires": { + "@lerna/npm-conf": "3.16.0", + "figgy-pudding": "^3.5.1", + "npm-lifecycle": "^3.1.2", + "npmlog": "^4.1.2" + } + }, + "@lerna/run-topologically": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-3.18.5.tgz", + "integrity": "sha512-6N1I+6wf4hLOnPW+XDZqwufyIQ6gqoPfHZFkfWlvTQ+Ue7CuF8qIVQ1Eddw5HKQMkxqN10thKOFfq/9NQZ4NUg==", + "dev": true, + "requires": { + "@lerna/query-graph": "3.18.5", + "figgy-pudding": "^3.5.1", + "p-queue": "^4.0.0" + } + }, + "@lerna/symlink-binary": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-3.17.0.tgz", + "integrity": "sha512-RLpy9UY6+3nT5J+5jkM5MZyMmjNHxZIZvXLV+Q3MXrf7Eaa1hNqyynyj4RO95fxbS+EZc4XVSk25DGFQbcRNSQ==", + "dev": true, + "requires": { + "@lerna/create-symlink": "3.16.2", + "@lerna/package": "3.16.0", + "fs-extra": "^8.1.0", + "p-map": "^2.1.0" + } + }, + "@lerna/symlink-dependencies": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-3.17.0.tgz", + "integrity": "sha512-KmjU5YT1bpt6coOmdFueTJ7DFJL4H1w5eF8yAQ2zsGNTtZ+i5SGFBWpb9AQaw168dydc3s4eu0W0Sirda+F59Q==", + "dev": true, + "requires": { + "@lerna/create-symlink": "3.16.2", + "@lerna/resolve-symlink": "3.16.0", + "@lerna/symlink-binary": "3.17.0", + "fs-extra": "^8.1.0", + "p-finally": "^1.0.0", + "p-map": "^2.1.0", + "p-map-series": "^1.0.0" + } + }, + "@lerna/timer": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-3.13.0.tgz", + "integrity": "sha512-RHWrDl8U4XNPqY5MQHkToWS9jHPnkLZEt5VD+uunCKTfzlxGnRCr3/zVr8VGy/uENMYpVP3wJa4RKGY6M0vkRw==", + "dev": true + }, + "@lerna/validation-error": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-3.13.0.tgz", + "integrity": "sha512-SiJP75nwB8GhgwLKQfdkSnDufAaCbkZWJqEDlKOUPUvVOplRGnfL+BPQZH5nvq2BYSRXsksXWZ4UHVnQZI/HYA==", + "dev": true, + "requires": { + "npmlog": "^4.1.2" + } + }, + "@lerna/version": { + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.22.1.tgz", + "integrity": "sha512-PSGt/K1hVqreAFoi3zjD0VEDupQ2WZVlVIwesrE5GbrL2BjXowjCsTDPqblahDUPy0hp6h7E2kG855yLTp62+g==", + "dev": true, + "requires": { + "@lerna/check-working-tree": "3.16.5", + "@lerna/child-process": "3.16.5", + "@lerna/collect-updates": "3.20.0", + "@lerna/command": "3.21.0", + "@lerna/conventional-commits": "3.22.0", + "@lerna/github-client": "3.22.0", + "@lerna/gitlab-client": "3.15.0", + "@lerna/output": "3.13.0", + "@lerna/prerelease-id-from-version": "3.16.0", + "@lerna/prompt": "3.18.5", + "@lerna/run-lifecycle": "3.16.2", + "@lerna/run-topologically": "3.18.5", + "@lerna/validation-error": "3.13.0", + "chalk": "^2.3.1", + "dedent": "^0.7.0", + "load-json-file": "^5.3.0", + "minimatch": "^3.0.4", + "npmlog": "^4.1.2", + "p-map": "^2.1.0", + "p-pipe": "^1.2.0", + "p-reduce": "^1.0.0", + "p-waterfall": "^1.0.0", + "semver": "^6.2.0", + "slash": "^2.0.0", + "temp-write": "^3.4.0", + "write-json-file": "^3.2.0" + }, + "dependencies": { + "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" + } + }, + "load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + } + } + }, + "@lerna/write-log-file": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-3.13.0.tgz", + "integrity": "sha512-RibeMnDPvlL8bFYW5C8cs4mbI3AHfQef73tnJCQ/SgrXZHehmHnsyWUiE7qDQCAo+B1RfTapvSyFF69iPj326A==", + "dev": true, + "requires": { + "npmlog": "^4.1.2", + "write-file-atomic": "^2.3.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@npmcli/ci-detect": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz", + "integrity": "sha512-oN3y7FAROHhrAt7Rr7PnTSwrHrZVRTS2ZbyxeQwSSYD0ifwM3YNgQqbaRmjcWoPyq77MjchusjJDspbzMmip1Q==", + "dev": true + }, + "@npmcli/git": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.4.tgz", + "integrity": "sha512-OJZCmJ9DNn1cz9HPXXsPmUBnqaArot3CGYo63CyajHQk+g87rPXVOJByGsskQJhPsUUEXJcsZ2Q6bWd2jSwnBA==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^1.1.0", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.3", + "npm-pick-manifest": "^6.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "semver": "^7.3.2", + "unique-filename": "^1.1.1", + "which": "^2.0.2" + }, + "dependencies": { + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.0.tgz", + "integrity": "sha512-/ep6QDxBkm9HvOhOg0heitSd7JHA1U7y1qhhlRlteYYAi9Pdb/ZV7FW5aHpkrpM8+P+4p/jjR8zCyKPBMBjSig==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-pick-manifest": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", + "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1", + "read-package-json-fast": "^1.1.1", + "readdir-scoped-modules": "^1.1.0" + } + }, + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "@npmcli/node-gyp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.1.tgz", + "integrity": "sha512-pBqoKPWmuk9iaEcXlLBVRIA6I1kG9JiICU+sG0NuD6NAR461F+02elHJS4WkQxHW2W5rnsfvP/ClKwmsZ9RaaA==", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.1.tgz", + "integrity": "sha512-G8c86g9cQHyRINosIcpovzv0BkXQc3urhL1ORf3KTe4TS4UBsg2O4Z2feca/W3pfzdHEJzc83ETBW4aKbb3SaA==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^1.0.0", + "@npmcli/promise-spawn": "^1.3.0", + "infer-owner": "^1.0.4", + "node-gyp": "^7.1.0", + "puka": "^1.0.1", + "read-package-json-fast": "^1.1.3" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "tar": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + } + } + }, + "@octokit/auth-token": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.4.tgz", + "integrity": "sha512-LNfGu3Ro9uFAYh10MUZVaT7X2CnNm2C8IDQmabx+3DygYIQjs9FwzFAHN/0t6mu5HEPhxcb1XOuxdpY82vCg2Q==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.10.tgz", + "integrity": "sha512-9+Xef8nT7OKZglfkOMm7IL6VwxXUQyR7DUSU0LH/F7VNqs8vyd7es5pTfz9E7DwUIx7R3pGscxu1EBhYljyu7Q==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + } + } + }, + "@octokit/openapi-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-2.0.0.tgz", + "integrity": "sha512-J4bfM7lf8oZvEAdpS71oTvC1ofKxfEZgU5vKVwzZKi4QPiL82udjpseJwxPid9Pu2FNmyRQOX4iEj6W1iOSnPw==", + "dev": true + }, + "@octokit/plugin-enterprise-rest": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", + "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", + "dev": true + }, + "@octokit/plugin-paginate-rest": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz", + "integrity": "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.1" + }, + "dependencies": { + "@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + } + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.2.tgz", + "integrity": "sha512-oTJSNAmBqyDR41uSMunLQKMX0jmEXbwD1fpz8FG27lScV3RhtGfBa1/BBLym+PxcC16IBlF7KH9vP1BUYxA+Eg==", + "dev": true + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz", + "integrity": "sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.1", + "deprecation": "^2.3.1" + }, + "dependencies": { + "@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + } + } + }, + "@octokit/request": { + "version": "5.4.12", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.12.tgz", + "integrity": "sha512-MvWYdxengUWTGFpfpefBBpVmmEYfkwMoxonIB3sUGp5rhdgwjXL1ejo6JbgzG/QD9B/NYt/9cJX1pxXeSIUCkg==", + "dev": true, + "requires": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.0.0", + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.1", + "once": "^1.4.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/request-error": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.4.tgz", + "integrity": "sha512-LjkSiTbsxIErBiRh5wSZvpZqT4t0/c9+4dOe0PII+6jXR+oj/h66s7E4a/MghV7iT8W9ffoQ5Skoxzs96+gBPA==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + } + } + }, + "@octokit/request-error": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.1.tgz", + "integrity": "sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "dependencies": { + "@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + } + } + }, + "@octokit/rest": { + "version": "16.43.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.43.2.tgz", + "integrity": "sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ==", + "dev": true, + "requires": { + "@octokit/auth-token": "^2.4.0", + "@octokit/plugin-paginate-rest": "^1.1.1", + "@octokit/plugin-request-log": "^1.0.0", + "@octokit/plugin-rest-endpoint-methods": "2.4.0", + "@octokit/request": "^5.2.0", + "@octokit/request-error": "^1.0.2", + "atob-lite": "^2.0.0", + "before-after-hook": "^2.0.0", + "btoa-lite": "^1.0.0", + "deprecation": "^2.0.0", + "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2", + "lodash.uniq": "^4.5.0", + "octokit-pagination-methods": "^1.1.0", + "once": "^1.4.0", + "universal-user-agent": "^4.0.0" + } + }, + "@octokit/types": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.1.1.tgz", + "integrity": "sha512-btm3D6S7VkRrgyYF31etUtVY/eQ1KzrNRqhFt25KSe2mKlXuLXJilglRC6eDA2P6ou94BUnk/Kz5MPEolXgoiw==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^2.0.0", + "@types/node": ">= 8" + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/axios": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz", + "integrity": "sha1-7CMA++fX3d1+udOr+HmZlkyvzkY=", + "requires": { + "axios": "*" + } + }, + "@types/bcryptjs": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", + "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==" + }, + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bson": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", + "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", + "requires": { + "@types/node": "*" + } + }, + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" + }, + "@types/config": { + "version": "0.0.37", + "resolved": "https://registry.npmjs.org/@types/config/-/config-0.0.37.tgz", + "integrity": "sha512-mi2uI9O09hc2J1AoyGz92Apm5N4UkGlNTvjaRgUYHy/G/rCKbwR0fd0b51k5E/PKHIUBCuTAZJgeluh+hHqu/Q==" + }, + "@types/connect": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", + "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==" + }, + "@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==" + }, + "@types/cors": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.9.tgz", + "integrity": "sha512-zurD1ibz21BRlAOIKP8yhrxlqKx6L9VCwkB5kMiP6nZAhoF5MvC7qS1qPA7nRcr1GJolfkQC7/EAL4hdYejLtg==" + }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==" + }, + "@types/eslint": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz", + "integrity": "sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", + "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==" + }, + "@types/express": { + "version": "4.17.9", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.9.tgz", + "integrity": "sha512-SDzEIZInC4sivGIFY4Sz1GG6J9UObPwCInYJjko2jzOf/Imx/dlpume6Xxwj1ORL82tBbmN4cPDIDkLbWHk9hw==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.17.tgz", + "integrity": "sha512-YYlVaCni5dnHc+bLZfY908IG1+x5xuibKZMGv8srKkvtul3wUuanYvpIj9GXXoWkQbaAdR+kgX46IETKUALWNQ==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-57DnyxiqClXOIjoCgeKCUYfKxBPOlOY/k+l1TPK+7bSwyiPTrS5FIk1Ycql7twk4wO7P5lfOVy6akDGiaMSLfw==", + "requires": { + "@types/express": "*" + } + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/jsonwebtoken": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz", + "integrity": "sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg==", + "requires": { + "@types/node": "*" + } + }, + "@types/lodash": { + "version": "4.14.165", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.165.tgz", + "integrity": "sha512-tjSSOTHhI5mCHTy/OOXYIhi2Wt1qcbHmuXD1Ha7q70CgI/I71afO4XtLb/cVexki1oVYchpul/TOuu3Arcdxrg==" + }, + "@types/mime": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", + "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==" + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", + "dev": true + }, + "@types/mocha": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz", + "integrity": "sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ==" + }, + "@types/mongodb": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.3.tgz", + "integrity": "sha512-6YNqGP1hk5bjUFaim+QoFFuI61WjHiHE1BNeB41TA00Xd2K7zG4lcWyLLq/XtIp36uMavvS5hoAUJ+1u/GcX2Q==", + "requires": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "@types/node": { + "version": "14.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", + "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" + }, + "@types/node-fetch": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", + "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/qs": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", + "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==" + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" + }, + "@types/serve-static": { + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz", + "integrity": "sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA==", + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/superagent": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.10.tgz", + "integrity": "sha512-xAgkb2CMWUMCyVc/3+7iQfOEBE75NvuZeezvmixbUw3nmENf2tCnQkW5yQLTYqvXUQ+R6EXxdqKKbal2zM5V/g==", + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.10.0.tgz", + "integrity": "sha512-h6/V46o6aXpKRlarP1AiJEXuCJ7cMQdlpfMDrcllIgX3dFkLwEBTXAoNP98ZoOmqd1xvymMVRAI4e7yVvlzWEg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.10.0", + "@typescript-eslint/scope-manager": "4.10.0", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.10.0.tgz", + "integrity": "sha512-opX+7ai1sdWBOIoBgpVJrH5e89ra1KoLrJTz0UtWAa4IekkKmqDosk5r6xqRaNJfCXEfteW4HXQAwMdx+jjEmw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.10.0", + "@typescript-eslint/types": "4.10.0", + "@typescript-eslint/typescript-estree": "4.10.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.10.0.tgz", + "integrity": "sha512-amBvUUGBMadzCW6c/qaZmfr3t9PyevcSWw7hY2FuevdZVp5QPw/K76VSQ5Sw3BxlgYCHZcK6DjIhSZK0PQNsQg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.10.0", + "@typescript-eslint/types": "4.10.0", + "@typescript-eslint/typescript-estree": "4.10.0", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.10.0.tgz", + "integrity": "sha512-WAPVw35P+fcnOa8DEic0tQUhoJJsgt+g6DEcz257G7vHFMwmag58EfowdVbiNcdfcV27EFR0tUBVXkDoIvfisQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.10.0", + "@typescript-eslint/visitor-keys": "4.10.0" + } + }, + "@typescript-eslint/types": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.10.0.tgz", + "integrity": "sha512-+dt5w1+Lqyd7wIPMa4XhJxUuE8+YF+vxQ6zxHyhLGHJjHiunPf0wSV8LtQwkpmAsRi1lEOoOIR30FG5S2HS33g==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.10.0.tgz", + "integrity": "sha512-mGK0YRp9TOk6ZqZ98F++bW6X5kMTzCRROJkGXH62d2azhghmq+1LNLylkGe6uGUOQzD452NOAEth5VAF6PDo5g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.10.0", + "@typescript-eslint/visitor-keys": "4.10.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.10.0.tgz", + "integrity": "sha512-hPyz5qmDMuZWFtHZkjcCpkAKHX8vdu1G3YsCLEd25ryZgnJfj6FQuJ5/O7R+dB1ueszilJmAFMtlU4CA6se3Jg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.10.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" + }, + "@webassemblyjs/ast": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.1.tgz", + "integrity": "sha512-uMu1nCWn2Wxyy126LlGqRVlhdTOsO/bsBRI4dNq3+6SiSuRKRQX6ejjKgh82LoGAPSq72lDUiQ4FWVaf0PecYw==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.1", + "@webassemblyjs/helper-wasm-bytecode": "1.9.1", + "@webassemblyjs/wast-parser": "1.9.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.1.tgz", + "integrity": "sha512-5VEKu024RySmLKTTBl9q1eO/2K5jk9ZS+2HXDBLA9s9p5IjkaXxWiDb/+b7wSQp6FRdLaH1IVGIfOex58Na2pg==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.1.tgz", + "integrity": "sha512-y1lGmfm38djrScwpeL37rRR9f1D6sM8RhMpvM7CYLzOlHVboouZokXK/G88BpzW0NQBSvCCOnW5BFhten4FPfA==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.1.tgz", + "integrity": "sha512-uS6VSgieHbk/m4GSkMU5cqe/5TekdCzQso4revCIEQ3vpGZgqSSExi4jWpTWwDpAHOIAb1Jfrs0gUB9AA4n71w==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.1.tgz", + "integrity": "sha512-ZQ2ZT6Evk4DPIfD+92AraGYaFIqGm4U20e7FpXwl7WUo2Pn1mZ1v8VGH8i+Y++IQpxPbQo/UyG0Khs7eInskzA==", + "requires": { + "@webassemblyjs/wast-printer": "1.9.1" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.1.tgz", + "integrity": "sha512-J32HGpveEqqcKFS0YbgicB0zAlpfIxJa5MjxDxhu3i5ltPcVfY5EPvKQ1suRguFPehxiUs+/hfkwPEXom/l0lw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.1.tgz", + "integrity": "sha512-IEH2cMmEQKt7fqelLWB5e/cMdZXf2rST1JIrzWmf4XBt3QTxGdnnLvV4DYoN8pJjOx0VYXsWg+yF16MmJtolZg==", + "requires": { + "@webassemblyjs/ast": "1.9.1" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.1.tgz", + "integrity": "sha512-i2rGTBqFUcSXxyjt2K4vm/3kkHwyzG6o427iCjcIKjOqpWH8SEem+xe82jUk1iydJO250/CvE5o7hzNAMZf0dQ==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.1.tgz", + "integrity": "sha512-FetqzjtXZr2d57IECK+aId3D0IcGweeM0CbAnJHkYJkcRTHP+YcMb7Wmc0j21h5UWBpwYGb9dSkK/93SRCTrGg==", + "requires": { + "@webassemblyjs/ast": "1.9.1", + "@webassemblyjs/helper-buffer": "1.9.1", + "@webassemblyjs/helper-wasm-bytecode": "1.9.1", + "@webassemblyjs/wasm-gen": "1.9.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.1.tgz", + "integrity": "sha512-EvTG9M78zP1MmkBpUjGQHZc26DzPGZSLIPxYHCjQsBMo60Qy2W34qf8z0exRDtxBbRIoiKa5dFyWer/7r1aaSQ==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.1.tgz", + "integrity": "sha512-Oc04ub0vFfLnF+2/+ki3AE+anmW4sv9uNBqb+79fgTaPv6xJsOT0dhphNfL3FrME84CbX/D1T9XT8tjFo0IIiw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.1.tgz", + "integrity": "sha512-llkYtppagjCodFjo0alWOUhAkfOiQPQDIc5oA6C9sFAXz7vC9QhZf/f8ijQIX+A9ToM3c9Pq85X0EX7nx9gVhg==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.1.tgz", + "integrity": "sha512-S2IaD6+x9B2Xi8BCT0eGsrXXd8UxAh2LVJpg1ZMtHXnrDcsTtIX2bDjHi40Hio6Lc62dWHmKdvksI+MClCYbbw==", + "requires": { + "@webassemblyjs/ast": "1.9.1", + "@webassemblyjs/helper-buffer": "1.9.1", + "@webassemblyjs/helper-wasm-bytecode": "1.9.1", + "@webassemblyjs/helper-wasm-section": "1.9.1", + "@webassemblyjs/wasm-gen": "1.9.1", + "@webassemblyjs/wasm-opt": "1.9.1", + "@webassemblyjs/wasm-parser": "1.9.1", + "@webassemblyjs/wast-printer": "1.9.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.1.tgz", + "integrity": "sha512-bqWI0S4lBQsEN5FTZ35vYzfKUJvtjNnBobB1agCALH30xNk1LToZ7Z8eiaR/Z5iVECTlBndoRQV3F6mbEqE/fg==", + "requires": { + "@webassemblyjs/ast": "1.9.1", + "@webassemblyjs/helper-wasm-bytecode": "1.9.1", + "@webassemblyjs/ieee754": "1.9.1", + "@webassemblyjs/leb128": "1.9.1", + "@webassemblyjs/utf8": "1.9.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.1.tgz", + "integrity": "sha512-gSf7I7YWVXZ5c6XqTEqkZjVs8K1kc1k57vsB6KBQscSagDNbAdxt6MwuJoMjsE1yWY1tsuL+pga268A6u+Fdkg==", + "requires": { + "@webassemblyjs/ast": "1.9.1", + "@webassemblyjs/helper-buffer": "1.9.1", + "@webassemblyjs/wasm-gen": "1.9.1", + "@webassemblyjs/wasm-parser": "1.9.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.1.tgz", + "integrity": "sha512-ImM4N2T1MEIond0MyE3rXvStVxEmivQrDKf/ggfh5pP6EHu3lL/YTAoSrR7shrbKNPpeKpGesW1LIK/L4kqduw==", + "requires": { + "@webassemblyjs/ast": "1.9.1", + "@webassemblyjs/helper-api-error": "1.9.1", + "@webassemblyjs/helper-wasm-bytecode": "1.9.1", + "@webassemblyjs/ieee754": "1.9.1", + "@webassemblyjs/leb128": "1.9.1", + "@webassemblyjs/utf8": "1.9.1" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.1.tgz", + "integrity": "sha512-2xVxejXSvj3ls/o2TR/zI6p28qsGupjHhnHL6URULQRcXmryn3w7G83jQMcT7PHqUfyle65fZtWLukfdLdE7qw==", + "requires": { + "@webassemblyjs/ast": "1.9.1", + "@webassemblyjs/floating-point-hex-parser": "1.9.1", + "@webassemblyjs/helper-api-error": "1.9.1", + "@webassemblyjs/helper-code-frame": "1.9.1", + "@webassemblyjs/helper-fsm": "1.9.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.1.tgz", + "integrity": "sha512-tDV8V15wm7mmbAH6XvQRU1X+oPGmeOzYsd6h7hlRLz6QpV4Ec/KKxM8OpLtFmQPLCreGxTp+HuxtH4pRIZyL9w==", + "requires": { + "@webassemblyjs/ast": "1.9.1", + "@webassemblyjs/wast-parser": "1.9.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "@zkochan/cmd-shim": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz", + "integrity": "sha512-o8l0+x7C7sMZU3v9GuJIAU10qQLtwR1dtRQIOmlNMtyaqhmpXOzx1HWiYoWfmmf9HHZoAkXpc9TM9PQYF9d4Jg==", + "dev": true, + "requires": { + "is-windows": "^1.0.0", + "mkdirp-promise": "^5.0.1", + "mz": "^2.5.0" + } + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-module-path": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-1.1.0.tgz", + "integrity": "sha1-pqxTaEUPIJufW4bpo+Smq2/nUxw=" + }, + "app-root-dir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", + "integrity": "sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg=" + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "argly": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/argly/-/argly-1.2.0.tgz", + "integrity": "sha1-KydORVGin/XnGZ0u2XiOtm7TbmA=" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", + "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-includes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", + "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "get-intrinsic": "^1.0.1", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "optional": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "atob-lite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", + "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "axios": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz", + "integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "^2.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + } + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==" + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + } + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "test-exclude": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } + } + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "requires": { + "regenerator-transform": "^0.10.0" + }, + "dependencies": { + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + } + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + } + } + }, + "babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + }, + "dependencies": { + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "before-after-hook": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", + "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" + }, + "bl": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.7.0.tgz", + "integrity": "sha1-P7BnBgKsKHjrdw3CA58YNr5irls=", + "requires": { + "readable-stream": "~1.0.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "optional": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "optional": true + }, + "browser-refresh-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/browser-refresh-client/-/browser-refresh-client-1.1.4.tgz", + "integrity": "sha1-jl/4R1/h1UHSroH3oa6gWuIaYhc=" + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "browserslist": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", + "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", + "requires": { + "caniuse-lite": "^1.0.30001165", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.621", + "escalade": "^3.1.1", + "node-releases": "^1.1.67" + } + }, + "bson": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", + "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" + }, + "btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", + "dev": true + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", + "dev": true + }, + "byte-size": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz", + "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + } + } + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + } + } + }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "caniuse-lite": { + "version": "1.0.30001168", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001168.tgz", + "integrity": "sha512-P2zmX7swIXKu+GMMR01TWa4csIKELTNnZKc+f1CjebmZJQtTAEXmpQSoKVJVVcvPGAA0TEYTOUp3VehavZSFPQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "requires": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "char-props": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/char-props/-/char-props-0.1.5.tgz", + "integrity": "sha1-W5UvniDqIc0Iyn/hNaEPb+kcEJ4=" + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cint": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/cint/-/cint-8.2.1.tgz", + "integrity": "sha1-cDhrG0jidz0NYxZqVa/5TvRFahI=", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-table": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.4.tgz", + "integrity": "sha512-1vinpnX/ZERcmE443i3SZTmU5DF0rPO9DrL4I2iVAllhxzCM9SzPlHnz19fsZB78htkKZvYBvj6SZ6vXnaxmTA==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "string-width": "^4.2.0" + }, + "dependencies": { + "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" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" + }, + "columnify": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", + "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", + "dev": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "comment-parser": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.6.tgz", + "integrity": "sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + }, + "dependencies": { + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + } + } + }, + "complain": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/complain/-/complain-1.6.0.tgz", + "integrity": "sha512-9oBfSEfxveaNmo2eSp/vEPkaBVxUhiJTZVgGYayzBchSAXQM6CK1PAQeV5ICShnSgfT+biYzrN7egKwwX+HkCw==", + "requires": { + "error-stack-parser": "^2.0.1" + } + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "config": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/config/-/config-3.3.3.tgz", + "integrity": "sha512-T3RmZQEAji5KYqUQpziWtyGJFli6Khz7h0rpxDwYNjSkr5ynyTWwO7WpfjHzTXclNCDfSWQRcwMb+NwxJesCKw==", + "requires": { + "json5": "^2.1.1" + }, + "dependencies": { + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + } + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "conventional-changelog-angular": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", + "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz", + "integrity": "sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ==", + "dev": true, + "requires": { + "conventional-changelog-writer": "^4.0.6", + "conventional-commits-parser": "^3.0.3", + "dateformat": "^3.0.0", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "2.0.0", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^2.0.3", + "lodash": "^4.2.1", + "normalize-package-data": "^2.3.5", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^3.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", "dev": true }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "conventional-changelog-writer": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.18.tgz", + "integrity": "sha512-mAQDCKyB9HsE8Ko5cCM1Jn1AWxXPYV0v8dFPabZRkvsiWUul2YyAqbIaoMKF88Zf2ffnOPSvKhboLf3fnjo5/A==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.6", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + } + } + }, + "conventional-commits-filter": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz", + "integrity": "sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ==", + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^2.0.0", + "through2": "^4.0.0", + "trim-off-newlines": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + } + } + }, + "conventional-recommended-bump": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz", + "integrity": "sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ==", + "dev": true, + "requires": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.1.1", + "conventional-commits-filter": "^2.0.2", + "conventional-commits-parser": "^3.0.3", + "git-raw-commits": "2.0.0", + "git-semver-tags": "^2.0.3", + "meow": "^4.0.0", + "q": "^1.5.1" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + } + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + } + } + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { - "color-convert": "^1.9.0" + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "default-require-extensions": "^3.0.0" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, + "core-js-compat": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz", + "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==", "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "browserslist": "^4.15.0", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, - "array-differ": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", - "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", - "dev": true + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "array-uniq": "^1.0.1" + "assert-plus": "^1.0.0" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } }, - "arrify": { + "debuglog": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", "dev": true }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", "dev": true, "requires": { - "safer-buffer": "~2.1.0" + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "atob-lite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", - "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=", + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "aws-sign2": { + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "dedent": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" + } + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -1771,2380 +7008,3076 @@ } } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "before-after-hook": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", - "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "denque": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", + "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "deresolve": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deresolve/-/deresolve-1.1.2.tgz", + "integrity": "sha1-nPI3nI0tYx3EuZVylLkOSnLLbOA=", "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "lasso-package-root": "^1.0.0", + "raptor-polyfill": "^1.0.2", + "resolve-from": "^1.0.1" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" } } }, - "btoa-lite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "byline": { + "detect-indent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", - "dev": true - }, - "byte-size": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz", - "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", "dev": true }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } + "requires": { + "asap": "^2.0.0", + "wrappy": "1" } }, - "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "path-type": "^4.0.0" } }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true + "dissolve": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/dissolve/-/dissolve-0.3.3.tgz", + "integrity": "sha1-uX7x/ymJx4nOz7AxB+F0EfqL5uU=", + "requires": { + "bl": "^0.7.0", + "readable-stream": "^1.0.26" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { - "callsites": "^2.0.0" + "esutils": "^2.0.2" } }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", "dev": true, "requires": { - "caller-callsite": "^2.0.0" + "is-obj": "^1.0.0" } }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==" }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.628", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.628.tgz", + "integrity": "sha512-fmhO4YGo/kapy+xL9Eq/cZwDASaTHZu3psIFYo4yc+RY1LzbZr84xjKlDImDrlrmWhOxsrDi98nX097U/xK/cQ==" + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "optional": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "iconv-lite": "^0.6.2" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "once": "^1.4.0" } }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, + "engine.io": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.0.5.tgz", + "integrity": "sha512-Ri+whTNr2PKklxQkfbGjwEo+kCBUM4Qxk4wtLqLrhH+b1up2NFL9g9pjYWiCV/oazwB0rArnvF/ZmZN2ab5Hpg==", "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.1.0", + "engine.io-parser": "~4.0.0", + "ws": "^7.1.2" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "ms": "^2.1.1" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, + "ws": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", + "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==" + } + } + }, + "engine.io-client": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-4.0.5.tgz", + "integrity": "sha512-1lkn0QdekHQPMTcxUh8LqIuxQHNtKV5GvqkQzmZ1rYKAvB6puMm13U7K1ps3OQZ4joE46asQiAKrcdL9weNEVw==", + "requires": { + "base64-arraybuffer": "0.1.4", + "component-emitter": "~1.3.0", + "debug": "~4.1.0", + "engine.io-parser": "~4.0.1", + "has-cors": "1.1.0", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.2.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ansi-regex": "^4.1.0" + "ms": "^2.1.1" } + }, + "ws": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", + "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==" } } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "engine.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "requires": { + "base64-arraybuffer": "0.1.4" + } + }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true + }, + "envinfo": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", + "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "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.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.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-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { - "color-name": "1.1.3" + "es6-promise": "^4.0.3" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", "dev": true }, - "columnify": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", - "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.15.0.tgz", + "integrity": "sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA==", "dev": true, "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } } }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", "dev": true, "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" }, "dependencies": { - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "is-obj": "^2.0.0" + "ms": "2.0.0" } }, - "is-obj": { + "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "eslint-plugin-jsdoc": { + "version": "30.7.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.7.8.tgz", + "integrity": "sha512-OWm2AYvXjCl7nRbpcw5xisfSVkpVAyp4lGqL9T+DeK4kaPm6ecnmTc/G5s1PtcRrwbaI8bIWGzwScqv5CdGyxA==", "dev": true, "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "comment-parser": "^0.7.6", + "debug": "^4.2.0", + "jsdoctypeparser": "^9.0.0", + "lodash": "^4.17.20", + "regextras": "^0.7.1", + "semver": "^7.3.2", + "spdx-expression-parse": "^3.0.1" } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "eslint-plugin-prefer-arrow": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.2.tgz", + "integrity": "sha512-C8YMhL+r8RMeMdYAw/rQtE6xNdMulj+zGWud/qIGnlmomiPRaLDGLMeskZ3alN6uMBojmooRimtdrXebLN4svQ==", "dev": true }, - "conventional-changelog-angular": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", - "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", - "dev": true, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" } }, - "conventional-changelog-core": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz", - "integrity": "sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ==", + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { - "conventional-changelog-writer": "^4.0.6", - "conventional-commits-parser": "^3.0.3", - "dateformat": "^3.0.0", - "get-pkg-repo": "^1.0.0", - "git-raw-commits": "2.0.0", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^2.0.3", - "lodash": "^4.2.1", - "normalize-package-data": "^2.3.5", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^3.0.0" + "eslint-visitor-keys": "^1.1.0" }, "dependencies": { - "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true } } }, - "conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", "dev": true }, - "conventional-changelog-writer": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.18.tgz", - "integrity": "sha512-mAQDCKyB9HsE8Ko5cCM1Jn1AWxXPYV0v8dFPabZRkvsiWUul2YyAqbIaoMKF88Zf2ffnOPSvKhboLf3fnjo5/A==", + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "compare-func": "^2.0.0", - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" + "estraverse": "^5.1.0" }, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - } + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true } } }, - "conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } } }, - "conventional-commits-parser": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==" + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, + "events": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz", - "integrity": "sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ==", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" + }, + "events-light": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/events-light/-/events-light-1.0.5.tgz", + "integrity": "sha1-lk5jRQugr0prAiqpVbF//vZXte4=", + "requires": { + "chai": "^3.5.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^1.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^2.0.0", - "through2": "^4.0.0", - "trim-off-newlines": "^1.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "readable-stream": "3" + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" } } } }, - "conventional-recommended-bump": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz", - "integrity": "sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ==", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.1.1", - "conventional-commits-filter": "^2.0.2", - "conventional-commits-parser": "^3.0.3", - "git-raw-commits": "2.0.0", - "git-semver-tags": "^2.0.3", - "meow": "^4.0.0", - "q": "^1.5.1" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" + "ms": "2.0.0" } }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" + "is-descriptor": "^0.1.0" } }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" + "is-extendable": "^0.1.0" } }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" + "kind-of": "^3.0.2" } }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } } } }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, + "express-session": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz", + "integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==", "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.0", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } } } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } } }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", "requires": { - "ms": "2.0.0" + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "fastq": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", + "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", "dev": true, "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } + "reusify": "^1.0.4" } }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "strip-bom": "^4.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - } + "escape-string-regexp": "^1.0.5" } }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "file-entry-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", "dev": true, "requires": { - "clone": "^1.0.2" + "flat-cache": "^3.0.4" } }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { - "object-keys": "^1.0.12" + "to-regex-range": "^5.0.1" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "kind-of": "^6.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "kind-of": "^6.0.0" + "p-locate": "^4.1.0" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "semver": "^6.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "flatted": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", + "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", "dev": true }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "asap": "^2.0.0", - "wrappy": "1" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true + "follow-redirects": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "requires": { - "path-type": "^3.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" } }, - "dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fp-and-or": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.3.tgz", + "integrity": "sha512-wJaE62fLaB3jCYvY2ZHjZvmKK2iiLiiehX38rz5QZxtdN8fVPJDeZUiVvJrHStdTc+23LHlyZuSEKgFc0pxi2g==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "is-obj": "^1.0.0" + "map-cache": "^0.2.2" } }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "end-of-stream": "^1.0.0", "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "readable-stream": "^2.0.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "requires": { - "iconv-lite": "^0.6.2" + "minipass": "^2.6.0" } }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "fs-walk": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/fs-walk/-/fs-walk-0.0.1.tgz", + "integrity": "sha1-9/yRw64e6tB8mYvF0N1B8tvr0zU=", + "requires": { + "async": "*" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, "requires": { - "once": "^1.4.0" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" } }, - "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "dev": true + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "envinfo": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", - "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", - "dev": true + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true }, - "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", "requires": { - "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "has-symbols": "^1.0.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==", + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "get-port": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", + "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", "dev": true }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "es6-promise": "^4.0.3" + "pump": "^3.0.0" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "assert-plus": "^1.0.0" } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "git-raw-commits": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", + "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, - "ms": { + "map-obj": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "pify": "^3.0.0" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true } } }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "figures": { + "git-remote-origin-url": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "git-semver-tags": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.3.tgz", + "integrity": "sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "meow": "^4.0.0", + "semver": "^6.0.0" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" } - } - } - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + } + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "p-locate": "^4.1.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "semver": "^6.0.0" + "pify": "^3.0.0" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "p-limit": "^2.2.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", "dev": true, "requires": { - "find-up": "^4.0.0" + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true } } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "git-up": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.2.tgz", + "integrity": "sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "is-ssh": "^1.3.0", + "parse-url": "^5.0.0" } }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "git-url-parse": { + "version": "11.4.3", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.4.3.tgz", + "integrity": "sha512-LZTTk0nqJnKN48YRtOpR8H5SEfp1oM2tls90NuZmBxN95PnCvmuXGzqQ4QmVirBgKx2KPYfPGteX3/raWjKenQ==", "dev": true, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" + "git-up": "^4.0.0" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "ini": "^1.3.2" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" }, "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { + "glob-parent": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "requires": { - "shebang-regex": "^3.0.0" + "is-glob": "^2.0.0" } }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "isexe": "^2.0.0" + "is-extglob": "^1.0.0" } } } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "ini": "1.3.7" + }, + "dependencies": { + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + } } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { - "map-cache": "^0.2.2" + "type-fest": "^0.8.1" } }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" } }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "dev": true, "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" } }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "grant": { + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/grant/-/grant-5.4.9.tgz", + "integrity": "sha512-DG7H7Fpm+xr54sndR9zlMp3S9WoijiSrIPMzLWiVKR7RBE3e9ahQ+daCTnaCeXmVFaMo/557M45+7HvpAeDS9g==", + "requires": { + "cookie": "^0.4.1", + "cookie-signature": "^1.1.0", + "jwk-to-pem": "^2.0.3", + "jws": "^4.0.0", + "qs": "^6.9.4", + "request-compose": "^2.1.0", + "request-oauth": "^1.0.0" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "optional": true + }, + "cookie-signature": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.1.0.tgz", + "integrity": "sha512-Alvs19Vgq07eunykd3Xy2jF0/qSNv2u7KDbAek9H5liV1UMijbqFs5cycZvv5dVsvseT/U4H8/7/w8Koh35C4A==", + "optional": true + } } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } } }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", - "dev": true + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, - "get-intrinsic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", - "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "meow": "^3.3.0", - "normalize-package-data": "^2.3.0", - "parse-github-repo-url": "^1.3.0", - "through2": "^2.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "is-buffer": "^1.1.5" } - }, - "strip-bom": { + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "optional": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "is-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true } } }, - "get-port": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", - "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", - "dev": true + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "optional": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, + "htmljs-parser": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/htmljs-parser/-/htmljs-parser-2.9.1.tgz", + "integrity": "sha512-RSjF/OPkltyhUxxs/HK5/be7TyPXwbOc7nEHbXFTHLLEAaS1/iHRfxPFQb9uEbID8TjzpMXCYlKmT++cobey3g==", "requires": { - "pump": "^3.0.0" + "char-props": "^0.1.5", + "complain": "^1.0.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { - "assert-plus": "^1.0.0" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } }, - "git-raw-commits": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", - "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "dev": true, "requires": { - "dargs": "^4.0.1", - "lodash.template": "^4.0.2", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0" + "agent-base": "4", + "debug": "3.1.0" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" + "ms": "2.0.0" } }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { + "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" }, "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } } } }, - "git-semver-tags": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.3.tgz", - "integrity": "sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA==", + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.3.5.tgz", + "integrity": "sha1-gyQOqy+1sAsEqrjHSwRx6cunrYw=" + }, + "import-fresh": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "dev": true, "requires": { - "meow": "^4.0.0", - "semver": "^6.0.0" + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" + "locate-path": "^3.0.0" } }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" + "p-try": "^2.0.0" } }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" + "p-limit": "^2.0.0" } }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } } } }, - "git-up": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.2.tgz", - "integrity": "sha512-kbuvus1dWQB2sSW4cbfTeGpCMd8ge9jx9RKnhXhuJ7tnvT+NIrTVfYZxjtflZddQYcmdOTlkAcjmx7bor+15AQ==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^5.0.0" - } + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, - "git-url-parse": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.4.0.tgz", - "integrity": "sha512-KlIa5jvMYLjXMQXkqpFzobsyD/V2K5DRHl5OAf+6oDFPlPLxrGDVQlIdI63c4/Kt6kai4kALENSALlzTGST3GQ==", - "dev": true, - "requires": { - "git-up": "^4.0.0" - } + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", - "dev": true, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "ini": "^1.3.2" + "once": "^1.3.0", + "wrappy": "1" } }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "init-package-json": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", + "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + } } }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "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 + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dev": true, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" + "loose-envify": "^1.0.0" } }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, - "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", - "dev": true, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" } } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "requires": { - "function-bind": "^1.1.1" + "binary-extensions": "^2.0.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "ci-info": "^2.0.0" } }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -4152,849 +10085,1036 @@ } } }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "^2.0.0" + } }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "requires": { - "agent-base": "4", - "debug": "3.1.0" + "is-extglob": "^2.1.1" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" } }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" } }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", "requires": { - "ms": "^2.0.0" + "is-unc-path": "^0.1.1" } }, - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "is-ssh": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.2.tgz", + "integrity": "sha512-elEw0/0c2UscLrNG+OAorbP539E3rhliKPg+hDMWN9VwrDXfYK+4PBEykDPfxlYYtQvl84TascnQyobfQLHEhQ==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "protocols": "^1.1.0" } }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "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 }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "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": { - "minimatch": "^3.0.4" + "has-symbols": "^1.0.1" } }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", "dev": true, "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } + "text-extensions": "^1.0.0" } }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "unc-path-regex": "^0.1.0" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", "dev": true }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, - "init-package-json": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", - "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", "dev": true, "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "semver": "^6.0.0" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "aggregate-error": "^3.0.0" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true } } }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { - "ci-info": "^2.0.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "requires": { - "has": "^1.0.3" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "requires": { - "kind-of": "^3.0.2" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "is-buffer": "^1.1.5" + "has-flag": "^4.0.0" } } } }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", "dev": true }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, + "js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==" + }, + "js-queue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz", + "integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "easy-stack": "^1.0.1" } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "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==" }, - "is-extendable": { + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "jsdoctypeparser": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", + "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", "dev": true }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "jju": "^1.1.0" } }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { - "has-symbols": "^1.0.1" + "jsonify": "~0.0.0" } }, - "is-ssh": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.2.tgz", - "integrity": "sha512-elEw0/0c2UscLrNG+OAorbP539E3rhliKPg+hDMWN9VwrDXfYK+4PBEykDPfxlYYtQvl84TascnQyobfQLHEhQ==", - "dev": true, - "requires": { - "protocols": "^1.1.0" - } + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "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" - } + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" }, - "is-text-path": { + "json5": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true, + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "requires": { - "text-extensions": "^1.0.0" + "minimist": "^1.2.0" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "jsonlines": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", + "integrity": "sha1-T80kbcXQ44aRkHxEqwAveC0dlMw=", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true + "jwk-to-pem": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.4.tgz", + "integrity": "sha512-4CCK9UBHNWjWtfSHdyu3I6rA8vlN5cWqnVuwY0cOMyXtw6M1tP+yrM8GZpwk+P932Dc3cLag4d35B6CqyIf89A==", + "optional": true, + "requires": { + "asn1.js": "^5.3.0", + "elliptic": "^6.5.3", + "safe-buffer": "^5.0.1" + } }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, "requires": { - "append-transform": "^2.0.0" + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" } }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "dev": true, "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "json-buffer": "3.0.0" } }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "lasso": { + "version": "2.11.24", + "resolved": "https://registry.npmjs.org/lasso/-/lasso-2.11.24.tgz", + "integrity": "sha512-q3FixSAt5I4OeUUadKEWfR7fPivFWhPBwqSAYtda8PwVKivAZ1DFyNFgP3l/1dc4ZfGuZt8R8rcU0YrL11wVag==", "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" + "app-module-path": "^1.1.0", + "app-root-dir": "^1.0.2", + "async": "^0.9.2", + "browser-refresh-client": "^1.1.4", + "glob": "^7.1.1", + "lasso-caching-fs": "^1.0.2", + "lasso-image": "^1.0.12", + "lasso-minify-css": "^1.1.4", + "lasso-minify-js": "^1.4.0", + "lasso-package-root": "^1.0.1", + "lasso-require": "^3.4.4", + "lasso-resolve-css-urls": "^2.0.2", + "lasso-resolve-from": "^1.2.0", + "marko": "^4.2.8", + "mime": "^1.2.11", + "mkdirp": "^0.5.1", + "property-handlers": "^1.1.1", + "raptor-async": "^1.1.3", + "raptor-cache": "^1.2.3", + "raptor-detect": "^1.0.1", + "raptor-logging": "^1.1.2", + "raptor-objects": "^1.0.2", + "raptor-polyfill": "^1.0.2", + "raptor-promises": "^1.0.3", + "raptor-regexp": "^1.0.1", + "raptor-strings": "^1.0.2", + "raptor-util": "^3.2.0", + "resolve-from": "^1.0.1", + "send": "^0.13.2", + "strip-json-comments": "^2.0.1", + "through": "^2.3.8" }, "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "requires": { - "semver": "^6.0.0" + "ms": "0.7.1" } }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", "requires": { - "glob": "^7.1.3" + "inherits": "~2.0.1", + "statuses": "1" } }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=" }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + }, + "send": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.2.tgz", + "integrity": "sha1-dl52B8gFVFK7pvCwUllTUJhgNt4=", "requires": { - "isexe": "^2.0.0" + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "escape-html": "~1.0.3", + "etag": "~1.7.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "~2.3.0", + "range-parser": "~1.0.3", + "statuses": "~1.2.1" + }, + "dependencies": { + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + } } + }, + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" } } }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, + "lasso-babel-transform": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lasso-babel-transform/-/lasso-babel-transform-1.0.2.tgz", + "integrity": "sha512-8AUeZ22LC5onZ6lanBRrdJKYq2D8EVtUoEm3UfMV/lNHD/8NUQEITZ+uRgTMxmSmAV0y68j06hsEUe4lf0tVVQ==", "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "babel-core": "^6.0.14", + "lasso-caching-fs": "^1.0.1", + "lasso-package-root": "^1.0.0", + "strip-json-comments": "^2.0.1" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" } } }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, + "lasso-caching-fs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lasso-caching-fs/-/lasso-caching-fs-1.0.2.tgz", + "integrity": "sha1-m+TrHwaqwSYDRMrq70LC8AhusQ0=", "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "raptor-async": "^1.1.2" + } + }, + "lasso-image": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/lasso-image/-/lasso-image-1.0.13.tgz", + "integrity": "sha1-ZZOAhS/AnTj5ZL8cEQTv/bzpYOE=", + "requires": { + "image-size": "^0.3.3", + "raptor-async": "^1.0.1" + } + }, + "lasso-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lasso-loader/-/lasso-loader-3.0.2.tgz", + "integrity": "sha1-29tV1fcu6zpbrnSn4xtrtf8t0JM=", + "requires": { + "events": "^1.0.2", + "raptor-util": "^1.0.0" }, "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "raptor-util": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-1.1.2.tgz", + "integrity": "sha1-8u6AdqmuPq4uZWcuRqIgB0+i3/M=" } } }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, + "lasso-minify-css": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lasso-minify-css/-/lasso-minify-css-1.1.4.tgz", + "integrity": "sha1-mqlNuBeL8GshR0zDDKY0l10TwB8=", "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "sqwish": "~0.2.1" + } + }, + "lasso-minify-js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/lasso-minify-js/-/lasso-minify-js-1.4.0.tgz", + "integrity": "sha1-8ij0J7tkebSzdxQeN8Tp34Fznks=", + "requires": { + "uglify-js": "^2.7.3" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.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 - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, + "lasso-modules-client": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/lasso-modules-client/-/lasso-modules-client-2.0.7.tgz", + "integrity": "sha512-yYqHNy5OnZGAtKiFIx+K9F6szWxZhRibA3PVi+P2eCfQb9uKCrZnDjea+s4s9M8UXWEm/Af2mrHdx1PMKTSMJQ==", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "lasso-package-root": "^1.0.0", + "raptor-polyfill": "^1.0.2" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "lasso-package-root": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lasso-package-root/-/lasso-package-root-1.0.1.tgz", + "integrity": "sha1-mX0OcfQdA8Xw+gmlvCmNeW+LLCM=", + "requires": { + "lasso-caching-fs": "^1.0.0" + } + }, + "lasso-require": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lasso-require/-/lasso-require-3.5.0.tgz", + "integrity": "sha512-qXBGpZMER5Gtuw3BCBPvfvEK3Vu9MR+ekPRGvKfpuLa+OYSHL6vvcmrQIZJqrCSwCutlge+JNKwCxp6gtbQatQ==", + "requires": { + "assert": "^1.4.1", + "babel-core": "^6.26.3", + "babel-preset-env": "^1.7.0", + "buffer": "^5.2.1", + "clone": "^2.1.2", + "escodegen": "^1.11.0", + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "events": "^3.0.0", + "ignore": "^5.0.2", + "lasso-caching-fs": "^1.0.2", + "lasso-loader": "^3.0.2", + "lasso-modules-client": "^2.0.5", + "lasso-package-root": "^1.0.1", + "lasso-resolve-from": "^1.2.0", + "mkdirp": "^0.5.1", + "path-browserify": "1.0.0", + "process": "^0.11.10", + "raptor-async": "^1.1.3", + "raptor-logging": "^1.1.3", + "raptor-polyfill": "^1.1.0", + "raptor-promises": "^1.0.3", + "raptor-util": "^1.1.2", + "resolve-from": "^4.0.0", + "stream-browserify": "^2.0.1", + "string_decoder": "^1.1.1", + "through": "^2.3.8", + "url": "^0.11.0", + "util": "^0.11.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "raptor-util": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-1.1.2.tgz", + "integrity": "sha1-8u6AdqmuPq4uZWcuRqIgB0+i3/M=" + } + } }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, + "lasso-resolve-css-urls": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lasso-resolve-css-urls/-/lasso-resolve-css-urls-2.0.2.tgz", + "integrity": "sha1-VeWOTvLCu9nk7I+jliBv1KAVdME=", "requires": { - "minimist": "^1.2.5" + "lasso-resolve-from": "^1.0.1", + "raptor-css-parser": "^1.0.2" } }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, + "lasso-resolve-from": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/lasso-resolve-from/-/lasso-resolve-from-1.2.0.tgz", + "integrity": "sha1-v7I0Rnr7abUwn1aLpFnMgyBiHG4=", "requires": { - "graceful-fs": "^4.1.6" + "is-absolute": "^0.2.3", + "lasso-caching-fs": "^1.0.1", + "raptor-util": "^1.0.10", + "resolve-from": "^2.0.0" + }, + "dependencies": { + "raptor-util": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-1.1.2.tgz", + "integrity": "sha1-8u6AdqmuPq4uZWcuRqIgB0+i3/M=" + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + } } }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "package-json": "^6.3.0" } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "lerna": { "version": "3.22.1", @@ -5022,40 +11142,152 @@ "npmlog": "^4.1.2" } }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "libnpmconfig": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/libnpmconfig/-/libnpmconfig-1.2.1.tgz", + "integrity": "sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "find-up": "^3.0.0", + "ini": "^1.3.5" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + } + } + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, + "listener-tracker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/listener-tracker/-/listener-tracker-2.0.0.tgz", + "integrity": "sha1-OWCLQ1wJAfpVECF8FFJyjWvBm18=" + }, "load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "loader-runner": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz", + "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==" + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "p-locate": "^3.0.0", + "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=" + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" }, "lodash._reinterpolate": { "version": "3.0.0", @@ -5063,12 +11295,37 @@ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "requires": { + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" + } + }, + "lodash.endswith": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz", + "integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -5081,12 +11338,67 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, "lodash.ismatch": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", "dev": true }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, "lodash.set": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", @@ -5124,6 +11436,32 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "requires": { + "chalk": "^4.0.0" + } + }, + "long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha1-lyHXiLR+C8taJMLivuGg2lXatRQ=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -5134,13 +11472,18 @@ "signal-exit": "^3.0.0" } }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" } }, "macos-release": { @@ -5166,6 +11509,11 @@ } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, "make-fetch-happen": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", @@ -5183,6 +11531,23 @@ "promise-retry": "^1.1.1", "socks-proxy-agent": "^4.0.0", "ssri": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "map-cache": { @@ -5206,6 +11571,82 @@ "object-visit": "^1.0.0" } }, + "marko": { + "version": "4.23.10", + "resolved": "https://registry.npmjs.org/marko/-/marko-4.23.10.tgz", + "integrity": "sha512-bbDF14OflpFQbIVnbiwqX71unXDQGyW0gjInlcEe6lFY9oaadTiF2DUkamOfQrtObMa3cewmSZyCv+wEZVt/Aw==", + "requires": { + "acorn": "^7.4.0", + "app-module-path": "^2.2.0", + "argly": "^1.0.0", + "browser-refresh-client": "^1.0.0", + "camelcase": "^5.0.0", + "char-props": "~0.1.5", + "complain": "^1.6.0", + "deresolve": "^1.1.2", + "escodegen": "^1.8.1", + "espree": "^7.3.0", + "estraverse": "^4.3.0", + "events-light": "^1.0.0", + "he": "^1.1.0", + "htmljs-parser": "^2.7.1", + "lasso-caching-fs": "^1.0.1", + "lasso-modules-client": "^2.0.4", + "lasso-package-root": "^1.0.1", + "listener-tracker": "^2.0.0", + "minimatch": "^3.0.2", + "property-handlers": "^1.0.0", + "raptor-regexp": "^1.0.0", + "raptor-util": "^3.2.0", + "resolve-from": "^2.0.0", + "self-closing-tags": "^1.0.1", + "simple-sha1": "^2.1.0", + "strip-json-comments": "^2.0.1", + "warp10": "^2.0.1" + }, + "dependencies": { + "app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=" + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + } + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "meow": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", @@ -5250,16 +11691,7 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^4.1.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" + "p-locate": "^4.1.0" } }, "normalize-package-data": { @@ -5274,6 +11706,15 @@ "validate-npm-package-license": "^3.0.1" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -5283,6 +11724,12 @@ "p-limit": "^2.2.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "parse-json": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", @@ -5364,27 +11811,12 @@ } } }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "type-fest": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "yargs-parser": { "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", @@ -5393,44 +11825,50 @@ } } }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, "mime-db": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" }, "mime-types": { "version": "2.1.27", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, "requires": { "mime-db": "1.44.0" } @@ -5441,17 +11879,34 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, "min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "optional": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "optional": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5459,8 +11914,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minimist-options": { "version": "4.1.0", @@ -5481,6 +11935,148 @@ "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-fetch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.2.tgz", + "integrity": "sha512-/i4fX1ss+Dtwyk++OsAI6SEV+eE1dvI6W+0hORdjfruQ7VD5uYTetJIHcEMjWiEiszWjn2aAtP1CB/Q4KfeoYA==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + } + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "minizlib": { @@ -5510,51 +12106,435 @@ "through2": "^2.0.0" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "dev": true, + "requires": { + "mkdirp": "*" + } + }, + "mocha": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", + "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==", + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.4.3", + "debug": "4.2.0", + "diff": "4.0.2", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.2", + "nanoid": "3.1.12", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "7.2.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.2", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "mocha-puppeteer": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/mocha-puppeteer/-/mocha-puppeteer-0.14.0.tgz", + "integrity": "sha512-wajn5TWDZkvBvlkf00ksfuvy3oJ87NWMzl2Hy7f8lJXWLfYcKt/6A/R8X2eNZS7T9iW1353OuxlDxre7gUCf7g==", + "requires": { + "argly": "^1.2.0", + "babel-plugin-istanbul": "^4.1.4", + "babel-polyfill": "^6.26.0", + "bluebird": "^3.5.0", + "body-parser": "^1.18.2", + "express": "^4.15.4", + "fs-walk": "0.0.1", + "lasso": "^2.11.16", + "lasso-babel-transform": "^1.0.1", + "marko": "^4.4.26", + "mocha": "^3.5.0", + "puppeteer": "^0.12.0", + "rimraf": "^2.6.1", + "superagent": "^3.6.0", + "uuid": "^3.1.0" }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "requires": { - "is-plain-object": "^2.0.4" + "graceful-readlink": ">= 1.0.0" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "requires": { + "has-flag": "^1.0.0" } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "dev": true, - "requires": { - "mkdirp": "*" - } - }, "modify-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true }, + "mongodb": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.3.tgz", + "integrity": "sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w==", + "requires": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + }, + "dependencies": { + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + } + } + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -5567,13 +12547,23 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multimatch": { "version": "3.0.0", @@ -5585,6 +12575,17 @@ "array-union": "^1.0.2", "arrify": "^1.0.1", "minimatch": "^3.0.4" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + } } }, "mute-stream": { @@ -5604,6 +12605,11 @@ "thenify-all": "^1.0.0" } }, + "nanoid": { + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", + "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==" + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -5623,11 +12629,21 @@ "to-regex": "^3.0.1" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "nice-try": { "version": "1.0.5", @@ -5638,8 +12654,7 @@ "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, "node-fetch-npm": { "version": "2.0.4", @@ -5671,14 +12686,42 @@ "which": "^1.3.1" }, "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, + "node-ipc": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.1.3.tgz", + "integrity": "sha512-8RS4RZyS/KMKKYG8mrje+cLxwATe9dBCuOiqKFSWND4oOuKytfuKCiR9yinvhoXF/nGdX/WnbywaUee+9U87zA==", + "requires": { + "event-pubsub": "4.3.0", + "js-message": "1.0.7", + "js-queue": "2.0.2" + } + }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -5688,6 +12731,11 @@ "process-on-spawn": "^1.0.0" } }, + "node-releases": { + "version": "1.1.67", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", + "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==" + }, "nopt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", @@ -5702,7 +12750,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -5713,11 +12760,15 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, "normalize-url": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", @@ -5733,6 +12784,116 @@ "npm-normalize-package-bin": "^1.0.1" } }, + "npm-check-updates": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-10.2.5.tgz", + "integrity": "sha512-R0BN+MqE6T12k0iGivF0WKfn3tuaeQuCai0haVvmsr7GcoPXU+yrlHxl9aFlO2XZ6z4m+pCd107YnbJDcRAf8Q==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cint": "^8.2.1", + "cli-table": "^0.3.4", + "commander": "^6.2.0", + "find-up": "5.0.0", + "fp-and-or": "^0.1.3", + "get-stdin": "^8.0.0", + "hosted-git-info": "^3.0.7", + "json-parse-helpfulerror": "^1.0.3", + "jsonlines": "^0.1.1", + "libnpmconfig": "^1.2.1", + "lodash": "^4.17.20", + "p-map": "^4.0.0", + "pacote": "^11.1.13", + "parse-github-url": "^1.0.2", + "progress": "^2.0.3", + "prompts": "^2.4.0", + "rc-config-loader": "^3.0.0", + "remote-git-tags": "^3.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.4", + "semver-utils": "^1.1.4", + "spawn-please": "^1.0.0", + "update-notifier": "^5.0.1" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true + }, + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, "npm-lifecycle": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz", @@ -5747,6 +12908,17 @@ "uid-number": "0.0.6", "umask": "^1.1.0", "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "npm-normalize-package-bin": { @@ -5805,6 +12977,222 @@ } } }, + "npm-registry-fetch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz", + "integrity": "sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA==", + "dev": true, + "requires": { + "@npmcli/ci-detect": "^1.0.0", + "lru-cache": "^6.0.0", + "make-fetch-happen": "^8.0.9", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + }, + "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.3.tgz", + "integrity": "sha512-wn8fw19xKZwdGPO47jivonaHRTd+nGOMP1z11sgGeQzDy2xd5FG0R67dIMcKHDE2cJ5y+YXV30XVGUBPRSY7Hg==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "make-fetch-happen": { + "version": "8.0.12", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.12.tgz", + "integrity": "sha512-cBD7yM72ltWEV+xlLlbimnh5qHwr+thAb/cZLiaZhicVVPVN63BikBvL5OR68+8+z2fvBOgck628vGJ2ulgF6g==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + } + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.0.tgz", + "integrity": "sha512-/ep6QDxBkm9HvOhOg0heitSd7JHA1U7y1qhhlRlteYYAi9Pdb/ZV7FW5aHpkrpM8+P+4p/jjR8zCyKPBMBjSig==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "socks-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" + } + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "tar": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + } + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -5812,6 +13200,14 @@ "dev": true, "requires": { "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + } } }, "npmlog": { @@ -5867,12 +13263,6 @@ "yargs": "^15.0.2" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -5948,6 +13338,15 @@ "semver": "^6.0.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -5966,6 +13365,12 @@ "aggregate-error": "^3.0.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5978,14 +13383,11 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true }, "string-width": { "version": "4.2.0", @@ -5998,15 +13400,6 @@ "strip-ansi": "^6.0.0" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -6052,14 +13445,12 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", @@ -6101,8 +13492,7 @@ "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 + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", @@ -6117,7 +13507,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -6136,6 +13525,15 @@ "es-abstract": "^1.18.0-next.1" } }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -6145,17 +13543,41 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + } + }, "octokit-pagination-methods": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==", "dev": true }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -6169,11 +13591,24 @@ "mimic-fn": "^1.0.0" } }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-name": { "version": "3.1.0", @@ -6188,8 +13623,7 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", @@ -6201,6 +13635,12 @@ "os-tmpdir": "^1.0.0" } }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -6208,21 +13648,19 @@ "dev": true }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "^2.0.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -6262,10 +13700,9 @@ "dev": true }, "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "p-waterfall": { "version": "1.0.0", @@ -6288,6 +13725,195 @@ "release-zalgo": "^1.0.0" } }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "pacote": { + "version": "11.1.13", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.13.tgz", + "integrity": "sha512-oJ7Bg7p3izrIMhZPHCCHmMHQl+xb+pKBXL5ZYeM2oCZrw6sBRSx7f8l7F+95V2qA0BP3c1cNaaBmUNkbo6Hn9w==", + "dev": true, + "requires": { + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.5", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^1.3.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^9.0.0", + "promise-retry": "^1.1.1", + "read-package-json-fast": "^1.1.3", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.1" + }, + "dependencies": { + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.0.tgz", + "integrity": "sha512-/ep6QDxBkm9HvOhOg0heitSd7JHA1U7y1qhhlRlteYYAi9Pdb/ZV7FW5aHpkrpM8+P+4p/jjR8zCyKPBMBjSig==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.4.tgz", + "integrity": "sha512-Qzg2pvXC9U4I4fLnUrBmcIT4x0woLtUgxUi9eC+Zrcv1Xx5eamytGAfbDWQ67j7xOcQ2VW1I3su9smVTIdu7Hw==", + "dev": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "tar": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + } + } + }, "parallel-transform": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", @@ -6299,20 +13925,139 @@ "readable-stream": "^2.1.5" } }, - "parse-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", - "dev": true - }, + "parallel-webpack": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/parallel-webpack/-/parallel-webpack-2.6.0.tgz", + "integrity": "sha512-aOOLfQ40yWWRt8214F0zNWp0DWbeCs7tJaEur0/XUlYU8Yht1sMTYt+eNrbY4VkM4O/SRSme7cdZJTtIantiOw==", + "requires": { + "ajv": "^4.9.2", + "bluebird": "^3.0.6", + "chalk": "^1.1.1", + "interpret": "^1.0.1", + "lodash.assign": "^4.0.8", + "lodash.endswith": "^4.0.1", + "lodash.flatten": "^4.2.0", + "minimist": "^1.2.0", + "node-ipc": "^9.1.0", + "pluralize": "^1.2.1", + "supports-color": "^3.1.2", + "worker-farm": "^1.3.1" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "parse-github-url": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", + "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "error-ex": "^1.2.0" } }, "parse-path": { @@ -6337,12 +14082,32 @@ "protocols": "^1.4.0" } }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, + "path-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.0.tgz", + "integrity": "sha512-Hkavx/nY4/plImrZPHRk2CL9vpOymZLgEbMNX1U0bjcBL7QN9wODxyx0yaMZURSQaUtSEvDrfAvxa9oPb0at9g==" + }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -6352,43 +14117,39 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, "performance-now": { "version": "2.1.0", @@ -6396,47 +14157,80 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, "requires": { "pinkie": "^2.0.0" } }, "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "^3.0.0" + "find-up": "^2.1.0" } }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=" + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "process-on-spawn": { "version": "1.0.0", @@ -6447,6 +14241,11 @@ "fromentries": "^1.2.0" } }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -6463,6 +14262,16 @@ "retry": "^0.10.0" } }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, "promzard": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", @@ -6472,6 +14281,11 @@ "read": "1" } }, + "property-handlers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/property-handlers/-/property-handlers-1.1.1.tgz", + "integrity": "sha1-yyDTIqq32U//rCj0bJGGvVlHtLQ=" + }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -6493,12 +14307,37 @@ "genfun": "^5.0.0" } }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, + "puka": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/puka/-/puka-1.0.1.tgz", + "integrity": "sha512-ssjRZxBd7BT3dte1RR3VoeT2cT/ODH8x+h0rUF1rMqB0srHYf48stSDWfiYakTp5UBZMxroZhB2+ExLDHm7W3g==", + "dev": true + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -6535,20 +14374,69 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "puppeteer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-0.12.0.tgz", + "integrity": "sha512-H/bylN7FccwbN7JZoSP+xRozxgJEDNy4uC4p727cyttKUVNXYjFuEMueJYHW0pblnrfLEH341SyFJVWhJMLxKQ==", + "requires": { + "debug": "^2.6.8", + "extract-zip": "^1.6.5", + "https-proxy-agent": "^2.1.0", + "mime": "^1.3.4", + "progress": "^2.0.0", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, "quick-lru": { "version": "4.0.1", @@ -6556,6 +14444,224 @@ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, + "radix-router": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/radix-router/-/radix-router-3.0.1.tgz", + "integrity": "sha512-jpHXHgP+ZmVzEfmZ7WVRSvc/EqMoAqYuMtBsHd9s47Hs9Iy8FDJhkweMrDH0wmdxanLzVIWhq0UpomLXNpW8tg==" + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raptor-async": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/raptor-async/-/raptor-async-1.1.3.tgz", + "integrity": "sha1-uDw8m2A9yYXCw6n3jStAc+b2Akw=" + }, + "raptor-cache": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/raptor-cache/-/raptor-cache-1.2.3.tgz", + "integrity": "sha1-woEmegoff6bRpURzEfZ06uYbTDM=", + "requires": { + "dissolve": "^0.3.3", + "mkdirp": "^0.5.0", + "property-handlers": "^1.0.0", + "raptor-async": "^1.0.0", + "raptor-logging": "^1.0.1", + "raptor-util": "^1.0.0", + "through": "^2.3.4", + "uuid": "^3.0.0" + }, + "dependencies": { + "raptor-util": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-1.1.2.tgz", + "integrity": "sha1-8u6AdqmuPq4uZWcuRqIgB0+i3/M=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "raptor-css-parser": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/raptor-css-parser/-/raptor-css-parser-1.1.5.tgz", + "integrity": "sha1-HeAY2WEhyNwfHDRoZUmv9xZJ0Dc=", + "requires": { + "raptor-async": "^1.0.0", + "raptor-promises": "^1.0.1" + } + }, + "raptor-detect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/raptor-detect/-/raptor-detect-1.0.1.tgz", + "integrity": "sha1-ClTGOQVu9m39Ur45RfoizG0UZvM=" + }, + "raptor-logging": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/raptor-logging/-/raptor-logging-1.1.3.tgz", + "integrity": "sha512-eklLyQmG5Y2oyIrSsvkFjBkjRYvwjemUQpQhjG757KKaNPxIPX9wu34bfQkIcS7OG495CP28CjX9baABLfOzIw==", + "requires": { + "raptor-polyfill": "^1.0.0", + "raptor-stacktraces": "^1.0.0" + } + }, + "raptor-objects": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/raptor-objects/-/raptor-objects-1.0.2.tgz", + "integrity": "sha1-mQ3ONgQTsHni5K8RTy5zRKcc7hE=", + "requires": { + "raptor-util": "^1.0.0" + }, + "dependencies": { + "raptor-util": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-1.1.2.tgz", + "integrity": "sha1-8u6AdqmuPq4uZWcuRqIgB0+i3/M=" + } + } + }, + "raptor-polyfill": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/raptor-polyfill/-/raptor-polyfill-1.1.0.tgz", + "integrity": "sha512-VhFc5e6EuNGdax7FQ2QWlCdXFi5OBBsclDh0kzZtgBI7lauc8aFs7+htdi5Q3qCRoYXfsucSBsRKf7a3s+YGmA==" + }, + "raptor-promises": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/raptor-promises/-/raptor-promises-1.0.3.tgz", + "integrity": "sha1-1XaxEOBCNlT3/fFyHijULk3DwOs=", + "requires": { + "q": "^1.0.1", + "raptor-util": "^1.0.0" + }, + "dependencies": { + "raptor-util": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-1.1.2.tgz", + "integrity": "sha1-8u6AdqmuPq4uZWcuRqIgB0+i3/M=" + } + } + }, + "raptor-regexp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/raptor-regexp/-/raptor-regexp-1.0.1.tgz", + "integrity": "sha1-7PD2bGZxwM2fXkjDcFAmxVCZlcA=" + }, + "raptor-stacktraces": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/raptor-stacktraces/-/raptor-stacktraces-1.0.1.tgz", + "integrity": "sha1-f5+ycafdza4pHGprFd3v+8wAinY=" + }, + "raptor-strings": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/raptor-strings/-/raptor-strings-1.0.2.tgz", + "integrity": "sha1-ks4ssBU6/pBHDYA5oCVbTPM6tfw=", + "requires": { + "raptor-polyfill": "^1.0.1" + } + }, + "raptor-util": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-3.2.0.tgz", + "integrity": "sha1-I7DIA8jxrIocrmfZpjiLSRYcl1g=" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "rc-config-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-3.0.0.tgz", + "integrity": "sha512-bwfUSB37TWkHfP+PPjb/x8BUjChFmmBK44JMfVnU7paisWqZl/o5k7ttCH+EQLnrbn2Aq8Fo1LAsyUiz+WF4CQ==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "js-yaml": "^3.12.0", + "json5": "^2.1.1", + "require-from-string": "^2.0.2" + }, + "dependencies": { + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -6586,6 +14692,16 @@ "npm-normalize-package-bin": "^1.0.0" } }, + "read-package-json-fast": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.2.1.tgz", + "integrity": "sha512-OFbpwnHcv74Oa5YN5WvbOBfLw6yPmPcwvyJJw/tj9cWFBF7juQUDLDSZiOjEcgzfweWeeROOmbPpNN1qm4hcRg==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, "read-package-tree": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", @@ -6597,97 +14713,42 @@ "util-promisify": "^2.1.0" } }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" }, "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { + "path-type": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "p-limit": "^1.1.0" + "pify": "^2.0.0" } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true } } }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -6701,8 +14762,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, @@ -6718,6 +14778,22 @@ "once": "^1.3.0" } }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, "redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -6728,6 +14804,40 @@ "strip-indent": "^3.0.0" } }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -6738,6 +14848,69 @@ "safe-regex": "^1.1.0" } }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regextras": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", + "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==", + "dev": true + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -6747,23 +14920,31 @@ "es6-error": "^4.0.1" } }, + "remote-git-tags": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", + "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, "requires": { "is-finite": "^1.0.0" } @@ -6794,25 +14975,85 @@ "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "request-compose": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/request-compose/-/request-compose-2.1.0.tgz", + "integrity": "sha512-mIWvU9HA2whb/fHcqeQ0LQXAImCGISqUPyjuFF2rALhym2Fu4ebZGv7wxFA78rsJO/fn2OeEaK54TSjwSwRAFw==" + }, + "request-oauth": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/request-oauth/-/request-oauth-1.0.0.tgz", + "integrity": "sha512-wsDzIq1Qu2itLDlcpFph8xh5Q+FVyUj4os5zdQTlZL/JvZYF/qOyaawVPsxxhDG4QwCB3tzSFprj6dkjqR+e8w==", + "requires": { + "oauth-sign": "^0.9.0", + "qs": "^6.9.3", + "uuid": "^3.4.0" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + }, + "dependencies": { + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } }, "resolve": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, "requires": { "is-core-module": "^2.1.0", "path-parse": "^1.0.6" @@ -6838,8 +15079,7 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, "resolve-url": { "version": "0.2.1", @@ -6847,6 +15087,15 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -6869,10 +15118,24 @@ "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -6884,6 +15147,12 @@ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, + "run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", + "dev": true + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -6893,11 +15162,15 @@ "aproba": "^1.1.1" } }, + "rusha": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.13.tgz", + "integrity": "sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo=" + }, "rxjs": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, "requires": { "tslib": "^1.9.0" } @@ -6905,8 +15178,7 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex": { "version": "1.1.0", @@ -6920,20 +15192,128 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "self-closing-tags": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/self-closing-tags/-/self-closing-tags-1.0.1.tgz", + "integrity": "sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA==" }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "semver-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", + "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.1", @@ -6958,42 +15338,95 @@ } } }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, "requires": { "kind-of": "^6.0.2" } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shx": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.3.tgz", + "integrity": "sha512-nZJ3HFWVoTSyyB+evEKjJ1STiixGztlqwKLTUNV5KqMWtGey9fTd4KU1gdZ1X9BV6215pswQ/Jew9NsuS/fNDA==", + "requires": { + "minimist": "^1.2.3", + "shelljs": "^0.8.4" + } + }, + "sift": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-12.0.1.tgz", + "integrity": "sha512-TVJzYmDLSSK2Qmps/SG16y1UfgQJAB5urJ6iIYNO7Ok+EHnQu/Mh5p31gCLkFMubtOSqWZk7fycRVcsrupQF+w==" + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, + "simple-sha1": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/simple-sha1/-/simple-sha1-2.1.2.tgz", + "integrity": "sha512-TQl9rm4rdKAVmhO++sXAb8TNN0D6JAD5iyI1mqEPNpxUzTRrtm4aOG1pDf/5W/qCFihiaoK6uuL9rvQz1x1VKw==", + "requires": { + "rusha": "^0.8.1" + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, "slide": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", @@ -7114,16 +15547,92 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "^3.2.0" + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.0.4.tgz", + "integrity": "sha512-Vj1jUoO75WGc9txWd311ZJJqS9Dr8QtNJJ7gk2r7dcM/yGe9sit7qOijQl3GAwhpBOz/W8CwkD7R6yob07nLbA==", + "requires": { + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.8", + "@types/node": "^14.14.7", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.1.0", + "engine.io": "~4.0.0", + "socket.io-adapter": "~2.0.3", + "socket.io-parser": "~4.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "socket.io-adapter": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.0.3.tgz", + "integrity": "sha512-2wo4EXgxOGSFueqvHAdnmi5JLZzWqMArjuP4nqC26AtLh5PoCPsaRbRdah2xhcwTAMooZfjYiNVNkkmmSMaxOQ==" + }, + "socket.io-client": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-3.0.4.tgz", + "integrity": "sha512-qMvBuS+W9JIN2mkfAWDCxuIt+jpIKDf8C0604zEqx1JrPaPSS6cN0F3B2GYWC83TqBeVJXW66GFxWV3KD88n0Q==", + "requires": { + "@types/component-emitter": "^1.2.10", + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~4.1.0", + "engine.io-client": "~4.0.0", + "parseuri": "0.0.6", + "socket.io-parser": "~4.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "socket.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.2.tgz", + "integrity": "sha512-Bs3IYHDivwf+bAAuW/8xwJgIiBNtlvnjYRc4PbXgniLmcP1BrakBoq/QhO24rgtgW7VZ7uAaswRGxutUnlAK7g==", + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.1.0" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "is-buffer": "^1.1.5" + "ms": "^2.1.1" } } } @@ -7168,11 +15677,15 @@ "is-plain-obj": "^1.0.0" } }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-resolve": { "version": "0.5.3", @@ -7187,12 +15700,35 @@ "urix": "^0.1.0" } }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "^0.5.6" + } + }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "spawn-please": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-1.0.0.tgz", + "integrity": "sha512-Kz33ip6NRNKuyTRo3aDWyWxeGeM0ORDO552Fs6E1nj4pLWPkl37SrRtTnq+MEopVaqgmaO6bAvVS+v64BJ5M/A==", + "dev": true + }, "spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", @@ -7216,23 +15752,11 @@ "semver": "^6.0.0" } }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -7240,7 +15764,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -7249,14 +15772,12 @@ "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -7265,8 +15786,7 @@ "spdx-license-ids": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" }, "split": { "version": "1.0.1", @@ -7298,8 +15818,12 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sqwish": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/sqwish/-/sqwish-0.2.2.tgz", + "integrity": "sha1-AP4maBBPEii1u37nOe9gEhu8sFc=" }, "sshpk": { "version": "1.16.1", @@ -7327,6 +15851,11 @@ "figgy-pudding": "^3.5.1" } }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -7348,6 +15877,20 @@ } } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", @@ -7365,14 +15908,28 @@ "dev": true }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "string.prototype.trimend": { @@ -7399,7 +15956,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" }, @@ -7407,18 +15963,17 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.0" } }, "strip-bom": { @@ -7442,6 +15997,11 @@ "min-indent": "^1.0.0" } }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, "strong-log-transformer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", @@ -7453,15 +16013,76 @@ "through": "^2.3.4" } }, + "superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "dependencies": { + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "mime": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", + "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, "tar": { "version": "4.4.13", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", @@ -7475,6 +16096,14 @@ "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", "yallist": "^3.0.3" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "temp-dir": { @@ -7502,6 +16131,94 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true + }, + "terser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", + "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + } + } + }, + "terser-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==", + "requires": { + "jest-worker": "^26.6.1", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.8" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -7522,6 +16239,12 @@ "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -7543,8 +16266,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.5", @@ -7568,8 +16290,7 @@ "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 + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-object-path": { "version": "0.3.0", @@ -7591,6 +16312,12 @@ } } }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -7604,15 +16331,18 @@ } }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -7644,45 +16374,90 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, + "ts-loader": { + "version": "8.0.12", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.12.tgz", + "integrity": "sha512-UIivVfGVJDdwwjgSrbtcL9Nf10c1BWnL1mxAQUVcnhNIn/P9W3nP5v60Z0aBMtc7ZrE11lMmU6+5jSgAXmGaYw==", "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^4.0.0", + "semver": "^6.0.0" }, "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "requires": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } } } }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -7703,17 +16478,39 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=" + }, "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typedarray-to-buffer": { "version": "3.1.5", @@ -7724,25 +16521,84 @@ "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", + "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", + "dev": true + }, + "uberproto": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/uberproto/-/uberproto-2.0.6.tgz", + "integrity": "sha512-68H97HffZoFaa3HFtpstahWorN9dSp5uTU6jo3GjIQ6JkJBR3hC2Nx/e/HFOoYHdUyT/Z1MRWfxN1EiQJZUyCQ==" + }, "uglify-js": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.1.tgz", - "integrity": "sha512-o8lHP20KjIiQe5b/67Rh68xEGRrc2SRsCuuoYclXXoC74AfSRGblU1HKzJWH3HxPZ+Ort85fWHpSX7KwBUC9CQ==", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.2.tgz", + "integrity": "sha512-rWYleAvfJPjduYCt+ELvzybNah/zIkRteGXIBO8X0lteRZPGladF61hFi8tU7qKTsF7u6DUQCtT9k00VlFOgkg==", "dev": true, "optional": true }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, "uid-number": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", "dev": true }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, "umask": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz", "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=", "dev": true }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -7773,6 +16629,15 @@ "imurmurhash": "^0.1.4" } }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, "universal-user-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", @@ -7788,6 +16653,11 @@ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -7834,11 +16704,32 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, + "update-notifier": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.0.1.tgz", + "integrity": "sha512-BuVpRdlwxeIOvmc32AGYvO1KVdPlsmqSh8KDDBxS6kDE5VR7R8OMP1d8MdhaVBvxl4H3551k9akXr0Y1iIB2Wg==", + "dev": true, + "requires": { + "boxen": "^4.2.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.2", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.2", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + } + }, "uri-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -7849,17 +16740,56 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util-promisify": { "version": "2.1.0", @@ -7870,17 +16800,26 @@ "object.getownpropertydescriptors": "^2.0.3" } }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -7895,6 +16834,11 @@ "builtins": "^1.0.3" } }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -7906,6 +16850,27 @@ "extsprintf": "^1.2.0" } }, + "warp10": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/warp10/-/warp10-2.0.1.tgz", + "integrity": "sha512-nS1KG2RCVTWepfSitZKzL+HYiqqMJag06KtOJF/LwklrJWeJYRWHjMYpd6GXMt09ot+HIEj+Y4dmQNnNNE0Bjg==" + }, + "watchpack": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.0.tgz", + "integrity": "sha512-UjgD1mqjkG99+3lgG36at4wPnUXNvis2v1utwTgQ43C22c4LD71LsYMExdWXh4HZ+RmW+B0t1Vrg2GpXAkTOQw==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "dependencies": { + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + } + } + }, "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -7921,6 +16886,144 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, + "webpack": { + "version": "5.10.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.10.3.tgz", + "integrity": "sha512-KFPEbpNKfNU4t2CDsUZJ7KpuUbzDqGUCZqLmz4667KSUWMc9BuR3a8jpa72Emv7JUbdGwISD9OZjoI9S5BnHig==", + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.45", + "@webassemblyjs/ast": "1.9.1", + "@webassemblyjs/helper-module-context": "1.9.1", + "@webassemblyjs/wasm-edit": "1.9.1", + "@webassemblyjs/wasm-parser": "1.9.1", + "acorn": "^8.0.4", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.3.1", + "eslint-scope": "^5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.1.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "pkg-dir": "^5.0.0", + "schema-utils": "^3.0.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.0.3", + "watchpack": "^2.0.0", + "webpack-sources": "^2.1.1" + }, + "dependencies": { + "acorn": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", + "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==" + }, + "enhanced-resolve": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.0.tgz", + "integrity": "sha512-ZmqfWURB2lConOBM1JdCVfPyMRv5RdKWktLXO6123p97ovVm2CLBgw9t5MBj3jJWA6eHyOeIws9iJQoGFR4euQ==", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.0.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "requires": { + "find-up": "^5.0.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==" + } + } + }, + "webpack-merge": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.2.tgz", + "integrity": "sha512-7o7qjwcIB6lqHX0VZA2Vxcp8RHftW1LNcaB6t87PEpco/VPlG0Wn9DnvgmcJ0nZU578/vKQfhDSLTF0EZ+pFAg==", + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", + "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, "whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", @@ -7933,10 +17036,9 @@ } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { "isexe": "^2.0.0" } @@ -7944,18 +17046,84 @@ "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, "requires": { "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } } }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, "windows-release": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", @@ -7965,17 +17133,34 @@ "execa": "^1.0.0" } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "workerpool": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", + "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==" + }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, "requires": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", @@ -7985,31 +17170,12 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, "requires": { "ansi-regex": "^4.1.0" } @@ -8019,8 +17185,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "2.4.3", @@ -8057,6 +17222,12 @@ "semver": "^5.6.0" } }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -8097,6 +17268,34 @@ } } }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -8106,14 +17305,12 @@ "y18n": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { "version": "14.2.3", @@ -8134,37 +17331,48 @@ "yargs-parser": "^15.0.1" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "p-try": "^2.0.0" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "p-limit": "^2.0.0" } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true } } }, @@ -8177,6 +17385,58 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + } + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/package.json b/package.json index b81af98c5b..1f484baae4 100644 --- a/package.json +++ b/package.json @@ -25,14 +25,23 @@ "scripts": { "install": "lerna bootstrap", "publish": "lerna publish && git commit -am \"chore: Update changelog\" && git push origin", - "lint": "tslint 'packages/**/*.js' 'packages/**/*.ts' -c tslint.json --fix", + "publish:premajor": "lerna publish premajor --preid pre --pre-dist-tag pre && git commit -am \"chore: Update version and changelog\" && git push origin", + "publish:prerelease": "lerna publish prerelease --preid pre --pre-dist-tag pre && git commit -am \"chore: Update version and changelog\" && git push origin", + "lint": "eslint packages/**/src/**/*.ts packages/**/test/**/*.ts --fix", "update-dependencies": "ncu -u && lerna exec -- ncu -u", "clean": "find . -name node_modules -exec rm -rf '{}' + && find . -name package-lock.json -exec rm -rf '{}' +", "test": "npm run lint && nyc lerna run test" }, "devDependencies": { + "@typescript-eslint/eslint-plugin": "^4.10.0", + "@typescript-eslint/parser": "^4.10.0", + "eslint": "^7.15.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsdoc": "^30.7.8", + "eslint-plugin-prefer-arrow": "^1.2.2", "lerna": "^3.22.1", + "npm-check-updates": "^10.2.5", "nyc": "^15.1.0", - "tslint": "^6.1.3" + "typescript": "^4.1.2" } } diff --git a/packages/adapter-commons/CHANGELOG.md b/packages/adapter-commons/CHANGELOG.md index cc44f5b2a6..e559f611c9 100644 --- a/packages/adapter-commons/CHANGELOG.md +++ b/packages/adapter-commons/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0-pre.1](https://github.com/feathersjs/databases/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + +### Features + +* **memory:** Move feathers-memory into @feathersjs/adapter-memory ([#2153](https://github.com/feathersjs/databases/issues/2153)) ([dd61fe3](https://github.com/feathersjs/databases/commit/dd61fe371fb0502f78b8ccbe1f45a030e31ecff6)) + + + + + ## [4.5.11](https://github.com/feathersjs/databases/compare/v4.5.10...v4.5.11) (2020-12-05) **Note:** Version bump only for package @feathersjs/adapter-commons diff --git a/packages/adapter-commons/package.json b/packages/adapter-commons/package.json index 28d594f53a..55e7e71a81 100644 --- a/packages/adapter-commons/package.json +++ b/packages/adapter-commons/package.json @@ -1,6 +1,6 @@ { "name": "@feathersjs/adapter-commons", - "version": "4.5.11", + "version": "5.0.0-pre.1", "description": "Shared database adapter utility functions", "homepage": "https://feathersjs.com", "keywords": [ @@ -32,7 +32,7 @@ "scripts": { "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", - "test": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -48,9 +48,9 @@ "access": "public" }, "dependencies": { - "@feathersjs/commons": "^4.5.11", - "@feathersjs/errors": "^4.5.11", - "@feathersjs/feathers": "^4.5.11" + "@feathersjs/commons": "^5.0.0-pre.1", + "@feathersjs/errors": "^5.0.0-pre.1", + "@feathersjs/feathers": "^5.0.0-pre.1" }, "devDependencies": { "@types/mocha": "^8.0.4", diff --git a/packages/adapter-commons/src/filter-query.ts b/packages/adapter-commons/src/filter-query.ts index a4588f2bdb..d1db78206c 100644 --- a/packages/adapter-commons/src/filter-query.ts +++ b/packages/adapter-commons/src/filter-query.ts @@ -99,7 +99,7 @@ export const OPERATORS = ['$in', '$nin', '$lt', '$lte', '$gt', '$gte', '$ne', '$ // Converts Feathers special query parameters and pagination settings // and returns them separately a `filters` and the rest of the query // as `query` -export default function filterQuery (query: any, options: any = {}) { +export function filterQuery (query: any, options: any = {}) { const { filters: additionalFilters = {}, operators: additionalOperators = [] @@ -113,7 +113,3 @@ export default function filterQuery (query: any, options: any = {}) { return result; } - -if (typeof module !== 'undefined') { - module.exports = Object.assign(filterQuery, module.exports); -} diff --git a/packages/adapter-commons/src/index.ts b/packages/adapter-commons/src/index.ts index d5ad7d0399..bfb73448d0 100644 --- a/packages/adapter-commons/src/index.ts +++ b/packages/adapter-commons/src/index.ts @@ -1,7 +1,7 @@ import { _ } from '@feathersjs/commons'; -export { AdapterService, InternalServiceMethods, ServiceOptions } from './service'; -export { default as filterQuery, FILTERS, OPERATORS } from './filter-query'; +export { AdapterService, InternalServiceMethods, ServiceOptions, Paginated } from './service'; +export { filterQuery, FILTERS, OPERATORS } from './filter-query'; export * from './sort'; // Return a function that filters a result object or array diff --git a/packages/adapter-commons/src/service.ts b/packages/adapter-commons/src/service.ts index bc004ceef1..e6763c1c19 100644 --- a/packages/adapter-commons/src/service.ts +++ b/packages/adapter-commons/src/service.ts @@ -1,6 +1,13 @@ import { NotImplemented, BadRequest, MethodNotAllowed } from '@feathersjs/errors'; -import { ServiceMethods, Params, Paginated, Id, NullableId } from '@feathersjs/feathers'; -import filterQuery from './filter-query'; +import { ServiceMethods, Params, Id, NullableId } from '@feathersjs/feathers'; +import { filterQuery } from './filter-query'; + +export interface Paginated { + total: number; + limit: number; + skip: number; + data: T[]; +} const callMethod = (self: any, name: any, ...args: any[]) => { if (typeof self[name] !== 'function') { @@ -104,7 +111,7 @@ export interface InternalServiceMethods { _remove (id: NullableId, params?: Params): Promise; } -export class AdapterService implements ServiceMethods { +export class AdapterService implements ServiceMethods> { options: ServiceOptions; constructor (options: Partial) { @@ -166,7 +173,7 @@ export class AdapterService implements ServiceMethods { create (data: Partial | Partial[], params?: Params): Promise { if (Array.isArray(data) && !this.allowsMulti('create')) { - return Promise.reject(new MethodNotAllowed(`Can not create multiple entries`)); + return Promise.reject(new MethodNotAllowed('Can not create multiple entries')); } return callMethod(this, '_create', data, params); @@ -175,7 +182,7 @@ export class AdapterService implements ServiceMethods { update (id: Id, data: T, params?: Params): Promise { if (id === null || Array.isArray(data)) { return Promise.reject(new BadRequest( - `You can not replace multiple instances. Did you mean 'patch'?` + 'You can not replace multiple instances. Did you mean \'patch\'?' )); } @@ -184,7 +191,7 @@ export class AdapterService implements ServiceMethods { patch (id: NullableId, data: Partial, params?: Params): Promise { if (id === null && !this.allowsMulti('patch')) { - return Promise.reject(new MethodNotAllowed(`Can not patch multiple entries`)); + return Promise.reject(new MethodNotAllowed('Can not patch multiple entries')); } return callMethod(this, '_patch', id, data, params); @@ -192,7 +199,7 @@ export class AdapterService implements ServiceMethods { remove (id: NullableId, params?: Params): Promise { if (id === null && !this.allowsMulti('remove')) { - return Promise.reject(new MethodNotAllowed(`Can not remove multiple entries`)); + return Promise.reject(new MethodNotAllowed('Can not remove multiple entries')); } return callMethod(this, '_remove', id, params); diff --git a/packages/adapter-commons/test/service.test.ts b/packages/adapter-commons/test/service.test.ts index 2831bcbaea..c098d7b673 100644 --- a/packages/adapter-commons/test/service.test.ts +++ b/packages/adapter-commons/test/service.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ import assert from 'assert'; import { NotImplemented } from '@feathersjs/errors'; import { AdapterService, InternalServiceMethods } from '../src'; diff --git a/packages/adapter-memory/CHANGELOG.md b/packages/adapter-memory/CHANGELOG.md new file mode 100644 index 0000000000..324b464aeb --- /dev/null +++ b/packages/adapter-memory/CHANGELOG.md @@ -0,0 +1,384 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [5.0.0-pre.1](https://github.com/feathersjs/databases/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + +### Features + +* **memory:** Move feathers-memory into @feathersjs/adapter-memory ([#2153](https://github.com/feathersjs/databases/issues/2153)) ([dd61fe3](https://github.com/feathersjs/databases/commit/dd61fe371fb0502f78b8ccbe1f45a030e31ecff6)) + + + + + +# Change Log + +## [v4.1.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v4.1.0) (2019-10-07) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v4.0.1...v4.1.0) + +**Merged pull requests:** + +- Update all dependencies [\#104](https://github.com/feathersjs-ecosystem/feathers-memory/pull/104) ([daffl](https://github.com/daffl)) + +## [v4.0.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v4.0.1) (2019-09-29) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v4.0.0...v4.0.1) + +**Closed issues:** + +- An in-range update of @types/node is breaking the build 🚨 [\#101](https://github.com/feathersjs-ecosystem/feathers-memory/issues/101) +- An in-range update of webpack is breaking the build 🚨 [\#98](https://github.com/feathersjs-ecosystem/feathers-memory/issues/98) + +**Merged pull requests:** + +- Pass entity type to AdapterService\ [\#103](https://github.com/feathersjs-ecosystem/feathers-memory/pull/103) ([daffl](https://github.com/daffl)) +- Update semistandard to the latest version 🚀 [\#102](https://github.com/feathersjs-ecosystem/feathers-memory/pull/102) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- Update dtslint to the latest version 🚀 [\#100](https://github.com/feathersjs-ecosystem/feathers-memory/pull/100) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- Greenkeeper/webpack 4.36.1 [\#99](https://github.com/feathersjs-ecosystem/feathers-memory/pull/99) ([daffl](https://github.com/daffl)) + +## [v4.0.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v4.0.0) (2019-07-05) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v3.0.2...v4.0.0) + +**Merged pull requests:** + +- Add TypeScript definitions and upgrade to Feathers 4 [\#97](https://github.com/feathersjs-ecosystem/feathers-memory/pull/97) ([daffl](https://github.com/daffl)) +- Update mocha to the latest version 🚀 [\#94](https://github.com/feathersjs-ecosystem/feathers-memory/pull/94) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v3.0.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v3.0.2) (2019-01-24) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v3.0.1...v3.0.2) + +**Closed issues:** + +- Multiple patch records [\#92](https://github.com/feathersjs-ecosystem/feathers-memory/issues/92) + +**Merged pull requests:** + +- Allow patch to update prop that is within the query [\#93](https://github.com/feathersjs-ecosystem/feathers-memory/pull/93) ([Mattchewone](https://github.com/Mattchewone)) +- Add new tests [\#91](https://github.com/feathersjs-ecosystem/feathers-memory/pull/91) ([daffl](https://github.com/daffl)) +- Update @feathersjs/adapter-commons to the latest version 🚀 [\#90](https://github.com/feathersjs-ecosystem/feathers-memory/pull/90) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v3.0.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v3.0.1) (2018-12-29) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v3.0.0...v3.0.1) + +**Merged pull requests:** + +- Add default params to hook-less methods [\#89](https://github.com/feathersjs-ecosystem/feathers-memory/pull/89) ([daffl](https://github.com/daffl)) + +## [v3.0.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v3.0.0) (2018-12-17) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.2.0...v3.0.0) + +**Closed issues:** + +- An in-range update of webpack is breaking the build 🚨 [\#84](https://github.com/feathersjs-ecosystem/feathers-memory/issues/84) +- An in-range update of @feathersjs/errors is breaking the build 🚨 [\#83](https://github.com/feathersjs-ecosystem/feathers-memory/issues/83) + +**Merged pull requests:** + +- Update to @feathersjs/adapter-commons and drop Node 6 [\#88](https://github.com/feathersjs-ecosystem/feathers-memory/pull/88) ([daffl](https://github.com/daffl)) +- Update semistandard to the latest version 🚀 [\#87](https://github.com/feathersjs-ecosystem/feathers-memory/pull/87) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- Update all dependencies and Webpack build [\#85](https://github.com/feathersjs-ecosystem/feathers-memory/pull/85) ([daffl](https://github.com/daffl)) +- Update babel-loader to the latest version 🚀 [\#81](https://github.com/feathersjs-ecosystem/feathers-memory/pull/81) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v2.2.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.2.0) (2018-08-26) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.1.3...v2.2.0) + +**Closed issues:** + +- Previously functional batch service no longer works when creating in-memory service [\#77](https://github.com/feathersjs-ecosystem/feathers-memory/issues/77) + +**Merged pull requests:** + +- Remove cloneDeep dependency [\#80](https://github.com/feathersjs-ecosystem/feathers-memory/pull/80) ([daffl](https://github.com/daffl)) +- Fix cloning of instances [\#79](https://github.com/feathersjs-ecosystem/feathers-memory/pull/79) ([homerjam](https://github.com/homerjam)) +- Update sift to the latest version 🚀 [\#76](https://github.com/feathersjs-ecosystem/feathers-memory/pull/76) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v2.1.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.1.3) (2018-06-11) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.1.2...v2.1.3) + +**Closed issues:** + +- Use with create-react-app [\#74](https://github.com/feathersjs-ecosystem/feathers-memory/issues/74) + +**Merged pull requests:** + +- Transpile all Feathers modules for distributable [\#75](https://github.com/feathersjs-ecosystem/feathers-memory/pull/75) ([saiichihashimoto](https://github.com/saiichihashimoto)) +- Update shx to the latest version 🚀 [\#73](https://github.com/feathersjs-ecosystem/feathers-memory/pull/73) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v2.1.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.1.2) (2018-06-03) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.1.1...v2.1.2) + +**Merged pull requests:** + +- Update uberproto to the latest version 🚀 [\#72](https://github.com/feathersjs-ecosystem/feathers-memory/pull/72) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- Update clone-deep to the latest version 🚀 [\#70](https://github.com/feathersjs-ecosystem/feathers-memory/pull/70) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v2.1.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.1.1) (2018-03-07) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.1.0...v2.1.1) + +**Closed issues:** + +- Why are all the data deleted after the server is rebooted? [\#68](https://github.com/feathersjs-ecosystem/feathers-memory/issues/68) + +**Merged pull requests:** + +- Update webpack to the latest version 🚀 [\#69](https://github.com/feathersjs-ecosystem/feathers-memory/pull/69) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- Update clone-deep to the latest version 🚀 [\#67](https://github.com/feathersjs-ecosystem/feathers-memory/pull/67) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- Update mocha to the latest version 🚀 [\#66](https://github.com/feathersjs-ecosystem/feathers-memory/pull/66) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- Update semistandard to the latest version 🚀 [\#65](https://github.com/feathersjs-ecosystem/feathers-memory/pull/65) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v2.1.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.1.0) (2017-12-03) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.0.0...v2.1.0) + +**Merged pull requests:** + +- Use namespaced module name for exporting [\#64](https://github.com/feathersjs-ecosystem/feathers-memory/pull/64) ([daffl](https://github.com/daffl)) + +## [v2.0.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.0.0) (2017-12-03) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.3.1...v2.0.0) + +**Merged pull requests:** + +- Client build [\#63](https://github.com/feathersjs-ecosystem/feathers-memory/pull/63) ([daffl](https://github.com/daffl)) +- Upgrade to Feathers Buzzard \(v3\) [\#62](https://github.com/feathersjs-ecosystem/feathers-memory/pull/62) ([daffl](https://github.com/daffl)) +- Update to new plugin infrastructure [\#61](https://github.com/feathersjs-ecosystem/feathers-memory/pull/61) ([daffl](https://github.com/daffl)) +- Update clone-deep to the latest version 🚀 [\#60](https://github.com/feathersjs-ecosystem/feathers-memory/pull/60) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v1.3.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.3.1) (2017-10-20) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.3.0...v1.3.1) + +**Closed issues:** + +- Custom $select returning `id` [\#58](https://github.com/feathersjs-ecosystem/feathers-memory/issues/58) +- Best practice for $search [\#51](https://github.com/feathersjs-ecosystem/feathers-memory/issues/51) + +**Merged pull requests:** + +- Do not select the id by default [\#59](https://github.com/feathersjs-ecosystem/feathers-memory/pull/59) ([daffl](https://github.com/daffl)) + +## [v1.3.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.3.0) (2017-10-19) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.2.1...v1.3.0) + +**Merged pull requests:** + +- Modified matcher to use new sift package [\#57](https://github.com/feathersjs-ecosystem/feathers-memory/pull/57) ([Mattchewone](https://github.com/Mattchewone)) +- Update mocha to the latest version 🚀 [\#56](https://github.com/feathersjs-ecosystem/feathers-memory/pull/56) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v1.2.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.2.1) (2017-09-13) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.2.0...v1.2.1) + +## [v1.2.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.2.0) (2017-09-13) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.1.0...v1.2.0) + +**Closed issues:** + +- \[RFE\] An option to set the type of the id field to String [\#54](https://github.com/feathersjs-ecosystem/feathers-memory/issues/54) + +**Merged pull requests:** + +- Deep clone objects before returning [\#55](https://github.com/feathersjs-ecosystem/feathers-memory/pull/55) ([daffl](https://github.com/daffl)) +- Update feathers-socketio to the latest version 🚀 [\#52](https://github.com/feathersjs-ecosystem/feathers-memory/pull/52) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- Update feathers-service-tests to the latest version 🚀 [\#50](https://github.com/feathersjs-ecosystem/feathers-memory/pull/50) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- Update semistandard to the latest version 🚀 [\#49](https://github.com/feathersjs-ecosystem/feathers-memory/pull/49) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- Update dependencies to enable Greenkeeper 🌴 [\#48](https://github.com/feathersjs-ecosystem/feathers-memory/pull/48) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v1.1.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.1.0) (2017-01-31) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.0.1...v1.1.0) + +**Merged pull requests:** + +- Allow to pass a custom matcher and sorter in the options [\#47](https://github.com/feathersjs-ecosystem/feathers-memory/pull/47) ([daffl](https://github.com/daffl)) +- Change `var` to `const`, fix a mistake with `feathers-memory` requiring [\#46](https://github.com/feathersjs-ecosystem/feathers-memory/pull/46) ([osenvosem](https://github.com/osenvosem)) + +## [v1.0.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.0.1) (2016-11-15) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.0.0...v1.0.1) + +**Merged pull requests:** + +- feathers-service-tests@0.9.1 breaks build 🚨 [\#45](https://github.com/feathersjs-ecosystem/feathers-memory/pull/45) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) + +## [v1.0.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.0.0) (2016-11-11) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.8.1...v1.0.0) + +**Closed issues:** + +- Support $select for gets [\#35](https://github.com/feathersjs-ecosystem/feathers-memory/issues/35) + +**Merged pull requests:** + +- Update feathers-service-tests to version 0.9.0 🚀 [\#44](https://github.com/feathersjs-ecosystem/feathers-memory/pull/44) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) +- Update feathers-commons to version 0.8.0 🚀 [\#43](https://github.com/feathersjs-ecosystem/feathers-memory/pull/43) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) + +## [v0.8.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.8.1) (2016-11-02) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.8.0...v0.8.1) + +**Merged pull requests:** + +- fix $select with more than one field [\#42](https://github.com/feathersjs-ecosystem/feathers-memory/pull/42) ([t2t2](https://github.com/t2t2)) +- babel-preset-es2015@6.18.0 breaks build 🚨 [\#41](https://github.com/feathersjs-ecosystem/feathers-memory/pull/41) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) +- Two tweaks for clean build and tests on Windows [\#38](https://github.com/feathersjs-ecosystem/feathers-memory/pull/38) ([ghost](https://github.com/ghost)) +- jshint —\> semistandard [\#37](https://github.com/feathersjs-ecosystem/feathers-memory/pull/37) ([marshallswain](https://github.com/marshallswain)) +- adding code coverage reporting [\#36](https://github.com/feathersjs-ecosystem/feathers-memory/pull/36) ([ekryski](https://github.com/ekryski)) +- Update feathers-service-tests to version 0.8.0 🚀 [\#32](https://github.com/feathersjs-ecosystem/feathers-memory/pull/32) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) + +## [v0.8.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.8.0) (2016-09-08) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.5...v0.8.0) + +**Closed issues:** + +- Remove object from memory once sent? [\#30](https://github.com/feathersjs-ecosystem/feathers-memory/issues/30) + +**Merged pull requests:** + +- Update service tests, id and events option [\#31](https://github.com/feathersjs-ecosystem/feathers-memory/pull/31) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) +- Update mocha to version 3.0.0 🚀 [\#29](https://github.com/feathersjs-ecosystem/feathers-memory/pull/29) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) + +## [v0.7.5](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.5) (2016-07-25) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.4...v0.7.5) + +## [v0.7.4](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.4) (2016-07-21) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.3...v0.7.4) + +**Merged pull requests:** + +- Update feathers-query-filters to version 2.0.0 🚀 [\#28](https://github.com/feathersjs-ecosystem/feathers-memory/pull/28) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) + +## [v0.7.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.3) (2016-06-16) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.2...v0.7.3) + +**Merged pull requests:** + +- Update feathers-service-tests to version 0.6.0 🚀 [\#27](https://github.com/feathersjs-ecosystem/feathers-memory/pull/27) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) + +## [v0.7.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.2) (2016-06-14) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.1...v0.7.2) + +**Closed issues:** + +- Support $search [\#14](https://github.com/feathersjs-ecosystem/feathers-memory/issues/14) + +**Merged pull requests:** + +- Use the original id if it can be coerced [\#26](https://github.com/feathersjs-ecosystem/feathers-memory/pull/26) ([daffl](https://github.com/daffl)) +- mocha@2.5.0 breaks build 🚨 [\#25](https://github.com/feathersjs-ecosystem/feathers-memory/pull/25) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) +- Update babel-plugin-add-module-exports to version 0.2.0 🚀 [\#24](https://github.com/feathersjs-ecosystem/feathers-memory/pull/24) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) + +## [v0.7.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.1) (2016-04-05) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.0...v0.7.1) + +## [v0.7.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.0) (2016-04-04) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.6.3...v0.7.0) + +**Merged pull requests:** + +- Move to feathers-commons utilities [\#20](https://github.com/feathersjs-ecosystem/feathers-memory/pull/20) ([daffl](https://github.com/daffl)) + +## [v0.6.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.6.3) (2016-02-25) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.6.2...v0.6.3) + +**Closed issues:** + +- Upgrade to lodash 4 [\#17](https://github.com/feathersjs-ecosystem/feathers-memory/issues/17) + +**Merged pull requests:** + +- Use individual Lodash methods [\#19](https://github.com/feathersjs-ecosystem/feathers-memory/pull/19) ([daffl](https://github.com/daffl)) + +## [v0.6.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.6.2) (2016-02-24) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.6.1...v0.6.2) + +**Merged pull requests:** + +- bumping feathers-errors version [\#16](https://github.com/feathersjs-ecosystem/feathers-memory/pull/16) ([ekryski](https://github.com/ekryski)) + +## [v0.6.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.6.1) (2016-02-22) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.6.0...v0.6.1) + +**Merged pull requests:** + +- Exmaple update [\#15](https://github.com/feathersjs-ecosystem/feathers-memory/pull/15) ([ekryski](https://github.com/ekryski)) + +## [v0.6.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.6.0) (2016-01-30) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.5.3...v0.6.0) + +**Merged pull requests:** + +- Use internal methods instead of service methods directly [\#13](https://github.com/feathersjs-ecosystem/feathers-memory/pull/13) ([daffl](https://github.com/daffl)) + +## [v0.5.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.5.3) (2016-01-23) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.5.2...v0.5.3) + +## [v0.5.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.5.2) (2016-01-23) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.5.1...v0.5.2) + +**Merged pull requests:** + +- Adding nsp check [\#12](https://github.com/feathersjs-ecosystem/feathers-memory/pull/12) ([marshallswain](https://github.com/marshallswain)) + +## [v0.5.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.5.1) (2015-12-19) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.5.0...v0.5.1) + +## [v0.5.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.5.0) (2015-12-03) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.4.1...v0.5.0) + +## [v0.4.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.4.1) (2015-12-03) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.4.0...v0.4.1) + +**Merged pull requests:** + +- Use ES6 classes, Promises and support pagination [\#11](https://github.com/feathersjs-ecosystem/feathers-memory/pull/11) ([daffl](https://github.com/daffl)) + +## [v0.4.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.4.0) (2015-11-07) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.4...v0.4.0) + +**Closed issues:** + +- How properly append values to an existing memory element [\#9](https://github.com/feathersjs-ecosystem/feathers-memory/issues/9) +- how to initialize memory on app startup [\#8](https://github.com/feathersjs-ecosystem/feathers-memory/issues/8) +- Add query-filter support [\#7](https://github.com/feathersjs-ecosystem/feathers-memory/issues/7) +- Remove sorting and other processing from core service [\#4](https://github.com/feathersjs-ecosystem/feathers-memory/issues/4) + +**Merged pull requests:** + +- Migrate to ES6 plugin infrastructure and shared feathers-service-tests [\#10](https://github.com/feathersjs-ecosystem/feathers-memory/pull/10) ([daffl](https://github.com/daffl)) +- Added support for simple query in find [\#6](https://github.com/feathersjs-ecosystem/feathers-memory/pull/6) ([ruimgoncalves](https://github.com/ruimgoncalves)) + +## [0.3.4](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.4) (2014-09-25) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.3...0.3.4) + +**Closed issues:** + +- Query and persisting Data [\#5](https://github.com/feathersjs-ecosystem/feathers-memory/issues/5) + +## [0.3.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.3) (2014-06-13) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.2...0.3.3) + +## [0.3.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.2) (2014-06-13) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.1...0.3.2) + +## [0.3.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.1) (2014-06-13) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.0...0.3.1) + +**Closed issues:** + +- Fix peer dependency [\#3](https://github.com/feathersjs-ecosystem/feathers-memory/issues/3) +- Should support `patch` service method [\#2](https://github.com/feathersjs-ecosystem/feathers-memory/issues/2) +- Need to return proper errors [\#1](https://github.com/feathersjs-ecosystem/feathers-memory/issues/1) + +## [0.3.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.0) (2014-06-05) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.2.1...0.3.0) + +## [0.2.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.2.1) (2014-06-04) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.2.0...0.2.1) + +## [0.2.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.2.0) (2014-04-22) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.1.2...0.2.0) + +## [0.1.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.1.2) (2014-04-11) +[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.1.1...0.1.2) + +## [0.1.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.1.1) (2014-04-11) + + +\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* diff --git a/packages/primus-client/LICENSE b/packages/adapter-memory/LICENSE similarity index 100% rename from packages/primus-client/LICENSE rename to packages/adapter-memory/LICENSE diff --git a/packages/adapter-memory/README.md b/packages/adapter-memory/README.md new file mode 100644 index 0000000000..3a4d7d2b3b --- /dev/null +++ b/packages/adapter-memory/README.md @@ -0,0 +1,96 @@ +# @feathersjs/adapter-memory + +[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) +[![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/memory)](https://david-dm.org/feathersjs/feathers?path=packages/memory) +[![Download Status](https://img.shields.io/npm/dm/@feathersjs/adapter-memory.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/adapter-memory) + +A [Feathers](https://feathersjs.com) service adapter for in-memory data storage that works on all platforms. + +```bash +$ npm install --save @feathersjs/adapter-memory +``` + +> __Important:__ `@feathersjs/adapter-memory` implements the [Feathers Common database adapter API](https://docs.feathersjs.com/api/databases/common.html) and [querying syntax](https://docs.feathersjs.com/api/databases/querying.html). + + +## API + +### `service([options])` + +Returns a new service instance initialized with the given options. + +```js +const service = require('@feathersjs/adapter-memory'); + +app.use('/messages', service()); +app.use('/messages', service({ id, startId, store, events, paginate })); +``` + +__Options:__ + +- `id` (*optional*, default: `'id'`) - The name of the id field property. +- `startId` (*optional*, default: `0`) - An id number to start with that will be incremented for every new record (unless it is already set). +- `store` (*optional*) - An object with id to item assignments to pre-initialize the data store +- `events` (*optional*) - A list of [custom service events](https://docs.feathersjs.com/api/events.html#custom-events) sent by this service +- `paginate` (*optional*) - A [pagination object](https://docs.feathersjs.com/api/databases/common.html#pagination) containing a `default` and `max` page size +- `whitelist` (*optional*) - A list of additional query parameters to allow +- `multi` (*optional*) - Allow `create` with arrays and `update` and `remove` with `id` `null` to change multiple items. Can be `true` for all methods or an array of allowed methods (e.g. `[ 'remove', 'create' ]`) + +## Example + +Here is an example of a Feathers server with a `messages` in-memory service that supports pagination: + +``` +$ npm install @feathersjs/feathers @feathersjs/express @feathersjs/socketio @feathersjs/errors @feathersjs/adapter-memory +``` + +In `app.js`: + +```js +const feathers = require('@feathersjs/feathers'); +const express = require('@feathersjs/express'); +const socketio = require('@feathersjs/socketio'); + +const memory = require('@feathersjs/adapter-memory'); + +// Create an Express compatible Feathers application instance. +const app = express(feathers()); +// Turn on JSON parser for REST services +app.use(express.json()); +// Turn on URL-encoded parser for REST services +app.use(express.urlencoded({ extended: true })); +// Enable REST services +app.configure(express.rest()); +// Enable REST services +app.configure(socketio()); +// Create an in-memory Feathers service with a default page size of 2 items +// and a maximum size of 4 +app.use('/messages', memory({ + paginate: { + default: 2, + max: 4 + } +})); +// Set up default error handler +app.use(express.errorHandler()); + +// Create a dummy Message +app.service('messages').create({ + text: 'Message created on server' +}).then(message => console.log('Created message', message)); + +// Start the server. +const port = 3030; + +app.listen(port, () => { + console.log(`Feathers server listening on port ${port}`) +}); +``` + +Run the example with `node app` and go to [localhost:3030/messages](http://localhost:3030/messages). + +## License + +Copyright (c) 2017 + +Licensed under the [MIT license](LICENSE). diff --git a/packages/adapter-memory/package.json b/packages/adapter-memory/package.json new file mode 100644 index 0000000000..1c34f5a619 --- /dev/null +++ b/packages/adapter-memory/package.json @@ -0,0 +1,61 @@ +{ + "name": "@feathersjs/adapter-memory", + "description": "An in memory service store", + "version": "5.0.0-pre.1", + "homepage": "https://github.com/feathersjs/databases", + "main": "lib/", + "keywords": [ + "feathers", + "feathers-plugin" + ], + "license": "MIT", + "repository": { + "type": "git", + "url": "git://github.com/feathersjs/databases.git" + }, + "author": { + "name": "Feathers contributors", + "email": "hello@feathersjs.com", + "url": "https://feathersjs.com" + }, + "contributors": [], + "bugs": { + "url": "https://github.com/feathersjs/databases/issues" + }, + "engines": { + "node": ">= 12" + }, + "files": [ + "CHANGELOG.md", + "LICENSE", + "README.md", + "src/**", + "lib/**", + "*.js" + ], + "scripts": { + "prepublish": "npm run compile", + "compile": "shx rm -rf lib/ && tsc", + "test": "npm run compile && npm run mocha", + "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + }, + "directories": { + "lib": "lib" + }, + "dependencies": { + "@feathersjs/adapter-commons": "^5.0.0-pre.1", + "@feathersjs/commons": "^5.0.0-pre.1", + "@feathersjs/errors": "^5.0.0-pre.1", + "sift": "^12.0.0" + }, + "devDependencies": { + "@feathersjs/adapter-tests": "^5.0.0-pre.1", + "@feathersjs/feathers": "^5.0.0-pre.1", + "@types/mocha": "^8.0.4", + "@types/node": "^14.14.10", + "mocha": "^8.2.1", + "shx": "^0.3.3", + "ts-node": "^9.1.0", + "typescript": "^4.1.2" + } +} diff --git a/packages/adapter-memory/src/index.ts b/packages/adapter-memory/src/index.ts new file mode 100644 index 0000000000..1a8b228e38 --- /dev/null +++ b/packages/adapter-memory/src/index.ts @@ -0,0 +1,156 @@ +import { NotFound } from '@feathersjs/errors'; +import { _ } from '@feathersjs/commons'; +import { sorter, select, AdapterService, ServiceOptions, InternalServiceMethods } from '@feathersjs/adapter-commons'; +import sift from 'sift'; +import { Params, NullableId, Id } from '@feathersjs/feathers'; + +export interface MemoryServiceStore { + [key: string]: T; +} + +export interface MemoryServiceOptions extends ServiceOptions { + store: MemoryServiceStore; + startId: number; + matcher?: (query: any) => any; + sorter?: (sort: any) => any; +} + +const _select = (data: any, params: any, ...args: any[]) => { + const base = select(params, ...args); + + return base(JSON.parse(JSON.stringify(data))); +}; + +export class Service extends AdapterService implements InternalServiceMethods { + options: MemoryServiceOptions; + store: MemoryServiceStore; + _uId: number; + + constructor (options: Partial> = {}) { + super(_.extend({ + id: 'id', + matcher: sift, + sorter + }, options)); + this._uId = options.startId || 0; + this.store = options.store || {}; + } + + async getEntries (params = {}) { + const { query } = this.filterQuery(params); + + return this._find(Object.assign({}, params, { + paginate: false, + query + }) as any) as Promise; + } + + async _find (params: Params = {}) { + const { query, filters, paginate } = this.filterQuery(params); + let values = _.values(this.store).filter(this.options.matcher(query)); + const total = values.length; + + if (filters.$sort !== undefined) { + values.sort(this.options.sorter(filters.$sort)); + } + + if (filters.$skip !== undefined) { + values = values.slice(filters.$skip); + } + + if (filters.$limit !== undefined) { + values = values.slice(0, filters.$limit); + } + + const result = { + total, + limit: filters.$limit, + skip: filters.$skip || 0, + data: values.map(value => _select(value, params)) + }; + + if (!(paginate && (paginate ).default)) { + return result.data; + } + + return result; + } + + async _get (id: Id, params: Params = {}) { + if (id in this.store) { + const { query } = this.filterQuery(params); + const value = this.store[id]; + + if (this.options.matcher(query)(value)) { + return _select(value, params, this.id); + } + } + + throw new NotFound(`No record found for id '${id}'`); + } + + // Create without hooks and mixins that can be used internally + async _create (data: Partial | Partial[], params: Params = {}): Promise { + if (Array.isArray(data)) { + return Promise.all(data.map(current => this._create(current, params) as Promise)); + } + + const id = (data as any)[this.id] || this._uId++; + const current = _.extend({}, data, { [this.id]: id }); + const result = (this.store[id] = current); + + return _select(result, params, this.id); + } + + async _update (id: NullableId, data: T, params: Params = {}) { + const oldEntry = await this._get(id); + // We don't want our id to change type if it can be coerced + const oldId = oldEntry[this.id]; + + // eslint-disable-next-line eqeqeq + id = oldId == id ? oldId : id; + + this.store[id] = _.extend({}, data, { [this.id]: id }); + + return this._get(id, params); + } + + async _patch (id: NullableId, data: Partial, params: Params = {}) { + const patchEntry = (entry: T) => { + const currentId = (entry as any)[this.id]; + + this.store[currentId] = _.extend(this.store[currentId], _.omit(data, this.id)); + + return _select(this.store[currentId], params, this.id); + }; + + if (id === null) { + const entries = await this.getEntries(params); + + return entries.map(patchEntry); + } + + return patchEntry(await this._get(id, params)); // Will throw an error if not found + } + + // Remove without hooks and mixins that can be used internally + async _remove (id: NullableId, params: Params = {}): Promise { + if (id === null) { + const entries = await this.getEntries(params); + + return Promise.all(entries.map(current => + this._remove((current as any)[this.id], params) as Promise + )); + } + + const entry = await this._get(id, params); + + delete this.store[id]; + + return entry; + } +} + +export function memory (options: Partial = {}) { + return new Service(options); +} diff --git a/packages/adapter-memory/test/index.test.ts b/packages/adapter-memory/test/index.test.ts new file mode 100644 index 0000000000..aebcdee79a --- /dev/null +++ b/packages/adapter-memory/test/index.test.ts @@ -0,0 +1,188 @@ +import assert from 'assert'; +import adapterTests from '@feathersjs/adapter-tests'; +import errors from '@feathersjs/errors'; +import feathers from '@feathersjs/feathers'; + +import { memory } from '../src'; + +const testSuite = adapterTests([ + '.options', + '.events', + '._get', + '._find', + '._create', + '._update', + '._patch', + '._remove', + '.get', + '.get + $select', + '.get + id + query', + '.get + NotFound', + '.get + id + query id', + '.find', + '.remove', + '.remove + $select', + '.remove + id + query', + '.remove + multi', + '.remove + id + query id', + '.update', + '.update + $select', + '.update + id + query', + '.update + NotFound', + '.update + id + query id', + '.patch', + '.patch + $select', + '.patch + id + query', + '.patch multiple', + '.patch multi query', + '.patch + NotFound', + '.patch + id + query id', + '.create', + '.create + $select', + '.create multi', + 'internal .find', + 'internal .get', + 'internal .create', + 'internal .update', + 'internal .patch', + 'internal .remove', + '.find + equal', + '.find + equal multiple', + '.find + $sort', + '.find + $sort + string', + '.find + $limit', + '.find + $limit 0', + '.find + $skip', + '.find + $select', + '.find + $or', + '.find + $in', + '.find + $nin', + '.find + $lt', + '.find + $lte', + '.find + $gt', + '.find + $gte', + '.find + $ne', + '.find + $gt + $lt + $sort', + '.find + $or nested + $sort', + '.find + paginate', + '.find + paginate + $limit + $skip', + '.find + paginate + $limit 0', + '.find + paginate + params' +]); + +describe('Feathers Memory Service', () => { + const events = [ 'testing' ]; + const app = feathers() + .use('/people', memory({ events })) + .use('/people-customid', memory({ + id: 'customid', events + })); + + it('update with string id works', async () => { + const people = app.service('people'); + const person = await people.create({ + name: 'Tester', + age: 33 + }); + + const updatedPerson = await people.update(person.id.toString(), person); + + assert.strictEqual(typeof updatedPerson.id, 'number'); + + await people.remove(person.id.toString()); + }); + + it('patch record with prop also in query', async () => { + app.use('/animals', memory({ multi: true })); + const animals = app.service('animals'); + await animals.create([{ + type: 'cat', + age: 30 + }, { + type: 'dog', + age: 10 + }]); + + const [updated] = await animals.patch(null, { age: 40 }, { query: { age: 30 } }); + + assert.strictEqual(updated.age, 40); + + await animals.remove(null, {}); + }); + + it('allows to pass custom find and sort matcher', async () => { + let sorterCalled = false; + let matcherCalled = false; + + app.use('/matcher', memory({ + matcher () { + matcherCalled = true; + return function () { + return true; + }; + }, + + sorter () { + sorterCalled = true; + return function () { + return 0; + }; + } + })); + + await app.service('matcher').find({ + query: { $sort: { something: 1 } } + }); + + assert.ok(sorterCalled, 'sorter called'); + assert.ok(matcherCalled, 'matcher called'); + }); + + it('does not modify the original data', async () => { + const people = app.service('people'); + + const person = await people.create({ + name: 'Delete tester', + age: 33 + }); + + delete person.age; + + const otherPerson = await people.get(person.id); + + assert.strictEqual(otherPerson.age, 33); + + await people.remove(person.id); + }); + + it('does not $select the id', async () => { + const people = app.service('people'); + const person = await people.create({ + name: 'Tester' + }); + const results = await people.find({ + query: { + name: 'Tester', + $select: ['name'] + } + }); + + assert.deepStrictEqual(results[0], { name: 'Tester' }, + 'deepEquals the same' + ); + + await people.remove(person.id); + }); + + it('update with null throws error', async () => { + try { + await app.service('people').update(null, {}); + throw new Error('Should never get here'); + } catch (error) { + assert.strictEqual(error.message, 'You can not replace multiple instances. Did you mean \'patch\'?'); + } + }); + + testSuite(app, errors, 'people'); + testSuite(app, errors, 'people-customid', 'customid'); +}); diff --git a/packages/adapter-memory/tsconfig.json b/packages/adapter-memory/tsconfig.json new file mode 100644 index 0000000000..316fd41336 --- /dev/null +++ b/packages/adapter-memory/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "include": [ + "src/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib" + } +} diff --git a/packages/adapter-tests/CHANGELOG.md b/packages/adapter-tests/CHANGELOG.md index 851ba4a717..06189bd5b8 100644 --- a/packages/adapter-tests/CHANGELOG.md +++ b/packages/adapter-tests/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0-pre.1](https://github.com/feathersjs/databases/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + +### Features + +* **memory:** Move feathers-memory into @feathersjs/adapter-memory ([#2153](https://github.com/feathersjs/databases/issues/2153)) ([dd61fe3](https://github.com/feathersjs/databases/commit/dd61fe371fb0502f78b8ccbe1f45a030e31ecff6)) + + + + + ## [4.5.11](https://github.com/feathersjs/databases/compare/v4.5.10...v4.5.11) (2020-12-05) **Note:** Version bump only for package @feathersjs/adapter-tests diff --git a/packages/adapter-tests/package.json b/packages/adapter-tests/package.json index 409ac8c06c..27fcb63369 100644 --- a/packages/adapter-tests/package.json +++ b/packages/adapter-tests/package.json @@ -1,6 +1,6 @@ { "name": "@feathersjs/adapter-tests", - "version": "4.5.11", + "version": "5.0.0-pre.1", "description": "Feathers shared database adapter test suite", "homepage": "https://feathersjs.com", "keywords": [ @@ -31,7 +31,7 @@ "scripts": { "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", - "test": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" diff --git a/packages/adapter-tests/src/index.ts b/packages/adapter-tests/src/index.ts index 32902c8c23..bfb0806e9c 100644 --- a/packages/adapter-tests/src/index.ts +++ b/packages/adapter-tests/src/index.ts @@ -1,4 +1,4 @@ -/* tslint:disable:no-console */ +/* eslint-disable no-console */ import basicTests from './basic'; import methodTests from './methods'; import syntaxTests from './syntax'; @@ -46,8 +46,4 @@ const adapterTests = (testNames: string[]) => { }; }; -export default adapterTests; - -if (typeof module !== 'undefined') { - module.exports = adapterTests; -} +export = adapterTests; diff --git a/packages/adapter-tests/test/index.test.ts b/packages/adapter-tests/test/index.test.ts index a80474e555..725c7cae49 100644 --- a/packages/adapter-tests/test/index.test.ts +++ b/packages/adapter-tests/test/index.test.ts @@ -66,7 +66,7 @@ const testSuite = adapterTests([ ]); describe('Feathers Memory Service', () => { - it('loads the test suite', async () => { + it('loads the test suite', () => { assert.ok(typeof testSuite === 'function'); }); diff --git a/packages/authentication-client/CHANGELOG.md b/packages/authentication-client/CHANGELOG.md index d03c240b04..e6f6670808 100644 --- a/packages/authentication-client/CHANGELOG.md +++ b/packages/authentication-client/CHANGELOG.md @@ -3,6 +3,40 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### chore + +* **package:** Remove @feathersjs/primus packages from core ([#1919](https://github.com/feathersjs/feathers/issues/1919)) ([d20b7d5](https://github.com/feathersjs/feathers/commit/d20b7d5a70f4d3306e294696156e8aa0337c35e9)), closes [#1899](https://github.com/feathersjs/feathers/issues/1899) + + +### BREAKING CHANGES + +* **package:** Remove primus packages to be moved into the ecosystem. + + + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### chore + +* **package:** Remove @feathersjs/primus packages from core ([#1919](https://github.com/feathersjs/feathers/issues/1919)) ([d20b7d5](https://github.com/feathersjs/feathers/commit/d20b7d5a70f4d3306e294696156e8aa0337c35e9)), closes [#1899](https://github.com/feathersjs/feathers/issues/1899) + + +### BREAKING CHANGES + +* **package:** Remove primus packages to be moved into the ecosystem. + + + ## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) diff --git a/packages/authentication-client/package.json b/packages/authentication-client/package.json index b962583b3a..3d454e1e6d 100644 --- a/packages/authentication-client/package.json +++ b/packages/authentication-client/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/authentication-client", "description": "The authentication plugin for feathers-client", - "version": "4.5.11", + "version": "5.0.0-pre.1", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -43,7 +43,7 @@ "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", "test": "npm run compile && npm run mocha", - "mocha": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" + "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -52,20 +52,19 @@ "access": "public" }, "dependencies": { - "@feathersjs/authentication": "^4.5.11", - "@feathersjs/commons": "^4.5.11", - "@feathersjs/errors": "^4.5.11", - "@feathersjs/feathers": "^4.5.11", + "@feathersjs/authentication": "^5.0.0-pre.1", + "@feathersjs/commons": "^5.0.0-pre.1", + "@feathersjs/errors": "^5.0.0-pre.1", + "@feathersjs/feathers": "^5.0.0-pre.1", "debug": "^4.3.1" }, "devDependencies": { - "@feathersjs/authentication-local": "^4.5.11", - "@feathersjs/express": "^4.5.11", - "@feathersjs/primus": "^4.5.11", - "@feathersjs/primus-client": "^4.5.11", - "@feathersjs/rest-client": "^4.5.11", - "@feathersjs/socketio": "^4.5.11", - "@feathersjs/socketio-client": "^4.5.11", + "@feathersjs/adapter-memory": "^5.0.0-pre.1", + "@feathersjs/authentication-local": "^5.0.0-pre.1", + "@feathersjs/express": "^5.0.0-pre.1", + "@feathersjs/rest-client": "^5.0.0-pre.1", + "@feathersjs/socketio": "^5.0.0-pre.1", + "@feathersjs/socketio-client": "^5.0.0-pre.1", "@types/debug": "^4.1.5", "@types/mocha": "^8.0.4", "@types/node": "^14.14.10", @@ -75,5 +74,5 @@ "ts-node": "^9.1.0", "typescript": "^4.1.2" }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/authentication-client/src/core.ts b/packages/authentication-client/src/core.ts index 9d7e8da4af..075f8760aa 100644 --- a/packages/authentication-client/src/core.ts +++ b/packages/authentication-client/src/core.ts @@ -37,7 +37,7 @@ export class AuthenticationClient { options: AuthenticationClientOptions; constructor (app: Application, options: AuthenticationClientOptions) { - const socket = app.io || app.primus; + const socket = app.io || (app as any).primus; const storage = new StorageWrapper(app.get('storage') || options.storage); this.app = app; @@ -132,7 +132,7 @@ export class AuthenticationClient { return Promise.reject(error); } - reAuthenticate (force: boolean = false, strategy?: string): Promise { + reAuthenticate (force = false, strategy?: string): Promise { // Either returns the authentication state or // tries to re-authenticate with the stored JWT and strategy const authPromise = this.app.get('authentication'); diff --git a/packages/authentication-client/src/index.ts b/packages/authentication-client/src/index.ts index d2f7d49354..4ee6b20058 100644 --- a/packages/authentication-client/src/index.ts +++ b/packages/authentication-client/src/index.ts @@ -3,11 +3,10 @@ import * as hooks from './hooks'; import { Application } from '@feathersjs/feathers'; import { Storage, MemoryStorage, StorageWrapper } from './storage'; -declare module '@feathersjs/feathers' { - interface Application { +declare module '@feathersjs/feathers/lib/declarations' { + interface Application { // eslint-disable-line io?: any; rest?: any; - primus?: any; authentication: AuthenticationClient; authenticate: AuthenticationClient['authenticate']; reAuthenticate: AuthenticationClient['reAuthenticate']; diff --git a/packages/authentication-client/test/integration/express.test.ts b/packages/authentication-client/test/integration/express.test.ts index 43a4bb4573..d65ebb8142 100644 --- a/packages/authentication-client/test/integration/express.test.ts +++ b/packages/authentication-client/test/integration/express.test.ts @@ -1,6 +1,6 @@ import axios from 'axios'; import feathers, { Application as FeathersApplication } from '@feathersjs/feathers'; -import express from '@feathersjs/express'; +import * as express from '@feathersjs/express'; import rest from '@feathersjs/rest-client'; import authClient from '../../src'; @@ -15,7 +15,7 @@ describe('@feathersjs/authentication-client Express integration', () => { const restApp = express.default(feathers()) .use(express.json()) .configure(express.rest()) - .use(express.parseAuthentication('jwt')); + .use(express.parseAuthentication()); app = getApp(restApp as unknown as FeathersApplication) as express.Application; app.use(express.errorHandler()); diff --git a/packages/authentication-client/test/integration/fixture.ts b/packages/authentication-client/test/integration/fixture.ts index ddc32c2195..289095601e 100644 --- a/packages/authentication-client/test/integration/fixture.ts +++ b/packages/authentication-client/test/integration/fixture.ts @@ -1,7 +1,6 @@ import { authenticate } from '@feathersjs/authentication'; import { HookContext, Application } from '@feathersjs/feathers'; -// @ts-ignore -import memory from 'feathers-memory'; +import { memory } from '@feathersjs/adapter-memory'; import { AuthenticationService, JWTStrategy } from '@feathersjs/authentication'; import { LocalStrategy, hooks } from '@feathersjs/authentication-local'; diff --git a/packages/authentication-client/test/integration/primus.test.ts b/packages/authentication-client/test/integration/primus.test.ts deleted file mode 100644 index f08f65f152..0000000000 --- a/packages/authentication-client/test/integration/primus.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -// @ts-ignore -import Primus from 'primus'; -// @ts-ignore -import Emitter from 'primus-emitter'; -import feathers, { Application } from '@feathersjs/feathers'; -import primusClient from '@feathersjs/primus-client'; -import primus from '@feathersjs/primus'; - -import authClient from '../../src'; -import getApp from './fixture'; -import commonTests from './commons'; - -const port = 8998; -const baseURL = `http://localhost:${port}`; -const Socket = Primus.createSocket({ - transformer: 'websockets', - plugin: { - emitter: Emitter - } -}); - -describe('@feathersjs/authentication-client Primus integration', () => { - let app: Application; - let server: any; - - before(() => { - app = getApp(feathers().configure(primus({ - transformer: 'websockets' - }))); - - server = app.listen(port); - }); - - after(() => server.close()); - - commonTests(() => app, () => { - return feathers() - .configure(primusClient(new Socket(baseURL), { timeout: 1000 })) - .configure(authClient()); - }, { - email: 'primusauth@feathersjs.com', - password: 'secrets', - provider: 'primus' - }); -}); diff --git a/packages/authentication-client/test/integration/socketio.test.ts b/packages/authentication-client/test/integration/socketio.test.ts index 2e7594cf75..d999592675 100644 --- a/packages/authentication-client/test/integration/socketio.test.ts +++ b/packages/authentication-client/test/integration/socketio.test.ts @@ -1,4 +1,4 @@ -import io from 'socket.io-client'; +import { io } from 'socket.io-client'; import assert from 'assert'; import feathers, { Application } from '@feathersjs/feathers'; import socketio from '@feathersjs/socketio'; diff --git a/packages/authentication-local/CHANGELOG.md b/packages/authentication-local/CHANGELOG.md index 9e7816e232..d55a073cca 100644 --- a/packages/authentication-local/CHANGELOG.md +++ b/packages/authentication-local/CHANGELOG.md @@ -3,15 +3,11 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - -**Note:** Version bump only for package @feathersjs/authentication-local - +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) **Note:** Version bump only for package @feathersjs/authentication-local @@ -19,14 +15,9 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - - -### Bug Fixes - -* **authentication-local:** Keep non-objects in protect hook ([#2085](https://github.com/feathersjs/feathers/issues/2085)) ([5a65e2e](https://github.com/feathersjs/feathers/commit/5a65e2e6cee0a15614f23ee2e0d3c25d3365027d)) - +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) +**Note:** Version bump only for package @feathersjs/authentication-local diff --git a/packages/authentication-local/package.json b/packages/authentication-local/package.json index 1826d9c29f..db1ab63823 100644 --- a/packages/authentication-local/package.json +++ b/packages/authentication-local/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/authentication-local", "description": "Local authentication strategy for @feathers/authentication", - "version": "4.5.11", + "version": "5.0.0-pre.1", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -43,7 +43,7 @@ "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", "test": "npm run compile && npm run mocha", - "mocha": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" + "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -52,14 +52,15 @@ "access": "public" }, "dependencies": { - "@feathersjs/authentication": "^4.5.11", - "@feathersjs/errors": "^4.5.11", - "@feathersjs/feathers": "^4.5.11", + "@feathersjs/authentication": "^5.0.0-pre.1", + "@feathersjs/errors": "^5.0.0-pre.1", + "@feathersjs/feathers": "^5.0.0-pre.1", "bcryptjs": "^2.4.3", "debug": "^4.3.1", "lodash": "^4.17.20" }, "devDependencies": { + "@feathersjs/adapter-memory": "^5.0.0-pre.1", "@types/bcryptjs": "^2.4.2", "@types/debug": "^4.1.5", "@types/lodash": "^4.14.165", @@ -70,5 +71,5 @@ "ts-node": "^9.1.0", "typescript": "^4.1.2" }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/authentication-local/src/hooks/hash-password.ts b/packages/authentication-local/src/hooks/hash-password.ts index f97a7cde38..2b564119ef 100644 --- a/packages/authentication-local/src/hooks/hash-password.ts +++ b/packages/authentication-local/src/hooks/hash-password.ts @@ -20,13 +20,13 @@ export default function hashPassword (field: string, options: HashPasswordOption return async (context: HookContext) => { if (context.type !== 'before') { - throw new Error(`The 'hashPassword' hook should only be used as a 'before' hook`); + throw new Error('The \'hashPassword\' hook should only be used as a \'before\' hook'); } const { app, data, params } = context; if (data === undefined) { - debug(`hook.data is undefined. Skipping hashPassword hook.`); + debug('hook.data is undefined. Skipping hashPassword hook.'); return context; } @@ -34,7 +34,7 @@ export default function hashPassword (field: string, options: HashPasswordOption const { strategy = 'local' } = options; if (!authService || typeof authService.getStrategies !== 'function') { - throw new BadRequest(`Could not find an authentication service to hash password`); + throw new BadRequest('Could not find an authentication service to hash password'); } const [ localStrategy ] = authService.getStrategies(strategy) as LocalStrategy[]; diff --git a/packages/authentication-local/src/strategy.ts b/packages/authentication-local/src/strategy.ts index bd332b487c..f3227db60e 100644 --- a/packages/authentication-local/src/strategy.ts +++ b/packages/authentication-local/src/strategy.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ import bcrypt from 'bcryptjs'; import get from 'lodash/get'; import omit from 'lodash/omit'; @@ -63,7 +64,7 @@ export class LocalStrategy extends AuthenticationBaseStrategy { const list = Array.isArray(result) ? result : result.data; if (!Array.isArray(list) || list.length === 0) { - debug(`No entity found`); + debug('No entity found'); throw new NotAuthenticated(errorMessage); } diff --git a/packages/authentication-local/test/fixture.js b/packages/authentication-local/test/fixture.js index 7bbd89de21..04e3598cc6 100644 --- a/packages/authentication-local/test/fixture.js +++ b/packages/authentication-local/test/fixture.js @@ -1,8 +1,8 @@ const feathers = require('@feathersjs/feathers'); -const memory = require('feathers-memory'); +const { memory } = require('@feathersjs/adapter-memory'); const { AuthenticationService, JWTStrategy } = require('@feathersjs/authentication'); -const { LocalStrategy, hooks } = require('../lib'); +const { LocalStrategy, hooks } = require('../src'); const { hashPassword, protect } = hooks; module.exports = (app = feathers()) => { diff --git a/packages/authentication-local/test/hooks/hash-password.test.ts b/packages/authentication-local/test/hooks/hash-password.test.ts index 37170fc54c..9755716402 100644 --- a/packages/authentication-local/test/hooks/hash-password.test.ts +++ b/packages/authentication-local/test/hooks/hash-password.test.ts @@ -51,7 +51,7 @@ describe('@feathersjs/authentication-local/hooks/hash-password', () => { assert.fail('Should never get here'); } catch (error) { assert.strictEqual(error.message, - `Could not find 'local' strategy to hash password` + 'Could not find \'local\' strategy to hash password' ); } }); @@ -73,7 +73,7 @@ describe('@feathersjs/authentication-local/hooks/hash-password', () => { assert.fail('Should never get here'); } catch (error) { assert.strictEqual(error.message, - `The 'hashPassword' hook should only be used as a 'before' hook` + 'The \'hashPassword\' hook should only be used as a \'before\' hook' ); } }); diff --git a/packages/authentication-local/test/strategy.test.ts b/packages/authentication-local/test/strategy.test.ts index 8fa9b02b98..6d05bb7b8d 100644 --- a/packages/authentication-local/test/strategy.test.ts +++ b/packages/authentication-local/test/strategy.test.ts @@ -25,7 +25,7 @@ describe('@feathersjs/authentication-local/strategy', () => { assert.fail('Should never get here'); } catch (error) { assert.strictEqual(error.message, - `'something' authentication strategy requires a 'usernameField' setting` + '\'something\' authentication strategy requires a \'usernameField\' setting' ); } }); diff --git a/packages/authentication-oauth/CHANGELOG.md b/packages/authentication-oauth/CHANGELOG.md index 1b3f06735a..1021f45fff 100644 --- a/packages/authentication-oauth/CHANGELOG.md +++ b/packages/authentication-oauth/CHANGELOG.md @@ -3,25 +3,21 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - - -### Bug Fixes - -* **socketio-client:** Throw an error and show a warning if someone tries to use socket.io-client v3 ([#2135](https://github.com/feathersjs/feathers/issues/2135)) ([cc3521c](https://github.com/feathersjs/feathers/commit/cc3521c935a1cbd690e29b7057998e3898f282db)) +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) +**Note:** Version bump only for package @feathersjs/authentication-oauth -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) -### Bug Fixes -* **authentication-oauth:** session.destroy is undefined when use cookie-session package ([#2100](https://github.com/feathersjs/feathers/issues/2100)) ([46e84b8](https://github.com/feathersjs/feathers/commit/46e84b83f2acce985380243fc6d08c64e96f0068)) +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) +**Note:** Version bump only for package @feathersjs/authentication-oauth diff --git a/packages/authentication-oauth/package.json b/packages/authentication-oauth/package.json index 0553704f2e..0ae2b78a0f 100644 --- a/packages/authentication-oauth/package.json +++ b/packages/authentication-oauth/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/authentication-oauth", "description": "oAuth 1 and 2 authentication for Feathers. Powered by Grant.", - "version": "4.5.11", + "version": "5.0.0-pre.1", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -43,7 +43,7 @@ "start": "ts-node test/app", "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", - "test": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -52,17 +52,17 @@ "access": "public" }, "dependencies": { - "@feathersjs/authentication": "^4.5.11", - "@feathersjs/errors": "^4.5.11", - "@feathersjs/express": "^4.5.11", - "@feathersjs/feathers": "^4.5.11", + "@feathersjs/authentication": "^5.0.0-pre.1", + "@feathersjs/errors": "^5.0.0-pre.1", + "@feathersjs/express": "^5.0.0-pre.1", + "@feathersjs/feathers": "^5.0.0-pre.1", "debug": "^4.3.1", "express-session": "^1.17.1", - "grant": "^4.7.0", - "grant-profile": "^0.0.11", + "grant": "^5.4.9", "lodash": "^4.17.20" }, "devDependencies": { + "@feathersjs/adapter-memory": "^5.0.0-pre.1", "@types/debug": "^4.1.5", "@types/express": "^4.17.9", "@types/express-session": "^1.17.3", @@ -75,5 +75,5 @@ "ts-node": "^9.1.0", "typescript": "^4.1.2" }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/authentication-oauth/src/express.ts b/packages/authentication-oauth/src/express.ts index 6401353f92..953020ddda 100644 --- a/packages/authentication-oauth/src/express.ts +++ b/packages/authentication-oauth/src/express.ts @@ -4,7 +4,6 @@ import Debug from 'debug'; import session from 'express-session'; import { Application } from '@feathersjs/feathers'; import { AuthenticationResult } from '@feathersjs/authentication'; -import qs from 'querystring'; import { Application as ExpressApplication, original as express @@ -35,7 +34,7 @@ export default (options: OauthSetupSettings) => { return; } - const { path } = config.defaults; + const { prefix } = config.defaults; const expressSession = options.expressSession || session({ secret: Math.random().toString(36).substring(7), saveUninitialized: true, @@ -46,26 +45,21 @@ export default (options: OauthSetupSettings) => { authApp.use(expressSession); - authApp.get('/:name', (req, res) => { + authApp.get('/:name', (req, _res, next) => { const { feathers_token, redirect, ...query } = req.query; - const { name } = req.params as any; if (feathers_token) { - debug(`Got feathers_token query parameter to link accounts`, feathers_token); + debug('Got feathers_token query parameter to link accounts', feathers_token); req.session.accessToken = feathers_token as string; } req.session.redirect = redirect as string; req.session.query = query; - res.redirect(`${path}/connect/${name}?${qs.stringify(query as any)}`); - }); - - authApp.get('/:name/callback', (req: any, res: any) => { - res.redirect(`${path}/connect/${req.params.name}/callback?${qs.stringify(req.query)}`); + next() }); authApp.get('/:name/authenticate', async (req, res, next) => { - const { name } = req.params as any; + const { name } = req.params ; const { accessToken, grant, query = {}, redirect } = req.session; const service = app.defaultAuthentication(authService); const [ strategy ] = service.getStrategies(name) as OAuthStrategy[]; @@ -129,6 +123,6 @@ export default (options: OauthSetupSettings) => { authApp.use(grantApp); app.set('grant', grantApp.config); - app.use(path, authApp); + app.use(prefix, authApp); }; }; diff --git a/packages/authentication-oauth/src/index.ts b/packages/authentication-oauth/src/index.ts index 2c666b6e5e..3f4ab0b41c 100644 --- a/packages/authentication-oauth/src/index.ts +++ b/packages/authentication-oauth/src/index.ts @@ -21,14 +21,14 @@ export const setup = (options: OauthSetupSettings) => (app: Application) => { const { oauth } = service.configuration; if (!oauth) { - debug(`No oauth configuration found in authentication configuration. Skipping oAuth setup.`); + debug('No oauth configuration found in authentication configuration. Skipping oAuth setup.'); return; } const { strategyNames } = service; // Set up all the defaults - const { path = '/oauth' } = oauth.defaults || {}; + const { prefix = '/oauth' } = oauth.defaults || {}; const port = app.get('port'); let host = app.get('host'); let protocol = 'https'; @@ -37,22 +37,22 @@ export const setup = (options: OauthSetupSettings) => (app: Application) => { if (app.get('env') === 'development') { protocol = 'http'; if (String(port) !== '80') { - host += ':' + port; + host += `:${port}`; } } const grant = merge({ defaults: { - path, - host, - protocol, - transport: 'session' + prefix, + origin: `${protocol}://${host}`, + transport: 'session', + response: ['tokens', 'raw', 'profile'] } }, omit(oauth, 'redirect')); const getUrl = (url: string) => { const { defaults } = grant; - return `${defaults.protocol}://${defaults.host}${path}/${url}`; + return `${defaults.origin}${prefix}/${url}`; }; each(grant, (value, name) => { diff --git a/packages/authentication-oauth/src/strategy.ts b/packages/authentication-oauth/src/strategy.ts index 1a2358872f..5786a4eb92 100644 --- a/packages/authentication-oauth/src/strategy.ts +++ b/packages/authentication-oauth/src/strategy.ts @@ -1,5 +1,5 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ // @ts-ignore -import getProfile from 'grant-profile/lib/client'; import querystring from 'querystring'; import Debug from 'debug'; import { @@ -46,14 +46,8 @@ export class OAuthStrategy extends AuthenticationBaseStrategy { }; } - /* istanbul ignore next */ async getProfile (data: AuthenticationRequest, _params: Params) { - const config = this.app.get('grant'); - const provider = config[data.strategy]; - - debug('getProfile of oAuth profile from grant-profile with', data); - - return getProfile(provider, data); + return data.profile } async getCurrentEntity (params: Params) { @@ -81,7 +75,7 @@ export class OAuthStrategy extends AuthenticationBaseStrategy { return null; } - const redirectUrl = redirect + queryRedirect; + const redirectUrl = `${redirect}${queryRedirect}`; const separator = redirect.endsWith('?') ? '' : (redirect.indexOf('#') !== -1 ? '?' : '#'); const authResult: AuthenticationResult = data; @@ -91,7 +85,7 @@ export class OAuthStrategy extends AuthenticationBaseStrategy { error: data.message || 'OAuth Authentication not successful' }; - return redirectUrl + separator + querystring.stringify(query); + return `${redirectUrl}${separator}${querystring.stringify(query)}`; } async findEntity (profile: OAuthProfile, params: Params) { @@ -152,7 +146,7 @@ export class OAuthStrategy extends AuthenticationBaseStrategy { const existingEntity = await this.findEntity(profile, params) || await this.getCurrentEntity(params); - debug(`authenticate with (existing) entity`, existingEntity); + debug('authenticate with (existing) entity', existingEntity); const authEntity = !existingEntity ? await this.createEntity(profile, params) : await this.updateEntity(existingEntity, profile, params); diff --git a/packages/authentication-oauth/test/express.test.ts b/packages/authentication-oauth/test/express.test.ts index af0a0c8848..53b8663c37 100644 --- a/packages/authentication-oauth/test/express.test.ts +++ b/packages/authentication-oauth/test/express.test.ts @@ -15,15 +15,23 @@ describe('@feathersjs/authentication-oauth/express', () => { after(() => server.close()); it('oauth/test', async () => { - axios.get('http://localhost:9876/oauth//test?feathers_token=testing'); + try { + await axios.get('http://localhost:9876/oauth/test?feathers_token=testing', { maxRedirects: 0 }); + } catch (error) { + assert.equal(error.response.status, 302) + } }); it('oauth/test with query', async () => { - axios.get('http://localhost:9876/oauth//test?other=test'); + try { + await axios.get('http://localhost:9876/oauth/test?other=test', { maxRedirects: 0 }); + } catch (error) { + assert.equal(error.response.status, 302) + } }); it('oauth/test/authenticate', async () => { - const { data } = await axios.get('http://localhost:9876/oauth//test/authenticate?id=expressTest'); + const { data } = await axios.get('http://localhost:9876/oauth/test/authenticate?profile[sub]=expressTest'); assert.ok(data.accessToken); assert.equal(data.user.testId, 'expressTest'); @@ -40,12 +48,4 @@ describe('@feathersjs/authentication-oauth/express', () => { delete app.get('authentication').oauth.redirect; } }); - - it('oauth/test/authenticate with error', async () => { - try { - await axios.get('http://localhost:9876/oauth/test/authenticate'); - } catch (error) { - assert.equal(error.response.data.message, 'Data needs an id'); - } - }); }); diff --git a/packages/authentication-oauth/test/fixture.ts b/packages/authentication-oauth/test/fixture.ts index 0bede592e6..0f7d1d86ff 100644 --- a/packages/authentication-oauth/test/fixture.ts +++ b/packages/authentication-oauth/test/fixture.ts @@ -1,18 +1,10 @@ import feathers, { Params } from '@feathersjs/feathers'; -import express from '@feathersjs/express'; -import memory from 'feathers-memory'; +import express, { rest, errorHandler } from '@feathersjs/express'; +import { memory } from '@feathersjs/adapter-memory'; import { AuthenticationService, JWTStrategy, AuthenticationRequest } from '@feathersjs/authentication'; import { express as oauth, OAuthStrategy } from '../src'; export class TestOAuthStrategy extends OAuthStrategy { - async getProfile (data: AuthenticationRequest, _params: Params) { - if (!data.id) { - throw new Error('Data needs an id'); - } - - return data; - } - async authenticate (data: AuthenticationRequest, params: Params) { const { fromMiddleware } = params; const authResult = await super.authenticate(data, params); @@ -27,13 +19,13 @@ export class TestOAuthStrategy extends OAuthStrategy { export const app = express(feathers()); -const port = 3000; +const port = 9876; const auth = new AuthenticationService(app); auth.register('jwt', new JWTStrategy()); auth.register('test', new TestOAuthStrategy()); -app.configure(express.rest()); +app.configure(rest()); app.set('host', '127.0.0.1'); app.set('port', port); app.set('authentication', { @@ -43,7 +35,7 @@ app.set('authentication', { authStrategies: [ 'jwt' ], oauth: { defaults: { - transport: 'query' + transport: 'querystring' }, test: { key: 'some-key', @@ -64,4 +56,4 @@ app.use('/authentication', auth); app.use('/users', memory()); app.configure(oauth()); -app.use(express.errorHandler({ logger: null })); +app.use(errorHandler({ logger: null })); diff --git a/packages/authentication-oauth/test/index.test.ts b/packages/authentication-oauth/test/index.test.ts index 014a50b7d8..962abdd045 100644 --- a/packages/authentication-oauth/test/index.test.ts +++ b/packages/authentication-oauth/test/index.test.ts @@ -1,7 +1,7 @@ import { strict as assert } from 'assert'; import feathers from '@feathersjs/feathers'; import { setup, express, OauthSetupSettings } from '../src'; -import { AuthenticationService } from '@feathersjs/authentication/lib'; +import { AuthenticationService } from '@feathersjs/authentication'; describe('@feathersjs/authentication-oauth', () => { describe('setup', () => { diff --git a/packages/authentication-oauth/test/strategy.test.ts b/packages/authentication-oauth/test/strategy.test.ts index 7f178a34a9..3b70b1eb14 100644 --- a/packages/authentication-oauth/test/strategy.test.ts +++ b/packages/authentication-oauth/test/strategy.test.ts @@ -1,6 +1,6 @@ import { strict as assert } from 'assert'; import { app, TestOAuthStrategy } from './fixture'; -import { AuthenticationService } from '@feathersjs/authentication/lib'; +import { AuthenticationService } from '@feathersjs/authentication'; describe('@feathersjs/authentication-oauth/strategy', () => { const authService: AuthenticationService = app.service('authentication'); @@ -51,18 +51,13 @@ describe('@feathersjs/authentication-oauth/strategy', () => { assert.equal(redirect, '/#dashboard?access_token=testing'); }); - it('getProfile', async () => { - const data = { id: 'getProfileTest' }; - const profile = await strategy.getProfile(data, {}); - - assert.deepEqual(profile, data); - }); - describe('authenticate', () => { it('with new user', async () => { const authResult = await strategy.authenticate({ strategy: 'test', - id: 'newEntity' + profile: { + id: 'newEntity' + } }, {}); assert.deepEqual(authResult, { @@ -78,7 +73,9 @@ describe('@feathersjs/authentication-oauth/strategy', () => { }); const authResult = await strategy.authenticate({ strategy: 'test', - id: 'existingEntity' + profile: { + id: 'existingEntity' + } }, {}); assert.deepEqual(authResult, { @@ -97,7 +94,9 @@ describe('@feathersjs/authentication-oauth/strategy', () => { const authResult = await strategy.authenticate({ strategy: 'test', - id: 'linkedEntity' + profile: { + id: 'linkedEntity' + } }, { authentication: { strategy: 'jwt', diff --git a/packages/authentication/CHANGELOG.md b/packages/authentication/CHANGELOG.md index bfb5e70a7e..4f2d647bf1 100644 --- a/packages/authentication/CHANGELOG.md +++ b/packages/authentication/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + +**Note:** Version bump only for package @feathersjs/authentication + + + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + + ## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) **Note:** Version bump only for package @feathersjs/authentication diff --git a/packages/authentication/package.json b/packages/authentication/package.json index f2707b0852..856acad787 100644 --- a/packages/authentication/package.json +++ b/packages/authentication/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/authentication", "description": "Add Authentication to your FeathersJS app.", - "version": "4.5.11", + "version": "5.0.0-pre.1", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -43,7 +43,7 @@ "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", "test": "npm run compile && npm run mocha", - "mocha": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" + "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -52,9 +52,9 @@ "access": "public" }, "dependencies": { - "@feathersjs/errors": "^4.5.11", - "@feathersjs/feathers": "^4.5.11", - "@feathersjs/transport-commons": "^4.5.11", + "@feathersjs/errors": "^5.0.0-pre.1", + "@feathersjs/feathers": "^5.0.0-pre.1", + "@feathersjs/transport-commons": "^5.0.0-pre.1", "@types/jsonwebtoken": "^8.5.0", "debug": "^4.3.1", "jsonwebtoken": "^8.5.1", @@ -63,16 +63,16 @@ "uuid": "^8.3.1" }, "devDependencies": { + "@feathersjs/adapter-memory": "^5.0.0-pre.1", "@types/debug": "^4.1.5", "@types/lodash": "^4.14.165", "@types/mocha": "^8.0.4", "@types/node": "^14.14.10", "@types/uuid": "^8.3.0", - "feathers-memory": "^4.1.0", "mocha": "^8.2.1", "shx": "^0.3.3", "ts-node": "^9.1.0", "typescript": "^4.1.2" }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/authentication/src/core.ts b/packages/authentication/src/core.ts index 376d0ea28b..78dade4617 100644 --- a/packages/authentication/src/core.ts +++ b/packages/authentication/src/core.ts @@ -23,16 +23,19 @@ export type ConnectionEvent = 'login' | 'logout' | 'disconnect'; export interface AuthenticationStrategy { /** * Implement this method to get access to the AuthenticationService + * * @param auth The AuthenticationService */ setAuthentication? (auth: AuthenticationBase): void; /** * Implement this method to get access to the Feathers application + * * @param app The Feathers application instance */ setApplication? (app: Application): void; /** * Implement this method to get access to the strategy name + * * @param name The name of the strategy */ setName? (name: string): void; @@ -44,6 +47,7 @@ export interface AuthenticationStrategy { /** * Authenticate an authentication request with this strategy. * Should throw an error if the strategy did not succeed. + * * @param authentication The authentication request * @param params The service call parameters */ @@ -57,6 +61,7 @@ export interface AuthenticationStrategy { handleConnection? (event: ConnectionEvent, connection: any, authResult?: AuthenticationResult): Promise; /** * Parse a basic HTTP request and response for authentication request information. + * * @param req The HTTP request * @param res The HTTP response */ @@ -79,11 +84,12 @@ export class AuthenticationBase { /** * Create a new authentication service. + * * @param app The Feathers application instance * @param configKey The configuration key name in `app.get` (default: `authentication`) * @param options Optional initial options */ - constructor (app: Application, configKey: string = 'authentication', options = {}) { + constructor (app: Application, configKey = 'authentication', options = {}) { if (!app || typeof app.use !== 'function') { throw new Error('An application instance has to be passed to the authentication service'); } @@ -113,6 +119,7 @@ export class AuthenticationBase { /** * Register a new authentication strategy under a given name. + * * @param name The name to register the strategy under * @param strategy The authentication strategy instance */ @@ -140,6 +147,7 @@ export class AuthenticationBase { /** * Get the registered authentication strategies for a list of names. + * * @param names The list or strategy names */ getStrategies (...names: string[]) { @@ -149,6 +157,7 @@ export class AuthenticationBase { /** * Create a new access token with payload and options. + * * @param payload The JWT payload * @param optsOverride The options to extend the defaults (`configuration.jwtOptions`) with * @param secretOverride Use a different secret instead @@ -170,6 +179,7 @@ export class AuthenticationBase { /** * Verifies an access token. + * * @param accessToken The token to verify * @param optsOverride The options to extend the defaults (`configuration.jwtOptions`) with * @param secretOverride Use a different secret instead @@ -187,7 +197,7 @@ export class AuthenticationBase { } try { - const verified = await jsonwebtoken.verify(accessToken, jwtSecret, options); + const verified = jsonwebtoken.verify(accessToken, jwtSecret, options); return verified as any; } catch (error) { @@ -197,6 +207,7 @@ export class AuthenticationBase { /** * Authenticate a given authentication request against a list of strategies. + * * @param authentication The authentication request * @param params Service call parameters * @param allowed A list of allowed strategy names @@ -233,6 +244,7 @@ export class AuthenticationBase { /** * Parse an HTTP request and response for authentication request information. + * * @param req The HTTP request * @param res The HTTP response * @param names A list of strategies to use diff --git a/packages/authentication/src/jwt.ts b/packages/authentication/src/jwt.ts index 93509c88f0..8173c3a429 100644 --- a/packages/authentication/src/jwt.ts +++ b/packages/authentication/src/jwt.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ import Debug from 'debug'; import omit from 'lodash/omit'; import { IncomingMessage } from 'http'; @@ -86,6 +87,7 @@ export class JWTStrategy extends AuthenticationBaseStrategy { /** * Return the entity for a given id + * * @param id The id to use * @param params Service call parameters */ @@ -96,7 +98,7 @@ export class JWTStrategy extends AuthenticationBaseStrategy { debug('Getting entity', id); if (entityService === null) { - throw new NotAuthenticated(`Could not find entity service`); + throw new NotAuthenticated('Could not find entity service'); } const query = await this.getEntityQuery(params); diff --git a/packages/authentication/src/service.ts b/packages/authentication/src/service.ts index f611845ecb..be697c2fab 100644 --- a/packages/authentication/src/service.ts +++ b/packages/authentication/src/service.ts @@ -9,8 +9,8 @@ import jsonwebtoken from 'jsonwebtoken'; const debug = Debug('@feathersjs/authentication/service'); -declare module '@feathersjs/feathers' { - interface Application { +declare module '@feathersjs/feathers/lib/declarations' { + interface Application { // eslint-disable-line /** * Returns the default authentication service or the @@ -27,10 +27,11 @@ declare module '@feathersjs/feathers' { } } +// eslint-disable-next-line export interface AuthenticationService extends ServiceAddons {} export class AuthenticationService extends AuthenticationBase implements Partial> { - constructor (app: Application, configKey: string = 'authentication', options = {}) { + constructor (app: Application, configKey = 'authentication', options = {}) { super(app, configKey, options); if (typeof app.defaultAuthentication !== 'function') { @@ -47,6 +48,7 @@ export class AuthenticationService extends AuthenticationBase implements Partial /** * Return the payload for a JWT based on the authentication result. * Called internally by the `create` method. + * * @param _authResult The current authentication result * @param params The service call parameters */ @@ -60,6 +62,7 @@ export class AuthenticationService extends AuthenticationBase implements Partial /** * Returns the JWT options based on an authentication result. * By default sets the JWT subject to the entity id. + * * @param authResult The authentication result * @param params Service call parameters */ @@ -86,6 +89,7 @@ export class AuthenticationService extends AuthenticationBase implements Partial /** * Create and return a new JWT for a given authentication request. * Will trigger the `login` event. + * * @param data The authentication request (should include `strategy` key) * @param params Service call parameters */ @@ -124,6 +128,7 @@ export class AuthenticationService extends AuthenticationBase implements Partial /** * Mark a JWT as removed. By default only verifies the JWT and returns the result. * Triggers the `logout` event. + * * @param id The JWT to remove or null * @param params Service call parameters */ @@ -150,12 +155,12 @@ export class AuthenticationService extends AuthenticationBase implements Partial const { secret, service, entity, entityId } = this.configuration; if (typeof secret !== 'string') { - throw new Error(`A 'secret' must be provided in your authentication configuration`); + throw new Error('A \'secret\' must be provided in your authentication configuration'); } if (entity !== null) { if (service === undefined) { - throw new Error(`The 'service' option is not set in the authentication configuration`); + throw new Error('The \'service\' option is not set in the authentication configuration'); } if (this.app.service(service) === undefined) { diff --git a/packages/authentication/test/hooks/authenticate.test.ts b/packages/authentication/test/hooks/authenticate.test.ts index 3758731d48..2e3147d6b9 100644 --- a/packages/authentication/test/hooks/authenticate.test.ts +++ b/packages/authentication/test/hooks/authenticate.test.ts @@ -95,7 +95,7 @@ describe('authentication/hooks/authenticate', () => { assert.fail('Should never get here'); } catch (error) { assert.strictEqual(error.name, 'NotAuthenticated'); - assert.strictEqual(error.message, `Could not find a valid authentication service`); + assert.strictEqual(error.message, 'Could not find a valid authentication service'); } }); diff --git a/packages/authentication/test/jwt.test.ts b/packages/authentication/test/jwt.test.ts index fa1680da50..bd27096756 100644 --- a/packages/authentication/test/jwt.test.ts +++ b/packages/authentication/test/jwt.test.ts @@ -1,8 +1,7 @@ import assert from 'assert'; import merge from 'lodash/merge'; import feathers, { Application, Service } from '@feathersjs/feathers'; -// @ts-ignore -import memory from 'feathers-memory'; +import { memory } from '@feathersjs/adapter-memory'; import { AuthenticationService, JWTStrategy, hooks } from '../src'; import { AuthenticationResult } from '../src/core'; @@ -222,7 +221,7 @@ describe('authentication/jwt', () => { assert.fail('Should never get here'); } catch (error) { assert.strictEqual(error.name, 'NotAuthenticated'); - assert.strictEqual(error.message, `Could not find entity service`); + assert.strictEqual(error.message, 'Could not find entity service'); } }); @@ -310,7 +309,7 @@ describe('authentication/jwt', () => { app.service('authentication').register('otherJwt', new JWTStrategy()); assert.fail('Should never get here'); } catch (error) { - assert.strictEqual(error.message, `Invalid JwtStrategy option 'authentication.otherJwt.expiresIn'. Did you mean to set it in 'authentication.jwtOptions'?`); + assert.strictEqual(error.message, 'Invalid JwtStrategy option \'authentication.otherJwt.expiresIn\'. Did you mean to set it in \'authentication.jwtOptions\'?'); } }); @@ -320,7 +319,7 @@ describe('authentication/jwt', () => { }; assert.throws(() => app.service('authentication').register('otherJwt', new JWTStrategy()), { - message: `The 'header' option for the otherJwt strategy must be a string` + message: 'The \'header\' option for the otherJwt strategy must be a string' }); }); }); @@ -369,7 +368,7 @@ describe('authentication/jwt', () => { it('return null when scheme does not match', async () => { const req = { headers: { - authorization: ` Basic something` + authorization: ' Basic something' } } as MockRequest; diff --git a/packages/authentication/test/service.test.ts b/packages/authentication/test/service.test.ts index de41aaf1a8..37ed7a6104 100644 --- a/packages/authentication/test/service.test.ts +++ b/packages/authentication/test/service.test.ts @@ -2,8 +2,7 @@ import assert from 'assert'; import omit from 'lodash/omit'; import jwt from 'jsonwebtoken'; import feathers, { Application, Service } from '@feathersjs/feathers'; -// @ts-ignore -import memory from 'feathers-memory'; +import { memory } from '@feathersjs/adapter-memory'; import defaultOptions from '../src/options'; import { AuthenticationService, AuthenticationResult } from '../src'; @@ -229,7 +228,7 @@ describe('authentication/service', () => { app.setup(); assert.fail('Should never get here'); } catch (error) { - assert.strictEqual(error.message, `A 'secret' must be provided in your authentication configuration`); + assert.strictEqual(error.message, 'A \'secret\' must be provided in your authentication configuration'); } }); @@ -245,7 +244,7 @@ describe('authentication/service', () => { otherApp.setup(); assert.fail('Should never get here'); } catch (error) { - assert.strictEqual(error.message, `The 'service' option is not set in the authentication configuration`); + assert.strictEqual(error.message, 'The \'service\' option is not set in the authentication configuration'); } }); @@ -263,7 +262,7 @@ describe('authentication/service', () => { otherApp.setup(); assert.fail('Should never get here'); } catch (error) { - assert.strictEqual(error.message, `The 'users' entity service does not exist (set to 'null' if it is not required)`); + assert.strictEqual(error.message, 'The \'users\' entity service does not exist (set to \'null\' if it is not required)'); } }); @@ -287,7 +286,7 @@ describe('authentication/service', () => { otherApp.setup(); assert.fail('Should never get here'); } catch (error) { - assert.strictEqual(error.message, `The 'users' service does not have an 'id' property and no 'entityId' option is set.`); + assert.strictEqual(error.message, 'The \'users\' service does not have an \'id\' property and no \'entityId\' option is set.'); } }); diff --git a/packages/client/.babelrc b/packages/client/.babelrc deleted file mode 100644 index ddafe9d618..0000000000 --- a/packages/client/.babelrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "presets": [ - [ - "@babel/preset-env", - { "loose": true } - ] - ] -} diff --git a/packages/client/CHANGELOG.md b/packages/client/CHANGELOG.md index efa0be0cee..c8ecaaab8d 100644 --- a/packages/client/CHANGELOG.md +++ b/packages/client/CHANGELOG.md @@ -3,6 +3,49 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### chore + +* **package:** Remove @feathersjs/primus packages from core ([#1919](https://github.com/feathersjs/feathers/issues/1919)) ([d20b7d5](https://github.com/feathersjs/feathers/commit/d20b7d5a70f4d3306e294696156e8aa0337c35e9)), closes [#1899](https://github.com/feathersjs/feathers/issues/1899) + + +### Features + +* **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) + + +### BREAKING CHANGES + +* **package:** Remove primus packages to be moved into the ecosystem. + + + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### chore + +* **package:** Remove @feathersjs/primus packages from core ([#1919](https://github.com/feathersjs/feathers/issues/1919)) ([d20b7d5](https://github.com/feathersjs/feathers/commit/d20b7d5a70f4d3306e294696156e8aa0337c35e9)), closes [#1899](https://github.com/feathersjs/feathers/issues/1899) + + +### Features + +* **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) + + +### BREAKING CHANGES + +* **package:** Remove primus packages to be moved into the ecosystem. + + ## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) **Note:** Version bump only for package @feathersjs/client diff --git a/packages/client/authentication.js b/packages/client/authentication.js deleted file mode 100644 index 936efab83f..0000000000 --- a/packages/client/authentication.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./dist/authentication'); diff --git a/packages/client/browser/test.js b/packages/client/browser/test.js index 98abdddf9a..fd9e96a9e5 100644 --- a/packages/client/browser/test.js +++ b/packages/client/browser/test.js @@ -1,11 +1,11 @@ const assert = require('assert'); const baseTests = require('@feathersjs/tests/lib/client'); -const memory = require('feathers-memory'); +const { Service } = require('@feathersjs/adapter-memory'); const feathers = require('../dist/feathers'); // Create an in-memory CRUD service for our Todos -class TodoService extends memory.Service { +class TodoService extends Service { get (id, params) { if (params.query.error) { return Promise.reject(new Error('Something went wrong')); diff --git a/packages/client/index.d.ts b/packages/client/index.d.ts deleted file mode 100644 index 70dff7ed41..0000000000 --- a/packages/client/index.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import feathers from '@feathersjs/feathers'; -import authentication from '@feathersjs/authentication-client'; -import errors from '@feathersjs/errors'; -import primus from '@feathersjs/primus-client'; -import rest from '@feathersjs/rest-client'; -import socketio from '@feathersjs/socketio-client'; - -export as namespace feathers; - -declare const feathersClient: FeathersClient; -export = feathersClient; - -type Feathers = typeof feathers; -type FeathersAuthenticationClient = typeof authentication; -type FeathersErrors = typeof errors; -type FeathersPrimusClient = typeof primus; -type FeathersRestClient = typeof rest; -type FeathersSocketIOClient = typeof socketio; - -interface FeathersClient extends Feathers { - authentication: FeathersAuthenticationClient; - errors: FeathersErrors; - primus: FeathersPrimusClient; - rest: FeathersRestClient; - socketio: FeathersSocketIOClient; -} diff --git a/packages/client/index.js b/packages/client/index.js deleted file mode 100644 index 8883ca3976..0000000000 --- a/packages/client/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./dist/feathers'); diff --git a/packages/client/package.json b/packages/client/package.json index e200d022dc..0727682603 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/client", "description": "A module that consolidates Feathers client modules for REST (jQuery, Request, Superagent) and Websocket (Socket.io, Primus) connections", - "version": "4.5.11", + "version": "5.0.0-pre.1", "repository": { "type": "git", "url": "https://github.com/feathersjs/feathers.git" @@ -23,61 +23,57 @@ "engines": { "node": ">= 10" }, - "main": "index.js", - "types": "index.d.ts", + "main": "dist/feathers", + "types": "dist/", "files": [ "CHANGELOG.md", "LICENSE", "README.md", "src/**", - "lib/**", "dist/**", "*.d.ts", "*.js" ], "scripts": { - "clean": "shx rm -rf dist/ && shx mkdir -p dist", + "compile": "tsc", "version": "npm run build", - "mocha": "mocha --config ../../.mocharc.json test/ --recursive", + "clean": "shx rm -rf dist/ && shx mkdir -p dist", + "build": "npm run clean && npm run compile && npm run webpack", + "mocha": "mocha --config ../../.mocharc.json --recursive test/**/*.test.ts", "test": "npm run build && npm run mocha", "test:browser": "mocha-puppeteer browser/test.js", - "build": "npm run clean && npm run webpack", "webpack": "parallel-webpack" }, "browserslist": [ "last 2 versions", - "IE 10" + "IE 11" ], + "dependencies": { + "@feathersjs/authentication-client": "^5.0.0-pre.1", + "@feathersjs/errors": "^5.0.0-pre.1", + "@feathersjs/feathers": "^5.0.0-pre.1", + "@feathersjs/rest-client": "^5.0.0-pre.1", + "@feathersjs/socketio-client": "^5.0.0-pre.1" + }, "devDependencies": { "@babel/core": "^7.12.9", "@babel/preset-env": "^7.12.7", - "@feathersjs/authentication-client": "^4.5.11", - "@feathersjs/errors": "^4.5.11", - "@feathersjs/express": "^4.5.11", - "@feathersjs/feathers": "^4.5.11", - "@feathersjs/primus": "^4.5.11", - "@feathersjs/primus-client": "^4.5.11", - "@feathersjs/rest-client": "^4.5.11", - "@feathersjs/socketio": "^4.5.11", - "@feathersjs/socketio-client": "^4.5.11", - "@feathersjs/tests": "^4.5.11", + "@feathersjs/adapter-memory": "^5.0.0-pre.1", + "@feathersjs/express": "^5.0.0-pre.1", + "@feathersjs/socketio": "^5.0.0-pre.1", + "@feathersjs/tests": "^5.0.0-pre.1", "babel-loader": "^8.2.2", - "body-parser": "^1.19.0", - "feathers-memory": "^4.1.0", - "jquery": "^3.5.1", - "jsdom": "^16.4.0", "mocha": "^8.2.1", "mocha-puppeteer": "^0.14.0", "node-fetch": "^2.6.1", "parallel-webpack": "^2.6.0", - "request": "^2.88.2", - "socket.io-client": "^2.3.1", + "shx": "^0.3.3", + "socket.io-client": "^3.0.3", "superagent": "^6.1.0", - "uglifyjs-webpack-plugin": "^2.2.0", + "ts-loader": "^8.0.12", + "typescript": "^4.1.2", "webpack": "^5.10.0", - "webpack-merge": "^5.4.0", - "ws": "^7.4.1", - "xhr2": "^0.2.0" + "webpack-merge": "^5.4.0" }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/client/primus.js b/packages/client/primus.js deleted file mode 100644 index 53970a2f9c..0000000000 --- a/packages/client/primus.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./dist/primus'); diff --git a/packages/client/rest.js b/packages/client/rest.js deleted file mode 100644 index aea6ff57ab..0000000000 --- a/packages/client/rest.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./dist/rest'); diff --git a/packages/client/socketio.js b/packages/client/socketio.js deleted file mode 100644 index 82a740ea54..0000000000 --- a/packages/client/socketio.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./dist/socketio'); diff --git a/packages/client/src/authentication.js b/packages/client/src/authentication.js deleted file mode 100644 index 5e0cd8d3ad..0000000000 --- a/packages/client/src/authentication.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@feathersjs/authentication-client'); diff --git a/packages/client/src/core.js b/packages/client/src/core.js deleted file mode 100644 index 827ca62cbb..0000000000 --- a/packages/client/src/core.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@feathersjs/feathers'); diff --git a/packages/client/src/core.ts b/packages/client/src/core.ts new file mode 100644 index 0000000000..325f8d781e --- /dev/null +++ b/packages/client/src/core.ts @@ -0,0 +1 @@ +export * from '@feathersjs/feathers'; diff --git a/packages/client/src/feathers.ts b/packages/client/src/feathers.ts new file mode 100644 index 0000000000..9ff11d4756 --- /dev/null +++ b/packages/client/src/feathers.ts @@ -0,0 +1,12 @@ +import feathers from '@feathersjs/feathers'; +import authentication from '@feathersjs/authentication-client'; +import rest from '@feathersjs/rest-client'; +import socketio from '@feathersjs/socketio-client'; + +export default feathers; +export * as errors from '@feathersjs/errors'; +export { authentication, rest, socketio }; + +if (typeof module !== 'undefined') { + module.exports = Object.assign(feathers, module.exports); +} diff --git a/packages/client/src/index.js b/packages/client/src/index.js deleted file mode 100644 index 806ad42dbd..0000000000 --- a/packages/client/src/index.js +++ /dev/null @@ -1,16 +0,0 @@ -const feathers = require('@feathersjs/feathers'); -const errors = require('@feathersjs/errors'); -const authentication = require('@feathersjs/authentication-client'); -const rest = require('@feathersjs/rest-client'); -const socketio = require('@feathersjs/socketio-client'); -const primus = require('@feathersjs/primus-client'); - -Object.assign(feathers, { - errors, - socketio, - primus, - rest, - authentication -}); - -module.exports = feathers; diff --git a/packages/client/src/primus.js b/packages/client/src/primus.js deleted file mode 100644 index 0def5eb195..0000000000 --- a/packages/client/src/primus.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@feathersjs/primus-client'); diff --git a/packages/client/src/rest.js b/packages/client/src/rest.js deleted file mode 100644 index fdbf671148..0000000000 --- a/packages/client/src/rest.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@feathersjs/rest-client'); diff --git a/packages/client/src/socketio.js b/packages/client/src/socketio.js deleted file mode 100644 index 9ab392310c..0000000000 --- a/packages/client/src/socketio.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@feathersjs/socketio-client'); diff --git a/packages/client/test/fixture.js b/packages/client/test/fixture.ts similarity index 66% rename from packages/client/test/fixture.js rename to packages/client/test/fixture.ts index 14646e4580..560f6bfbee 100644 --- a/packages/client/test/fixture.js +++ b/packages/client/test/fixture.ts @@ -1,16 +1,15 @@ -const feathers = require('@feathersjs/feathers'); -const express = require('@feathersjs/express'); -const rest = require('@feathersjs/express/rest'); -const memory = require('feathers-memory'); +import feathers, { Application, HookContext, Id, Params } from '@feathersjs/feathers'; +import * as express from '@feathersjs/express'; +import { Service } from '@feathersjs/adapter-memory'; // eslint-disable-next-line no-extend-native Object.defineProperty(Error.prototype, 'toJSON', { - value: function () { - var alt = {}; + value () { + const alt: any = {}; - Object.getOwnPropertyNames(this).forEach(function (key) { + Object.getOwnPropertyNames(this).forEach((key: string) => { alt[key] = this[key]; - }, this); + }); return alt; }, @@ -18,10 +17,10 @@ Object.defineProperty(Error.prototype, 'toJSON', { }); // Create an in-memory CRUD service for our Todos -class TodoService extends memory.Service { - get (id, params) { +class TodoService extends Service { + async get (id: Id, params: Params) { if (params.query.error) { - return Promise.reject(new Error('Something went wrong')); + throw new Error('Something went wrong'); } return super.get(id).then(data => @@ -30,12 +29,12 @@ class TodoService extends memory.Service { } } -module.exports = function (configurer) { - const app = express(feathers()) - .configure(rest()); +export default (configurer?: (app: Application) => void) => { + const app = express.default(feathers()) + .configure(express.rest()); if (typeof configurer === 'function') { - configurer.call(app); + configurer.call(app, app); } // Parse HTTP bodies @@ -57,7 +56,7 @@ module.exports = function (configurer) { service.create(testTodo); service.hooks({ after: { - remove (hook) { + remove (hook: HookContext) { if (hook.id === null) { service._uId = 0; return service.create(testTodo) diff --git a/packages/client/test/rest/fetch.test.js b/packages/client/test/rest/fetch.test.ts similarity index 54% rename from packages/client/test/rest/fetch.test.js rename to packages/client/test/rest/fetch.test.ts index 60e508de1c..f57f879916 100644 --- a/packages/client/test/rest/fetch.test.js +++ b/packages/client/test/rest/fetch.test.ts @@ -1,12 +1,12 @@ -const fetch = require('node-fetch'); -const baseTests = require('@feathersjs/tests/lib/client'); +import fetch from 'node-fetch'; +import { setupTests } from '@feathersjs/tests/src/client'; -const app = require('../fixture'); -const feathers = require('../../index'); +import * as feathers from '../../dist/feathers'; +import app from '../fixture'; describe('fetch REST connector', function () { const rest = feathers.rest('http://localhost:8889'); - const client = feathers() + const client = feathers.default() .configure(rest.fetch(fetch)); before(function (done) { @@ -17,5 +17,5 @@ describe('fetch REST connector', function () { this.server.close(done); }); - baseTests(client, 'todos'); + setupTests(client, 'todos'); }); diff --git a/packages/client/test/rest/request.test.js b/packages/client/test/rest/request.test.js deleted file mode 100644 index b02e52bd0c..0000000000 --- a/packages/client/test/rest/request.test.js +++ /dev/null @@ -1,21 +0,0 @@ -const request = require('request'); -const baseTests = require('@feathersjs/tests/lib/client'); - -const app = require('../fixture'); -const feathers = require('../../'); - -describe('node-request REST connector', function () { - const rest = feathers.rest('http://localhost:6777'); - const client = feathers() - .configure(rest.request(request)); - - before(function (done) { - this.server = app().listen(6777, done); - }); - - after(function (done) { - this.server.close(done); - }); - - baseTests(client, 'todos'); -}); diff --git a/packages/client/test/rest/superagent.test.js b/packages/client/test/rest/superagent.test.ts similarity index 55% rename from packages/client/test/rest/superagent.test.js rename to packages/client/test/rest/superagent.test.ts index accea2634e..a54cace738 100644 --- a/packages/client/test/rest/superagent.test.js +++ b/packages/client/test/rest/superagent.test.ts @@ -1,12 +1,12 @@ -const superagent = require('superagent'); -const baseTests = require('@feathersjs/tests/lib/client'); +import superagent from 'superagent'; +import { setupTests } from '@feathersjs/tests/src/client'; -const app = require('../fixture'); -const feathers = require('../../'); +import * as feathers from '../../dist/feathers'; +import app from '../fixture'; describe('Superagent REST connector', function () { const rest = feathers.rest('http://localhost:8889'); - const client = feathers() + const client = feathers.default() .configure(rest.superagent(superagent)); before(function (done) { @@ -17,5 +17,5 @@ describe('Superagent REST connector', function () { this.server.close(done); }); - baseTests(client, 'todos'); + setupTests(client, 'todos'); }); diff --git a/packages/client/test/server.js b/packages/client/test/server.js deleted file mode 100644 index c1f8d35897..0000000000 --- a/packages/client/test/server.js +++ /dev/null @@ -1,7 +0,0 @@ -const socketio = require('@feathersjs/socketio'); -const createApp = require('./fixture'); -const app = createApp(function () { - this.configure(socketio()); -}); - -module.exports = app.listen(3000); diff --git a/packages/client/test/server.ts b/packages/client/test/server.ts new file mode 100644 index 0000000000..e1d3792de6 --- /dev/null +++ b/packages/client/test/server.ts @@ -0,0 +1,8 @@ +import socketio from '@feathersjs/socketio'; +import createApp from './fixture'; + +const app = createApp(function () { + this.configure(socketio()); +}); + +export default app.listen(3000); diff --git a/packages/client/test/sockets/primus.test.js b/packages/client/test/sockets/primus.test.js deleted file mode 100644 index 38c00275de..0000000000 --- a/packages/client/test/sockets/primus.test.js +++ /dev/null @@ -1,29 +0,0 @@ -const primus = require('@feathersjs/primus'); -const baseTests = require('@feathersjs/tests/lib/client'); - -const app = require('../fixture'); -const feathers = require('../../'); - -describe('Primus connector', function () { - const client = feathers(); - - let socket; - - before(function (done) { - this.server = app(function () { - this.configure(primus({ - transformer: 'websockets' - }, function (primus) { - socket = new primus.Socket('http://localhost:12012'); - client.configure(feathers.primus(socket)); - })); - }).listen(12012, done); - }); - - after(function () { - socket.socket.close(); - this.server.close(); - }); - - baseTests(client, 'todos'); -}); diff --git a/packages/client/test/sockets/socketio.test.js b/packages/client/test/sockets/socketio.test.js deleted file mode 100644 index 31ad9bff94..0000000000 --- a/packages/client/test/sockets/socketio.test.js +++ /dev/null @@ -1,28 +0,0 @@ -const io = require('socket.io-client'); -const socketio = require('@feathersjs/socketio'); -const baseTests = require('@feathersjs/tests/lib/client'); - -const app = require('../fixture'); -const feathers = require('../../'); - -describe('Socket.io connector', function () { - const socket = io('http://localhost:9988'); - const client = feathers() - .configure(feathers.socketio(socket)); - - before(function (done) { - this.server = app(function () { - this.configure(socketio()); - }).listen(9988, done); - }); - - after(function (done) { - socket.once('disconnect', () => { - this.server.close(); - done(); - }); - socket.disconnect(); - }); - - baseTests(client, 'todos'); -}); diff --git a/packages/client/test/sockets/socketio.test.ts b/packages/client/test/sockets/socketio.test.ts new file mode 100644 index 0000000000..911a0877e9 --- /dev/null +++ b/packages/client/test/sockets/socketio.test.ts @@ -0,0 +1,26 @@ +import { io } from 'socket.io-client'; +import socketio from '@feathersjs/socketio'; +import { setupTests } from '@feathersjs/tests/src/client'; + +import * as feathers from '../../dist/feathers'; +import app from '../fixture'; + +describe('Socket.io connector', function () { + const socket = io('http://localhost:9988'); + const client = feathers.default() + .configure(feathers.socketio(socket)); + + before(function (done) { + this.server = app(app => app.configure(socketio())).listen(9988, done); + }); + + after(function (done) { + socket.once('disconnect', () => { + this.server.close(); + done(); + }); + socket.disconnect(); + }); + + setupTests(client, 'todos'); +}); diff --git a/packages/client/tsconfig.json b/packages/client/tsconfig.json new file mode 100644 index 0000000000..ea5cc61312 --- /dev/null +++ b/packages/client/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig", + "sourceMap": false, + "include": [ + "src/**/*.ts" + ], + "compilerOptions": { + "outDir": "dist/" + } +} diff --git a/packages/client/webpack.config.js b/packages/client/webpack.config.js index ac04391402..ca4e37011d 100644 --- a/packages/client/webpack.config.js +++ b/packages/client/webpack.config.js @@ -1,12 +1,12 @@ const path = require('path'); const webpack = require('webpack'); const { merge } = require('webpack-merge'); -const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); -function createConfig (name, isProduction = false) { - const output = name === 'index' ? 'feathers' : name; +function createConfig (output, isProduction = false) { const commons = { - entry: `./src/${name}.js`, + entry: [ + `./src/${output}.ts` + ], output: { library: 'feathers', libraryTarget: 'umd', @@ -14,13 +14,21 @@ function createConfig (name, isProduction = false) { path: path.resolve(__dirname, 'dist'), filename: `${output}.js` }, + resolve: { + extensions: [ '.tsx', '.ts', '.js' ] + }, module: { rules: [{ + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/ + }, { test: /\.js/, exclude: /node_modules\/(?!(@feathersjs|debug))/, loader: 'babel-loader', options: { presets: ['@babel/preset-env'] + // plugins: ['@babel/plugin-transform-classes'] } }] } @@ -36,13 +44,6 @@ function createConfig (name, isProduction = false) { filename: `${output}.min.js` }, plugins: [ - new UglifyJSPlugin({ - uglifyOptions: { - ie8: false, - comments: false, - sourceMap: false - } - }), new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify('production') }) @@ -53,16 +54,8 @@ function createConfig (name, isProduction = false) { } module.exports = [ - createConfig('index'), - createConfig('index', true), + createConfig('feathers'), + createConfig('feathers', true), createConfig('core'), - createConfig('core', true), - createConfig('rest'), - createConfig('rest', true), - createConfig('socketio'), - createConfig('socketio', true), - createConfig('primus'), - createConfig('primus', true), - createConfig('authentication'), - createConfig('authentication', true) + createConfig('core', true) ]; diff --git a/packages/commons/CHANGELOG.md b/packages/commons/CHANGELOG.md index 9a6fe2a3dd..d4fa0ddf8d 100644 --- a/packages/commons/CHANGELOG.md +++ b/packages/commons/CHANGELOG.md @@ -3,6 +3,32 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### Features + +* **core:** Migrate @feathersjs/feathers to TypeScript ([#1963](https://github.com/feathersjs/feathers/issues/1963)) ([7812529](https://github.com/feathersjs/feathers/commit/7812529ff0f1008e21211f1d01efbc49795dbe55)) +* **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) + + + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### Features + +* **core:** Migrate @feathersjs/feathers to TypeScript ([#1963](https://github.com/feathersjs/feathers/issues/1963)) ([7812529](https://github.com/feathersjs/feathers/commit/7812529ff0f1008e21211f1d01efbc49795dbe55)) +* **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) + + + ## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) **Note:** Version bump only for package @feathersjs/commons diff --git a/packages/commons/package.json b/packages/commons/package.json index 9ca1ab8b3d..d284fad7b6 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -1,6 +1,6 @@ { "name": "@feathersjs/commons", - "version": "4.5.11", + "version": "5.0.0-pre.1", "description": "Shared Feathers utility functions", "homepage": "https://feathersjs.com", "keywords": [ @@ -41,7 +41,7 @@ "scripts": { "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", - "test": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" + "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -57,5 +57,5 @@ "ts-node": "^9.1.0", "typescript": "^4.1.2" }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts index 8fbef52251..04f01d5aca 100644 --- a/packages/commons/src/index.ts +++ b/packages/commons/src/index.ts @@ -1,4 +1,101 @@ -import * as hookUtils from './hooks'; +// Removes all leading and trailing slashes from a path +export function stripSlashes (name: string) { + return name.replace(/^(\/+)|(\/+)$/g, ''); +} -export * from './utils'; -export const hooks = hookUtils; +export type KeyValueCallback = (value: any, key: string) => T; + +// A set of lodash-y utility functions that use ES6 +export const _ = { + each (obj: any, callback: KeyValueCallback) { + if (obj && typeof obj.forEach === 'function') { + obj.forEach(callback); + } else if (_.isObject(obj)) { + Object.keys(obj).forEach(key => callback(obj[key], key)); + } + }, + + some (value: any, callback: KeyValueCallback) { + return Object.keys(value) + .map(key => [ value[key], key ]) + .some(([val, key]) => callback(val, key)); + }, + + every (value: any, callback: KeyValueCallback) { + return Object.keys(value) + .map(key => [ value[key], key ]) + .every(([val, key]) => callback(val, key)); + }, + + keys (obj: any) { + return Object.keys(obj); + }, + + values (obj: any) { + return _.keys(obj).map(key => obj[key]); + }, + + isMatch (obj: any, item: any) { + return _.keys(item).every(key => obj[key] === item[key]); + }, + + isEmpty (obj: any) { + return _.keys(obj).length === 0; + }, + + isObject (item: any) { + return (typeof item === 'object' && !Array.isArray(item) && item !== null); + }, + + isObjectOrArray (value: any) { + return typeof value === 'object' && value !== null; + }, + + extend (first: any, ...rest: any[]) { + return Object.assign(first, ...rest); + }, + + omit (obj: any, ...keys: string[]) { + const result = _.extend({}, obj); + keys.forEach(key => delete result[key]); + return result; + }, + + pick (source: any, ...keys: string[]) { + return keys.reduce((result: { [key: string]: any }, key) => { + if (source[key] !== undefined) { + result[key] = source[key]; + } + + return result; + }, {}); + }, + + // Recursively merge the source object into the target object + merge (target: any, source: any) { + if (_.isObject(target) && _.isObject(source)) { + Object.keys(source).forEach(key => { + if (_.isObject(source[key])) { + if (!target[key]) { + Object.assign(target, { [key]: {} }); + } + + _.merge(target[key], source[key]); + } else { + Object.assign(target, { [key]: source[key] }); + } + }); + } + return target; + } +}; + +// Duck-checks if an object looks like a promise +export function isPromise (result: any) { + return _.isObject(result) && + typeof result.then === 'function'; +} + +export function createSymbol (name: string) { + return typeof Symbol !== 'undefined' ? Symbol(name) : name; +} diff --git a/packages/commons/src/utils.ts b/packages/commons/src/utils.ts deleted file mode 100644 index c6858d4979..0000000000 --- a/packages/commons/src/utils.ts +++ /dev/null @@ -1,114 +0,0 @@ -// Removes all leading and trailing slashes from a path -export function stripSlashes (name: string) { - return name.replace(/^(\/+)|(\/+)$/g, ''); -} - -export type KeyValueCallback = (value: any, key: string) => T; - -// A set of lodash-y utility functions that use ES6 -export const _ = { - each (obj: any, callback: KeyValueCallback) { - if (obj && typeof obj.forEach === 'function') { - obj.forEach(callback); - } else if (_.isObject(obj)) { - Object.keys(obj).forEach(key => callback(obj[key], key)); - } - }, - - some (value: any, callback: KeyValueCallback) { - return Object.keys(value) - .map(key => [ value[key], key ]) - .some(([val, key]) => callback(val, key)); - }, - - every (value: any, callback: KeyValueCallback) { - return Object.keys(value) - .map(key => [ value[key], key ]) - .every(([val, key]) => callback(val, key)); - }, - - keys (obj: any) { - return Object.keys(obj); - }, - - values (obj: any) { - return _.keys(obj).map(key => obj[key]); - }, - - isMatch (obj: any, item: any) { - return _.keys(item).every(key => obj[key] === item[key]); - }, - - isEmpty (obj: any) { - return _.keys(obj).length === 0; - }, - - isObject (item: any) { - return (typeof item === 'object' && !Array.isArray(item) && item !== null); - }, - - isObjectOrArray (value: any) { - return typeof value === 'object' && value !== null; - }, - - extend (first: any, ...rest: any[]) { - return Object.assign(first, ...rest); - }, - - omit (obj: any, ...keys: string[]) { - const result = _.extend({}, obj); - keys.forEach(key => delete result[key]); - return result; - }, - - pick (source: any, ...keys: string[]) { - return keys.reduce((result: { [key: string]: any }, key) => { - if (source[key] !== undefined) { - result[key] = source[key]; - } - - return result; - }, {}); - }, - - // Recursively merge the source object into the target object - merge (target: any, source: any) { - if (_.isObject(target) && _.isObject(source)) { - Object.keys(source).forEach(key => { - if (_.isObject(source[key])) { - if (!target[key]) { - Object.assign(target, { [key]: {} }); - } - - _.merge(target[key], source[key]); - } else { - Object.assign(target, { [key]: source[key] }); - } - }); - } - return target; - } -}; - -// Duck-checks if an object looks like a promise -export function isPromise (result: any) { - return _.isObject(result) && - typeof result.then === 'function'; -} - -export function makeUrl (path: string, app: any = {}) { - const get = typeof app.get === 'function' ? app.get.bind(app) : () => {}; - const env = get('env') || process.env.NODE_ENV; - const host = get('host') || process.env.HOST_NAME || 'localhost'; - const protocol = (env === 'development' || env === 'test' || (env === undefined)) ? 'http' : 'https'; - const PORT = get('port') || process.env.PORT || 3030; - const port = (env === 'development' || env === 'test' || (env === undefined)) ? `:${PORT}` : ''; - - path = path || ''; - - return `${protocol}://${host}${port}/${exports.stripSlashes(path)}`; -} - -export function createSymbol (name: string) { - return typeof Symbol !== 'undefined' ? Symbol(name) : name; -} diff --git a/packages/commons/test/module.test.ts b/packages/commons/test/module.test.ts index 77458be989..7ab2acebbd 100644 --- a/packages/commons/test/module.test.ts +++ b/packages/commons/test/module.test.ts @@ -3,11 +3,11 @@ import { _ } from '../src'; describe('module', () => { it('is commonjs compatible', () => { + // eslint-disable-next-line const commons = require('../lib'); assert.equal(typeof commons, 'object'); assert.equal(typeof commons.stripSlashes, 'function'); - assert.equal(typeof commons.hooks, 'object'); assert.equal(typeof commons._, 'object'); }); diff --git a/packages/commons/test/utils.test.ts b/packages/commons/test/utils.test.ts index 0a3a152f18..fb7eafc9c5 100644 --- a/packages/commons/test/utils.test.ts +++ b/packages/commons/test/utils.test.ts @@ -1,14 +1,6 @@ /* tslint:disable:no-unused-expression */ - import { strict as assert } from 'assert'; - -import { - _, - stripSlashes, - isPromise, - makeUrl, - createSymbol -} from '../src'; +import { _, stripSlashes, isPromise, createSymbol } from '../src'; describe('@feathersjs/commons utils', () => { it('stripSlashes', () => { @@ -168,64 +160,4 @@ describe('@feathersjs/commons utils', () => { assert.equal(_.merge('hello', {}), 'hello'); }); }); - - describe('makeUrl', function () { - let mockApp: any; - - beforeEach(() => { - mockApp = { env: 'development' }; - mockApp.get = (value: any) => { - switch (value) { - case 'port': - return 3030; - case 'host': - return 'feathersjs.com'; - case 'env': - return mockApp.env; - } - }; - }); - - it('when in development mode returns the correct url', () => { - const uri = makeUrl('test', mockApp); - assert.equal(uri, 'http://feathersjs.com:3030/test'); - }); - - it('when in test mode returns the correct url', () => { - mockApp.env = 'test'; - const uri = makeUrl('test', mockApp); - assert.equal(uri, 'http://feathersjs.com:3030/test'); - }); - - it('when in production mode returns the correct url', () => { - mockApp.env = 'production'; - const uri = makeUrl('test', mockApp); - assert.equal(uri, 'https://feathersjs.com/test'); - }); - - it('when path is not provided returns a default url', () => { - const uri = makeUrl(null, mockApp); - assert.equal(uri, 'http://feathersjs.com:3030/'); - }); - - it('when app is not defined returns the correct url', () => { - const uri = makeUrl('test'); - assert.equal(uri, 'http://localhost:3030/test'); - }); - - it('strips leading slashes on path', () => { - const uri = makeUrl('/test'); - assert.equal(uri, 'http://localhost:3030/test'); - }); - - it('strips trailing slashes on path', () => { - const uri = makeUrl('test/'); - assert.equal(uri, 'http://localhost:3030/test'); - }); - - it('works with query strings', () => { - const uri = makeUrl('test?admin=true'); - assert.equal(uri, 'http://localhost:3030/test?admin=true'); - }); - }); }); diff --git a/packages/configuration/CHANGELOG.md b/packages/configuration/CHANGELOG.md index 600c6c38b9..3afffc90e6 100644 --- a/packages/configuration/CHANGELOG.md +++ b/packages/configuration/CHANGELOG.md @@ -3,18 +3,39 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) -**Note:** Version bump only for package @feathersjs/configuration +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) +### chore -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) +* **configuration:** Remove environment variable substitution ([#1942](https://github.com/feathersjs/feathers/issues/1942)) ([caaa21f](https://github.com/feathersjs/feathers/commit/caaa21ffdc6a8dcac82fb403c91d9d4b781a6c0a)) -**Note:** Version bump only for package @feathersjs/configuration +### BREAKING CHANGES + +* **configuration:** Falls back to node-config instead of adding additional +functionality like path replacements and automatic environment variable insertion. + + + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### chore + +* **configuration:** Remove environment variable substitution ([#1942](https://github.com/feathersjs/feathers/issues/1942)) ([caaa21f](https://github.com/feathersjs/feathers/commit/caaa21ffdc6a8dcac82fb403c91d9d4b781a6c0a)) + + +### BREAKING CHANGES + +* **configuration:** Falls back to node-config instead of adding additional +functionality like path replacements and automatic environment variable insertion. diff --git a/packages/configuration/package.json b/packages/configuration/package.json index 8855455730..dc08662823 100644 --- a/packages/configuration/package.json +++ b/packages/configuration/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/configuration", "description": "A small configuration module for your Feathers application.", - "version": "4.5.11", + "version": "5.0.0-pre.1", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -43,7 +43,7 @@ "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", "test": "npm run compile && npm run mocha", - "mocha": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" + "mocha": "NODE_CONFIG_DIR=./test/config mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "semistandard": { "env": [ @@ -57,7 +57,7 @@ "access": "public" }, "dependencies": { - "@feathersjs/feathers": "^4.5.11", + "@feathersjs/feathers": "^5.0.0-pre.1", "config": "^3.3.3", "debug": "^4.3.1" }, @@ -71,5 +71,5 @@ "ts-node": "^9.1.0", "typescript": "^4.1.2" }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/configuration/src/index.ts b/packages/configuration/src/index.ts index f67922fdbe..5cdea8193f 100644 --- a/packages/configuration/src/index.ts +++ b/packages/configuration/src/index.ts @@ -1,65 +1,23 @@ import { Application } from '@feathersjs/feathers'; import Debug from 'debug'; -import path from 'path'; import config from 'config'; const debug = Debug('@feathersjs/configuration'); -const separator = path.sep; -export default function init () { +export = function init () { return (app?: Application) => { - const convert = (current: any) => { - const result: { [key: string]: any } = Array.isArray(current) ? [] : {}; - - Object.keys(current).forEach(name => { - let value = current[name]; - - if (typeof value === 'object' && value !== null) { - value = convert(value); - } - - if (typeof value === 'string') { - if (value.indexOf('\\') === 0) { - value = value.replace('\\', ''); - } else { - if (process.env[value]) { - value = process.env[value]; - } - if (value.indexOf('./') === 0 || value.indexOf('../') === 0) { - // Make relative paths absolute - value = path.resolve( - path.join(config.util.getEnv('NODE_CONFIG_DIR')), - value.replace(/\//g, separator) - ); - } - } - } - - result[name] = value; - }); - - return result; - }; - - const env = config.util.getEnv('NODE_ENV'); - const conf = convert(config); - if (!app) { - return conf; + return config; } - debug(`Initializing configuration for ${env} environment`); + debug(`Initializing configuration for ${config.util.getEnv('NODE_ENV')} environment`); - Object.keys(conf).forEach(name => { - const value = conf[name]; + Object.keys(config).forEach(name => { + const value = (config as any)[name]; debug(`Setting ${name} configuration value to`, value); - app!.set(name, value); + app.set(name, value); }); - return conf; + return config; }; } - -if (typeof module !== 'undefined') { - module.exports = Object.assign(init, module.exports); -} diff --git a/packages/configuration/test/config/custom-environment-variables.json b/packages/configuration/test/config/custom-environment-variables.json deleted file mode 100644 index 80c1764937..0000000000 --- a/packages/configuration/test/config/custom-environment-variables.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "port": "PORT", - "mongodb": "MONGOHQ_URL" -} diff --git a/packages/configuration/test/config/default.json b/packages/configuration/test/config/default.json index c336b5d442..8e3ede2021 100644 --- a/packages/configuration/test/config/default.json +++ b/packages/configuration/test/config/default.json @@ -1,13 +1,5 @@ { "port": 3030, - "environment": "NODE_ENV", - "path": "../something", - "notDotPath": ".dot", - "notDotDotPath": "..dotdot", - "pathFromEnv": "PATH_ENV", - "unescaped": "\\NODE_ENV", - "from": "default", - "deeply": { "nested": { "env": "NODE_ENV" } }, "array": ["one", "two", "three"], "deep": { "base": false }, "nullish": null diff --git a/packages/configuration/test/config/testing.js b/packages/configuration/test/config/testing.js deleted file mode 100644 index 039b4612d6..0000000000 --- a/packages/configuration/test/config/testing.js +++ /dev/null @@ -1,18 +0,0 @@ -// @feathersjs/configuration pulls in default and settings files using -// Node's `require()`. -// Node require() looks first for .js, -// and if not found, it will check for .json -// -// This configuration file has `.js` suffix, and must provide -// a `module.exports` containing the configuration properties. - -var derivedSetting = 'Hello World'; -var derivedEnvironment = 'NODE_ENV'; - -module.exports = { - from: 'testing', - testEnvironment: 'NODE_ENV', - derived: derivedSetting, - derivedEnvironment: derivedEnvironment, - deep: { merge: true } -}; diff --git a/packages/configuration/test/index.test.ts b/packages/configuration/test/index.test.ts index 99eee0c4c7..6ad2d1e2f5 100644 --- a/packages/configuration/test/index.test.ts +++ b/packages/configuration/test/index.test.ts @@ -1,99 +1,23 @@ -import assert from 'assert'; -import { join } from 'path'; +import { strict as assert } from 'assert'; import feathers, { Application } from '@feathersjs/feathers'; +import plugin from '../src'; describe('@feathersjs/configuration', () => { - const originalEnv: { [key: string]: any } = {}; - let app: Application; - let plugin: any; - - before(() => { - originalEnv.NODE_ENV = process.env.NODE_ENV; - originalEnv.NODE_CONFIG_DIR = process.env.NODE_CONFIG_DIR; - - process.env.NODE_ENV = 'testing'; - process.env.NODE_CONFIG_DIR = join(__dirname, 'config'); - process.env.PATH_ENV = '../something'; - - plugin = require('../lib'); - app = feathers().configure(plugin()); + const app: Application = feathers().configure(plugin()); + + it('initialized app with default.json', () => { + assert.equal(app.get('port'), 3030); + assert.deepEqual(app.get('array'), [ + 'one', 'two', 'three' + ]); + assert.deepEqual(app.get('deep'), { base: false }); + assert.deepEqual(app.get('nullish'), null); }); - after(() => { - process.env.NODE_ENV = originalEnv.NODE_ENV; - process.env.NODE_CONFIG_DIR = originalEnv.NODE_CONFIG_DIR; - }); - - it('exports default', () => - assert.strictEqual(plugin, plugin.default) - ); - - it('initialized app with default data', () => - assert.strictEqual(app.get('port'), 3030) - ); - - it('initialized with ', () => - assert.strictEqual(app.get('from'), 'testing') - ); - - it('initialized with derived data module', () => - assert.strictEqual(app.get('derived'), 'Hello World') - ); - - it('initialized property with environment variable', () => - assert.strictEqual(app.get('environment'), 'testing') - ); - - it('initialized property with environment variable from ', () => - assert.strictEqual(app.get('testEnvironment'), 'testing') - ); - - it('initialized property with derived environment variable from module', () => - assert.strictEqual(app.get('derivedEnvironment'), 'testing') - ); - - it('uses an escape character', () => - assert.strictEqual(app.get('unescaped'), 'NODE_ENV') - ); - - it('normalizes relative path names', () => - assert.strictEqual(app.get('path'), join(__dirname, 'something')) - ); - - it('normalizes relative path names from environment variable', () => - assert.strictEqual(app.get('pathFromEnv'), join(__dirname, 'something')) - ); - - it('does not normalize values that start with . but are not a relative path', () => - assert.strictEqual(app.get('notDotPath'), '.dot') - ); - - it('does not normalize values that start with .. but are not a relative path', () => - assert.strictEqual(app.get('notDotDotPath'), '..dotdot') - ); - - it('converts environment variables recursively', () => - assert.strictEqual(app.get('deeply').nested.env, 'testing') - ); - - it('converts arrays as actual arrays', () => - assert.ok(Array.isArray(app.get('array'))) - ); - it('works when called directly', () => { const fn = plugin(); + const conf = fn() as any; - assert.strictEqual(fn().port, 3030); - }); - - it('deep merges properties', () => - assert.deepStrictEqual(app.get('deep'), { - base: false, - merge: true - }) - ); - - it('supports null value', () => { - assert.strictEqual(app.get('nullish'), null); + assert.strictEqual(conf.port, 3030); }); }); diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index 7aa5d75bf8..f92d22838e 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -3,16 +3,31 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) ### Bug Fixes -* **typescript:** Fix `data` property definition in @feathersjs/errors ([#2018](https://github.com/feathersjs/feathers/issues/2018)) ([ef1398c](https://github.com/feathersjs/feathers/commit/ef1398cd5b19efa50929e8c9511ca5684a18997f)) +* **errors:** Format package.json with spaces ([cbd31c1](https://github.com/feathersjs/feathers/commit/cbd31c10c2c574de63d6ca5e55dbfb73a5fdd758)) + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) +### Bug Fixes + +* **errors:** Format package.json with spaces ([cbd31c1](https://github.com/feathersjs/feathers/commit/cbd31c10c2c574de63d6ca5e55dbfb73a5fdd758)) +* **typescript:** Fix `data` property definition in @feathersjs/errors ([#2018](https://github.com/feathersjs/feathers/issues/2018)) ([ef1398c](https://github.com/feathersjs/feathers/commit/ef1398cd5b19efa50929e8c9511ca5684a18997f)) + +## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) + +**Note:** Version bump only for package @feathersjs/errors ## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) diff --git a/packages/errors/index.d.ts b/packages/errors/index.d.ts deleted file mode 100644 index 4c43f46427..0000000000 --- a/packages/errors/index.d.ts +++ /dev/null @@ -1,122 +0,0 @@ -export interface FeathersErrorJSON { - readonly name: string; - readonly message: string; - readonly code: number; - readonly className: string; - readonly data?: any; - readonly errors: any; -} - -export class FeathersError extends Error { - readonly code: number; - readonly className: string; - readonly data?: unknown; - readonly errors: any; - constructor (msg: string | Error, name: string, code: number, className: string, data: any); - toJSON (): FeathersErrorJSON; -} - -export class BadRequest extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class NotAuthenticated extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class PaymentError extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class Forbidden extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class NotFound extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class MethodNotAllowed extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class NotAcceptable extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class Timeout extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class Conflict extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class LengthRequired extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class Unprocessable extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class TooManyRequests extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class GeneralError extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class NotImplemented extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class BadGateway extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export class Unavailable extends FeathersError { - constructor (msg?: string | Error, data?: any); -} - -export interface Errors { - FeathersError: FeathersError; - BadRequest: BadRequest; - NotAuthenticated: NotAuthenticated; - PaymentError: PaymentError; - Forbidden: Forbidden; - NotFound: NotFound; - MethodNotAllowed: MethodNotAllowed; - NotAcceptable: NotAcceptable; - Timeout: Timeout; - Conflict: Conflict; - LengthRequired: LengthRequired; - Unprocessable: Unprocessable; - TooManyRequests: TooManyRequests; - GeneralError: GeneralError; - NotImplemented: NotImplemented; - BadGateway: BadGateway; - Unavailable: Unavailable; - 400: BadRequest; - 401: NotAuthenticated; - 402: PaymentError; - 403: Forbidden; - 404: NotFound; - 405: MethodNotAllowed; - 406: NotAcceptable; - 408: Timeout; - 409: Conflict; - 411: LengthRequired; - 422: Unprocessable; - 429: TooManyRequests; - 500: GeneralError; - 501: NotImplemented; - 502: BadGateway; - 503: Unavailable; -} - -export function convert (error: any): FeathersError; - -export const types: Errors; -export const errors: Errors; diff --git a/packages/errors/lib/index.js b/packages/errors/lib/index.js deleted file mode 100644 index b1f5ca7127..0000000000 --- a/packages/errors/lib/index.js +++ /dev/null @@ -1,258 +0,0 @@ -const debug = require('debug')('@feathersjs/errors'); - -function FeathersError (msg, name, code, className, data) { - msg = msg || 'Error'; - - let errors; - let message; - let newData; - - if (msg instanceof Error) { - message = msg.message || 'Error'; - - // NOTE (EK): This is typically to handle validation errors - if (msg.errors) { - errors = msg.errors; - } - } else if (typeof msg === 'object') { // Support plain old objects - message = msg.message || 'Error'; - data = msg; - } else { // message is just a string - message = msg; - } - - if (data) { - // NOTE(EK): To make sure that we are not messing - // with immutable data, just make a copy. - // https://github.com/feathersjs/errors/issues/19 - newData = JSON.parse(JSON.stringify(data)); - - if (newData.errors) { - errors = newData.errors; - delete newData.errors; - } else if (data.errors) { - // The errors property from data could be - // stripped away while cloning resulting newData not to have it - // For example: when cloning arrays this property - errors = JSON.parse(JSON.stringify(data.errors)); - } - } - - // NOTE (EK): Babel doesn't support this so - // we have to pass in the class name manually. - // this.name = this.constructor.name; - this.type = 'FeathersError'; - this.name = name; - this.message = message; - this.code = code; - this.className = className; - this.data = newData; - this.errors = errors || {}; - - debug(`${this.name}(${this.code}): ${this.message}`); - debug(this.errors); - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, FeathersError); - } else { - this.stack = (new Error()).stack; - } -} - -function inheritsFrom (Child, Parent) { - Child.prototype = Object.create(Parent.prototype); - Child.prototype.constructor = Child; -} - -inheritsFrom(FeathersError, Error); - -// NOTE (EK): A little hack to get around `message` not -// being included in the default toJSON call. -Object.defineProperty(FeathersError.prototype, 'toJSON', { - value: function () { - return { - name: this.name, - message: this.message, - code: this.code, - className: this.className, - data: this.data, - errors: this.errors - }; - } -}); - -// 400 - Bad Request -function BadRequest (message, data) { - FeathersError.call(this, message, 'BadRequest', 400, 'bad-request', data); -} - -inheritsFrom(BadRequest, FeathersError); - -// 401 - Not Authenticated -function NotAuthenticated (message, data) { - FeathersError.call(this, message, 'NotAuthenticated', 401, 'not-authenticated', data); -} - -inheritsFrom(NotAuthenticated, FeathersError); - -// 402 - Payment Error -function PaymentError (message, data) { - FeathersError.call(this, message, 'PaymentError', 402, 'payment-error', data); -} - -inheritsFrom(PaymentError, FeathersError); - -// 403 - Forbidden -function Forbidden (message, data) { - FeathersError.call(this, message, 'Forbidden', 403, 'forbidden', data); -} - -inheritsFrom(Forbidden, FeathersError); - -// 404 - Not Found -function NotFound (message, data) { - FeathersError.call(this, message, 'NotFound', 404, 'not-found', data); -} - -inheritsFrom(NotFound, FeathersError); - -// 405 - Method Not Allowed -function MethodNotAllowed (message, data) { - FeathersError.call(this, message, 'MethodNotAllowed', 405, 'method-not-allowed', data); -} - -inheritsFrom(MethodNotAllowed, FeathersError); - -// 406 - Not Acceptable -function NotAcceptable (message, data) { - FeathersError.call(this, message, 'NotAcceptable', 406, 'not-acceptable', data); -} - -inheritsFrom(NotAcceptable, FeathersError); - -// 408 - Timeout -function Timeout (message, data) { - FeathersError.call(this, message, 'Timeout', 408, 'timeout', data); -} - -inheritsFrom(Timeout, FeathersError); - -// 409 - Conflict -function Conflict (message, data) { - FeathersError.call(this, message, 'Conflict', 409, 'conflict', data); -} - -inheritsFrom(Conflict, FeathersError); - -// 410 - Gone -function Gone (message, data) { - FeathersError(this, message, 'Gone', 410, 'gone', data); -} - -inheritsFrom(Gone, FeathersError); - -// 411 - Length Required -function LengthRequired (message, data) { - FeathersError.call(this, message, 'LengthRequired', 411, 'length-required', data); -} - -inheritsFrom(LengthRequired, FeathersError); - -// 422 Unprocessable -function Unprocessable (message, data) { - FeathersError.call(this, message, 'Unprocessable', 422, 'unprocessable', data); -} - -inheritsFrom(Unprocessable, FeathersError); - -// 429 Too Many Requests -function TooManyRequests (message, data) { - FeathersError.call(this, message, 'TooManyRequests', 429, 'too-many-requests', data); -} - -inheritsFrom(TooManyRequests, FeathersError); - -// 500 - General Error -function GeneralError (message, data) { - FeathersError.call(this, message, 'GeneralError', 500, 'general-error', data); -} - -inheritsFrom(GeneralError, FeathersError); - -// 501 - Not Implemented -function NotImplemented (message, data) { - FeathersError.call(this, message, 'NotImplemented', 501, 'not-implemented', data); -} - -inheritsFrom(NotImplemented, FeathersError); - -// 502 - Bad Gateway -function BadGateway (message, data) { - FeathersError.call(this, message, 'BadGateway', 502, 'bad-gateway', data); -} - -inheritsFrom(BadGateway, FeathersError); - -// 503 - Unavailable -function Unavailable (message, data) { - FeathersError.call(this, message, 'Unavailable', 503, 'unavailable', data); -} - -inheritsFrom(Unavailable, FeathersError); - -const errors = { - FeathersError, - BadRequest, - NotAuthenticated, - PaymentError, - Forbidden, - NotFound, - MethodNotAllowed, - NotAcceptable, - Timeout, - Conflict, - Gone, - LengthRequired, - Unprocessable, - TooManyRequests, - GeneralError, - NotImplemented, - BadGateway, - Unavailable, - 400: BadRequest, - 401: NotAuthenticated, - 402: PaymentError, - 403: Forbidden, - 404: NotFound, - 405: MethodNotAllowed, - 406: NotAcceptable, - 408: Timeout, - 409: Conflict, - 410: Gone, - 411: LengthRequired, - 422: Unprocessable, - 429: TooManyRequests, - 500: GeneralError, - 501: NotImplemented, - 502: BadGateway, - 503: Unavailable -}; - -function convert (error) { - if (!error) { - return error; - } - - const FeathersError = errors[error.name]; - const result = FeathersError - ? new FeathersError(error.message, error.data) - : new Error(error.message || error); - - if (typeof error === 'object') { - Object.assign(result, error); - } - - return result; -} - -module.exports = Object.assign({ convert }, errors); diff --git a/packages/errors/package.json b/packages/errors/package.json index d177e2c19b..0e6a610bb2 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,56 +1,59 @@ { - "name": "@feathersjs/errors", - "description": "Common error types for Feathers apps", - "version": "4.5.11", - "homepage": "https://feathersjs.com", - "main": "lib/index", - "types": "index.d.ts", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 10" - }, - "directories": { - "lib": "lib" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "test": "mocha --config ../../.mocharc.json" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "debug": "^4.3.1" - }, - "devDependencies": { - "@feathersjs/feathers": "^4.5.11", - "express": "^4.17.1", - "mocha": "^8.2.1" - }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "name": "@feathersjs/errors", + "description": "Common error types for Feathers apps", + "version": "5.0.0-pre.1", + "homepage": "https://feathersjs.com", + "main": "lib/", + "types": "lib/", + "keywords": [ + "feathers", + "feathers-plugin" + ], + "license": "MIT", + "repository": { + "type": "git", + "url": "git://github.com/feathersjs/feathers.git" + }, + "author": { + "name": "Feathers contributors", + "email": "hello@feathersjs.com", + "url": "https://feathersjs.com" + }, + "contributors": [], + "bugs": { + "url": "https://github.com/feathersjs/feathers/issues" + }, + "engines": { + "node": ">= 10" + }, + "directories": { + "lib": "lib" + }, + "scripts": { + "prepublish": "npm run compile", + "compile": "shx rm -rf lib/ && tsc", + "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + }, + "publishConfig": { + "access": "public" + }, + "files": [ + "CHANGELOG.md", + "LICENSE", + "README.md", + "src/**", + "lib/**", + "*.d.ts", + "*.js" + ], + "devDependencies": { + "@feathersjs/feathers": "^5.0.0-pre.1", + "@types/mocha": "^8.0.4", + "@types/node": "^14.14.10", + "mocha": "^8.2.1", + "shx": "^0.3.3", + "ts-node": "^9.1.0", + "typescript": "^4.1.2" + }, + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/errors/src/index.ts b/packages/errors/src/index.ts new file mode 100644 index 0000000000..25c692bcf3 --- /dev/null +++ b/packages/errors/src/index.ts @@ -0,0 +1,273 @@ +export interface FeathersErrorJSON { + name: string; + message: string; + code: number; + className: string; + data?: any; + errors?: any; +} + +export type DynamicError = Error & { [key: string]: any }; +export type ErrorMessage = string | DynamicError | { [key: string]: any } | any[]; + +interface ErrorProperties extends Omit { + type: string; +} + +export class FeathersError extends Error { + readonly type: string; + readonly code: number; + readonly className: string; + readonly data: any; + readonly errors: any; + + constructor (err: ErrorMessage, name: string, code: number, className: string, _data: any) { + let msg = typeof err === 'string' ? err : 'Error'; + const properties: ErrorProperties = { + name, + code, + className, + type: 'FeathersError' + }; + + if (Array.isArray(_data)) { + properties.data = _data; + } else if (typeof err === 'object' || _data !== undefined) { + const { message, errors, ...rest } = typeof err === 'object' ? err : _data; + + msg = message || msg; + properties.errors = errors; + properties.data = rest; + } + + super(msg); + Object.assign(this, properties); + } + + toJSON () { + const result: FeathersErrorJSON = { + name: this.name, + message: this.message, + code: this.code, + className: this.className + }; + + if (this.data !== undefined) { + result.data = this.data; + } + + if (this.errors !== undefined) { + result.errors = this.errors; + } + + return result; + } +} + +export class BadRequest extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'BadRequest', 400, 'bad-request', data); + } +} + +// 401 - Not Authenticated +export class NotAuthenticated extends FeathersError{ + constructor (message?: ErrorMessage, data?: any) { + super(message, 'NotAuthenticated', 401, 'not-authenticated', data); + } +} + +// 402 - Payment Error +export class PaymentError extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'PaymentError', 402, 'payment-error', data); + } +} + +// 403 - Forbidden +export class Forbidden extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'Forbidden', 403, 'forbidden', data); + } +} + +// 404 - Not Found +export class NotFound extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'NotFound', 404, 'not-found', data); + } +} + +// 405 - Method Not Allowed +export class MethodNotAllowed extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'MethodNotAllowed', 405, 'method-not-allowed', data); + } +} + +// 406 - Not Acceptable +export class NotAcceptable extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'NotAcceptable', 406, 'not-acceptable', data); + } +} + +// 408 - Timeout +export class Timeout extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'Timeout', 408, 'timeout', data); + } +} + +// 409 - Conflict +export class Conflict extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'Conflict', 409, 'conflict', data); + } +} + +// 410 - Gone +export class Gone extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'Gone', 410, 'gone', data); + } +} + +// 411 - Length Required +export class LengthRequired extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'LengthRequired', 411, 'length-required', data); + } +} + +// 422 Unprocessable +export class Unprocessable extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'Unprocessable', 422, 'unprocessable', data); + } +} + +// 429 Too Many Requests +export class TooManyRequests extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'TooManyRequests', 429, 'too-many-requests', data); + } +} + +// 500 - General Error +export class GeneralError extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'GeneralError', 500, 'general-error', data); + } +} + +// 501 - Not Implemented +export class NotImplemented extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'NotImplemented', 501, 'not-implemented', data); + } +} + +// 502 - Bad Gateway +export class BadGateway extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'BadGateway', 502, 'bad-gateway', data); + } +} + +// 503 - Unavailable +export class Unavailable extends FeathersError { + constructor (message?: ErrorMessage, data?: any) { + super(message, 'Unavailable', 503, 'unavailable', data); + } +} + +export interface Errors { + FeathersError: FeathersError; + BadRequest: BadRequest; + NotAuthenticated: NotAuthenticated; + PaymentError: PaymentError; + Forbidden: Forbidden; + NotFound: NotFound; + MethodNotAllowed: MethodNotAllowed; + NotAcceptable: NotAcceptable; + Timeout: Timeout; + Conflict: Conflict; + LengthRequired: LengthRequired; + Unprocessable: Unprocessable; + TooManyRequests: TooManyRequests; + GeneralError: GeneralError; + NotImplemented: NotImplemented; + BadGateway: BadGateway; + Unavailable: Unavailable; + 400: BadRequest; + 401: NotAuthenticated; + 402: PaymentError; + 403: Forbidden; + 404: NotFound; + 405: MethodNotAllowed; + 406: NotAcceptable; + 408: Timeout; + 409: Conflict; + 411: LengthRequired; + 422: Unprocessable; + 429: TooManyRequests; + 500: GeneralError; + 501: NotImplemented; + 502: BadGateway; + 503: Unavailable; +} + +export const errors = { + FeathersError, + BadRequest, + NotAuthenticated, + PaymentError, + Forbidden, + NotFound, + MethodNotAllowed, + NotAcceptable, + Timeout, + Conflict, + LengthRequired, + Unprocessable, + TooManyRequests, + GeneralError, + NotImplemented, + BadGateway, + Unavailable, + 400: BadRequest, + 401: NotAuthenticated, + 402: PaymentError, + 403: Forbidden, + 404: NotFound, + 405: MethodNotAllowed, + 406: NotAcceptable, + 408: Timeout, + 409: Conflict, + 410: Gone, + 411: LengthRequired, + 422: Unprocessable, + 429: TooManyRequests, + 500: GeneralError, + 501: NotImplemented, + 502: BadGateway, + 503: Unavailable +} + +export function convert (error: any) { + if (!error) { + return error; + } + + const FeathersError = (errors as any)[error.name]; + const result = FeathersError + ? new FeathersError(error.message, error.data) + : new Error(error.message || error); + + if (typeof error === 'object') { + Object.assign(result, error); + } + + return result; +} diff --git a/packages/errors/test/index.test.js b/packages/errors/test/index.test.ts similarity index 73% rename from packages/errors/test/index.test.js rename to packages/errors/test/index.test.ts index 1b14ae4bc1..10e679eb9b 100644 --- a/packages/errors/test/index.test.js +++ b/packages/errors/test/index.test.ts @@ -1,14 +1,9 @@ -const assert = require('assert'); +import assert from 'assert'; +import * as errors from '../src'; -const errors = require('../lib'); const { convert } = errors; describe('@feathersjs/errors', () => { - it('is CommonJS compatible', () => { - assert.strictEqual(typeof require('../lib'), 'object'); - assert.strictEqual(typeof require('../lib').FeathersError, 'function'); - }); - describe('errors.convert', () => { it('converts objects to feathers errors', () => { const error = convert({ @@ -17,9 +12,9 @@ describe('@feathersjs/errors', () => { expando: 'Me' }); - assert.ok(error instanceof errors.BadRequest); assert.strictEqual(error.message, 'Hi'); assert.strictEqual(error.expando, 'Me'); + assert.ok(error instanceof errors.BadRequest); }); it('converts other object to error', () => { @@ -111,80 +106,78 @@ describe('@feathersjs/errors', () => { }); it('400', () => { - assert.notStrictEqual(typeof errors[400], 'undefined', 'has BadRequest alias'); + assert.notStrictEqual(typeof errors.errors[400], 'undefined', 'has BadRequest alias'); }); it('401', () => { - assert.notStrictEqual(typeof errors[401], 'undefined', 'has NotAuthenticated alias'); + assert.notStrictEqual(typeof errors.errors[401], 'undefined', 'has NotAuthenticated alias'); }); it('402', () => { - assert.notStrictEqual(typeof errors[402], 'undefined', 'has PaymentError alias'); + assert.notStrictEqual(typeof errors.errors[402], 'undefined', 'has PaymentError alias'); }); it('403', () => { - assert.notStrictEqual(typeof errors[403], 'undefined', 'has Forbidden alias'); + assert.notStrictEqual(typeof errors.errors[403], 'undefined', 'has Forbidden alias'); }); it('404', () => { - assert.notStrictEqual(typeof errors[404], 'undefined', 'has NotFound alias'); + assert.notStrictEqual(typeof errors.errors[404], 'undefined', 'has NotFound alias'); }); it('405', () => { - assert.notStrictEqual(typeof errors[405], 'undefined', 'has MethodNotAllowed alias'); + assert.notStrictEqual(typeof errors.errors[405], 'undefined', 'has MethodNotAllowed alias'); }); it('406', () => { - assert.notStrictEqual(typeof errors[406], 'undefined', 'has NotAcceptable alias'); + assert.notStrictEqual(typeof errors.errors[406], 'undefined', 'has NotAcceptable alias'); }); it('408', () => { - assert.notStrictEqual(typeof errors[408], 'undefined', 'has Timeout alias'); + assert.notStrictEqual(typeof errors.errors[408], 'undefined', 'has Timeout alias'); }); it('409', () => { - assert.notStrictEqual(typeof errors[409], 'undefined', 'has Conflict alias'); + assert.notStrictEqual(typeof errors.errors[409], 'undefined', 'has Conflict alias'); }); it('410', () => { - assert.notStrictEqual(typeof errors[410], 'undefined', 'has Gone alias'); + assert.notStrictEqual(typeof errors.errors[410], 'undefined', 'has Gone alias'); }); it('411', () => { - assert.notStrictEqual(typeof errors[411], 'undefined', 'has LengthRequired alias'); + assert.notStrictEqual(typeof errors.errors[411], 'undefined', 'has LengthRequired alias'); }); it('422', () => { - assert.notStrictEqual(typeof errors[422], 'undefined', 'has Unprocessable alias'); + assert.notStrictEqual(typeof errors.errors[422], 'undefined', 'has Unprocessable alias'); }); it('429', () => { - assert.notStrictEqual(typeof errors[429], 'undefined', 'has TooManyRequests alias'); + assert.notStrictEqual(typeof errors.errors[429], 'undefined', 'has TooManyRequests alias'); }); it('500', () => { - assert.notStrictEqual(typeof errors[500], 'undefined', 'has GeneralError alias'); + assert.notStrictEqual(typeof errors.errors[500], 'undefined', 'has GeneralError alias'); }); it('501', () => { - assert.notStrictEqual(typeof errors[501], 'undefined', 'has NotImplemented alias'); + assert.notStrictEqual(typeof errors.errors[501], 'undefined', 'has NotImplemented alias'); }); it('502', () => { - assert.notStrictEqual(typeof errors[502], 'undefined', 'has BadGateway alias'); + assert.notStrictEqual(typeof errors.errors[502], 'undefined', 'has BadGateway alias'); }); it('503', () => { - assert.notStrictEqual(typeof errors[503], 'undefined', 'has Unavailable alias'); + assert.notStrictEqual(typeof errors.errors[503], 'undefined', 'has Unavailable alias'); }); it('instantiates every error', () => { - Object.keys(errors).forEach(name => { - if (name === 'convert') { - return; - } + const index: any = errors.errors; - const E = errors[name]; + Object.keys(index).forEach(name => { + const E = index[name]; if (E) { // tslint:disable-next-line @@ -216,23 +209,25 @@ describe('@feathersjs/errors', () => { describe('successful error creation', () => { describe('without custom message', () => { it('default error', () => { - var error = new errors.GeneralError(); + const error = new errors.GeneralError(); assert.strictEqual(error.code, 500); assert.strictEqual(error.className, 'general-error'); assert.strictEqual(error.message, 'Error'); + assert.strictEqual(error.data, undefined); + assert.strictEqual(error.errors, undefined); assert.notStrictEqual(error.stack, undefined); assert.strictEqual(error instanceof errors.GeneralError, true); assert.strictEqual(error instanceof errors.FeathersError, true); }); it('can wrap an existing error', () => { - var error = new errors.BadRequest(new Error()); + const error = new errors.BadRequest(new Error()); assert.strictEqual(error.code, 400); assert.strictEqual(error.message, 'Error'); }); it('with multiple errors', () => { - var data = { + const data = { errors: { email: 'Email Taken', password: 'Invalid Password' @@ -240,7 +235,7 @@ describe('@feathersjs/errors', () => { foo: 'bar' }; - var error = new errors.BadRequest(data); + const error = new errors.BadRequest(data); assert.strictEqual(error.code, 400); assert.strictEqual(error.message, 'Error'); assert.deepStrictEqual(error.errors, { email: 'Email Taken', password: 'Invalid Password' }); @@ -248,12 +243,12 @@ describe('@feathersjs/errors', () => { }); it('with data', () => { - var data = { + const data = { email: 'Email Taken', password: 'Invalid Password' }; - var error = new errors.GeneralError(data); + const error = new errors.GeneralError(data); assert.strictEqual(error.code, 500); assert.strictEqual(error.message, 'Error'); assert.deepStrictEqual(error.data, data); @@ -262,31 +257,31 @@ describe('@feathersjs/errors', () => { describe('with custom message', () => { it('contains our message', () => { - var error = new errors.BadRequest('Invalid Password'); + const error = new errors.BadRequest('Invalid Password'); assert.strictEqual(error.code, 400); assert.strictEqual(error.message, 'Invalid Password'); }); it('can wrap an existing error', () => { - var error = new errors.BadRequest(new Error('Invalid Password')); + const error = new errors.BadRequest(new Error('Invalid Password')); assert.strictEqual(error.code, 400); assert.strictEqual(error.message, 'Invalid Password'); }); it('with data', () => { - var data = { + const data = { email: 'Email Taken', password: 'Invalid Password' }; - var error = new errors.GeneralError('Custom Error', data); + const error = new errors.GeneralError('Custom Error', data); assert.strictEqual(error.code, 500); assert.strictEqual(error.message, 'Custom Error'); assert.deepStrictEqual(error.data, data); }); it('with multiple errors', () => { - var data = { + const data = { errors: { email: 'Email Taken', password: 'Invalid Password' @@ -294,7 +289,8 @@ describe('@feathersjs/errors', () => { foo: 'bar' }; - var error = new errors.BadRequest(data); + const error = new errors.BadRequest(data); + assert.strictEqual(error.code, 400); assert.strictEqual(error.message, 'Error'); assert.deepStrictEqual(error.errors, { email: 'Email Taken', password: 'Invalid Password' }); @@ -303,7 +299,7 @@ describe('@feathersjs/errors', () => { }); it('can return JSON', () => { - var data = { + const data = { errors: { email: 'Email Taken', password: 'Invalid Password' @@ -311,14 +307,14 @@ describe('@feathersjs/errors', () => { foo: 'bar' }; - var expected = '{"name":"GeneralError","message":"Custom Error","code":500,"className":"general-error","data":{"foo":"bar"},"errors":{"email":"Email Taken","password":"Invalid Password"}}'; + const expected = '{"name":"GeneralError","message":"Custom Error","code":500,"className":"general-error","data":{"foo":"bar"},"errors":{"email":"Email Taken","password":"Invalid Password"}}'; - var error = new errors.GeneralError('Custom Error', data); + const error = new errors.GeneralError('Custom Error', data); assert.strictEqual(JSON.stringify(error), expected); }); it('can handle immutable data', () => { - var data = { + const data = { errors: { email: 'Email Taken', password: 'Invalid Password' @@ -326,24 +322,22 @@ describe('@feathersjs/errors', () => { foo: 'bar' }; - var error = new errors.GeneralError('Custom Error', Object.freeze(data)); + const error = new errors.GeneralError('Custom Error', Object.freeze(data)); assert.strictEqual(error.data.errors, undefined); assert.deepStrictEqual(error.data, { foo: 'bar' }); }); it('allows arrays as data', () => { - var data = [ + const data = [ { hello: 'world' } ]; - data.errors = 'Invalid input'; - var error = new errors.GeneralError('Custom Error', data); + const error = new errors.GeneralError('Custom Error', data); assert.strictEqual(error.data.errors, undefined); assert.ok(Array.isArray(error.data)); assert.deepStrictEqual(error.data, [{ hello: 'world' }]); - assert.strictEqual(error.errors, 'Invalid input'); }); it('has proper stack trace (#78)', () => { @@ -354,7 +348,7 @@ describe('@feathersjs/errors', () => { assert.strictEqual(e.stack.indexOf(text), 0); - assert.ok(e.stack.indexOf('index.test.js') !== -1); + assert.ok(e.stack.indexOf('index.test.ts') !== -1); const oldCST = Error.captureStackTrace; @@ -369,4 +363,4 @@ describe('@feathersjs/errors', () => { } }); }); -}); +}); \ No newline at end of file diff --git a/packages/errors/tsconfig.json b/packages/errors/tsconfig.json new file mode 100644 index 0000000000..316fd41336 --- /dev/null +++ b/packages/errors/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "include": [ + "src/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib" + } +} diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index 6802458075..a44f88cf79 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -3,6 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### Features + +* **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) + + + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### Features + +* **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) + + + ## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) **Note:** Version bump only for package @feathersjs/express diff --git a/packages/express/index.d.ts b/packages/express/index.d.ts deleted file mode 100644 index 05d329d7a2..0000000000 --- a/packages/express/index.d.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Application as FeathersApplication, Params as FeathersParams, HookContext, SetupMethod, ServiceMethods } from '@feathersjs/feathers'; -import express from 'express'; - -declare const feathersExpress: FeathersExpress; -export = feathersExpress; - -type Express = typeof express; - -interface FeathersExpress extends Express { - (app: FeathersApplication): feathersExpress.Application; - - (app?: any): express.Express; - - default: FeathersExpress; - - rest: { - (handler?: express.RequestHandler): () => void; - formatter: express.RequestHandler; - httpMethod: (verb: string, uris?: string | string[]) => (method: T) => T; - }; - - original: Express; - - errorHandler (options?: { - public?: string, - logger?: { error: (msg: any) => void, info: (msg: any) => void }, - html?: any, - json?: any - }): express.ErrorRequestHandler; - - notFound (): express.RequestHandler; - - parseAuthentication (...strategies: string[]): express.RequestHandler; - authenticate (...strategies: string[]): express.RequestHandler; -} - -declare namespace feathersExpress { - type Application = express.Express & FeathersApplication; -} - -declare module 'express-serve-static-core' { - interface Request { - feathers?: Partial; - } - - interface Response { - data?: any; - hook?: HookContext; - } - - type FeathersService = Partial & SetupMethod>; - - interface IRouterMatcher { - // tslint:disable-next-line callable-types (Required for declaration merging) -

( - path: PathParams, - ...handlers: (RequestHandler | FeathersService | Application)[] - ): T; - } -} diff --git a/packages/express/lib/not-found-handler.js b/packages/express/lib/not-found-handler.js deleted file mode 100644 index ff8334c1b9..0000000000 --- a/packages/express/lib/not-found-handler.js +++ /dev/null @@ -1,9 +0,0 @@ -const errors = require('@feathersjs/errors'); - -module.exports = function ({ verbose = false } = {}) { - return function (req, res, next) { - const { url } = req; - const message = `Page not found${verbose ? ': ' + url : ''}`; - next(new errors.NotFound(message, { url })); - }; -}; diff --git a/packages/express/package.json b/packages/express/package.json index 7a60ccba41..f8163c6099 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,10 +1,9 @@ { "name": "@feathersjs/express", "description": "Feathers Express framework bindings and REST provider", - "version": "4.5.11", + "version": "5.0.0-pre.1", "homepage": "https://feathersjs.com", "main": "lib/", - "types": "index.d.ts", "keywords": [ "feathers", "feathers-plugin" @@ -36,11 +35,12 @@ "README.md", "src/**", "lib/**", - "*.d.ts", - "*.js" + "public/**" ], "scripts": { - "test": "mocha --config ../../.mocharc.json" + "prepublish": "npm run compile", + "compile": "shx rm -rf lib/ && tsc", + "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -49,8 +49,8 @@ "access": "public" }, "dependencies": { - "@feathersjs/commons": "^4.5.11", - "@feathersjs/errors": "^4.5.11", + "@feathersjs/commons": "^5.0.0-pre.1", + "@feathersjs/errors": "^5.0.0-pre.1", "@types/express": "^4.17.9", "debug": "^4.3.1", "express": "^4.17.1", @@ -58,13 +58,18 @@ "uberproto": "^2.0.6" }, "devDependencies": { - "@feathersjs/authentication": "^4.5.11", - "@feathersjs/authentication-local": "^4.5.11", - "@feathersjs/feathers": "^4.5.11", - "@feathersjs/tests": "^4.5.11", + "@feathersjs/authentication": "^5.0.0-pre.1", + "@feathersjs/authentication-local": "^5.0.0-pre.1", + "@feathersjs/feathers": "^5.0.0-pre.1", + "@feathersjs/tests": "^5.0.0-pre.1", + "@types/mocha": "^8.0.4", + "@types/node": "^14.14.10", "axios": "^0.21.0", "lodash": "^4.17.20", - "mocha": "^8.2.1" + "mocha": "^8.2.1", + "shx": "^0.3.3", + "ts-node": "^9.1.0", + "typescript": "^4.1.2" }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/express/lib/public/401.html b/packages/express/public/401.html similarity index 100% rename from packages/express/lib/public/401.html rename to packages/express/public/401.html diff --git a/packages/express/lib/public/404.html b/packages/express/public/404.html similarity index 100% rename from packages/express/lib/public/404.html rename to packages/express/public/404.html diff --git a/packages/express/lib/public/default.html b/packages/express/public/default.html similarity index 100% rename from packages/express/lib/public/default.html rename to packages/express/public/default.html diff --git a/packages/express/rest.js b/packages/express/rest.js deleted file mode 100644 index 551ea4064e..0000000000 --- a/packages/express/rest.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/rest'); diff --git a/packages/express/lib/authentication.js b/packages/express/src/authentication.ts similarity index 61% rename from packages/express/lib/authentication.js rename to packages/express/src/authentication.ts index a937bb53f2..bf805308cb 100644 --- a/packages/express/lib/authentication.js +++ b/packages/express/src/authentication.ts @@ -1,15 +1,22 @@ -const flatten = require('lodash/flatten'); -const merge = require('lodash/merge'); -const debug = require('debug')('@feathersjs/express/authentication'); +import Debug from 'debug'; +import { merge, flatten } from 'lodash'; +import { NextFunction, RequestHandler } from 'express'; -const normalizeStrategy = (_settings = [], ..._strategies) => +const debug = Debug('@feathersjs/express/authentication'); + +type StrategyOptions = { + service?: string; + strategies: string[] +}; + +const normalizeStrategy = (_settings: string|StrategyOptions, ..._strategies: string[]) => typeof _settings === 'string' ? { strategies: flatten([ _settings, ..._strategies ]) } : _settings; -exports.parseAuthentication = (settings = {}) => { +export function parseAuthentication (settings: any = {}): RequestHandler { return function (req, res, next) { - const { app } = req; + const app = req.app as any; const service = app.defaultAuthentication ? app.defaultAuthentication(settings.service) : null; if (service === null) { @@ -25,7 +32,7 @@ exports.parseAuthentication = (settings = {}) => { } service.parse(req, res, ...authStrategies) - .then(authentication => { + .then((authentication: any) => { if (authentication) { debug('Parsed authentication from HTTP header', authentication); merge(req, { @@ -37,27 +44,28 @@ exports.parseAuthentication = (settings = {}) => { next(); }).catch(next); }; -}; +} -exports.authenticate = (...strategies) => { - const settings = normalizeStrategy(...strategies); +export function authenticate (_settings: string|StrategyOptions, ..._strategies: string[]) { + const settings = normalizeStrategy(_settings, ..._strategies); if (!Array.isArray(settings.strategies) || settings.strategies.length === 0) { - throw new Error(`'authenticate' middleware requires at least one strategy name`); + throw new Error('\'authenticate\' middleware requires at least one strategy name'); } - return function (req, res, next) { + return (_req: Request, _res: Response, next: NextFunction) => { + const req = _req as any; const { app, authentication } = req; const service = app.defaultAuthentication(settings.service); debug('Authenticating with Express middleware and strategies', settings.strategies); service.authenticate(authentication, req.feathers, ...settings.strategies) - .then(authResult => { + .then((authResult: any) => { debug('Merging request with', authResult); merge(req, authResult); next(); }).catch(next); }; -}; +} diff --git a/packages/express/lib/error-handler.js b/packages/express/src/handlers.ts similarity index 70% rename from packages/express/lib/error-handler.js rename to packages/express/src/handlers.ts index a8dbfd2a30..9ad8f0f471 100644 --- a/packages/express/lib/error-handler.js +++ b/packages/express/src/handlers.ts @@ -1,14 +1,31 @@ -const errors = require('@feathersjs/errors'); -const path = require('path'); +import path from 'path'; +import { NotFound, GeneralError } from '@feathersjs/errors'; +import { Request, Response, NextFunction, ErrorRequestHandler, RequestHandler } from 'express'; const defaults = { - public: path.resolve(__dirname, 'public'), + public: path.resolve(__dirname, '..', 'public'), logger: console }; const defaultHtmlError = path.resolve(defaults.public, 'default.html'); -module.exports = function (options = {}) { - options = Object.assign({}, defaults, options); +export function notFound ({ verbose = false } = {}): RequestHandler { + return function (req: Request, _res: Response, next: NextFunction) { + const url = `${req.url}`; + const message = `Page not found${verbose ? ': ' + url : ''}`; + + next(new NotFound(message, { url })); + }; +} + +export type ErrorHandlerOptions = { + public?: string, + logger?: boolean|{ error?: (msg: any) => void, info?: (msg: any) => void }, + html?: any, + json?: any +}; + +export function errorHandler (_options: ErrorHandlerOptions = {}): ErrorRequestHandler { + const options = Object.assign({}, defaults, _options); if (typeof options.html === 'undefined') { options.html = { @@ -22,7 +39,7 @@ module.exports = function (options = {}) { options.json = {}; } - return function (error, req, res, next) { + return function (error: any, req: Request, res: Response, next: NextFunction) { // Set the error code for HTTP processing semantics error.code = !isNaN(parseInt(error.code, 10)) ? parseInt(error.code, 10) : 500; @@ -36,17 +53,18 @@ module.exports = function (options = {}) { } if (error.type !== 'FeathersError') { - let oldError = error; - error = new errors.GeneralError(oldError.message, { + const oldError = error; + + error = oldError.errors ? new GeneralError(oldError.message, { errors: oldError.errors - }); + }) : new GeneralError(oldError.message); if (oldError.stack) { error.stack = oldError.stack; } } - const formatter = {}; + const formatter: { [key: string]: any } = {}; // If the developer passed a custom function for ALL html errors if (typeof options.html === 'function') { @@ -71,7 +89,7 @@ module.exports = function (options = {}) { if (typeof options.json === 'function') { formatter['application/json'] = options.json; } else { - let handler = options.json[error.code] || options.json.default; + const handler = options.json[error.code] || options.json.default; // If the developer passed a custom function for individual json errors if (typeof handler === 'function') { formatter['application/json'] = handler; @@ -82,7 +100,7 @@ module.exports = function (options = {}) { } formatter['application/json'] = function () { - let output = Object.assign({}, error.toJSON()); + const output = Object.assign({}, error.toJSON()); if (process.env.NODE_ENV === 'production') { delete output.stack; @@ -109,4 +127,4 @@ module.exports = function (options = {}) { formatter['application/json'](error, req, res, next); } }; -}; +} diff --git a/packages/express/lib/index.js b/packages/express/src/index.ts similarity index 54% rename from packages/express/lib/index.js rename to packages/express/src/index.ts index ee38524335..932b118265 100644 --- a/packages/express/lib/index.js +++ b/packages/express/src/index.ts @@ -1,15 +1,50 @@ -const express = require('express'); -const Proto = require('uberproto'); -const debug = require('debug')('@feathersjs/express'); +// @ts-ignore +import Proto from 'uberproto'; +import express, { Express, static as _static, json, raw, text, urlencoded, query } from 'express'; +import Debug from 'debug'; +import { + Application as FeathersApplication, Params as FeathersParams, + HookContext, ServiceMethods, SetupMethod +} from '@feathersjs/feathers'; + +import { errorHandler, notFound } from './handlers'; +import { rest } from './rest'; +import { parseAuthentication, authenticate } from './authentication'; + +export { + _static as static, json, raw, text, urlencoded, query, + errorHandler, notFound, rest, express as original, + authenticate, parseAuthentication +}; + +const debug = Debug('@feathersjs/express'); + +declare module 'express-serve-static-core' { + interface Request { + feathers?: Partial; + } + + interface Response { + data?: any; + hook?: HookContext; + } -const errorHandler = require('./error-handler'); -const authentication = require('./authentication'); -const notFound = require('./not-found-handler'); -const rest = require('./rest'); + type FeathersService = Partial & SetupMethod>; -function feathersExpress (feathersApp, expressApp = express()) { + interface IRouterMatcher { + // eslint-disable-next-line +

( + path: PathParams, + ...handlers: (RequestHandler | FeathersService | Application)[] + ): T; + } +} + +export type Application = Express & FeathersApplication; + +export default function feathersExpress (feathersApp?: FeathersApplication, expressApp: Express = express()): Application { if (!feathersApp) { - return expressApp; + return expressApp as any; } if (typeof feathersApp.setup !== 'function') { @@ -21,11 +56,10 @@ function feathersExpress (feathersApp, expressApp = express()) { } // An Uberproto mixin that provides the extended functionality - const mixin = { - use (location) { - let service; - let middleware = Array.from(arguments) - .slice(1) + const mixin: any = { + use (location: string) { + let service: any; + const middleware = Array.from(arguments).slice(1) .reduce(function (middleware, arg) { if (typeof arg === 'function' || Array.isArray(arg)) { middleware[service ? 'after' : 'before'].push(arg); @@ -40,7 +74,7 @@ function feathersExpress (feathersApp, expressApp = express()) { after: [] }); - const hasMethod = methods => methods.some(name => + const hasMethod = (methods: string[]) => methods.some(name => (service && typeof service[name] === 'function') ); @@ -81,12 +115,6 @@ function feathersExpress (feathersApp, expressApp = express()) { return Proto.mixin(mixin, expressApp); } -module.exports = feathersExpress; - -Object.assign(module.exports, express, authentication, { - default: feathersExpress, - original: express, - rest, - notFound, - errorHandler -}); +if (typeof module !== 'undefined') { + module.exports = Object.assign(feathersExpress, module.exports); +} diff --git a/packages/express/lib/rest/getHandler.js b/packages/express/src/rest/getHandler.ts similarity index 63% rename from packages/express/lib/rest/getHandler.js rename to packages/express/src/rest/getHandler.ts index 42954e4b21..e754fd2840 100644 --- a/packages/express/lib/rest/getHandler.js +++ b/packages/express/src/rest/getHandler.ts @@ -1,13 +1,18 @@ -const errors = require('@feathersjs/errors'); -const { omit } = require('@feathersjs/commons')._; -const debug = require('debug')('@feathersjs/express/rest'); +import Debug from 'debug'; +import { Request, Response, NextFunction } from 'express'; +import { MethodNotAllowed } from '@feathersjs/errors'; +import { _ } from '@feathersjs/commons'; +import { HookContext } from '@feathersjs/feathers'; -const statusCodes = { +const { omit } = _; +const debug = Debug('@feathersjs/express/rest'); + +export const statusCodes = { created: 201, noContent: 204, methodNotAllowed: 405 }; -const methodMap = { +export const methodMap = { find: 'GET', get: 'GET', create: 'POST', @@ -16,23 +21,23 @@ const methodMap = { remove: 'DELETE' }; -function getAllowedMethods (service, routes) { +export function getAllowedMethods (service: any, routes: any) { if (routes) { return routes - .filter(({ method }) => typeof service[method] === 'function') - .map(methodRoute => methodRoute.verb.toUpperCase()) - .filter((value, index, list) => list.indexOf(value) === index); + .filter(({ method }: any) => typeof service[method] === 'function') + .map((methodRoute: any) => methodRoute.verb.toUpperCase()) + .filter((value: any, index: number, list: any) => list.indexOf(value) === index); } return Object.keys(methodMap) - .filter(method => typeof service[method] === 'function') - .map(method => methodMap[method]) + .filter((method: any) => typeof service[method] === 'function') + .map((method: any) => (methodMap as any)[method]) // Filter out duplicates - .filter((value, index, list) => list.indexOf(value) === index); + .filter((value: any, index: number, list: any) => list.indexOf(value) === index); } -function makeArgsGetter (argsOrder) { - return (req, params) => argsOrder.map((argName) => { +export function makeArgsGetter (argsOrder: any) { + return (req: Request, params: any) => argsOrder.map((argName: string) => { switch (argName) { case 'id': return req.params.__feathersId || null; @@ -46,12 +51,12 @@ function makeArgsGetter (argsOrder) { // A function that returns the middleware for a given method and service // `getArgs` is a function that should return additional leading service arguments -module.exports = function getHandler (method) { - return (service, routes) => { +export function getHandler (method: string) { + return (service: any, routes: any) => { const getArgs = makeArgsGetter(service.methods[method]); const allowedMethods = getAllowedMethods(service, routes); - return function (req, res, next) { + return (req: Request, res: Response, next: NextFunction) => { const { query } = req; const route = omit(req.params, '__feathersId'); @@ -62,7 +67,7 @@ module.exports = function getHandler (method) { debug(`Method '${method}' not allowed on '${req.url}'`); res.status(statusCodes.methodNotAllowed); - return next(new errors.MethodNotAllowed(`Method \`${method}\` is not supported by this endpoint.`)); + return next(new MethodNotAllowed(`Method \`${method}\` is not supported by this endpoint.`)); } // Grab the service parameters. Use req.feathers @@ -80,7 +85,7 @@ module.exports = function getHandler (method) { debug(`REST handler calling \`${method}\` from \`${req.url}\``); service[method](...args, true) - .then(hook => { + .then((hook: HookContext) => { const data = hook.dispatch !== undefined ? hook.dispatch : hook.result; res.data = data; @@ -97,7 +102,7 @@ module.exports = function getHandler (method) { return next(); }) - .catch(hook => { + .catch((hook: HookContext) => { const { error } = hook; debug(`Error in handler: \`${error.message}\``); @@ -107,4 +112,4 @@ module.exports = function getHandler (method) { }); }; }; -}; +} diff --git a/packages/express/lib/rest/index.js b/packages/express/src/rest/index.ts similarity index 75% rename from packages/express/lib/rest/index.js rename to packages/express/src/rest/index.ts index e84e1c474a..173894071b 100644 --- a/packages/express/lib/rest/index.js +++ b/packages/express/src/rest/index.ts @@ -1,12 +1,14 @@ -const { stripSlashes } = require('@feathersjs/commons'); -const debug = require('debug')('@feathersjs/express/rest'); -const { parseAuthentication } = require('../authentication'); -const getHandler = require('./getHandler'); +import Debug from 'debug'; +import { stripSlashes } from '@feathersjs/commons'; +import { Request, Response, NextFunction, RequestHandler } from 'express'; +import { parseAuthentication } from '../authentication'; +import { getHandler } from './getHandler'; +const debug = Debug('@feathersjs/express/rest'); const HTTP_METHOD = Symbol('@feathersjs/express/rest/HTTP_METHOD'); -function httpMethod (verb, uris) { - return method => { +export function httpMethod (verb: any, uris?: any) { + return (method: any) => { Object.defineProperty(method, HTTP_METHOD, { enumerable: false, configurable: true, @@ -22,13 +24,13 @@ function httpMethod (verb, uris) { }; } -function getDefaultUri (path, methods, method) { +export function getDefaultUri (path: string, methods: any, method: any) { return methods[method].indexOf('id') === -1 ? `/${path}/${method}` : `/${path}/:__feathersId/${method}`; } -function parseRoute (path, methods, method, route) { +export function parseRoute (path: any, methods: any, method: any, route: any) { return { method, verb: route.verb, @@ -36,7 +38,7 @@ function parseRoute (path, methods, method, route) { }; } -function getServiceRoutes (service, path, defaultRoutes) { +export function getServiceRoutes (service: any, path: any, defaultRoutes: any) { const { methods } = service; return Object.keys(methods) @@ -58,7 +60,7 @@ function getServiceRoutes (service, path, defaultRoutes) { }, defaultRoutes); } -function getDefaultRoutes (uri) { +export function getDefaultRoutes (uri: string) { const idUri = `${uri}/:__feathersId`; return [ @@ -74,20 +76,20 @@ function getDefaultRoutes (uri) { ]; } -function formatter (req, res, next) { +export function formatter (_req: Request, res: Response, next: NextFunction) { if (res.data === undefined) { return next(); } res.format({ - 'application/json': function () { + 'application/json' () { res.json(res.data); } }); } -function rest (handler = formatter) { - return function () { +export function rest (handler: RequestHandler = formatter) { + return function (this: any) { const app = this; if (typeof app.route !== 'function') { @@ -107,7 +109,7 @@ function rest (handler = formatter) { remove: getHandler('remove') }; - app.use(function (req, res, next) { + app.use((req: Request, _res: Response, next: NextFunction) => { req.feathers = Object.assign({ provider: 'rest', headers: req.headers @@ -118,9 +120,10 @@ function rest (handler = formatter) { app.use(parseAuthentication()); // Register the REST provider - app.providers.push(function (service, path, options) { + app.providers.push(function (service: any, path: string, options: any) { const baseUri = `/${path}`; - let { middleware: { before, after } } = options; + const { middleware: { before } } = options; + let { middleware: { after } } = options; if (typeof handler === 'function') { after = after.concat(handler); @@ -143,6 +146,3 @@ function rest (handler = formatter) { rest.formatter = formatter; rest.httpMethod = httpMethod; -rest.HTTP_METHOD = HTTP_METHOD; - -module.exports = rest; diff --git a/packages/express/test/authentication.test.js b/packages/express/test/authentication.test.ts similarity index 84% rename from packages/express/test/authentication.test.js rename to packages/express/test/authentication.test.ts index cc457a1d34..a2eaa48f6a 100644 --- a/packages/express/test/authentication.test.js +++ b/packages/express/test/authentication.test.ts @@ -1,11 +1,14 @@ -const assert = require('assert'); -const _axios = require('axios'); -const feathers = require('@feathersjs/feathers'); -const getApp = require('@feathersjs/authentication-local/test/fixture'); -const { authenticate } = require('@feathersjs/authentication'); -const omit = require('lodash/omit'); - -const expressify = require('../lib'); +import { omit } from 'lodash'; +import { strict as assert } from 'assert'; +import { default as _axios } from 'axios'; +import feathers from '@feathersjs/feathers'; + +// @ts-ignore +import getApp from '@feathersjs/authentication-local/test/fixture'; +import { authenticate, AuthenticationResult } from '@feathersjs/authentication'; +import * as express from '../src'; + +const expressify = express.default; const axios = _axios.create({ baseURL: 'http://localhost:9876/' }); @@ -14,15 +17,15 @@ describe('@feathersjs/express/authentication', () => { const email = 'expresstest@authentication.com'; const password = 'superexpress'; - let app; - let server; - let user; - let authResult; + let app: express.Application; + let server: any; + let user: any; + let authResult: AuthenticationResult; - before(() => { + before(async () => { const expressApp = expressify(feathers()) - .use(expressify.json()) - .configure(expressify.rest()); + .use(express.json()) + .configure(express.rest()); app = getApp(expressApp); server = app.listen(9876); @@ -33,11 +36,11 @@ describe('@feathersjs/express/authentication', () => { } }); - app.use('/protected', expressify.authenticate('jwt'), (req, res) => { - res.json(req.user); + app.use('/protected', express.authenticate('jwt'), (req, res) => { + res.json((req as any).user); }); - app.use(expressify.errorHandler({ + app.use(express.errorHandler({ logger: false })); @@ -45,18 +48,17 @@ describe('@feathersjs/express/authentication', () => { before: [ authenticate('jwt') ] }); - return app.service('users').create({ email, password }) - .then(result => { - user = result; + const result = await app.service('users').create({ email, password }); - return axios.post('/authentication', { - strategy: 'local', - password, - email - }); - }).then(res => { - authResult = res.data; - }); + user = result; + + const res = await axios.post('/authentication', { + strategy: 'local', + password, + email + }); + + authResult = res.data; }); after(done => server.close(done)); @@ -154,6 +156,7 @@ describe('@feathersjs/express/authentication', () => { describe('authenticate middleware', () => { it('errors without valid strategies', () => { try { + // @ts-ignore authenticate(); assert.fail('Should never get here'); } catch (error) { diff --git a/packages/express/test/error-handler.test.js b/packages/express/test/error-handler.test.js deleted file mode 100644 index ba649feee9..0000000000 --- a/packages/express/test/error-handler.test.js +++ /dev/null @@ -1,490 +0,0 @@ -/* tsline:disable:handle-callback-err */ -/* tslint:disable:no-unused-expression */ -const { strict: assert } = require('assert'); -const express = require('express'); -const errors = require('@feathersjs/errors'); -const request = require('request'); -const fs = require('fs'); -const { join } = require('path'); - -const handler = require('../lib/error-handler'); - -const content = 'Error'; - -let htmlHandler = function (error, req, res, next) { - res.send(content); -}; - -const jsonHandler = function (error, req, res, next) { - res.json(error); -}; - -describe('error-handler', () => { - it('is CommonJS compatible', () => { - assert.equal(typeof require('../lib/error-handler'), 'function'); - }); - - it('is import compatible', () => { - assert.equal(typeof handler, 'function'); - }); - - describe('supports catch-all custom handlers', function () { - let currentError; - - before(function () { - this.app = express().get('/error', function (req, res, next) { - next(new Error('Something went wrong')); - }).use(handler({ - html: htmlHandler, - json: jsonHandler, - logger: { - error (e) { - currentError = e; - } - } - })); - - this.server = this.app.listen(5050); - }); - - after(function (done) { - this.server.close(done); - }); - - describe('HTML handler', () => { - const options = { - url: 'http://localhost:5050/error', - headers: { - 'Content-Type': 'text/html', - 'Accept': 'text/html' - } - }; - - it('logs the error', done => { - request(options, (error, res, body) => { - assert.equal(currentError.message, 'Something went wrong'); - done(); - }); - }); - - it('can send a custom response', done => { - request(options, (error, res, body) => { - assert.equal(body, content); - done(); - }); - }); - }); - - describe('JSON handler', () => { - const options = { - url: 'http://localhost:5050/error', - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json' - } - }; - - it('can send a custom response', done => { - const expected = JSON.stringify({ - name: 'GeneralError', - message: 'Something went wrong', - code: 500, - className: 'general-error', - data: {}, - errors: {} - }); - request(options, (error, res, body) => { - assert.deepEqual(body, expected); - done(); - }); - }); - }); - }); - - describe('supports error-code specific custom handlers', () => { - describe('HTML handler', () => { - const req = { - headers: { 'content-type': 'text/html' } - }; - const makeRes = (errCode, props) => { - return Object.assign({ - set () {}, - status (code) { - assert.equal(code, errCode); - } - }, props); - }; - - it('if the value is a string, calls res.sendFile', done => { - const err = new errors.NotAuthenticated(); - const middleware = handler({ - logger: null, - html: { 401: 'path/to/401.html' } - }); - const res = makeRes(401, { - sendFile (f) { - assert.equal(f, 'path/to/401.html'); - done(); - } - }); - middleware(err, req, res); - }); - - it('if the value is a function, calls as middleware ', done => { - const err = new errors.PaymentError(); - const res = makeRes(402); - const middleware = handler({ - logger: null, - html: { 402: (_err, _req, _res) => { - assert.equal(_err, err); - assert.equal(_req, req); - assert.equal(_res, res); - done(); - } } - }); - middleware(err, req, res); - }); - - it('falls back to default if error code config is available', done => { - const err = new errors.NotAcceptable(); - const res = makeRes(406); - const middleware = handler({ - logger: null, - html: { default: (_err, _req, _res) => { - assert.equal(_err, err); - assert.equal(_req, req); - assert.equal(_res, res); - done(); - } } - }); - middleware(err, req, res); - }); - }); - - describe('JSON handler', () => { - const req = { - headers: { 'content-type': 'application/json' } - }; - const makeRes = (errCode, props) => { - return Object.assign({ - set () {}, - status (code) { - assert.equal(code, errCode); - } - }, props); - }; - - it('calls res.json by default', done => { - const err = new errors.NotAuthenticated(); - const middleware = handler({ - logger: null, - json: {} - }); - const res = makeRes(401, { - json (obj) { - assert.deepEqual(obj, err.toJSON()); - done(); - } - }); - middleware(err, req, res); - }); - - it('if the value is a function, calls as middleware ', done => { - const err = new errors.PaymentError(); - const res = makeRes(402); - const middleware = handler({ - logger: null, - json: { 402: (_err, _req, _res) => { - assert.equal(_err, err); - assert.equal(_req, req); - assert.equal(_res, res); - done(); - } } - }); - middleware(err, req, res); - }); - - it('falls back to default if error code config is available', done => { - const err = new errors.NotAcceptable(); - const res = makeRes(406); - const middleware = handler({ - logger: null, - json: { default: (_err, _req, _res) => { - assert.equal(_err, err); - assert.equal(_req, req); - assert.equal(_res, res); - done(); - } } - }); - middleware(err, req, res); - }); - }); - }); - - describe('use as app error handler', function () { - before(function () { - this.app = express() - .get('/error', function (req, res, next) { - next(new Error('Something went wrong')); - }) - .get('/string-error', function (req, res, next) { - const e = new Error('Something was not found'); - e.code = '404'; - - next(e); - }) - .get('/bad-request', function (req, res, next) { - next(new errors.BadRequest({ - message: 'Invalid Password', - errors: [{ - path: 'password', - value: null, - message: `'password' cannot be 'null'` - }] - })); - }) - .use(function (req, res, next) { - next(new errors.NotFound('File not found')); - }) - .use(handler({ - logger: null - })); - - this.server = this.app.listen(5050); - }); - - after(function (done) { - this.server.close(done); - }); - - describe('converts an non-feathers error', () => { - it('is an instance of GeneralError', done => { - request({ - url: 'http://localhost:5050/error', - json: true - }, (error, res, body) => { - assert.equal(res.statusCode, 500); - assert.deepEqual(body, { - name: 'GeneralError', - message: 'Something went wrong', - code: 500, - className: 'general-error', - data: {}, - errors: {} - }); - done(); - }); - }); - }); - - describe('text/html format', () => { - it('serves a 404.html', done => { - fs.readFile(join(__dirname, '..', 'lib', 'public', '404.html'), function (err, html) { - request({ - url: 'http://localhost:5050/path/to/nowhere', - headers: { - 'Content-Type': 'text/html', - 'Accept': 'text/html' - } - }, (error, res, body) => { - assert.equal(res.statusCode, 404); - assert.equal(html.toString(), body); - done(); - }); - }); - }); - - it('serves a 500.html', done => { - fs.readFile(join(__dirname, '..', 'lib', 'public', 'default.html'), function (err, html) { - request({ - url: 'http://localhost:5050/error', - headers: { - 'Content-Type': 'text/html', - 'Accept': 'text/html' - } - }, (error, res, body) => { - assert.equal(res.statusCode, 500); - assert.equal(html.toString(), body); - done(); - }); - }); - }); - - it('returns html when Content-Type header is set', done => { - fs.readFile(join(__dirname, '..', 'lib', 'public', '404.html'), function (err, html) { - request({ - url: 'http://localhost:5050/path/to/nowhere', - headers: { - 'Content-Type': 'text/html' - } - }, (error, res, body) => { - assert.equal(res.statusCode, 404); - assert.equal(html.toString(), body); - done(); - }); - }); - }); - - it('returns html when Accept header is set', done => { - fs.readFile(join(__dirname, '..', 'lib', 'public', '404.html'), function (err, html) { - request({ - url: 'http://localhost:5050/path/to/nowhere', - headers: { - 'Accept': 'text/html' - } - }, (error, res, body) => { - assert.equal(res.statusCode, 404); - assert.equal(html.toString(), body); - done(); - }); - }); - }); - }); - - describe('application/json format', () => { - it('500', done => { - request({ - url: 'http://localhost:5050/error', - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json' - }, - json: true - }, (error, res, body) => { - assert.equal(res.statusCode, 500); - assert.deepEqual(body, { - name: 'GeneralError', - message: 'Something went wrong', - code: 500, - className: 'general-error', - data: {}, - errors: {} - }); - done(); - }); - }); - - it('404', done => { - request({ - url: 'http://localhost:5050/path/to/nowhere', - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json' - }, - json: true - }, (error, res, body) => { - assert.equal(res.statusCode, 404); - assert.deepEqual(body, { name: 'NotFound', - message: 'File not found', - code: 404, - className: 'not-found', - errors: {} - }); - done(); - }); - }); - - it('400', done => { - request({ - url: 'http://localhost:5050/bad-request', - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json' - }, - json: true - }, (error, res, body) => { - assert.equal(res.statusCode, 400); - assert.deepEqual(body, { name: 'BadRequest', - message: 'Invalid Password', - code: 400, - className: 'bad-request', - data: { - message: 'Invalid Password' - }, - errors: [{ - path: 'password', - value: null, - message: `'password' cannot be 'null'` - }] - }); - done(); - }); - }); - - it('returns JSON when only Content-Type header is set', done => { - request({ - url: 'http://localhost:5050/bad-request', - headers: { - 'Content-Type': 'application/json' - }, - json: true - }, (error, res, body) => { - assert.equal(res.statusCode, 400); - assert.deepEqual(body, { name: 'BadRequest', - message: 'Invalid Password', - code: 400, - className: 'bad-request', - data: { - message: 'Invalid Password' - }, - errors: [{ - path: 'password', - value: null, - message: `'password' cannot be 'null'` - }] - }); - done(); - }); - }); - - it('returns JSON when only Accept header is set', done => { - request({ - url: 'http://localhost:5050/bad-request', - headers: { - 'Accept': 'application/json' - }, - json: true - }, (error, res, body) => { - assert.equal(res.statusCode, 400); - assert.deepEqual(body, { name: 'BadRequest', - message: 'Invalid Password', - code: 400, - className: 'bad-request', - data: { - message: 'Invalid Password' - }, - errors: [{ - path: 'password', - value: null, - message: `'password' cannot be 'null'` - }] - }); - done(); - }); - }); - }); - - it('returns JSON by default', done => { - request('http://localhost:5050/bad-request', (error, res, body) => { - const expected = JSON.stringify({ - name: 'BadRequest', - message: 'Invalid Password', - code: 400, - className: 'bad-request', - data: { - message: 'Invalid Password' - }, - errors: [{ - path: 'password', - value: null, - message: `'password' cannot be 'null'` - }] - }); - - assert.equal(res.statusCode, 400); - assert.deepEqual(body, expected); - done(); - }); - }); - }); -}); diff --git a/packages/express/test/error-handler.test.ts b/packages/express/test/error-handler.test.ts new file mode 100644 index 0000000000..f7c1aeaef0 --- /dev/null +++ b/packages/express/test/error-handler.test.ts @@ -0,0 +1,369 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { strict as assert } from 'assert'; +import express, { Request, Response, NextFunction } from 'express'; +import axios from 'axios'; +import fs from 'fs' +import { join } from 'path'; +import { BadRequest, NotAcceptable, NotAuthenticated, NotFound, PaymentError } from '@feathersjs/errors'; + +import { errorHandler } from '../src'; + +const content = 'Error'; + +const htmlHandler = function (_error: Error, _req: Request, res: Response, _next: NextFunction) { + res.send(content); +}; + +const jsonHandler = function (error: Error, _req: Request, res: Response, _next: NextFunction) { + res.json(error); +}; + +describe('error-handler', () => { + describe('supports catch-all custom handlers', function () { + before(function () { + this.app = express().get('/error', function (_req, _res, next) { + next(new Error('Something went wrong')); + }).use(errorHandler({ + html: htmlHandler, + json: jsonHandler + })); + + this.server = this.app.listen(5050); + }); + + after(function (done) { + this.server.close(done); + }); + + describe('JSON handler', () => { + const options = { + url: 'http://localhost:5050/error', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + } + }; + + it('can send a custom response', async () => { + try { + await axios(options); + assert.fail('Should never get here'); + } catch (error) { + assert.deepEqual(error.response.data, { + name: 'GeneralError', + message: 'Something went wrong', + code: 500, + className: 'general-error' + }); + } + }); + }); + }); + + describe('supports error-code specific custom handlers', () => { + describe('HTML handler', () => { + const req = { + headers: { 'content-type': 'text/html' } + }; + const makeRes = (errCode: number, props?: any) => { + return Object.assign({ + set () {}, + status (code: number) { + assert.equal(code, errCode); + } + }, props); + }; + + it('if the value is a string, calls res.sendFile', done => { + const err = new NotAuthenticated(); + const middleware = errorHandler({ + logger: null, + html: { 401: 'path/to/401.html' } + }); + const res = makeRes(401, { + sendFile (f: any) { + assert.equal(f, 'path/to/401.html'); + done(); + } + }); + (middleware as any)(err, req, res); + }); + + it('if the value is a function, calls as middleware ', done => { + const err = new PaymentError(); + const res = makeRes(402); + const middleware = errorHandler({ + logger: null, + html: { 402: (_err: any, _req: any, _res: any) => { + assert.equal(_err, err); + assert.equal(_req, req); + assert.equal(_res, res); + done(); + } } + }); + (middleware as any)(err, req, res); + }); + + it('falls back to default if error code config is available', done => { + const err = new NotAcceptable(); + const res = makeRes(406); + const middleware = errorHandler({ + logger: null, + html: { default: (_err: any, _req: any, _res: any) => { + assert.equal(_err, err); + assert.equal(_req, req); + assert.equal(_res, res); + done(); + } } + }); + (middleware as any)(err, req, res); + }); + }); + + describe('JSON handler', () => { + const req = { + headers: { 'content-type': 'application/json' } + }; + const makeRes = (errCode: number, props?: any) => { + return Object.assign({ + set () {}, + status (code: number) { + assert.equal(code, errCode); + } + }, props); + }; + + it('calls res.json by default', done => { + const err = new NotAuthenticated(); + const middleware = errorHandler({ + logger: null, + json: {} + }); + const res = makeRes(401, { + json (obj: any) { + assert.deepEqual(obj, err.toJSON()); + done(); + } + }); + (middleware as any)(err, req, res); + }); + + it('if the value is a function, calls as middleware ', done => { + const err = new PaymentError(); + const res = makeRes(402); + const middleware = errorHandler({ + logger: null, + json: { 402: (_err: any, _req: any, _res: any) => { + assert.equal(_err, err); + assert.equal(_req, req); + assert.equal(_res, res); + done(); + } } + }); + (middleware as any)(err, req, res); + }); + + it('falls back to default if error code config is available', done => { + const err = new NotAcceptable(); + const res = makeRes(406); + const middleware = errorHandler({ + logger: null, + json: { default: (_err: any, _req: any, _res: any) => { + assert.equal(_err, err); + assert.equal(_req, req); + assert.equal(_res, res); + done(); + } } + }); + (middleware as any)(err, req, res); + }); + }); + }); + + describe('use as app error handler', function () { + before(function () { + this.app = express() + .get('/error', function (_req, _res, next) { + next(new Error('Something went wrong')); + }) + .get('/string-error', function (_req, _res, next) { + const e: any = new Error('Something was not found'); + e.code = '404'; + + next(e); + }) + .get('/bad-request', function (_req, _res, next) { + next(new BadRequest({ + message: 'Invalid Password', + errors: [{ + path: 'password', + value: null, + message: '\'password\' cannot be \'null\'' + }] + })); + }) + .use(function (_req, _res, next) { + next(new NotFound('File not found')); + }) + .use(errorHandler({ + logger: null + })); + + this.server = this.app.listen(5050); + }); + + after(function (done) { + this.server.close(done); + }); + + describe('converts an non-feathers error', () => { + it('is an instance of GeneralError', async () => { + try { + await axios({ + url: 'http://localhost:5050/error', + responseType: 'json' + }); + assert.fail('Should never get here'); + } catch (error) { + assert.equal(error.response.status, 500); + assert.deepEqual(error.response.data, { + name: 'GeneralError', + message: 'Something went wrong', + code: 500, + className: 'general-error' + }); + } + }); + }); + + describe('text/html format', () => { + it('serves a 404.html', done => { + fs.readFile(join(__dirname, '..', 'public', '404.html'), async function (_err, html) { + try { + await axios({ + url: 'http://localhost:5050/path/to/nowhere', + headers: { + 'Content-Type': 'text/html', + 'Accept': 'text/html' + } + }); + assert.fail('Should never get here'); + } catch(error) { + assert.equal(error.response.status, 404); + assert.equal(error.response.data, html.toString()); + done(); + } + }); + }); + + it('serves a 500.html', done => { + fs.readFile(join(__dirname, '..', 'public', 'default.html'), async function (_err, html) { + try { + await axios({ + url: 'http://localhost:5050/error', + headers: { + 'Content-Type': 'text/html', + 'Accept': 'text/html' + } + }); + assert.fail('Should never get here'); + } catch(error) { + assert.equal(error.response.status, 500); + assert.equal(error.response.data, html.toString()); + done(); + } + }); + }); + }); + + describe('application/json format', () => { + it('500', async () => { + try { + await axios({ + url: 'http://localhost:5050/error', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + } + }); + assert.fail('Should never get here'); + } catch (error) { + assert.equal(error.response.status, 500); + assert.deepEqual(error.response.data, { + name: 'GeneralError', + message: 'Something went wrong', + code: 500, + className: 'general-error' + }); + } + }); + + it('404', async () => { + try { + await axios({ + url: 'http://localhost:5050/path/to/nowhere', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + } + }); + assert.fail('Should never get here'); + } catch (error) { + assert.equal(error.response.status, 404); + assert.deepEqual(error.response.data, { name: 'NotFound', + message: 'File not found', + code: 404, + className: 'not-found' + }); + } + }); + + it('400', async () => { + try { + await axios({ + url: 'http://localhost:5050/bad-request', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + } + }); + assert.fail('Should never get here'); + } catch (error) { + assert.equal(error.response.status, 400); + assert.deepEqual(error.response.data, { name: 'BadRequest', + message: 'Invalid Password', + code: 400, + className: 'bad-request', + data: {}, + errors: [{ + path: 'password', + value: null, + message: '\'password\' cannot be \'null\'' + }] + }); + } + }); + }); + + it('returns JSON by default', async () => { + try { + await axios('http://localhost:5050/bad-request'); + assert.fail('Should never get here'); + } catch (error) { + assert.equal(error.response.status, 400); + assert.deepEqual(error.response.data, { + name: 'BadRequest', + message: 'Invalid Password', + code: 400, + className: 'bad-request', + data: {}, + errors: [{ + path: 'password', + value: null, + message: '\'password\' cannot be \'null\'' + }] + }); + } + }); + }); +}); diff --git a/packages/express/test/index.test.js b/packages/express/test/index.test.ts similarity index 67% rename from packages/express/test/index.test.js rename to packages/express/test/index.test.ts index 9a32d617ed..a5b1a75b20 100644 --- a/packages/express/test/index.test.js +++ b/packages/express/test/index.test.ts @@ -1,22 +1,21 @@ -const assert = require('assert'); -const express = require('express'); -const axios = require('axios'); -const fs = require('fs'); -const path = require('path'); -const https = require('https'); -const feathers = require('@feathersjs/feathers'); +import { strict as assert } from 'assert'; +import express, { Request, Response, NextFunction } from 'express'; +import axios from 'axios'; +import fs from 'fs'; +import path from 'path'; +import https from 'https'; +import feathers, { HookContext, Id } from '@feathersjs/feathers'; -const expressify = require('../lib'); +import * as expressify from '../src'; describe('@feathersjs/express', () => { const service = { - get (id) { - return Promise.resolve({ id }); + async get (id: Id) { + return { id }; } }; it('exports .default, .original .rest, .notFound and .errorHandler', () => { - assert.strictEqual(expressify.default, expressify); assert.strictEqual(expressify.original, express); assert.strictEqual(typeof expressify.rest, 'function'); assert.ok(expressify.notFound); @@ -24,14 +23,14 @@ describe('@feathersjs/express', () => { }); it('returns an Express application', () => { - const app = expressify(feathers()); + const app = expressify.default(feathers()); assert.strictEqual(typeof app, 'function'); }); it('allows to use an existing Express instance', () => { const expressApp = express(); - const app = expressify(feathers(), expressApp); + const app = expressify.default(feathers(), expressApp); assert.strictEqual(app, expressApp); }); @@ -41,7 +40,7 @@ describe('@feathersjs/express', () => { }); it('returns a plain express app when no app is provided', () => { - const app = expressify(); + const app = expressify.default(); assert.strictEqual(typeof app.use, 'function'); assert.strictEqual(typeof app.service, 'undefined'); @@ -50,7 +49,8 @@ describe('@feathersjs/express', () => { it('errors when app with wrong version is provided', () => { try { - expressify({}); + // @ts-ignore + expressify.default({}); } catch (e) { assert.strictEqual(e.message, '@feathersjs/express requires a valid Feathers application instance'); } @@ -59,7 +59,7 @@ describe('@feathersjs/express', () => { const app = feathers(); app.version = '2.9.9'; - expressify(app); + expressify.default(app); } catch (e) { assert.strictEqual(e.message, '@feathersjs/express requires an instance of a Feathers application version 3.x or later (got 2.9.9)'); } @@ -68,34 +68,34 @@ describe('@feathersjs/express', () => { const app = feathers(); delete app.version; - expressify(app); + expressify.default(app); } catch (e) { assert.strictEqual(e.message, '@feathersjs/express requires an instance of a Feathers application version 3.x or later (got unknown)'); } }); it('Can use Express sub-apps', () => { - const app = expressify(feathers()); + const app = expressify.default(feathers()); const child = express(); app.use('/path', child); - assert.strictEqual(child.parent, app); + assert.strictEqual((child as any).parent, app); }); it('Can use express.static', () => { - const app = expressify(feathers()); + const app = expressify.default(feathers()); app.use('/path', expressify.static(__dirname)); }); - it('has Feathers functionality', () => { - const app = expressify(feathers()); + it('has Feathers functionality', async () => { + const app = expressify.default(feathers()); app.use('/myservice', service); app.hooks({ after: { - get (hook) { + get (hook: HookContext) { hook.result.fromAppHook = true; } } @@ -103,46 +103,52 @@ describe('@feathersjs/express', () => { app.service('myservice').hooks({ after: { - get (hook) { + get (hook: HookContext) { hook.result.fromHook = true; } } }); - return app.service('myservice').get(10) - .then(data => assert.deepStrictEqual(data, { - id: 10, - fromHook: true, - fromAppHook: true - })); + const data = await app.service('myservice').get(10); + + assert.deepStrictEqual(data, { + id: 10, + fromHook: true, + fromAppHook: true + }); }); it('can register a service and start an Express server', done => { - const app = expressify(feathers()); + const app = expressify.default(feathers()); const response = { message: 'Hello world' }; app.use('/myservice', service); - app.use((req, res) => res.json(response)); + app.use((_req, res) => res.json(response)); - const server = app.listen(8787).on('listening', () => { - app.service('myservice').get(10) - .then(data => assert.deepStrictEqual(data, { id: 10 })) - .then(() => axios.get('http://localhost:8787')) - .then(res => assert.deepStrictEqual(res.data, response)) - .then(() => server.close(() => done())) - .catch(done); + const server = app.listen(8787).on('listening', async () => { + try { + const data = await app.service('myservice').get(10); + assert.deepStrictEqual(data, { id: 10 }); + + const res = await axios.get('http://localhost:8787'); + assert.deepStrictEqual(res.data, response); + + server.close(() => done()); + } catch (error) { + done(error); + } }); }); it('.listen calls .setup', done => { - const app = expressify(feathers()); + const app = expressify.default(feathers()); let called = false; app.use('/myservice', { - get (id) { - return Promise.resolve({ id }); + async get (id) { + return { id }; }, setup (appParam, path) { @@ -168,14 +174,14 @@ describe('@feathersjs/express', () => { it('passes middleware as options', () => { const feathersApp = feathers(); - const app = expressify(feathersApp); + const app = expressify.default(feathersApp); const oldUse = feathersApp.use; - const a = (req, res, next) => next(); - const b = (req, res, next) => next(); - const c = (req, res, next) => next(); + const a = (_req: Request, _res: Response, next: NextFunction) => next(); + const b = (_req: Request, _res: Response, next: NextFunction) => next(); + const c = (_req: Request, _res: Response, next: NextFunction) => next(); const service = { - get (id) { - return Promise.resolve({ id }); + async get (id: Id) { + return { id }; } }; @@ -186,7 +192,7 @@ describe('@feathersjs/express', () => { before: [a, b], after: [c] }); - return oldUse.apply(this, arguments); + return (oldUse as any).apply(this, arguments); }; app.use('/myservice', a, b, service, c); @@ -194,10 +200,10 @@ describe('@feathersjs/express', () => { it('throws an error for invalid middleware options', () => { const feathersApp = feathers(); - const app = expressify(feathersApp); + const app = expressify.default(feathersApp); const service = { - get (id) { - return Promise.resolve({ id }); + async get (id: any) { + return { id }; } }; @@ -210,15 +216,15 @@ describe('@feathersjs/express', () => { it('Works with HTTPS', done => { const todoService = { - get (name) { - return Promise.resolve({ + async get (name: Id) { + return { id: name, description: `You have to do ${name}!` - }); + }; } }; - const app = expressify(feathers()) + const app = expressify.default(feathers()) .configure(expressify.rest()) .use('/secureTodos', todoService); diff --git a/packages/express/test/not-found-handler.test.js b/packages/express/test/not-found-handler.test.ts similarity index 53% rename from packages/express/test/not-found-handler.test.js rename to packages/express/test/not-found-handler.test.ts index 0e2524e2d3..4db680e456 100644 --- a/packages/express/test/not-found-handler.test.js +++ b/packages/express/test/not-found-handler.test.ts @@ -1,23 +1,17 @@ -const { strict: assert } = require('assert'); -const errors = require('@feathersjs/errors'); +import { strict as assert } from 'assert'; +import { NotFound } from '@feathersjs/errors'; -const handler = require('../lib/not-found-handler'); +import { notFound } from '../src'; -describe('not-found-handler', () => { - it('is CommonJS compatible', () => { - assert.equal(typeof require('../lib/not-found-handler'), 'function'); - }); - - it('is import compatible', () => { - assert.equal(typeof handler, 'function'); - }); +const handler = notFound as any; +describe('not-found-handler', () => { it('returns NotFound error', done => { handler()({ url: 'some/where', headers: {} - }, {}, function (error) { - assert.ok(error instanceof errors.NotFound); + }, {}, function (error: any) { + assert.ok(error instanceof NotFound); assert.equal(error.message, 'Page not found'); assert.deepEqual(error.data, { url: 'some/where' @@ -30,8 +24,8 @@ describe('not-found-handler', () => { handler({ verbose: true })({ url: 'some/where', headers: {} - }, {}, function (error) { - assert.ok(error instanceof errors.NotFound); + }, {}, function (error: any) { + assert.ok(error instanceof NotFound); assert.equal(error.message, 'Page not found: some/where'); assert.deepEqual(error.data, { url: 'some/where' diff --git a/packages/express/test/rest.test.js b/packages/express/test/rest.test.js deleted file mode 100644 index 5e1cd9fcb6..0000000000 --- a/packages/express/test/rest.test.js +++ /dev/null @@ -1,646 +0,0 @@ -const assert = require('assert'); -const axios = require('axios'); - -const feathers = require('@feathersjs/feathers'); -const { BadRequest } = require('@feathersjs/errors'); -const { Service } = require('@feathersjs/tests/lib/fixture'); -const { crud } = require('@feathersjs/tests/lib/crud'); - -const expressify = require('../lib'); -const { rest } = expressify; - -describe('@feathersjs/express/rest provider', () => { - describe('base functionality', () => { - it('throws an error if you did not expressify', () => { - const app = feathers(); - - try { - app.configure(rest()); - assert.ok(false, 'Should never get here'); - } catch (e) { - assert.strictEqual(e.message, '@feathersjs/express/rest needs an Express compatible app. Feathers apps have to wrapped with feathers-express first.'); - } - }); - - it('throws an error for incompatible Feathers version', () => { - try { - const app = expressify(feathers()); - - app.version = '2.9.9'; - app.configure(rest()); - - assert.ok(false, 'Should never get here'); - } catch (e) { - assert.strictEqual(e.message, '@feathersjs/express/rest requires an instance of a Feathers application version 3.x or later (got 2.9.9)'); - } - }); - - it('lets you set the handler manually', () => { - const app = expressify(feathers()); - const formatter = function (req, res) { - res.format({ - 'text/plain': function () { - res.end(`The todo is: ${res.data.description}`); - } - }); - }; - - app.configure(rest(formatter)) - .use('/todo', { - get (id) { - return Promise.resolve({ - description: `You have to do ${id}` - }); - } - }); - - let server = app.listen(4776); - - return axios.get('http://localhost:4776/todo/dishes') - .then(res => { - assert.strictEqual(res.data, 'The todo is: You have to do dishes'); - }) - .then(() => server.close()); - }); - - it('lets you set no handler', () => { - const app = expressify(feathers()); - const data = { fromHandler: true }; - - app.configure(rest(null)) - .use('/todo', { - get (id) { - return Promise.resolve({ - description: `You have to do ${id}` - }); - } - }) - .use((req, res) => res.json(data)); - - let server = app.listen(5775); - - return axios.get('http://localhost:5775/todo-handler/dishes') - .then(res => assert.deepStrictEqual(res.data, data)) - .then(() => server.close()); - }); - }); - - describe('CRUD', () => { - let server; - let app; - - before(function () { - app = expressify(feathers()) - .configure(rest(rest.formatter)) - .use(expressify.json()) - .use('codes', { - get (id, params) { - return Promise.resolve({ id }); - }, - - create (data) { - return Promise.resolve(data); - } - }) - .use('/', Service) - .use('todo', Service); - - server = app.listen(4777, () => app.use('tasks', Service)); - }); - - after(done => server.close(done)); - - crud('Services', 'todo', 4777); - crud('Root Service', '/', 4777); - crud('Dynamic Services', 'tasks', 4777); - - describe('res.hook', () => { - const convertHook = hook => { - const result = Object.assign({}, hook); - - delete result.service; - delete result.app; - delete result.error; - - return result; - }; - - it('sets the actual hook object in res.hook', () => { - const params = { - route: {}, - query: { test: 'param' }, - provider: 'rest' - }; - - app.use('/hook', { - get (id) { - return Promise.resolve({ - description: `You have to do ${id}` - }); - } - }, function (req, res, next) { - res.data = convertHook(res.hook); - - next(); - }); - - app.service('hook').hooks({ - after (hook) { - hook.addedProperty = true; - } - }); - - return axios.get('http://localhost:4777/hook/dishes?test=param') - .then(res => { - const paramsWithHeaders = { - ...params, - headers: res.data.params.headers - }; - - assert.deepStrictEqual(res.data, { - id: 'dishes', - params: paramsWithHeaders, - arguments: [ - 'dishes', paramsWithHeaders - ], - type: 'after', - method: 'get', - path: 'hook', - result: { description: 'You have to do dishes' }, - addedProperty: true - }); - }); - }); - - it('can use hook.dispatch', () => { - app.use('/hook-dispatch', { - get (id) { - return Promise.resolve({}); - } - }); - - app.service('hook-dispatch').hooks({ - after (hook) { - hook.dispatch = { - id: hook.id, - fromDispatch: true - }; - } - }); - - return axios.get('http://localhost:4777/hook-dispatch/dishes') - .then(res => { - assert.deepStrictEqual(res.data, { - id: 'dishes', - fromDispatch: true - }); - }); - }); - - it('allows to set statusCode in a hook', () => { - app.use('/hook-status', { - get (id) { - return Promise.resolve({}); - } - }); - - app.service('hook-status').hooks({ - after (hook) { - hook.statusCode = 206; - } - }); - - return axios.get('http://localhost:4777/hook-status/dishes') - .then(res => assert.strictEqual(res.status, 206)); - }); - - it('sets the hook object in res.hook on error', () => { - const params = { - route: {}, - query: {}, - provider: 'rest' - }; - - app.use('/hook-error', { - get () { - return Promise.reject(new Error('I blew up')); - } - }, function (error, req, res, next) { - res.status(500); - res.json({ - hook: convertHook(res.hook), - error: { - message: error.message - } - }); - }); - - return axios('http://localhost:4777/hook-error/dishes') - .catch(error => { - const { data } = error.response; - const paramsWithHeaders = { - ...params, - headers: data.hook.params.headers - }; - assert.deepStrictEqual(error.response.data, { - hook: { - id: 'dishes', - params: paramsWithHeaders, - arguments: ['dishes', paramsWithHeaders ], - type: 'error', - method: 'get', - path: 'hook-error', - original: data.hook.original - }, - error: { message: 'I blew up' } - }); - }); - }); - }); - }); - - describe('middleware', () => { - it('sets service parameters and provider type', () => { - let service = { - get (id, params) { - return Promise.resolve(params); - } - }; - - let server = expressify(feathers()) - .configure(rest(rest.formatter)) - .use(function (req, res, next) { - assert.ok(req.feathers, 'Feathers object initialized'); - req.feathers.test = 'Happy'; - next(); - }) - .use('service', service) - .listen(4778); - - return axios.get('http://localhost:4778/service/bla?some=param&another=thing') - .then(res => { - let expected = { - headers: res.data.headers, - test: 'Happy', - provider: 'rest', - route: {}, - query: { - some: 'param', - another: 'thing' - } - }; - - assert.ok(res.status === 200, 'Got OK status code'); - assert.deepStrictEqual(res.data, expected, 'Got params object back'); - }) - .then(() => server.close()); - }); - - it('Lets you configure your own middleware before the handler (#40)', () => { - const data = { - description: 'Do dishes!', - id: 'dishes' - }; - const app = expressify(feathers()); - - app.use(function defaultContentTypeMiddleware (req, res, next) { - req.headers['content-type'] = req.headers['content-type'] || 'application/json'; - next(); - }) - .configure(rest(rest.formatter)) - .use(expressify.json()) - .use('/todo', { - create (data) { - return Promise.resolve(data); - } - }); - - const server = app.listen(4775); - const options = { - url: 'http://localhost:4775/todo', - method: 'post', - data, - headers: { - 'content-type': '' - } - }; - - return axios(options) - .then(res => { - assert.deepStrictEqual(res.data, data); - server.close(); - }); - }); - - it('allows middleware before and after a service', () => { - const app = expressify(feathers()); - - app.configure(rest()) - .use(expressify.json()) - .use('/todo', function (req, res, next) { - req.body.before = ['before first']; - next(); - }, function (req, res, next) { - req.body.before.push('before second'); - next(); - }, { - create (data) { - return Promise.resolve(data); - } - }, function (req, res, next) { - res.data.after = ['after first']; - next(); - }, function (req, res, next) { - res.data.after.push('after second'); - next(); - }); - - const server = app.listen(4776); - - return axios.post('http://localhost:4776/todo', { text: 'Do dishes' }) - .then(res => { - assert.deepStrictEqual(res.data, { - text: 'Do dishes', - before: ['before first', 'before second'], - after: ['after first', 'after second'] - }); - }) - .then(() => server.close()); - }); - - it('allows middleware arrays before and after a service', () => { - const app = expressify(feathers()); - - app.configure(rest()) - .use(expressify.json()) - .use('/todo', [function (req, res, next) { - req.body.before = ['before first']; - next(); - }, function (req, res, next) { - req.body.before.push('before second'); - next(); - }], { - create (data) { - return Promise.resolve(data); - } - }, [function (req, res, next) { - res.data.after = ['after first']; - next(); - }], function (req, res, next) { - res.data.after.push('after second'); - next(); - }); - - const server = app.listen(4776); - - return axios.post('http://localhost:4776/todo', { text: 'Do dishes' }) - .then(res => { - assert.deepStrictEqual(res.data, { - text: 'Do dishes', - before: ['before first', 'before second'], - after: ['after first', 'after second'] - }); - }) - .then(() => server.close()); - }); - - it('allows an array of middleware without a service', () => { - const app = expressify(feathers()); - const middlewareArray = [ - function (req, res, next) { - res.data = ['first']; - next(); - }, function (req, res, next) { - res.data.push('second'); - next(); - }, function (req, res, next) { - res.data.push(req.body.text); - res.status(200).json(res.data); - }]; - app.configure(rest()) - .use(expressify.json()) - .use('/array-middleware', middlewareArray); - - const server = app.listen(4776); - - return axios.post('http://localhost:4776/array-middleware', { text: 'Do dishes' }) - .then(res => { - assert.deepStrictEqual(res.data, ['first', 'second', 'Do dishes']); - }) - .then(() => server.close()); - }); - - it('formatter does nothing when there is no res.data', () => { - const data = { message: 'It worked' }; - const app = expressify(feathers()).use('/test', - rest.formatter, - (req, res) => res.json(data) - ); - - const server = app.listen(7988); - - return axios.get('http://localhost:7988/test') - .then(res => assert.deepStrictEqual(res.data, data)) - .then(() => server.close()); - }); - }); - - describe('HTTP status codes', () => { - let app; - let server; - - before(function () { - app = expressify(feathers()) - .configure(rest(rest.formatter)) - .use('todo', { - get (id) { - return Promise.resolve({ - description: `You have to do ${id}` - }); - }, - - patch () { - return Promise.reject(new Error('Not implemented')); - }, - - find () { - return Promise.resolve(null); - } - }); - - app.use(function (req, res, next) { - if (typeof res.data !== 'undefined') { - next(new Error('Should never get here')); - } else { - next(); - } - }); - - // Error handler - app.use(function (error, req, res, next) { - if (res.statusCode < 400) { - res.status(500); - } - - res.json({ message: error.message }); - }); - - server = app.listen(4780); - }); - - after(done => server.close(done)); - - it('throws a 405 for undefined service methods and sets Allow header (#99)', () => { - return axios.get('http://localhost:4780/todo/dishes') - .then(res => { - assert.ok(res.status === 200, 'Got OK status code for .get'); - assert.deepStrictEqual(res.data, { - description: 'You have to do dishes' - }, 'Got expected object'); - - return axios.post('http://localhost:4780/todo'); - }) - .catch(error => { - assert.strictEqual(error.response.headers.allow, 'GET,PATCH'); - assert.ok(error.response.status === 405, 'Got 405 for .create'); - assert.deepStrictEqual(error.response.data, { - message: 'Method `create` is not supported by this endpoint.' - }, 'Error serialized as expected'); - }); - }); - - it('throws a 404 for undefined route', () => { - return axios.get('http://localhost:4780/todo/foo/bar') - .catch(error => { - assert.ok(error.response.status === 404, 'Got Not Found code'); - }); - }); - - it('empty response sets 204 status codes, does not run other middleware (#391)', () => { - return axios.get('http://localhost:4780/todo') - .then(res => { - assert.ok(res.status === 204, 'Got empty status code'); - }); - }); - }); - - describe('route parameters', () => { - let server; - let app; - - before(() => { - app = expressify(feathers()) - .configure(rest()) - .use('/:appId/:id/todo', { - get (id, params) { - if (params.query.error) { - return Promise.reject(new BadRequest('Not good')); - } - - return Promise.resolve({ - id, - route: params.route - }); - } - }) - .use(expressify.errorHandler()); - - server = app.listen(6880); - }); - - after(done => server.close(done)); - - it('adds route params as `params.route` and allows id property (#76, #407)', () => { - const expected = { - id: 'dishes', - route: { - appId: 'theApp', - id: 'myId' - } - }; - - return axios.get(`http://localhost:6880/theApp/myId/todo/${expected.id}`) - .then(res => { - assert.ok(res.status === 200, 'Got OK status code'); - assert.deepStrictEqual(expected, res.data); - }); - }); - - it('properly serializes error for nested routes (#1096)', () => { - return axios.get(`http://localhost:6880/theApp/myId/todo/test?error=true`) - .catch(error => { - const { response } = error; - - assert.strictEqual(response.status, 400); - assert.deepStrictEqual(response.data, { - name: 'BadRequest', - message: 'Not good', - code: 400, - className: 'bad-request', - errors: {} - }); - }); - }); - }); - - describe('Custom methods', () => { - let server; - let app; - - before(() => { - app = expressify(feathers()) - .configure(rest()) - .use(expressify.json()) - .use('/todo', { - get (id) { - return id; - }, - // httpMethod is usable as a decorator: @httpMethod('POST', '/:__feathersId/custom-path') - custom: rest.httpMethod('POST')(feathers.activateHooks(['id', 'data', 'params'])( - (id, data, params = {}) => { - return Promise.resolve({ - id, - data - }); - } - )), - other: rest.httpMethod('PATCH', ':__feathersId/second-method')( - feathers.activateHooks(['id', 'data', 'params'])( - (id, data, params = {}) => { - return Promise.resolve({ - id, - data - }); - } - ) - ) - }); - - server = app.listen(4781); - }); - - after(done => server.close(done)); - - it('works with custom methods', () => { - return axios.post('http://localhost:4781/todo/42/custom', { text: 'Do dishes' }) - .then(res => { - assert.equal(res.headers.allow, 'GET,POST,PATCH'); - assert.deepEqual(res.data, { - id: '42', - data: { text: 'Do dishes' } - }); - }); - }); - - it('works with custom methods - with route', () => { - return axios.patch('http://localhost:4781/todo/12/second-method', { text: 'Hmm' }) - .then(res => { - assert.equal(res.headers.allow, 'GET,POST,PATCH'); - assert.deepEqual(res.data, { - id: '12', - data: { text: 'Hmm' } - }); - }); - }); - }); -}); diff --git a/packages/express/test/rest.test.ts b/packages/express/test/rest.test.ts new file mode 100644 index 0000000000..a46addd585 --- /dev/null +++ b/packages/express/test/rest.test.ts @@ -0,0 +1,642 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { strict as assert } from 'assert'; +import axios from 'axios'; + +import { Server } from 'http'; +import feathers, { HookContext, Id, Params } from '@feathersjs/feathers'; +// import { BadRequest } from '@feathersjs/errors'; +import { Service } from '@feathersjs/tests/src/fixture'; +import { crud } from '@feathersjs/tests/src/crud'; + +import * as express from '../src' +import { Request, Response, NextFunction } from 'express'; +import { BadRequest } from '@feathersjs/errors/lib'; + +const expressify = express.default; +const { rest } = express; + +describe('@feathersjs/express/rest provider', () => { + describe('base functionality', () => { + it('throws an error if you did not expressify', () => { + const app = feathers(); + + try { + app.configure(rest()); + assert.ok(false, 'Should never get here'); + } catch (e) { + assert.strictEqual(e.message, '@feathersjs/express/rest needs an Express compatible app. Feathers apps have to wrapped with feathers-express first.'); + } + }); + + it('throws an error for incompatible Feathers version', () => { + try { + const app = expressify(feathers()); + + app.version = '2.9.9'; + app.configure(rest()); + + assert.ok(false, 'Should never get here'); + } catch (e) { + assert.strictEqual(e.message, '@feathersjs/express/rest requires an instance of a Feathers application version 3.x or later (got 2.9.9)'); + } + }); + + it('lets you set the handler manually', async () => { + const app = expressify(feathers()); + + app.configure(rest(function (_req, res) { + res.format({ + 'text/plain' () { + res.end(`The todo is: ${res.data.description}`); + } + }); + })).use('/todo', { + get (id) { + return Promise.resolve({ + description: `You have to do ${id}` + }); + } + }); + + const server = app.listen(4776); + + const res = await axios.get('http://localhost:4776/todo/dishes'); + + assert.strictEqual(res.data, 'The todo is: You have to do dishes'); + server.close(); + }); + + it('lets you set no handler', async () => { + const app = expressify(feathers()); + const data = { fromHandler: true }; + + app.configure(rest(null)) + .use('/todo', { + get (id) { + return Promise.resolve({ + description: `You have to do ${id}` + }); + } + }) + .use((_req, res) => res.json(data)); + + const server = app.listen(5775); + + const res = await axios.get('http://localhost:5775/todo-handler/dishes') + + assert.deepStrictEqual(res.data, data); + + server.close(); + }); + }); + + describe('CRUD', () => { + let server: Server; + let app: express.Application; + + before(function () { + app = expressify(feathers()) + .configure(rest(rest.formatter)) + .use(express.json()) + .use('codes', { + async get (id) { + return { id }; + }, + + async create (data) { + return data; + } + }) + .use('/', Service) + .use('todo', Service); + + server = app.listen(4777, () => app.use('tasks', Service)); + }); + + after(done => server.close(done)); + + crud('Services', 'todo', 4777); + crud('Root Service', '/', 4777); + crud('Dynamic Services', 'tasks', 4777); + + describe('res.hook', () => { + const convertHook = (hook: HookContext) => { + const result: any = Object.assign({}, hook); + + delete result.self; + delete result.service; + delete result.app; + delete result.error; + + return result; + }; + + it('sets the actual hook object in res.hook', async () => { + const params = { + route: {}, + query: { test: 'param' }, + provider: 'rest' + }; + + app.use('/hook', { + async get (id) { + return { + description: `You have to do ${id}` + }; + } + }, function (_req, res, next) { + res.data = convertHook(res.hook); + + next(); + }); + + app.service('hook').hooks({ + after (hook: HookContext) { + (hook as any).addedProperty = true; + } + }); + + const res = await axios.get('http://localhost:4777/hook/dishes?test=param'); + const paramsWithHeaders = { + ...params, + headers: res.data.params.headers + }; + + assert.deepStrictEqual(res.data, { + id: 'dishes', + params: paramsWithHeaders, + arguments: [ + 'dishes', paramsWithHeaders + ], + type: 'after', + method: 'get', + path: 'hook', + result: { description: 'You have to do dishes' }, + addedProperty: true + }); + }); + + it('can use hook.dispatch', async () => { + app.use('/hook-dispatch', { + async get () { + return {}; + } + }); + + app.service('hook-dispatch').hooks({ + after (hook: HookContext) { + hook.dispatch = { + id: hook.id, + fromDispatch: true + }; + } + }); + + const res = await axios.get('http://localhost:4777/hook-dispatch/dishes'); + assert.deepStrictEqual(res.data, { + id: 'dishes', + fromDispatch: true + }); + }); + + it('allows to set statusCode in a hook', async () => { + app.use('/hook-status', { + async get () { + return {}; + } + }); + + app.service('hook-status').hooks({ + after (hook: HookContext) { + hook.statusCode = 206; + } + }); + + const res = await axios.get('http://localhost:4777/hook-status/dishes'); + + assert.strictEqual(res.status, 206); + }); + + it('sets the hook object in res.hook on error', async () => { + const params = { + route: {}, + query: {}, + provider: 'rest' + }; + + app.use('/hook-error', { + async get () { + throw new Error('I blew up'); + } + }, function (error: Error, _req: Request, res: Response, _next: NextFunction) { + res.status(500); + res.json({ + hook: convertHook(res.hook), + error: { + message: error.message + } + }); + }); + + try { + await axios('http://localhost:4777/hook-error/dishes'); + assert.fail('Should never get here'); + } catch (error) { + const { data } = error.response; + const paramsWithHeaders = { + ...params, + headers: data.hook.params.headers + }; + assert.deepStrictEqual(error.response.data, { + hook: { + id: 'dishes', + params: paramsWithHeaders, + arguments: ['dishes', paramsWithHeaders ], + type: 'error', + method: 'get', + path: 'hook-error', + original: data.hook.original + }, + error: { message: 'I blew up' } + }); + } + }); + }); + }); + + describe('middleware', () => { + it('sets service parameters and provider type', async () => { + const service = { + async get (_id: Id, params: Params) { + return params; + } + }; + + const server = expressify(feathers()) + .configure(rest(rest.formatter)) + .use(function (req, _res, next) { + assert.ok(req.feathers, 'Feathers object initialized'); + req.feathers.test = 'Happy'; + next(); + }) + .use('service', service) + .listen(4778); + + const res = await axios.get('http://localhost:4778/service/bla?some=param&another=thing'); + const expected = { + headers: res.data.headers, + test: 'Happy', + provider: 'rest', + route: {}, + query: { + some: 'param', + another: 'thing' + } + }; + + assert.ok(res.status === 200, 'Got OK status code'); + assert.deepStrictEqual(res.data, expected, 'Got params object back'); + server.close(); + }); + + it('Lets you configure your own middleware before the handler (#40)', async () => { + const data = { + description: 'Do dishes!', + id: 'dishes' + }; + const app = expressify(feathers()); + + app.use(function defaultContentTypeMiddleware (req, _res, next) { + req.headers['content-type'] = req.headers['content-type'] || 'application/json'; + next(); + }) + .configure(rest(rest.formatter)) + .use(express.json()) + .use('/todo', { + create (data) { + return Promise.resolve(data); + } + }); + + const server = app.listen(4775); + + const res = await axios({ + url: 'http://localhost:4775/todo', + method: 'post', + data, + headers: { + 'content-type': '' + } + }); + + assert.deepStrictEqual(res.data, data); + server.close(); + }); + + it('allows middleware before and after a service', async () => { + const app = expressify(feathers()); + + app.configure(rest()) + .use(express.json()) + .use('/todo', function (req, _res, next) { + req.body.before = ['before first']; + next(); + }, function (req, _res, next) { + req.body.before.push('before second'); + next(); + }, { + create (data) { + return Promise.resolve(data); + } + }, function (_req, res, next) { + res.data.after = ['after first']; + next(); + }, function (_req, res, next) { + res.data.after.push('after second'); + next(); + }); + + const server = app.listen(4776); + const res = await axios.post('http://localhost:4776/todo', { text: 'Do dishes' }); + + assert.deepStrictEqual(res.data, { + text: 'Do dishes', + before: ['before first', 'before second'], + after: ['after first', 'after second'] + }); + + server.close(); + }); + + it('allows middleware arrays before and after a service', async () => { + const app = expressify(feathers()); + + app.configure(rest()) + .use(express.json()) + .use('/todo', [function (req: Request, _res: Response, next: NextFunction) { + req.body.before = ['before first']; + next(); + }, function (req: Request, _res: Response, next: NextFunction) { + req.body.before.push('before second'); + next(); + }], { + async create (data) { + return data; + } + }, [function (_req: Request, res: Response, next: NextFunction) { + res.data.after = ['after first']; + next(); + }], function (_req: Request, res: Response, next: NextFunction) { + res.data.after.push('after second'); + next(); + }); + + const server = app.listen(4776); + const res = await axios.post('http://localhost:4776/todo', { text: 'Do dishes' }); + + assert.deepStrictEqual(res.data, { + text: 'Do dishes', + before: ['before first', 'before second'], + after: ['after first', 'after second'] + }); + server.close(); + }); + + it('allows an array of middleware without a service', async () => { + const app = expressify(feathers()); + const middlewareArray = [ + function (_req: Request, res: Response, next: NextFunction) { + res.data = ['first']; + next(); + }, function (_req: Request, res: Response, next: NextFunction) { + res.data.push('second'); + next(); + }, function (req: Request, res: Response) { + res.data.push(req.body.text); + res.status(200).json(res.data); + }]; + app.configure(rest()) + .use(express.json()) + .use('/array-middleware', middlewareArray); + + const server = app.listen(4776); + const res = await axios.post('http://localhost:4776/array-middleware', { text: 'Do dishes' }); + + assert.deepStrictEqual(res.data, ['first', 'second', 'Do dishes']); + server.close(); + }); + + it('formatter does nothing when there is no res.data', async () => { + const data = { message: 'It worked' }; + const app = expressify(feathers()).use('/test', + rest.formatter, + (_req, res) => res.json(data) + ); + + const server = app.listen(7988); + const res = await axios.get('http://localhost:7988/test'); + + assert.deepStrictEqual(res.data, data); + server.close(); + }); + }); + + describe('HTTP status codes', () => { + let app: express.Application; + let server: Server; + + before(function () { + app = expressify(feathers()) + .configure(rest(rest.formatter)) + .use('todo', { + async get (id: Id) { + return { + description: `You have to do ${id}` + }; + }, + + async patch () { + throw new Error('Not implemented'); + }, + + async find () { + return null; + } + }); + + app.use(function (_req, res, next) { + if (typeof res.data !== 'undefined') { + next(new Error('Should never get here')); + } else { + next(); + } + }); + + // Error handler + app.use(function (error: Error, _req: Request, res: Response, _next: NextFunction) { + if (res.statusCode < 400) { + res.status(500); + } + + res.json({ message: error.message }); + }); + + server = app.listen(4780); + }); + + after(done => server.close(done)); + + it('throws a 405 for undefined service methods and sets Allow header (#99)', async () => { + const res = await axios.get('http://localhost:4780/todo/dishes'); + + assert.ok(res.status === 200, 'Got OK status code for .get'); + assert.deepStrictEqual(res.data, { + description: 'You have to do dishes' + }, 'Got expected object'); + + try { + await axios.post('http://localhost:4780/todo'); + assert.fail('Should never get here'); + } catch (error) { + assert.strictEqual(error.response.headers.allow, 'GET,PATCH'); + assert.ok(error.response.status === 405, 'Got 405 for .create'); + assert.deepStrictEqual(error.response.data, { + message: 'Method `create` is not supported by this endpoint.' + }, 'Error serialized as expected'); + } + }); + + it('throws a 404 for undefined route', async () => { + try { + await axios.get('http://localhost:4780/todo/foo/bar'); + assert.fail('Should never get here'); + } catch (error) { + assert.ok(error.response.status === 404, 'Got Not Found code'); + } + }); + + it('empty response sets 204 status codes, does not run other middleware (#391)', async () => { + const res = await axios.get('http://localhost:4780/todo'); + + assert.ok(res.status === 204, 'Got empty status code'); + }); + }); + + describe('route parameters', () => { + let server: Server; + let app: express.Application; + + before(() => { + app = expressify(feathers()) + .configure(rest()) + .use('/:appId/:id/todo', { + async get (id: Id, params: Params) { + if (params.query.error) { + throw new BadRequest('Not good'); + } + + return { + id, + route: params.route + }; + } + }) + .use(express.errorHandler()); + + server = app.listen(6880); + }); + + after(done => server.close(done)); + + it('adds route params as `params.route` and allows id property (#76, #407)', async () => { + const expected = { + id: 'dishes', + route: { + appId: 'theApp', + id: 'myId' + } + }; + + const res = await axios.get(`http://localhost:6880/theApp/myId/todo/${expected.id}`); + + assert.ok(res.status === 200, 'Got OK status code'); + assert.deepStrictEqual(expected, res.data); + }); + + it('properly serializes error for nested routes (#1096)', async () => { + try { + await axios.get('http://localhost:6880/theApp/myId/todo/test?error=true'); + assert.fail('Should never het here'); + } catch (error) { + const { response } = error; + + assert.strictEqual(response.status, 400); + assert.deepStrictEqual(response.data, { + name: 'BadRequest', + message: 'Not good', + code: 400, + className: 'bad-request' + }); + } + }); + }); + + describe('Custom methods', () => { + let server: Server; + let app: express.Application; + + before(() => { + app = expressify(feathers()) + .configure(rest()) + .use(express.json()) + .use('/todo', { + async get (id) { + return id; + }, + // httpMethod is usable as a decorator: @httpMethod('POST', '/:__feathersId/custom-path') + custom: rest.httpMethod('POST')((feathers as any).activateHooks(['id', 'data', 'params'])( + (id: any, data: any) => { + return Promise.resolve({ + id, + data + }); + } + )), + other: rest.httpMethod('PATCH', ':__feathersId/second-method')( + (feathers as any).activateHooks(['id', 'data', 'params'])( + (id: any, data: any) => { + return Promise.resolve({ + id, + data + }); + } + ) + ) + }); + + server = app.listen(4781); + }); + + after(done => server.close(done)); + + it('works with custom methods', async () => { + const res = await axios.post('http://localhost:4781/todo/42/custom', { text: 'Do dishes' }); + + assert.equal(res.headers.allow, 'GET,POST,PATCH'); + assert.deepEqual(res.data, { + id: '42', + data: { text: 'Do dishes' } + }); + }); + + it('works with custom methods - with route', async () => { + const res = await axios.patch('http://localhost:4781/todo/12/second-method', { text: 'Hmm' }); + + assert.equal(res.headers.allow, 'GET,POST,PATCH'); + assert.deepEqual(res.data, { + id: '12', + data: { text: 'Hmm' } + }); + }); + }); +}); diff --git a/packages/express/tsconfig.json b/packages/express/tsconfig.json new file mode 100644 index 0000000000..316fd41336 --- /dev/null +++ b/packages/express/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "include": [ + "src/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib" + } +} diff --git a/packages/feathers/CHANGELOG.md b/packages/feathers/CHANGELOG.md index 9fe5a8c79f..8c469f955b 100644 --- a/packages/feathers/CHANGELOG.md +++ b/packages/feathers/CHANGELOG.md @@ -3,6 +3,32 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### Features + +* **core:** Migrate @feathersjs/feathers to TypeScript ([#1963](https://github.com/feathersjs/feathers/issues/1963)) ([7812529](https://github.com/feathersjs/feathers/commit/7812529ff0f1008e21211f1d01efbc49795dbe55)) +* **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) + + + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### Features + +* **core:** Migrate @feathersjs/feathers to TypeScript ([#1963](https://github.com/feathersjs/feathers/issues/1963)) ([7812529](https://github.com/feathersjs/feathers/commit/7812529ff0f1008e21211f1d01efbc49795dbe55)) +* **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) + + + ## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) **Note:** Version bump only for package @feathersjs/feathers diff --git a/packages/feathers/index.d.ts b/packages/feathers/index.d.ts deleted file mode 100644 index 0c31c9e7ca..0000000000 --- a/packages/feathers/index.d.ts +++ /dev/null @@ -1,337 +0,0 @@ -/// - -import { EventEmitter } from 'events'; -import * as http from 'http'; - -declare const createApplication: Feathers; -export = createApplication; - -interface Feathers { - (): createApplication.Application; - readonly ACTIVATE_HOOKS: unique symbol; - version: string; - default: Feathers; - // TODO: Write a definition for activateHooks. - // activateHooks(): void -} - -declare namespace createApplication { - type Id = number | string; - type NullableId = Id | null; - - interface Query { - [key: string]: any; - } - - interface PaginationOptions { - default: number; - max: number; - } - - type ClientSideParams = Pick; - type ServerSideParams = Params; - - /** - * Service call parameters - * - * @see {@link https://docs.feathersjs.com/api/services.html#params} - */ - interface Params { - query?: Query; - paginate?: false | Pick; - provider?: string; - route?: {[key: string]: string}; - headers?: {[key: string]: any}; - user?: {[key: string]: any}; - - [key: string]: any; // (JL) not sure if we want this - } - - interface Paginated { - total: number; - limit: number; - skip: number; - data: T[]; - } - - // tslint:disable-next-line void-return - type Hook> = (context: HookContext) => (Promise | void> | HookContext | void); - - interface HookContext> { - /** - * A read only property that contains the Feathers application object. This can be used to - * retrieve other services (via context.app.service('name')) or configuration values. - */ - readonly app: Application; - /** - * A writeable property containing the data of a create, update and patch service - * method call. - */ - data?: T; - /** - * A writeable property with the error object that was thrown in a failed method call. - * It is only available in error hooks. - */ - error?: any; - /** - * A writeable property and the id for a get, remove, update and patch service - * method call. For remove, update and patch context.id can also be null when - * modifying multiple entries. In all other cases it will be undefined. - */ - id?: string | number; - /** - * A read only property with the name of the service method (one of find, get, - * create, update, patch, remove). - */ - readonly method: 'find' | 'get' | 'create' | 'update' | 'patch' | 'remove'; - /** - * A writeable property that contains the service method parameters (including - * params.query). - */ - params: Params; - /** - * A read only property and contains the service name (or path) without leading or - * trailing slashes. - */ - readonly path: string; - /** - * A writeable property containing the result of the successful service method call. - * It is only available in after hooks. - * - * `context.result` can also be set in - * - * - A before hook to skip the actual service method (database) call - * - An error hook to swallow the error and return a result instead - */ - result?: T; - /** - * A read only property and contains the service this hook currently runs on. - */ - readonly service: S; - /** - * A writeable, optional property and contains a 'safe' version of the data that - * should be sent to any client. If context.dispatch has not been set context.result - * will be sent to the client instead. - */ - dispatch?: T; - /** - * A writeable, optional property that allows to override the standard HTTP status - * code that should be returned. - */ - statusCode?: number; - /** - * A read only property with the hook type (one of before, after or error). - */ - readonly type: 'before' | 'after' | 'error'; - /** - * A writeable, optional property that allows service events to be skipped by - * setting it to `null` - */ - event?: null; - } - - interface HookMap { - all: Hook | Hook[]; - find: Hook | Hook[]; - get: Hook | Hook[]; - create: Hook | Hook[]; - update: Hook | Hook[]; - patch: Hook | Hook[]; - remove: Hook | Hook[]; - } - - interface HooksObject { - before: Partial> | Hook | Hook[]; - after: Partial> | Hook | Hook[]; - error: Partial> | Hook | Hook[]; - finally?: Partial> | Hook | Hook[]; - } - - interface SetupMethod { - setup (app: Application, path: string): void; - } - - interface ServiceMethods { - [key: string]: any; - - /** - * Retrieve all resources from this service. - * - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#find-params|Feathers API Documentation: .find(params)} - */ - find (params?: Params): Promise>; - - /** - * Retrieve a single resource matching the given ID. - * - * @param id - ID of the resource to locate - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#get-id-params|Feathers API Documentation: .get(id, params)} - */ - get (id: Id, params?: Params): Promise; - - /** - * Create a new resource for this service. - * - * @param data - Data to insert into this service. - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#create-data-params|Feathers API Documentation: .create(data, params)} - */ - create (data: Partial | Partial[], params?: Params): Promise; - - /** - * Replace any resources matching the given ID with the given data. - * - * @param id - ID of the resource to be updated - * @param data - Data to be put in place of the current resource. - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#update-id-data-params|Feathers API Documentation: .update(id, data, params)} - */ - update (id: NullableId, data: T, params?: Params): Promise; - - /** - * Merge any resources matching the given ID with the given data. - * - * @param id - ID of the resource to be patched - * @param data - Data to merge with the current resource. - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#patch-id-data-params|Feathers API Documentation: .patch(id, data, params)} - */ - patch (id: NullableId, data: Partial, params?: Params): Promise; - - /** - * Remove resources matching the given ID from the this service. - * - * @param id - ID of the resource to be removed - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#remove-id-params|Feathers API Documentation: .remove(id, params)} - */ - remove (id: NullableId, params?: Params): Promise; - } - - interface ServiceOverloads { - /** - * Create a new resource for this service. - * - * @param data - Data to insert into this service. - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#create-data-params|Feathers API Documentation: .create(data, params)} - */ - create? (data: Partial, params?: Params): Promise; - - /** - * Create a new resource for this service. - * - * @param data - Data to insert into this service. - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#create-data-params|Feathers API Documentation: .create(data, params)} - */ - create? (data: Partial[], params?: Params): Promise; - - /** - * Replace any resources matching the given ID with the given data. - * - * @param id - ID of the resource to be updated - * @param data - Data to be put in place of the current resource. - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#update-id-data-params|Feathers API Documentation: .update(id, data, params)} - */ - update? (id: Id, data: T, params?: Params): Promise; - - /** - * Replace any resources matching the given ID with the given data. - * - * @param id - ID of the resource to be updated - * @param data - Data to be put in place of the current resource. - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#update-id-data-params|Feathers API Documentation: .update(id, data, params)} - */ - update? (id: null, data: T, params?: Params): Promise; - - /** - * Merge any resources matching the given ID with the given data. - * - * @param id - ID of the resource to be patched - * @param data - Data to merge with the current resource. - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#patch-id-data-params|Feathers API Documentation: .patch(id, data, params)} - */ - patch? (id: Id, data: Partial, params?: Params): Promise; - - /** - * Merge any resources matching the given ID with the given data. - * - * @param id - ID of the resource to be patched - * @param data - Data to merge with the current resource. - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#patch-id-data-params|Feathers API Documentation: .patch(id, data, params)} - */ - patch? (id: null, data: Partial, params?: Params): Promise; - - /** - * Remove resources matching the given ID from the this service. - * - * @param id - ID of the resource to be removed - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#remove-id-params|Feathers API Documentation: .remove(id, params)} - */ - remove? (id: Id, params?: Params): Promise; - - /** - * Remove resources matching the given ID from the this service. - * - * @param id - ID of the resource to be removed - * @param params - Service call parameters {@link Params} - * @see {@link https://docs.feathersjs.com/api/services.html#remove-id-params|Feathers API Documentation: .remove(id, params)} - */ - remove? (id: null, params?: Params): Promise; - } - - interface ServiceAddons extends EventEmitter { - id?: any; - _serviceEvents: string[]; - methods: {[method: string]: string[]}; - hooks (hooks: Partial): this; - } - - type Service = ServiceOverloads & ServiceAddons & ServiceMethods; - - type ServiceMixin = (service: Service, path: string) => void; - - interface Application extends EventEmitter { - version: string; - - services: keyof ServiceTypes extends never ? any : ServiceTypes; - - mixins: ServiceMixin[]; - - methods: string[]; - - get (name: string): any; - - set (name: string, value: any): this; - - disable (name: string): this; - - disabled (name: string): boolean; - - enable (name: string): this; - - enabled (name: string): boolean; - - configure (callback: (this: this, app: this) => void): this; - - hooks (hooks: Partial): this; - - setup (server?: any): this; - - service (location: L): ServiceTypes[L]; - - service (location: string): keyof ServiceTypes extends never ? any : never; - - use (path: string, service: Partial & SetupMethod> | Application, options?: any): this; - - listen (port: number): http.Server; - } -} diff --git a/packages/feathers/lib/hooks/index.js b/packages/feathers/lib/hooks/index.js deleted file mode 100644 index e1db2eb6f6..0000000000 --- a/packages/feathers/lib/hooks/index.js +++ /dev/null @@ -1,212 +0,0 @@ -const { hooks, isPromise } = require('@feathersjs/commons'); -const baseHooks = require('./base'); - -const { - createHookObject, - getHooks, - processHooks, - enableHooks, - ACTIVATE_HOOKS -} = hooks; - -const withHooks = function withHooks ({ - app, - service, - method, - original -}) { - return (_hooks = {}) => { - const hooks = app.hookTypes.reduce((result, type) => { - const value = _hooks[type] || []; - - result[type] = Array.isArray(value) ? value : [ value ]; - - return result; - }, {}); - - return function (...args) { - const returnHook = args[args.length - 1] === true - ? args.pop() : false; - - // Create the hook object that gets passed through - const hookObject = createHookObject(method, { - type: 'before', // initial hook object type - arguments: args, - service, - app - }); - - return Promise.resolve(hookObject) - - // Run `before` hooks - .then(hookObject => { - return processHooks.call(service, baseHooks.concat(hooks.before), hookObject); - }) - - // Run the original method - .then(hookObject => { - // If `hookObject.result` is set, skip the original method - if (typeof hookObject.result !== 'undefined') { - return hookObject; - } - - // Otherwise, call it with arguments created from the hook object - const promise = new Promise(resolve => { - const func = original || service[method]; - const args = service.methods[method].map((value) => hookObject[value]); - const result = func.apply(service, args); - - if (!isPromise(result)) { - throw new Error(`Service method '${hookObject.method}' for '${hookObject.path}' service must return a promise`); - } - - resolve(result); - }); - - return promise - .then(result => { - hookObject.result = result; - return hookObject; - }) - .catch(error => { - error.hook = hookObject; - throw error; - }); - }) - - // Run `after` hooks - .then(hookObject => { - const afterHookObject = Object.assign({}, hookObject, { - type: 'after' - }); - - return processHooks.call(service, hooks.after, afterHookObject); - }) - - // Run `errors` hooks - .catch(error => { - const errorHookObject = Object.assign({}, error.hook, { - type: 'error', - original: error.hook, - error, - result: undefined - }); - - return processHooks.call(service, hooks.error, errorHookObject) - .catch(error => { - const errorHookObject = Object.assign({}, error.hook, { - error, - result: undefined - }); - - return errorHookObject; - }); - }) - - // Run `finally` hooks - .then(hookObject => { - return processHooks.call(service, hooks.finally, hookObject) - .catch(error => { - const errorHookObject = Object.assign({}, error.hook, { - error, - result: undefined - }); - - return errorHookObject; - }); - }) - - // Resolve with a result or reject with an error - .then(hookObject => { - if (typeof hookObject.error !== 'undefined' && typeof hookObject.result === 'undefined') { - return Promise.reject(returnHook ? hookObject : hookObject.error); - } else { - return returnHook ? hookObject : hookObject.result; - } - }); - }; - }; -}; - -// A service mixin that adds `service.hooks()` method and functionality -const hookMixin = exports.hookMixin = function hookMixin (service) { - if (typeof service.hooks === 'function') { - return; - } - - service.methods = Object.getOwnPropertyNames(service) - .filter(key => typeof service[key] === 'function' && service[key][ACTIVATE_HOOKS]) - .reduce((result, methodName) => { - result[methodName] = service[methodName][ACTIVATE_HOOKS]; - return result; - }, service.methods || {}); - - Object.assign(service.methods, { - find: ['params'], - get: ['id', 'params'], - create: ['data', 'params'], - update: ['id', 'data', 'params'], - patch: ['id', 'data', 'params'], - remove: ['id', 'params'] - }); - - const app = this; - const methodNames = Object.keys(service.methods); - // Assemble the mixin object that contains all "hooked" service methods - const mixin = methodNames.reduce((mixin, method) => { - if (typeof service[method] !== 'function') { - return mixin; - } - - mixin[method] = function () { - const service = this; - const args = Array.from(arguments); - const original = service._super.bind(service); - - return withHooks({ - app, - service, - method, - original - })({ - before: getHooks(app, service, 'before', method), - after: getHooks(app, service, 'after', method, true), - error: getHooks(app, service, 'error', method, true), - finally: getHooks(app, service, 'finally', method, true) - })(...args); - }; - - return mixin; - }, {}); - - // Add .hooks method and properties to the service - enableHooks(service, methodNames, app.hookTypes); - - service.mixin(mixin); -}; - -module.exports = function () { - return function (app) { - // We store a reference of all supported hook types on the app - // in case someone needs it - Object.assign(app, { - hookTypes: ['before', 'after', 'error', 'finally'] - }); - - // Add functionality for hooks to be registered as app.hooks - enableHooks(app, app.methods, app.hookTypes); - - app.mixins.push(hookMixin); - }; -}; - -module.exports.withHooks = withHooks; - -module.exports.ACTIVATE_HOOKS = ACTIVATE_HOOKS; - -module.exports.activateHooks = function activateHooks (args) { - return fn => { - Object.defineProperty(fn, ACTIVATE_HOOKS, { value: args }); - return fn; - }; -}; diff --git a/packages/feathers/lib/index.js b/packages/feathers/lib/index.js deleted file mode 100644 index 33acf66abe..0000000000 --- a/packages/feathers/lib/index.js +++ /dev/null @@ -1,27 +0,0 @@ -const Proto = require('uberproto'); -const Application = require('./application'); -const version = require('./version'); -const { ACTIVATE_HOOKS, activateHooks } = require('./hooks'); -// A base object Prototype that does not inherit from a -// potentially polluted Object prototype -const baseObject = Object.create(null); - -function createApplication () { - const app = Object.create(baseObject); - - // Mix in the base application - Proto.mixin(Application, app); - - app.init(); - - return app; -} - -createApplication.version = version; -createApplication.ACTIVATE_HOOKS = ACTIVATE_HOOKS; -createApplication.activateHooks = activateHooks; - -module.exports = createApplication; - -// For better ES module (TypeScript) compatibility -module.exports.default = createApplication; diff --git a/packages/feathers/lib/version.js b/packages/feathers/lib/version.js deleted file mode 100644 index 41bd0ae026..0000000000 --- a/packages/feathers/lib/version.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 'development'; diff --git a/packages/feathers/package.json b/packages/feathers/package.json index a9122ef1fa..84306eb0b4 100644 --- a/packages/feathers/package.json +++ b/packages/feathers/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/feathers", "description": "A framework for real-time applications and REST API with JavaScript and TypeScript", - "version": "4.5.11", + "version": "5.0.0-pre.1", "homepage": "http://feathersjs.com", "repository": { "type": "git", @@ -13,8 +13,8 @@ "socket.io", "realtime" ], - "main": "lib/index.js", - "types": "index.d.ts", + "main": "lib/", + "types": "lib/", "author": { "name": "Feathers contributors", "email": "hello@feathersjs.com", @@ -41,26 +41,34 @@ "*.js" ], "scripts": { - "test": "mocha --config ../../.mocharc.json", - "write-version": "node -e \"console.log('module.exports = \\'' + require('./package.json').version + '\\';')\" > lib/version.js", - "reset-version": "node -e \"console.log('module.exports = \\'development\\';')\" > lib/version.js", + "write-version": "node -e \"console.log('export default \\'' + require('./package.json').version + '\\';')\" > src/version.ts", + "reset-version": "node -e \"console.log('export default \\'development\\';')\" > src/version.ts", + "prepublish": "npm run compile", "version": "npm run write-version", - "publish": "npm run reset-version" + "publish": "npm run reset-version", + "compile": "shx rm -rf lib/ && tsc", + "test": "npm run compile && mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "engines": { - "node": ">= 10" + "node": ">= 12" }, "publishConfig": { "access": "public" }, "dependencies": { - "@feathersjs/commons": "^4.5.11", + "@feathersjs/commons": "^5.0.0-pre.1", + "@feathersjs/hooks": "^0.6.1", "debug": "^4.3.1", "events": "^3.2.0", "uberproto": "^2.0.6" }, "devDependencies": { - "mocha": "^8.2.1" + "@types/mocha": "^8.0.4", + "@types/node": "^14.14.10", + "mocha": "^8.2.1", + "shx": "^0.3.3", + "ts-node": "^9.1.0", + "typescript": "^4.1.2" }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/feathers/lib/application.js b/packages/feathers/src/application.ts similarity index 83% rename from packages/feathers/lib/application.js rename to packages/feathers/src/application.ts index 92e89cf166..666a59f3ec 100644 --- a/packages/feathers/lib/application.js +++ b/packages/feathers/src/application.ts @@ -1,16 +1,26 @@ -const debug = require('debug')('feathers:application'); -const { stripSlashes } = require('@feathersjs/commons'); +import Debug from 'debug'; +import { stripSlashes } from '@feathersjs/commons'; -const Uberproto = require('uberproto'); -const events = require('./events'); -const hooks = require('./hooks'); -const version = require('./version'); +// @ts-ignore +import Uberproto from 'uberproto'; +import events from './events'; +import hooks from './hooks'; +import version from './version'; +import { BaseApplication, Service } from './declarations'; + +const debug = Debug('feathers:application'); const Proto = Uberproto.extend({ create: null }); -const application = { +interface AppExtensions { + _isSetup: boolean; + init (): void; + services: { [key: string]: Service }; +} + +export default { init () { Object.assign(this, { version, @@ -61,11 +71,7 @@ const application = { return this; }, - service (path, service) { - if (typeof service !== 'undefined') { - throw new Error('Registering a new service with `app.service(path, service)` is no longer supported. Use `app.use(path, service)` instead.'); - } - + service (path: string) { const location = stripSlashes(path) || '/'; const current = this.services[location]; @@ -77,14 +83,14 @@ const application = { return current; }, - use (path, service, options = {}) { + use (path, service, options: any = {}) { if (typeof path !== 'string') { throw new Error(`'${path}' is not a valid service path.`); } const location = stripSlashes(path) || '/'; const isSubApp = typeof service.service === 'function' && service.services; - const isService = this.methods.concat('setup').some(name => typeof service[name] === 'function'); + const isService = this.methods.concat('setup').some(name => typeof (service as any)[name] === 'function'); if (isSubApp) { const subApp = service; @@ -144,6 +150,4 @@ const application = { return this; } -}; - -module.exports = application; +} as BaseApplication & AppExtensions; diff --git a/packages/feathers/src/declarations.ts b/packages/feathers/src/declarations.ts new file mode 100644 index 0000000000..637db0b9c8 --- /dev/null +++ b/packages/feathers/src/declarations.ts @@ -0,0 +1,210 @@ +import { EventEmitter } from 'events'; +import { NextFunction } from '@feathersjs/hooks'; + +export type Id = number | string; +export type NullableId = Id | null; + +export interface Query { + [key: string]: any; +} + +export interface AppSettings { + [key: string]: any; +} + +export interface Params { + query?: Query; + provider?: string; + route?: { [key: string]: string }; + headers?: { [key: string]: any }; + + [key: string]: any; // (JL) not sure if we want this +} + +export interface BaseApplication { + version: string; + + mixins: ServiceMixin[]; + + methods: string[]; + + settings: AppSettings; + + providers: any[]; + + defaultService: any; + + eventMappings: { [key: string]: string }; + + get (name: string): any; + + set (name: string, value: any): this; + + disable (name: string): this; + + disabled (name: string): boolean; + + enable (name: string): this; + + enabled (name: string): boolean; + + configure (callback: (this: this, app: this) => void): this; + + hooks (hooks: Partial): this; + + setup (server?: any): this; + + service (location: string): Service; + + use (path: string, service: Partial & SetupMethod> | Application, options?: any): this; + + listen (port: number): any; +} + +export interface Application extends EventEmitter, BaseApplication { + services: keyof ServiceTypes extends never ? any : ServiceTypes; + + service (location: L): ServiceTypes[L]; + + service (location: string): keyof ServiceTypes extends never ? any : never; +} + +// tslint:disable-next-line void-return +export type Hook> = (hook: HookContext, next?: NextFunction) => (Promise | void> | HookContext | void); + +export interface HookContext> { + /** + * A read only property that contains the Feathers application object. This can be used to + * retrieve other services (via context.app.service('name')) or configuration values. + */ + readonly app: Application; + /** + * A writeable property containing the data of a create, update and patch service + * method call. + */ + data?: T; + /** + * A writeable property with the error object that was thrown in a failed method call. + * It is only available in error hooks. + */ + error?: any; + /** + * A writeable property and the id for a get, remove, update and patch service + * method call. For remove, update and patch context.id can also be null when + * modifying multiple entries. In all other cases it will be undefined. + */ + id?: string | number; + /** + * A read only property with the name of the service method (one of find, get, + * create, update, patch, remove). + */ + readonly method: 'find' | 'get' | 'create' | 'update' | 'patch' | 'remove'; + /** + * A writeable property that contains the service method parameters (including + * params.query). + */ + params: Params; + /** + * A read only property and contains the service name (or path) without leading or + * trailing slashes. + */ + readonly path: string; + /** + * A writeable property containing the result of the successful service method call. + * It is only available in after hooks. + * + * `context.result` can also be set in + * + * - A before hook to skip the actual service method (database) call + * - An error hook to swallow the error and return a result instead + */ + result?: T; + /** + * A read only property and contains the service this hook currently runs on. + */ + readonly service: S; + /** + * A writeable, optional property and contains a 'safe' version of the data that + * should be sent to any client. If context.dispatch has not been set context.result + * will be sent to the client instead. + */ + dispatch?: T; + /** + * A writeable, optional property that allows to override the standard HTTP status + * code that should be returned. + */ + statusCode?: number; + /** + * A read only property with the hook type (one of before, after or error). + */ + readonly type: 'before' | 'after' | 'error'; + event?: string; + arguments: any[]; +} + +export interface HookMap { + all: Hook | Hook[]; + find: Hook | Hook[]; + get: Hook | Hook[]; + create: Hook | Hook[]; + update: Hook | Hook[]; + patch: Hook | Hook[]; + remove: Hook | Hook[]; +} + +export interface HooksObject { + before: Partial> | Hook | Hook[]; + after: Partial> | Hook | Hook[]; + error: Partial> | Hook | Hook[]; + async?: Partial> | Hook | Hook[]; + finally?: Partial> | Hook | Hook[]; +} + +export interface ServiceMethods { + [key: string]: any; + + find (params?: Params): Promise; + + get (id: Id, params?: Params): Promise; + + create (data: Partial | Partial[], 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; +} + +export interface SetupMethod { + setup (app: Application, path: string): void; +} + +export interface ServiceOverloads { + create? (data: Partial, params?: Params): Promise; + + create? (data: Partial[], params?: Params): Promise; + + update? (id: Id, data: T, params?: Params): Promise; + + update? (id: null, data: T, params?: Params): Promise; + + patch? (id: Id, data: Partial, params?: Params): Promise; + + patch? (id: null, data: Partial, params?: Params): Promise; + + remove? (id: Id, params?: Params): Promise; + + remove? (id: null, params?: Params): Promise; +} + +export interface ServiceAddons extends EventEmitter { + id?: any; + _serviceEvents: string[]; + methods: { [method: string]: string[] }; + hooks (hooks: Partial>): this; +} + +export type Service = ServiceOverloads & ServiceAddons & ServiceMethods; + +export type ServiceMixin = (service: Service, path: string, options?: any) => void; diff --git a/packages/feathers/lib/events.js b/packages/feathers/src/events.ts similarity index 77% rename from packages/feathers/lib/events.js rename to packages/feathers/src/events.ts index 96e9e75b3c..0670edaccb 100644 --- a/packages/feathers/lib/events.js +++ b/packages/feathers/src/events.ts @@ -1,25 +1,28 @@ -const { EventEmitter } = require('events'); -const Proto = require('uberproto'); +// @ts-ignore +import Proto from 'uberproto'; +import { EventEmitter } from 'events'; +import { HookContext, Service, Application } from './declarations'; // Returns a hook that emits service events. Should always be // used as the very last hook in the chain -const eventHook = exports.eventHook = function eventHook () { - return function (hook) { - const { app, service } = hook; - const eventName = hook.event === null ? hook.event : app.eventMappings[hook.method]; +export function eventHook () { + return function (ctx: HookContext) { + const { app, service, method, event, type, result } = ctx; + + const eventName = event === null ? event : (app as any).eventMappings[method]; const isHookEvent = service._hookEvents && service._hookEvents.indexOf(eventName) !== -1; // If this event is not being sent yet and we are not in an error hook - if (eventName && isHookEvent && hook.type !== 'error') { - const results = Array.isArray(hook.result) ? hook.result : [ hook.result ]; + if (eventName && isHookEvent && type !== 'error') { + const results = Array.isArray(result) ? result : [ result ]; - results.forEach(element => service.emit(eventName, element, hook)); + results.forEach(element => service.emit(eventName, element, ctx)); } }; -}; +} // Mixin that turns a service into a Node event emitter -const eventMixin = exports.eventMixin = function eventMixin (service) { +export function eventMixin (this: Application, service: Service) { if (service._serviceEvents) { return; } @@ -59,10 +62,10 @@ const eventMixin = exports.eventMixin = function eventMixin (service) { service._hookEvents.push(event); } }); -}; +} -module.exports = function () { - return function (app) { +export default function () { + return function (app: any) { // Mappings from service method to event name Object.assign(app, { eventMappings: { @@ -82,4 +85,4 @@ module.exports = function () { app.mixins.push(eventMixin); }; -}; +} diff --git a/packages/feathers/lib/hooks/base.js b/packages/feathers/src/hooks/base.ts similarity index 66% rename from packages/feathers/lib/hooks/base.js rename to packages/feathers/src/hooks/base.ts index bde4fea210..ff8c23cfef 100644 --- a/packages/feathers/lib/hooks/base.js +++ b/packages/feathers/src/hooks/base.ts @@ -1,21 +1,22 @@ -const { _ } = require('@feathersjs/commons'); +import { _ } from '@feathersjs/commons'; +import { HookContext } from '../declarations'; -const assignArguments = context => { +export const assignArguments = (context: HookContext, next: any) => { const { service, method } = context; const parameters = service.methods[method]; context.arguments.forEach((value, index) => { - context[parameters[index]] = value; + (context as any)[parameters[index]] = value; }); if (!context.params) { context.params = {}; } - return context; + return next(); }; -const validate = context => { +export const validate = (context: HookContext, next: any) => { const { service, method, path } = context; const parameters = service.methods[method]; @@ -27,7 +28,5 @@ const validate = context => { throw new Error(`A data object must be provided to the '${path}.${method}' method`); } - return context; + return next(); }; - -module.exports = [ assignArguments, validate ]; diff --git a/packages/commons/src/hooks.ts b/packages/feathers/src/hooks/commons.ts similarity index 56% rename from packages/commons/src/hooks.ts rename to packages/feathers/src/hooks/commons.ts index 9852c01422..f7a6bbf662 100644 --- a/packages/commons/src/hooks.ts +++ b/packages/feathers/src/hooks/commons.ts @@ -1,6 +1,8 @@ -import { createSymbol, _ } from './utils'; +import { HookContext } from '@feathersjs/hooks'; +import { createSymbol, _ } from '@feathersjs/commons'; -const { each, pick } = _; +const { each, pick, omit } = _; +const noop = () => {}; export const ACTIVATE_HOOKS = createSymbol('__feathersActivateHooks'); @@ -87,15 +89,19 @@ export function convertHookData (obj: any) { // Duck-checks a given object to be a hook object // A valid hook object has `type` and `method` export function isHookObject (hookObject: any) { - return typeof hookObject === 'object' && - typeof hookObject.method === 'string' && - typeof hookObject.type === 'string'; + return ( + hookObject instanceof HookContext || ( + typeof hookObject === 'object' && + typeof hookObject.method === 'string' && + typeof hookObject.type === 'string' + ) + ); } // Returns all service and application hooks combined // for a given method and type `appLast` sets if the hooks // from `app` should be added last (or first by default) -export function getHooks (app: any, service: any, type: string, method: string, appLast: boolean = false) { +export function getHooks (app: any, service: any, type: string, method: string, appLast = false) { const appHooks = app.__hooks[type][method] || []; const serviceHooks = service.__hooks[type][method] || []; @@ -193,3 +199,138 @@ export function enableHooks (obj: any, methods: string[], types: string[]) { } }); } + +function handleError (hook: any, context: any, onError: any) { + try { + return Promise.resolve(hook.call(context.self, context)) + .catch((error: any) => { + if (typeof onError === 'function') { + onError(error, context); + } + throw error; + }) + .then((result: any) => { + Object.assign(context, omit(result, 'arguments', 'path')); + + if (typeof context.error !== 'undefined') { + throw context.error; + } + + return result; + }); + } catch(errorError: any) { + if (typeof onError === 'function') { + onError(errorError, context); + } + throw errorError; + } +} + +export function firstHook (context: any, next: any) { + context.type = 'before'; + return next(); +} + +export function lastHook (context: any, next: any) { + context.type = 'after'; + return next(); +} + +export function toBeforeHook (hook: any) { + return (context: any, next: any) => { + return Promise.resolve(hook.call(context.self, context)) + .then((result: any) => Object.assign(context, omit(result, 'arguments', 'path'))) + .then(() => next()); + }; +} + +export function toAfterHook (hook: any) { + return (context: any, next: any) => { + return next() + .then(() => hook.call(context.self, context)) + .then((result: any) => Object.assign(context, omit(result, 'arguments', 'path'))); + } +} + +export function toErrorHook (hook: any, onError: any, control: any) { + return (context: any, next: any) => { + return next() + .catch((error: any) => { + if (typeof control === 'function') { + control(context); + } + + context.error = error; + context.result = undefined; + + return handleError(hook, context, onError); + }); + }; +} + +export function toFinallyHook (hook: any, onError: any, control: any) { + return (context: any, next: any) => { + return next() + .finally(() => { + if (typeof control === 'function') { + control(context); + } + + return handleError(hook, context, onError); + }) + }; +} + +export function beforeWrapper (hooks: any) { + return [firstHook, ...[].concat(hooks).map(toBeforeHook)]; +} + +export function afterWrapper (hooks: any) { + return [...[].concat(hooks).reverse().map(toAfterHook), lastHook]; +} + +export function finallyWrapper (hooks: any) { + let errorInFinally: any; + + const onError = (error: any, context: any) => { + errorInFinally = error; + context.error = error; + context.result = undefined; + }; + const control = () => { + if (errorInFinally) { + throw errorInFinally; + } + }; + + return [].concat(hooks).reverse().map(hook => toFinallyHook(hook, onError, control)); +} + +export function errorWrapper (hooks: any) { + let errorInError: any; + + const onError = (error: any, context: any) => { + errorInError = error; + context.error = error; + context.result = undefined; + }; + const control = (context: any) => { + if (!context.original) { + context.original = { ...context }; + } + if (errorInError) { + throw errorInError; + } + context.type = 'error'; + }; + + return [noop].concat(hooks).reverse().map(hook => toErrorHook(hook, onError, control)); +} + +export function wrap ({ async = [], before = [], after = [] }: any = {}) { + return [ + ...[].concat(async), + ...beforeWrapper(before), + ...afterWrapper(after) + ]; +} diff --git a/packages/feathers/src/hooks/index.ts b/packages/feathers/src/hooks/index.ts new file mode 100644 index 0000000000..fd361a8887 --- /dev/null +++ b/packages/feathers/src/hooks/index.ts @@ -0,0 +1,177 @@ +import * as hookCommons from './commons'; +import { + hooks as hooksDecorator, + HookManager, + HookContext, + HookMap, + Middleware, + middleware +} from '@feathersjs/hooks'; +import { assignArguments, validate } from './base'; +import { Application, Service } from '../declarations'; +const baseHooks = [ assignArguments, validate ]; +const { + getHooks, + enableHooks, + ACTIVATE_HOOKS, + finallyWrapper, + errorWrapper, + wrap +} = hookCommons; + +function getMiddlewareOptions (app: Application, service: Service, method: string) { + const params: string[] = service.methods[method]; + const defaults = params.find(v => v === 'params') ? { params: {} } : null; + + return { + params, + defaults, + props: { + app, + service, + type: 'before', + get path () { + if (!service || !app || !app.services) { + return null; + } + + return Object.keys(app.services) + .find(path => app.services[path] === service); + } + } + }; +} + +function getCollector (app: Application, service: Service, method: string) { + return function (this: HookManager): Middleware[] { + const previous = this._parent && this._parent.getMiddleware(); + let result; + + if (previous && this._middleware) { + result = previous.concat(this._middleware); + } else { + result = previous || this._middleware || []; + } + + const hooks = { + async: getHooks(app, service, 'async', method), + before: getHooks(app, service, 'before', method), + after: getHooks(app, service, 'after', method, true), + error: getHooks(app, service, 'error', method, true), + finally: getHooks(app, service, 'finally', method, true) + }; + + return [ + ...finallyWrapper(hooks.finally), + ...errorWrapper(hooks.error), + ...baseHooks, + ...result, + ...wrap(hooks) + ]; + }; +} + +function withHooks (app: Application, service: Service, methods: string[]) { + const hookMap = methods.reduce((accu, method) => { + if (typeof service[method] !== 'function') { + return accu; + } + + const hookManager = middleware([], getMiddlewareOptions(app, service, method)); + + hookManager.getMiddleware = getCollector(app, service, method); + + accu[method] = hookManager; + + return accu; + }, {} as HookMap); + + hooksDecorator(service, hookMap); +} + +function mixinMethod (this: any) { + const service = this; + const args = Array.from(arguments); + + const returnHook = args[args.length - 1] === true || args[args.length - 1] instanceof HookContext + ? args.pop() : false; + + const hookContext = returnHook instanceof HookContext ? returnHook : this._super.createContext(); + + return this._super.call(service, ...args, hookContext) + .then(() => returnHook ? hookContext : hookContext.result) + // Handle errors + .catch(() => { + if (typeof hookContext.error !== 'undefined' && typeof hookContext.result === 'undefined') { + return Promise.reject(returnHook ? hookContext : hookContext.error); + } else { + return returnHook ? hookContext : hookContext.result; + } + }); +} + +// A service mixin that adds `service.hooks()` method and functionality +const hookMixin = exports.hookMixin = function hookMixin (service: any) { + if (typeof service.hooks === 'function') { + return; + } + + service.methods = Object.getOwnPropertyNames(service) + .filter(key => typeof service[key] === 'function' && service[key][ACTIVATE_HOOKS]) + .reduce((result, methodName) => { + result[methodName] = service[methodName][ACTIVATE_HOOKS]; + return result; + }, service.methods || {}); + + Object.assign(service.methods, { + find: ['params'], + get: ['id', 'params'], + create: ['data', 'params'], + update: ['id', 'data', 'params'], + patch: ['id', 'data', 'params'], + remove: ['id', 'params'] + }); + + const app = this; + const methodNames = Object.keys(service.methods); + + withHooks(app, service, methodNames); + + // Usefull only for the `returnHook` backwards compatibility with `true` + const mixin = methodNames.reduce((mixin, method) => { + if (typeof service[method] !== 'function') { + return mixin; + } + + mixin[method] = mixinMethod; + + return mixin; + }, {} as any); + + // Add .hooks method and properties to the service + enableHooks(service, methodNames, app.hookTypes); + + service.mixin(mixin); +}; + +export default function () { + return function (app: any) { + // We store a reference of all supported hook types on the app + // in case someone needs it + Object.assign(app, { + hookTypes: ['async', 'before', 'after', 'error', 'finally'] + }); + + // Add functionality for hooks to be registered as app.hooks + enableHooks(app, app.methods, app.hookTypes); + + app.mixins.push(hookMixin); + }; +} + +export function activateHooks (args: any[]) { + return (fn: any) => { + Object.defineProperty(fn, ACTIVATE_HOOKS, { value: args }); + return fn; + }; +} diff --git a/packages/feathers/src/index.ts b/packages/feathers/src/index.ts new file mode 100644 index 0000000000..c765ecab28 --- /dev/null +++ b/packages/feathers/src/index.ts @@ -0,0 +1,26 @@ +// @ts-ignore +import Proto from 'uberproto'; +import Application from './application'; +import version from './version'; +import { Application as ApplicationType } from './declarations' + +const baseObject = Object.create(null); + +export default function feathers (): ApplicationType { + const app = Object.create(baseObject); + + // Mix in the base application + Proto.mixin(Application, app); + + app.init(); + + return app; +} + +export { version }; +export * from './declarations'; +export * from './hooks/index'; + +if (typeof module !== 'undefined') { + module.exports = Object.assign(feathers, module.exports); +} diff --git a/packages/feathers/src/version.ts b/packages/feathers/src/version.ts new file mode 100644 index 0000000000..a54d824540 --- /dev/null +++ b/packages/feathers/src/version.ts @@ -0,0 +1 @@ +export default 'development'; diff --git a/packages/feathers/test/application.test.js b/packages/feathers/test/application.test.ts similarity index 74% rename from packages/feathers/test/application.test.js rename to packages/feathers/test/application.test.ts index 36588863e1..e565afd3b7 100644 --- a/packages/feathers/test/application.test.js +++ b/packages/feathers/test/application.test.ts @@ -1,12 +1,10 @@ -const assert = require('assert'); -const Proto = require('uberproto'); -const feathers = require('../lib'); +// @ts-ignore +import Proto from 'uberproto'; +import assert from 'assert'; +import feathers, { Id, version } from '../src' +import { HookContext } from '@feathersjs/hooks'; describe('Feathers application', () => { - it('adds an ES module `default` export', () => { - assert.strictEqual(feathers, feathers.default); - }); - it('initializes', () => { const app = feathers(); @@ -18,7 +16,7 @@ describe('Feathers application', () => { it('sets the version on main and app instance', () => { const app = feathers(); - assert.ok(feathers.version > '4.0.0'); + assert.ok(version > '4.0.0'); assert.ok(app.version > '4.0.0'); }); @@ -26,7 +24,7 @@ describe('Feathers application', () => { const app = feathers(); const original = { hello: 'world' }; - app.on('test', data => { + app.on('test', (data: any) => { assert.deepStrictEqual(original, data); done(); }); @@ -38,6 +36,7 @@ describe('Feathers application', () => { const app = feathers(); try { + // @ts-ignore app.service('/test', {}); } catch (e) { assert.strictEqual(e.message, 'Registering a new service with `app.service(path, service)` is no longer supported. Use `app.use(path, service)` instead.'); @@ -49,10 +48,10 @@ describe('Feathers application', () => { assert.ok(!app.service('/todos/')); - app.defaultService = function (path) { + app.defaultService = function (path: string) { assert.strictEqual(path, 'todos'); return { - get (id) { + get (id: string) { return Promise.resolve({ id, description: `You have to do ${id}!` }); @@ -60,7 +59,7 @@ describe('Feathers application', () => { }; }; - return app.service('/todos/').get('dishes').then(data => { + return app.service('/todos/').get('dishes').then((data: any) => { assert.deepStrictEqual(data, { id: 'dishes', description: 'You have to do dishes!' @@ -69,7 +68,7 @@ describe('Feathers application', () => { }); it('additionally passes `app` as .configure parameter (#558)', done => { - feathers().configure(function (app) { + feathers().configure(function (this: any, app: any) { assert.strictEqual(this, app); done(); }); @@ -82,13 +81,14 @@ describe('Feathers application', () => { try { app.use(null, {}); } catch (e) { - assert.strictEqual(e.message, `'null' is not a valid service path.`); + assert.strictEqual(e.message, '\'null\' is not a valid service path.'); } try { + // @ts-ignore app.use({}, {}); } catch (e) { - assert.strictEqual(e.message, `'[object Object]' is not a valid service path.`); + assert.strictEqual(e.message, '\'[object Object]\' is not a valid service path.'); } }); @@ -105,11 +105,11 @@ describe('Feathers application', () => { it('registers and wraps a new service', () => { const dummyService = { - setup (app, path) { + setup (this: any, _app: any, path: string) { this.path = path; }, - create (data) { + create (data: any) { return Promise.resolve(data); } }; @@ -121,18 +121,18 @@ describe('Feathers application', () => { return wrappedService.create({ message: 'Test message' - }).then(data => assert.strictEqual(data.message, 'Test message')); + }).then((data: any) => assert.strictEqual(data.message, 'Test message')); }); it('can use a root level service', () => { const app = feathers().use('/', { - get (id) { + get (id: string) { return Promise.resolve({ id }); } }); return app.service('/').get('test') - .then(result => assert.deepStrictEqual(result, { id: 'test' })); + .then((result: any) => assert.deepStrictEqual(result, { id: 'test' })); }); it('services can be re-used (#566)', done => { @@ -140,7 +140,7 @@ describe('Feathers application', () => { const app2 = feathers(); app2.use('/dummy', { - create (data) { + create (data: any) { return Promise.resolve(data); } }); @@ -149,13 +149,13 @@ describe('Feathers application', () => { dummy.hooks({ before: { - create (hook) { + create (hook: HookContext) { hook.data.fromHook = true; } } }); - dummy.on('created', data => { + dummy.on('created', (data: any) => { assert.deepStrictEqual(data, { message: 'Hi', fromHook: true @@ -168,16 +168,46 @@ describe('Feathers application', () => { app1.service('testing').create({ message: 'Hi' }); }); + it('async hooks', done => { + const app = feathers(); + + app.use('/dummy', { + create (data: any) { + return Promise.resolve(data); + } + }); + + const dummy = app.service('dummy'); + + dummy.hooks({ + async: async (ctx: any, next: any) => { + await next(); + ctx.params.fromAsyncHook = true; + }, + before: { + create (hook: any) { + hook.params.fromAsyncHook = false; + } + } + }); + + dummy.create({ message: 'Hi' }, {}, true) + .then((ctx: any) => { + assert.ok(ctx.params.fromAsyncHook); + }) + .then(done, done); + }); + it('services conserve Symbols', () => { const TEST = Symbol('test'); const dummyService = { [TEST]: true, - setup (app, path) { + setup (this: any, _app: any, path: string) { this.path = path; }, - create (data) { + create (data: any) { return Promise.resolve(data); } }; @@ -191,16 +221,16 @@ describe('Feathers application', () => { it('methods conserve Symbols', () => { const TEST = Symbol('test'); const dummyService = { - setup (app, path) { + setup (this: any, _app: any, path: string) { this.path = path; }, - create (data) { + create (data: any) { return Promise.resolve(data); } }; - dummyService.create[TEST] = true; + (dummyService.create as any)[TEST] = true; const app = feathers().use('/dummy', dummyService); const wrappedService = app.service('dummy'); @@ -213,30 +243,30 @@ describe('Feathers application', () => { describe('Express app options compatibility', function () { describe('.set()', () => { it('should set a value', () => { - var app = feathers(); + const app = feathers(); app.set('foo', 'bar'); assert.strictEqual(app.get('foo'), 'bar'); }); it('should return the app', () => { - var app = feathers(); + const app = feathers(); assert.strictEqual(app.set('foo', 'bar'), app); }); it('should return the app when undefined', () => { - var app = feathers(); + const app = feathers(); assert.strictEqual(app.set('foo', undefined), app); }); }); describe('.get()', () => { it('should return undefined when unset', () => { - var app = feathers(); + const app = feathers(); assert.strictEqual(app.get('foo'), undefined); }); it('should otherwise return the value', () => { - var app = feathers(); + const app = feathers(); app.set('foo', 'bar'); assert.strictEqual(app.get('foo'), 'bar'); }); @@ -244,7 +274,7 @@ describe('Feathers application', () => { describe('.enable()', () => { it('should set the value to true', () => { - var app = feathers(); + const app = feathers(); assert.strictEqual(app.enable('tobi'), app); assert.strictEqual(app.get('tobi'), true); }); @@ -252,7 +282,7 @@ describe('Feathers application', () => { describe('.disable()', () => { it('should set the value to false', () => { - var app = feathers(); + const app = feathers(); assert.strictEqual(app.disable('tobi'), app); assert.strictEqual(app.get('tobi'), false); }); @@ -260,12 +290,12 @@ describe('Feathers application', () => { describe('.enabled()', () => { it('should default to false', () => { - var app = feathers(); + const app = feathers(); assert.strictEqual(app.enabled('foo'), false); }); it('should return true when set', () => { - var app = feathers(); + const app = feathers(); app.set('foo', 'bar'); assert.strictEqual(app.enabled('foo'), true); }); @@ -273,12 +303,12 @@ describe('Feathers application', () => { describe('.disabled()', () => { it('should default to true', () => { - var app = feathers(); + const app = feathers(); assert.strictEqual(app.disabled('foo'), true); }); it('should return false when set', () => { - var app = feathers(); + const app = feathers(); app.set('foo', 'bar'); assert.strictEqual(app.disabled('foo'), false); }); @@ -291,7 +321,7 @@ describe('Feathers application', () => { let setupCount = 0; app.use('/dummy', { - setup (appRef, path) { + setup (appRef: any, path: any) { setupCount++; assert.strictEqual(appRef, app); assert.strictEqual(path, 'dummy'); @@ -299,13 +329,13 @@ describe('Feathers application', () => { }); app.use('/simple', { - get (id) { + get (id: string) { return Promise.resolve({ id }); } }); app.use('/dummy2', { - setup (appRef, path) { + setup (appRef: any, path: any) { setupCount++; assert.strictEqual(appRef, app); assert.strictEqual(path, 'dummy2'); @@ -314,7 +344,7 @@ describe('Feathers application', () => { app.setup(); - assert.ok(app._isSetup); + assert.ok((app as any)._isSetup); assert.strictEqual(setupCount, 2); }); @@ -324,8 +354,8 @@ describe('Feathers application', () => { app.setup(); app.use('/dummy', { - setup (appRef, path) { - assert.ok(app._isSetup); + setup (appRef: any, path: any) { + assert.ok((app as any)._isSetup); assert.strictEqual(appRef, app); assert.strictEqual(path, 'dummy'); } @@ -337,8 +367,10 @@ describe('Feathers application', () => { let _setup = false; app.use('/dummy', { - get () {}, - _setup (appRef, path) { + async get (id: Id) { + return { id }; + }, + _setup (appRef: any, path: any) { _setup = true; assert.strictEqual(appRef, app); assert.strictEqual(path, 'dummy'); @@ -354,7 +386,7 @@ describe('Feathers application', () => { const app = feathers(); let providerRan = false; - app.providers.push(function (service, location, options) { + app.providers.push(function (service: any, location: any, options: any) { assert.ok(service.dummy); assert.strictEqual(location, 'dummy'); assert.deepStrictEqual(options, {}); @@ -363,7 +395,9 @@ describe('Feathers application', () => { app.use('/dummy', { dummy: true, - get () {} + async get (id: Id) { + return { id }; + } }); assert.ok(providerRan); @@ -377,7 +411,7 @@ describe('Feathers application', () => { let providerRan = false; - app.providers.push(function (service, location, options) { + app.providers.push(function (service: any, location: any, options: any) { assert.ok(service.dummy); assert.strictEqual(location, 'dummy'); assert.deepStrictEqual(options, opts); @@ -386,7 +420,9 @@ describe('Feathers application', () => { app.use('/dummy', { dummy: true, - get () {} + async get (id: Id) { + return { id }; + } }, opts); assert.ok(providerRan); @@ -401,31 +437,31 @@ describe('Feathers application', () => { const subApp = feathers(); subApp.use('/service1', { - get (id) { + get (id: string) { return Promise.resolve({ id, name: 'service1' }); } }).use('/service2', { - get (id) { + get (id: string) { return Promise.resolve({ id, name: 'service2' }); }, - create (data) { + create (data: any) { return Promise.resolve(data); } }); app.use('/api/', subApp); - app.service('/api/service2').once('created', data => { + app.service('/api/service2').once('created', (data: any) => { assert.deepStrictEqual(data, { message: 'This is a test' }); - subApp.service('service2').once('created', data => { + subApp.service('service2').once('created', (data: any) => { assert.deepStrictEqual(data, { message: 'This is another test' }); @@ -438,11 +474,11 @@ describe('Feathers application', () => { }); }); - app.service('/api/service1').get(10).then(data => { + app.service('/api/service1').get(10).then((data: any) => { assert.strictEqual(data.name, 'service1'); return app.service('/api/service2').get(1); - }).then(data => { + }).then((data: any) => { assert.strictEqual(data.name, 'service2'); return subApp.service('service2').create({ diff --git a/packages/feathers/test/events.test.js b/packages/feathers/test/events.test.ts similarity index 77% rename from packages/feathers/test/events.test.js rename to packages/feathers/test/events.test.ts index 652529a1de..c02514d42a 100644 --- a/packages/feathers/test/events.test.js +++ b/packages/feathers/test/events.test.ts @@ -1,7 +1,7 @@ -const assert = require('assert'); -const { EventEmitter } = require('events'); +import assert from 'assert'; +import { EventEmitter } from 'events'; -const feathers = require('../lib'); +import feathers from '../src'; describe('Service events', () => { it('app is an event emitter', done => { @@ -9,7 +9,7 @@ describe('Service events', () => { assert.strictEqual(typeof app.on, 'function'); - app.on('test', data => { + app.on('test', (data: any) => { assert.deepStrictEqual(data, { message: 'app' }); done(); }); @@ -18,13 +18,13 @@ describe('Service events', () => { it('works with service that is already an EventEmitter', done => { const app = feathers(); - const service = new EventEmitter(); + const service: any = new EventEmitter(); - service.create = function (data) { + service.create = function (data: any) { return Promise.resolve(data); }; - service.on('created', data => { + service.on('created', (data: any) => { assert.deepStrictEqual(data, { message: 'testing' }); @@ -41,14 +41,14 @@ describe('Service events', () => { describe('emits event data on a service', () => { it('.create and created', done => { const app = feathers().use('/creator', { - create (data) { + create (data: any) { return Promise.resolve(data); } }); const service = app.service('creator'); - service.on('created', data => { + service.on('created', (data: any) => { assert.deepStrictEqual(data, { message: 'Hello' }); done(); }); @@ -58,7 +58,7 @@ describe('Service events', () => { it('allows to skip event emitting', done => { const app = feathers().use('/creator', { - create (data) { + create (data: any) { return Promise.resolve(data); } }); @@ -67,7 +67,7 @@ describe('Service events', () => { service.hooks({ before: { - create (context) { + create (context: any) { context.event = null; return context; @@ -75,7 +75,7 @@ describe('Service events', () => { } }); - service.on('created', data => { + service.on('created', () => { done(new Error('Should never get here')); }); @@ -84,14 +84,14 @@ describe('Service events', () => { it('.update and updated', done => { const app = feathers().use('/creator', { - update (id, data) { + update (id: any, data: any) { return Promise.resolve(Object.assign({ id }, data)); } }); const service = app.service('creator'); - service.on('updated', data => { + service.on('updated', (data: any) => { assert.deepStrictEqual(data, { id: 10, message: 'Hello' }); done(); }); @@ -101,14 +101,14 @@ describe('Service events', () => { it('.patch and patched', done => { const app = feathers().use('/creator', { - patch (id, data) { + patch (id: any, data: any) { return Promise.resolve(Object.assign({ id }, data)); } }); const service = app.service('creator'); - service.on('patched', data => { + service.on('patched', (data: any) => { assert.deepStrictEqual(data, { id: 12, message: 'Hello' }); done(); }); @@ -118,14 +118,14 @@ describe('Service events', () => { it('.remove and removed', done => { const app = feathers().use('/creator', { - remove (id) { + remove (id: any) { return Promise.resolve({ id }); } }); const service = app.service('creator'); - service.on('removed', data => { + service.on('removed', (data: any) => { assert.deepStrictEqual(data, { id: 22 }); done(); }); @@ -137,9 +137,11 @@ describe('Service events', () => { describe('emits event data arrays on a service', () => { it('.create and created with array', done => { const app = feathers().use('/creator', { - create (data) { + create (data: any) { if (Array.isArray(data)) { - return Promise.all(data.map(current => this.create(current))); + return Promise.all(data.map(current => + (this as any).create(current)) + ); } return Promise.resolve(data); @@ -153,8 +155,8 @@ describe('Service events', () => { ]; Promise.all(createItems.map((element, index) => { - return new Promise((resolve, reject) => { - service.on('created', data => { + return new Promise((resolve) => { + service.on('created', (data: any) => { if (data.message === element.message) { assert.deepStrictEqual(data, { message: `Hello ${index}` }); resolve(); @@ -168,9 +170,11 @@ describe('Service events', () => { it('.update and updated with array', done => { const app = feathers().use('/creator', { - update (id, data) { + update (id: any, data: any) { if (Array.isArray(data)) { - return Promise.all(data.map((current, index) => this.update(index, current))); + return Promise.all(data.map((current, index) => + (this as any).update(index, current)) + ); } return Promise.resolve(Object.assign({ id }, data)); } @@ -183,8 +187,8 @@ describe('Service events', () => { ]; Promise.all(updateItems.map((element, index) => { - return new Promise((resolve, reject) => { - service.on('updated', data => { + return new Promise((resolve) => { + service.on('updated', (data: any) => { if (data.message === element.message) { assert.deepStrictEqual(data, { id: index, message: `Hello ${index}` }); resolve(); @@ -198,9 +202,11 @@ describe('Service events', () => { it('.patch and patched with array', done => { const app = feathers().use('/creator', { - patch (id, data) { + patch (id: any, data: any) { if (Array.isArray(data)) { - return Promise.all(data.map((current, index) => this.patch(index, current))); + return Promise.all(data.map((current, index) => + (this as any).patch(index, current)) + ); } return Promise.resolve(Object.assign({ id }, data)); } @@ -213,8 +219,8 @@ describe('Service events', () => { ]; Promise.all(patchItems.map((element, index) => { - return new Promise((resolve, reject) => { - service.on('patched', data => { + return new Promise((resolve) => { + service.on('patched', (data: any) => { if (data.message === element.message) { assert.deepStrictEqual(data, { id: index, message: `Hello ${index}` }); resolve(); @@ -228,9 +234,11 @@ describe('Service events', () => { it('.remove and removed with array', done => { const app = feathers().use('/creator', { - remove (id, data) { + remove (id: any, data: any) { if (Array.isArray(data)) { - return Promise.all(data.map((current, index) => this.remove(index, current))); + return Promise.all(data.map((current, index) => + (this as any).remove(index, current)) + ); } return Promise.resolve(Object.assign({ id }, data)); } @@ -243,8 +251,8 @@ describe('Service events', () => { ]; Promise.all(removeItems.map((element, index) => { - return new Promise((resolve, reject) => { - service.on('removed', data => { + return new Promise((resolve) => { + service.on('removed', (data: any) => { if (data.message === element.message) { assert.deepStrictEqual(data, { id: index, message: `Hello ${index}` }); resolve(); @@ -260,7 +268,7 @@ describe('Service events', () => { describe('event format', () => { it('also emits the actual hook object', done => { const app = feathers().use('/creator', { - create (data) { + create (data: any) { return Promise.resolve(data); } }); @@ -268,12 +276,12 @@ describe('Service events', () => { const service = app.service('creator'); service.hooks({ - after (hook) { + after (hook: any) { hook.changed = true; } }); - service.on('created', (data, hook) => { + service.on('created', (data: any, hook: any) => { assert.deepStrictEqual(data, { message: 'Hi' }); assert.ok(hook.changed); assert.strictEqual(hook.service, service); @@ -288,14 +296,14 @@ describe('Service events', () => { it('events indicated by the service are not sent automatically', done => { const app = feathers().use('/creator', { events: ['created'], - create (data) { + create (data: any) { return Promise.resolve(data); } }); const service = app.service('creator'); - service.on('created', data => { + service.on('created', (data: any) => { assert.deepStrictEqual(data, { message: 'custom event' }); done(); }); diff --git a/packages/feathers/test/hooks/after.test.js b/packages/feathers/test/hooks/after.test.ts similarity index 82% rename from packages/feathers/test/hooks/after.test.js rename to packages/feathers/test/hooks/after.test.ts index 4b038677f6..daad7d1b8a 100644 --- a/packages/feathers/test/hooks/after.test.js +++ b/packages/feathers/test/hooks/after.test.ts @@ -1,11 +1,11 @@ -const assert = require('assert'); -const feathers = require('../../lib'); +import assert from 'assert'; +import feathers from '../../src'; describe('`after` hooks', () => { describe('function(hook)', () => { it('returning a non-hook object throws error', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: any) { return Promise.resolve({ id }); } }); @@ -19,17 +19,16 @@ describe('`after` hooks', () => { } }); - return service.get(10).catch(e => { + return service.get(10).catch((e: any) => { assert.strictEqual(e.message, 'after hook for \'get\' method returned invalid hook object'); }); }); it('.after hooks can return a promise', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: any) { return Promise.resolve({ - id: id, - description: `You have to do ${id}` + id, description: `You have to do ${id}` }); }, @@ -41,7 +40,7 @@ describe('`after` hooks', () => { service.hooks({ after: { - get (hook) { + get (hook: any) { hook.result.ran = true; return Promise.resolve(hook); }, @@ -52,7 +51,7 @@ describe('`after` hooks', () => { } }); - return service.get('laundry', {}).then(data => { + return service.get('laundry', {}).then((data: any) => { assert.deepStrictEqual(data, { id: 'laundry', description: 'You have to do laundry', @@ -61,7 +60,7 @@ describe('`after` hooks', () => { return service.find({}).then(() => { throw new Error('Should never get here'); - }).catch(error => { + }).catch((error: any) => { assert.strictEqual(error.message, 'You can not see this'); }); }); @@ -69,7 +68,7 @@ describe('`after` hooks', () => { it('.after hooks do not need to return anything', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: any) { return Promise.resolve({ id, description: `You have to do ${id}` }); @@ -83,7 +82,7 @@ describe('`after` hooks', () => { service.hooks({ after: { - get (hook) { + get (hook: any) { hook.result.ran = true; }, @@ -93,14 +92,14 @@ describe('`after` hooks', () => { } }); - return service.get('laundry').then(data => { + return service.get('laundry').then((data: any) => { assert.deepStrictEqual(data, { id: 'laundry', description: 'You have to do laundry', ran: true }); - return service.find().catch(error => { + return service.find().catch((error: any) => { assert.strictEqual(error.message, 'You can not see this'); }); }); @@ -110,7 +109,7 @@ describe('`after` hooks', () => { describe('function(hook, next)', () => { it('gets mixed into a service and modifies data', () => { const dummyService = { - create (data, params) { + create (data: any) { return Promise.resolve(data); } }; @@ -120,7 +119,7 @@ describe('`after` hooks', () => { service.hooks({ after: { - create (hook) { + create (hook: any) { assert.strictEqual(hook.type, 'after'); hook.result.some = 'thing'; @@ -130,14 +129,14 @@ describe('`after` hooks', () => { } }); - return service.create({ my: 'data' }).then(data => { + return service.create({ my: 'data' }).then((data: any) => { assert.deepStrictEqual({ my: 'data', some: 'thing' }, data, 'Got modified data'); }); }); it('also makes the app available at hook.app', () => { const dummyService = { - create (data) { + create (data: any) { return Promise.resolve(data); } }; @@ -147,7 +146,7 @@ describe('`after` hooks', () => { service.hooks({ after: { - create (hook) { + create (hook: any) { hook.result.appPresent = typeof hook.app !== 'undefined'; assert.strictEqual(hook.result.appPresent, true); @@ -156,14 +155,14 @@ describe('`after` hooks', () => { } }); - return service.create({ my: 'data' }).then(data => { + return service.create({ my: 'data' }).then((data: any) => { assert.deepStrictEqual({ my: 'data', appPresent: true }, data, 'The app was present in the hook.'); }); }); it('returns errors', () => { const dummyService = { - update (id, data) { + update (_id: any, data: any) { return Promise.resolve(data); } }; @@ -179,7 +178,7 @@ describe('`after` hooks', () => { } }); - return service.update(1, { my: 'data' }).catch(error => { + return service.update(1, { my: 'data' }).catch((error: any) => { assert.ok(error, 'Got an error'); assert.strictEqual(error.message, 'This did not work', 'Got expected error message from hook'); }); @@ -203,7 +202,7 @@ describe('`after` hooks', () => { } }); - return service.remove(1, {}).catch(error => { + return service.remove(1, {}).catch((error: any) => { assert.ok(error, 'Got error'); assert.strictEqual(error.message, 'Error removing item', 'Got error message from service'); }); @@ -211,7 +210,7 @@ describe('`after` hooks', () => { it('adds .after() and chains multiple hooks for the same method', () => { const dummyService = { - create (data) { + create (data: any) { return Promise.resolve(data); } }; @@ -221,7 +220,7 @@ describe('`after` hooks', () => { service.hooks({ after: { - create (hook) { + create (hook: any) { hook.result.some = 'thing'; return hook; @@ -231,13 +230,13 @@ describe('`after` hooks', () => { service.hooks({ after: { - create (hook) { + create (hook: any) { hook.result.other = 'stuff'; } } }); - service.create({ my: 'data' }).then(data => { + service.create({ my: 'data' }).then((data: any) => { assert.deepStrictEqual({ my: 'data', some: 'thing', @@ -248,7 +247,7 @@ describe('`after` hooks', () => { it('chains multiple after hooks using array syntax', () => { const dummyService = { - create (data) { + create (data: any) { return Promise.resolve(data); } }; @@ -259,12 +258,12 @@ describe('`after` hooks', () => { service.hooks({ after: { create: [ - function (hook) { + function (hook: any) { hook.result.some = 'thing'; return hook; }, - function (hook) { + function (hook: any) { hook.result.other = 'stuff'; return hook; @@ -273,7 +272,7 @@ describe('`after` hooks', () => { } }); - return service.create({ my: 'data' }).then(data => { + return service.create({ my: 'data' }).then((data: any) => { assert.deepStrictEqual({ my: 'data', some: 'thing', @@ -284,7 +283,7 @@ describe('`after` hooks', () => { it('.after hooks run in the correct order (#13)', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: any) { return Promise.resolve({ id }); } }); @@ -293,7 +292,7 @@ describe('`after` hooks', () => { service.hooks({ after: { - get (hook) { + get (hook: any) { hook.result.items = ['first']; return hook; @@ -304,12 +303,12 @@ describe('`after` hooks', () => { service.hooks({ after: { get: [ - function (hook) { + function (hook: any) { hook.result.items.push('second'); return hook; }, - function (hook) { + function (hook: any) { hook.result.items.push('third'); return hook; @@ -318,16 +317,16 @@ describe('`after` hooks', () => { } }); - service.get(10).then(data => { + service.get(10).then((data: any) => { assert.deepStrictEqual(data.items, ['first', 'second', 'third']); }); }); it('after all hooks (#11)', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: any) { return Promise.resolve({ - id: id, + id, items: [] }); }, @@ -341,7 +340,7 @@ describe('`after` hooks', () => { service.hooks({ after: { - all (hook) { + all (hook: any) { hook.result.afterAllObject = true; return hook; @@ -351,7 +350,7 @@ describe('`after` hooks', () => { service.hooks({ after: [ - function (hook) { + function (hook: any) { hook.result.afterAllMethodArray = true; return hook; @@ -359,11 +358,11 @@ describe('`after` hooks', () => { ] }); - return service.find({}).then(data => { + return service.find({}).then((data: any) => { assert.ok(data.afterAllObject); assert.ok(data.afterAllMethodArray); - return service.get(1, {}).then(data => { + return service.get(1, {}).then((data: any) => { assert.ok(data.afterAllObject); assert.ok(data.afterAllMethodArray); }); @@ -373,9 +372,9 @@ describe('`after` hooks', () => { it('after hooks have service as context and keep it in service method (#17)', () => { const app = feathers().use('/dummy', { number: 42, - get (id) { + get (id: any) { return Promise.resolve({ - id: id, + id, number: this.number }); } @@ -385,7 +384,7 @@ describe('`after` hooks', () => { service.hooks({ after: { - get (hook) { + get (this: any, hook: any) { hook.result.test = this.number + 1; return hook; @@ -393,7 +392,7 @@ describe('`after` hooks', () => { } }); - service.get(10).then(data => { + service.get(10).then((data: any) => { assert.deepStrictEqual(data, { id: 10, number: 42, diff --git a/packages/feathers/test/hooks/app.test.js b/packages/feathers/test/hooks/app.test.ts similarity index 68% rename from packages/feathers/test/hooks/app.test.js rename to packages/feathers/test/hooks/app.test.ts index bf9dd9a92b..eb7e713d89 100644 --- a/packages/feathers/test/hooks/app.test.js +++ b/packages/feathers/test/hooks/app.test.ts @@ -1,13 +1,14 @@ -const assert = require('assert'); -const feathers = require('../../lib'); +import assert from 'assert'; + +import feathers, { Application } from '../../src'; describe('app.hooks', () => { - let app; + let app: Application; beforeEach(() => { app = feathers() .use('/todos', { - get (id, params) { + get (id: any, params: any) { if (id === 'error') { return Promise.reject(new Error('Something went wrong')); } @@ -15,7 +16,7 @@ describe('app.hooks', () => { return Promise.resolve({ id, params }); }, - create (data, params) { + create (data: any, params: any) { return Promise.resolve({ data, params }); } }); @@ -25,18 +26,47 @@ describe('app.hooks', () => { assert.strictEqual(typeof app.hooks, 'function'); }); + describe('app.hooks({ async })', () => { + it('basic app async hook', () => { + const service = app.service('todos'); + + app.hooks({ + async async (hook: any, next: any) { + assert.strictEqual(hook.app, app); + await next(); + hook.params.ran = true; + } + }); + + return service.get('test').then((result: any) => { + assert.deepStrictEqual(result, { + id: 'test', + params: { ran: true } + }); + + const data = { test: 'hi' }; + + return service.create(data).then((result: any) => { + assert.deepStrictEqual(result, { + data, params: { ran: true } + }); + }); + }); + }); + }); + describe('app.hooks({ before })', () => { it('basic app before hook', () => { const service = app.service('todos'); app.hooks({ - before (hook) { + before (hook: any) { assert.strictEqual(hook.app, app); hook.params.ran = true; } }); - return service.get('test').then(result => { + return service.get('test').then((result: any) => { assert.deepStrictEqual(result, { id: 'test', params: { ran: true } @@ -44,7 +74,7 @@ describe('app.hooks', () => { const data = { test: 'hi' }; - return service.create(data).then(result => { + return service.create(data).then((result: any) => { assert.deepStrictEqual(result, { data, params: { ran: true } }); @@ -54,28 +84,28 @@ describe('app.hooks', () => { it('app before hooks always run first', () => { app.service('todos').hooks({ - before (hook) { + before (hook: any) { assert.strictEqual(hook.app, app); hook.params.order.push('service.before'); } }); app.service('todos').hooks({ - before (hook) { + before (hook: any) { assert.strictEqual(hook.app, app); hook.params.order.push('service.before 1'); } }); app.hooks({ - before (hook) { + before (hook: any) { assert.strictEqual(hook.app, app); hook.params.order = []; hook.params.order.push('app.before'); } }); - return app.service('todos').get('test').then(result => { + return app.service('todos').get('test').then((result: any) => { assert.deepStrictEqual(result, { id: 'test', params: { @@ -89,13 +119,13 @@ describe('app.hooks', () => { describe('app.hooks({ after })', () => { it('basic app after hook', () => { app.hooks({ - after (hook) { + after (hook: any) { assert.strictEqual(hook.app, app); hook.result.ran = true; } }); - return app.service('todos').get('test').then(result => { + return app.service('todos').get('test').then((result: any) => { assert.deepStrictEqual(result, { id: 'test', params: {}, @@ -106,14 +136,14 @@ describe('app.hooks', () => { it('app after hooks always run last', () => { app.hooks({ - after (hook) { + after (hook: any) { assert.strictEqual(hook.app, app); hook.result.order.push('app.after'); } }); app.service('todos').hooks({ - after (hook) { + after (hook: any) { assert.strictEqual(hook.app, app); hook.result.order = []; hook.result.order.push('service.after'); @@ -121,13 +151,13 @@ describe('app.hooks', () => { }); app.service('todos').hooks({ - after (hook) { + after (hook: any) { assert.strictEqual(hook.app, app); hook.result.order.push('service.after 1'); } }); - return app.service('todos').get('test').then(result => { + return app.service('todos').get('test').then((result: any) => { assert.deepStrictEqual(result, { id: 'test', params: {}, @@ -140,40 +170,40 @@ describe('app.hooks', () => { describe('app.hooks({ error })', () => { it('basic app error hook', () => { app.hooks({ - error (hook) { + error (hook: any) { assert.strictEqual(hook.app, app); hook.error = new Error('App hook ran'); } }); - return app.service('todos').get('error').catch(error => { + return app.service('todos').get('error').catch((error: any) => { assert.strictEqual(error.message, 'App hook ran'); }); }); it('app error hooks always run last', () => { app.hooks({ - error (hook) { + error (hook: any) { assert.strictEqual(hook.app, app); hook.error = new Error(`${hook.error.message} app.after`); } }); app.service('todos').hooks({ - error (hook) { + error (hook: any) { assert.strictEqual(hook.app, app); hook.error = new Error(`${hook.error.message} service.after`); } }); app.service('todos').hooks({ - error (hook) { + error (hook: any) { assert.strictEqual(hook.app, app); hook.error = new Error(`${hook.error.message} service.after 1`); } }); - return app.service('todos').get('error').catch(error => { + return app.service('todos').get('error').catch((error: any) => { assert.strictEqual(error.message, 'Something went wrong service.after service.after 1 app.after'); }); }); diff --git a/packages/feathers/test/hooks/async.test.ts b/packages/feathers/test/hooks/async.test.ts new file mode 100644 index 0000000000..485be6b6fe --- /dev/null +++ b/packages/feathers/test/hooks/async.test.ts @@ -0,0 +1,536 @@ +import assert from 'assert'; +import feathers from '../../src'; + +describe('`async` hooks', () => { + describe('function([hook])', () => { + it('returning a non-hook object throws error', () => { + const app = feathers().use('/dummy', { + get (id: any) { + return Promise.resolve({ id }); + } + }); + const service = app.service('dummy'); + + service.hooks({ + async: { + get () { + return {}; + } + } + }); + + return service.get(10).catch((e: any) => { + assert.strictEqual(e.message, 'async hook for \'get\' method returned invalid hook object'); + }); + }); + + it('hooks in chain can be replaced', () => { + const app = feathers().use('/dummy', { + get (id: any) { + return Promise.resolve({ + id, description: `You have to do ${id}` + }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + async: { + get: [ + function (hook: any) { + return Object.assign({}, hook, { + modified: true + }); + }, + function (hook: any) { + assert.ok(hook.modified); + } + ] + } + }); + + return service.get('laundry'); + }); + + it('.async hooks can return a promise', () => { + const app = feathers().use('/dummy', { + get (id: any, params: any) { + assert.ok(params.ran, 'Ran through promise hook'); + + return Promise.resolve({ + id, + description: `You have to do ${id}` + }); + }, + + remove () { + assert.ok(false, 'Should never get here'); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + async: { + get (hook: any) { + return new Promise(resolve => { + hook.params.ran = true; + resolve(); + }); + }, + + remove () { + return new Promise((_resolve, reject) => { + reject(new Error('This did not work')); + }); + } + } + }); + + return service.get('dishes').then(() => service.remove(10)) + .catch((error: any) => { + assert.strictEqual(error.message, 'This did not work'); + }); + }); + + it('.async hooks do not need to return anything', () => { + const app = feathers().use('/dummy', { + get (id: any, params: any) { + assert.ok(params.ran, 'Ran through promise hook'); + + return Promise.resolve({ + id, description: `You have to do ${id}` + }); + }, + + remove () { + assert.ok(false, 'Should never get here'); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + async: { + get (hook: any) { + hook.params.ran = true; + }, + + remove () { + throw new Error('This did not work'); + } + } + }); + + return service.get('dishes').then(() => service.remove(10)) + .catch((error: any) => { + assert.strictEqual(error.message, 'This did not work'); + }); + }); + + it('.async hooks can set hook.result which will skip service method', () => { + const app = feathers().use('/dummy', { + get (id: any) { + assert.ok(false, 'This should never run'); + return Promise.resolve({ id }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + async: { + async get (hook: any, next: any) { + hook.result = { + id: hook.id, + message: 'Set from hook' + }; + + await next(); + } + } + }); + + return service.get(10, {}).then((data: any) => { + assert.deepStrictEqual(data, { + id: 10, + message: 'Set from hook' + }); + }); + }); + }); + + describe('function(hook, next)', () => { + it('gets mixed into a service and modifies data', () => { + const dummyService = { + create (data: any, params: any) { + assert.deepStrictEqual(data, { + some: 'thing', + modified: 'data' + }, 'Data modified'); + + assert.deepStrictEqual(params, { + modified: 'params' + }, 'Params modified'); + + return Promise.resolve(data); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + async: { + create (hook: any, next: any) { + assert.strictEqual(hook.type, 'before'); + + hook.data.modified = 'data'; + + Object.assign(hook.params, { + modified: 'params' + }); + + return next(); + } + } + }); + + return service.create({ some: 'thing' }).then((data: any) => { + assert.deepStrictEqual(data, { + some: 'thing', + modified: 'data' + }, 'Data got modified'); + }); + }); + + it('contains the app object at hook.app', () => { + const someServiceConfig = { + create (data: any) { + return Promise.resolve(data); + } + }; + + const app = feathers().use('/some-service', someServiceConfig); + const someService = app.service('some-service'); + + someService.hooks({ + async: { + create (hook: any, next: any) { + hook.data.appPresent = typeof hook.app !== 'undefined'; + assert.strictEqual(hook.data.appPresent, true); + return next(); + } + } + }); + + return someService.create({ some: 'thing' }).then((data: any) => { + assert.deepStrictEqual(data, { + some: 'thing', + appPresent: true + }, 'App object was present'); + }); + }); + + it('passes errors', () => { + const dummyService = { + update () { + assert.ok(false, 'Never should be called'); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + async: { + update () { + throw new Error('You are not allowed to update'); + } + } + }); + + return service.update(1, {}).catch((error: any) => { + assert.ok(error, 'Got an error'); + assert.strictEqual(error.message, 'You are not allowed to update', 'Got error message'); + }); + }); + + it('does not run after hook when there is an error', () => { + const dummyService = { + remove () { + return Promise.reject(new Error('Error removing item')); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + after: { + async remove (_context: any, next: any) { + await next(); + + assert.ok(false, 'This should never get called'); + } + } + }); + + return service.remove(1, {}).catch((error: any) => { + assert.ok(error, 'Got error'); + assert.strictEqual(error.message, 'Error removing item', 'Got error message from service'); + }); + }); + + it('calling back with no arguments uses the old ones', () => { + const dummyService = { + remove (id: any, params: any) { + assert.strictEqual(id, 1, 'Got id'); + assert.deepStrictEqual(params, { my: 'param' }); + + return Promise.resolve({ id }); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + async: { + remove (_hook: any, next: any) { + next(); + } + } + }); + + return service.remove(1, { my: 'param' }); + }); + + it('adds .hooks() and chains multiple hooks for the same method', () => { + const dummyService = { + create (data: any, params: any) { + assert.deepStrictEqual(data, { + some: 'thing', + modified: 'second data' + }, 'Data modified'); + + assert.deepStrictEqual(params, { + modified: 'params' + }, 'Params modified'); + + return Promise.resolve(data); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + async: { + create (hook: any, next: any) { + hook.params.modified = 'params'; + + next(); + } + } + }); + + service.hooks({ + async: { + create (hook: any, next: any) { + hook.data.modified = 'second data'; + + next(); + } + } + }); + + return service.create({ some: 'thing' }); + }); + + it('chains multiple async hooks using array syntax', () => { + const dummyService = { + create (data: any, params: any) { + assert.deepStrictEqual(data, { + some: 'thing', + modified: 'second data' + }, 'Data modified'); + + assert.deepStrictEqual(params, { + modified: 'params' + }, 'Params modified'); + + return Promise.resolve(data); + } + }; + + const app = feathers().use('/dummy', dummyService); + const service = app.service('dummy'); + + service.hooks({ + async: { + create: [ + function (hook: any, next: any) { + hook.params.modified = 'params'; + + next(); + }, + function (hook: any, next: any) { + hook.data.modified = 'second data'; + + next(); + } + ] + } + }); + + return service.create({ some: 'thing' }); + }); + + it('.async hooks run in the correct order (#13)', () => { + const app = feathers().use('/dummy', { + get (id: any, params: any) { + assert.deepStrictEqual(params.items, ['first', 'second', 'third']); + + return Promise.resolve({ + id, + items: [] + }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + async: { + get (hook: any, next: any) { + hook.params.items = ['first']; + next(); + } + } + }); + + service.hooks({ + async: { + get: [ + function (hook: any, next: any) { + hook.params.items.push('second'); + next(); + }, + function (hook: any, next: any) { + hook.params.items.push('third'); + next(); + } + ] + } + }); + + return service.get(10); + }); + + it('async all hooks (#11)', () => { + const app = feathers().use('/dummy', { + get (id: any, params: any) { + assert.ok(params.asyncAllObject); + assert.ok(params.asyncAllMethodArray); + + return Promise.resolve({ + id, + items: [] + }); + }, + + find (params: any) { + assert.ok(params.asyncAllObject); + assert.ok(params.asyncAllMethodArray); + + return Promise.resolve([]); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + async: { + all (hook: any, next: any) { + hook.params.asyncAllObject = true; + next(); + } + } + }); + + service.hooks({ + async: [ + function (hook: any, next: any) { + hook.params.asyncAllMethodArray = true; + next(); + } + ] + }); + + return service.find(); + }); + + it('async hooks have service as context and keep it in service method (#17)', () => { + const app = feathers().use('/dummy', { + number: 42, + get (id: any, params: any) { + return Promise.resolve({ + id, + number: (this as any).number, + test: params.test + }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + async: { + get (this: any, hook: any, next: any) { + hook.params.test = this.number + 2; + return next(); + } + } + }); + + return service.get(10).then((data: any) => { + assert.deepStrictEqual(data, { + id: 10, + number: 42, + test: 44 + }); + }); + }); + + it('calling next() multiple times does not do anything', () => { + const app = feathers().use('/dummy', { + get (id: any) { + return Promise.resolve({ id }); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + async: { + get: [ + function (_hook: any, next: any) { + return next(); + }, + + function (_hook: any, next: any) { + next(); + return next(); + } + ] + } + }); + + return service.get(10).catch((e: any) => { + assert.strictEqual(e.message, 'next() called multiple times'); + }); + }); + }); +}); diff --git a/packages/feathers/test/hooks/before.test.js b/packages/feathers/test/hooks/before.test.ts similarity index 84% rename from packages/feathers/test/hooks/before.test.js rename to packages/feathers/test/hooks/before.test.ts index 18955545d9..b4b2193f78 100644 --- a/packages/feathers/test/hooks/before.test.js +++ b/packages/feathers/test/hooks/before.test.ts @@ -1,11 +1,11 @@ -const assert = require('assert'); -const feathers = require('../../lib'); +import assert from 'assert'; +import feathers from '../../src'; describe('`before` hooks', () => { describe('function([hook])', () => { it('returning a non-hook object throws error', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: any) { return Promise.resolve({ id }); } }); @@ -19,14 +19,14 @@ describe('`before` hooks', () => { } }); - return service.get(10).catch(e => { + return service.get(10).catch((e: any) => { assert.strictEqual(e.message, 'before hook for \'get\' method returned invalid hook object'); }); }); it('hooks in chain can be replaced', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: any) { return Promise.resolve({ id, description: `You have to do ${id}` }); @@ -38,12 +38,12 @@ describe('`before` hooks', () => { service.hooks({ before: { get: [ - function (hook) { + function (hook: any) { return Object.assign({}, hook, { modified: true }); }, - function (hook) { + function (hook: any) { assert.ok(hook.modified); } ] @@ -55,11 +55,11 @@ describe('`before` hooks', () => { it('.before hooks can return a promise', () => { const app = feathers().use('/dummy', { - get (id, params) { + get (id: any, params: any) { assert.ok(params.ran, 'Ran through promise hook'); return Promise.resolve({ - id: id, + id, description: `You have to do ${id}` }); }, @@ -73,15 +73,15 @@ describe('`before` hooks', () => { service.hooks({ before: { - get (hook) { - return new Promise(resolve => { + get (hook: any) { + return new Promise(resolve => { hook.params.ran = true; resolve(); }); }, remove () { - return new Promise((resolve, reject) => { + return new Promise((_resolve, reject) => { reject(new Error('This did not work')); }); } @@ -89,18 +89,18 @@ describe('`before` hooks', () => { }); return service.get('dishes').then(() => service.remove(10)) - .catch(error => { + .catch((error: any) => { assert.strictEqual(error.message, 'This did not work'); }); }); it('.before hooks do not need to return anything', () => { const app = feathers().use('/dummy', { - get (id, params) { + get (id: any, params: any) { assert.ok(params.ran, 'Ran through promise hook'); return Promise.resolve({ - id: id, + id, description: `You have to do ${id}` }); }, @@ -114,7 +114,7 @@ describe('`before` hooks', () => { service.hooks({ before: { - get (hook) { + get (hook: any) { hook.params.ran = true; }, @@ -125,14 +125,14 @@ describe('`before` hooks', () => { }); return service.get('dishes').then(() => service.remove(10)) - .catch(error => { + .catch((error: any) => { assert.strictEqual(error.message, 'This did not work'); }); }); it('.before hooks can set hook.result which will skip service method', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: any) { assert.ok(false, 'This should never run'); return Promise.resolve({ id }); } @@ -142,7 +142,7 @@ describe('`before` hooks', () => { service.hooks({ before: { - get (hook) { + get (hook: any) { hook.result = { id: hook.id, message: 'Set from hook' @@ -151,7 +151,7 @@ describe('`before` hooks', () => { } }); - return service.get(10, {}).then(data => { + return service.get(10, {}).then((data: any) => { assert.deepStrictEqual(data, { id: 10, message: 'Set from hook' @@ -163,7 +163,7 @@ describe('`before` hooks', () => { describe('function(hook, next)', () => { it('gets mixed into a service and modifies data', () => { const dummyService = { - create (data, params) { + create (data: any, params: any) { assert.deepStrictEqual(data, { some: 'thing', modified: 'data' @@ -182,7 +182,7 @@ describe('`before` hooks', () => { service.hooks({ before: { - create (hook) { + create (hook: any) { assert.strictEqual(hook.type, 'before'); hook.data.modified = 'data'; @@ -196,7 +196,7 @@ describe('`before` hooks', () => { } }); - return service.create({ some: 'thing' }).then(data => { + return service.create({ some: 'thing' }).then((data: any) => { assert.deepStrictEqual(data, { some: 'thing', modified: 'data' @@ -206,7 +206,7 @@ describe('`before` hooks', () => { it('contains the app object at hook.app', () => { const someServiceConfig = { - create (data, params, callback) { + create (data: any) { return Promise.resolve(data); } }; @@ -216,7 +216,7 @@ describe('`before` hooks', () => { someService.hooks({ before: { - create (hook) { + create (hook: any) { hook.data.appPresent = typeof hook.app !== 'undefined'; assert.strictEqual(hook.data.appPresent, true); @@ -225,7 +225,7 @@ describe('`before` hooks', () => { } }); - return someService.create({ some: 'thing' }).then(data => { + return someService.create({ some: 'thing' }).then((data: any) => { assert.deepStrictEqual(data, { some: 'thing', appPresent: true @@ -251,7 +251,7 @@ describe('`before` hooks', () => { } }); - return service.update(1, {}).catch(error => { + return service.update(1, {}).catch((error: any) => { assert.ok(error, 'Got an error'); assert.strictEqual(error.message, 'You are not allowed to update', 'Got error message'); }); @@ -259,7 +259,7 @@ describe('`before` hooks', () => { it('calling back with no arguments uses the old ones', () => { const dummyService = { - remove (id, params) { + remove (id: any, params: any) { assert.strictEqual(id, 1, 'Got id'); assert.deepStrictEqual(params, { my: 'param' }); @@ -272,7 +272,7 @@ describe('`before` hooks', () => { service.hooks({ before: { - remove (hook) { + remove (hook: any) { return hook; } } @@ -283,7 +283,7 @@ describe('`before` hooks', () => { it('adds .hooks() and chains multiple hooks for the same method', () => { const dummyService = { - create (data, params) { + create (data: any, params: any) { assert.deepStrictEqual(data, { some: 'thing', modified: 'second data' @@ -302,7 +302,7 @@ describe('`before` hooks', () => { service.hooks({ before: { - create (hook) { + create (hook: any) { hook.params.modified = 'params'; return hook; @@ -312,7 +312,7 @@ describe('`before` hooks', () => { service.hooks({ before: { - create (hook) { + create (hook: any) { hook.data.modified = 'second data'; return hook; @@ -325,7 +325,7 @@ describe('`before` hooks', () => { it('chains multiple before hooks using array syntax', () => { const dummyService = { - create (data, params) { + create (data: any, params: any) { assert.deepStrictEqual(data, { some: 'thing', modified: 'second data' @@ -345,12 +345,12 @@ describe('`before` hooks', () => { service.hooks({ before: { create: [ - function (hook) { + function (hook: any) { hook.params.modified = 'params'; return hook; }, - function (hook) { + function (hook: any) { hook.data.modified = 'second data'; return hook; @@ -364,11 +364,11 @@ describe('`before` hooks', () => { it('.before hooks run in the correct order (#13)', () => { const app = feathers().use('/dummy', { - get (id, params, callback) { + get (id: any, params: any) { assert.deepStrictEqual(params.items, ['first', 'second', 'third']); return Promise.resolve({ - id: id, + id, items: [] }); } @@ -378,7 +378,7 @@ describe('`before` hooks', () => { service.hooks({ before: { - get (hook) { + get (hook: any) { hook.params.items = ['first']; return hook; @@ -389,12 +389,12 @@ describe('`before` hooks', () => { service.hooks({ before: { get: [ - function (hook) { + function (hook: any) { hook.params.items.push('second'); return hook; }, - function (hook) { + function (hook: any) { hook.params.items.push('third'); return hook; @@ -408,17 +408,17 @@ describe('`before` hooks', () => { it('before all hooks (#11)', () => { const app = feathers().use('/dummy', { - get (id, params) { + get (id: any, params: any) { assert.ok(params.beforeAllObject); assert.ok(params.beforeAllMethodArray); return Promise.resolve({ - id: id, + id, items: [] }); }, - find (params) { + find (params: any) { assert.ok(params.beforeAllObject); assert.ok(params.beforeAllMethodArray); @@ -430,7 +430,7 @@ describe('`before` hooks', () => { service.hooks({ before: { - all (hook) { + all (hook: any) { hook.params.beforeAllObject = true; return hook; @@ -440,7 +440,7 @@ describe('`before` hooks', () => { service.hooks({ before: [ - function (hook) { + function (hook: any) { hook.params.beforeAllMethodArray = true; return hook; @@ -454,10 +454,10 @@ describe('`before` hooks', () => { it('before hooks have service as context and keep it in service method (#17)', () => { const app = feathers().use('/dummy', { number: 42, - get (id, params) { + get (id: any, params: any) { return Promise.resolve({ - id: id, - number: this.number, + id, + number: (this as any).number, test: params.test }); } @@ -467,7 +467,7 @@ describe('`before` hooks', () => { service.hooks({ before: { - get (hook) { + get (this: any, hook: any) { hook.params.test = this.number + 2; return hook; @@ -475,7 +475,7 @@ describe('`before` hooks', () => { } }); - return service.get(10).then(data => { + return service.get(10).then((data: any) => { assert.deepStrictEqual(data, { id: 10, number: 42, diff --git a/packages/commons/test/hooks.test.ts b/packages/feathers/test/hooks/commons.test.ts similarity index 96% rename from packages/commons/test/hooks.test.ts rename to packages/feathers/test/hooks/commons.test.ts index 5253b08051..b496199f71 100644 --- a/packages/commons/test/hooks.test.ts +++ b/packages/feathers/test/hooks/commons.test.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { hooks } from '../src'; +import * as hooks from '../../src/hooks/commons'; describe('hook utilities', () => { describe('.makeArguments', () => { @@ -306,7 +306,7 @@ describe('hook utilities', () => { ], dummyHook); return promise.catch((e: any) => { - assert.equal(e.message, `dummy hook for 'something' method returned invalid hook object`); + assert.equal(e.message, 'dummy hook for \'something\' method returned invalid hook object'); assert.equal(typeof e.hook, 'object'); }); }); @@ -364,7 +364,7 @@ describe('hook utilities', () => { base.hooks({ wrong () {} }); throw new Error('Should never get here'); } catch (e) { - assert.equal(e.message, `'wrong' is not a valid hook type`); + assert.equal(e.message, '\'wrong\' is not a valid hook type'); } }); @@ -375,7 +375,7 @@ describe('hook utilities', () => { } }); throw new Error('Should never get here'); } catch (e) { - assert.equal(e.message, `'wrongMethod' is not a valid hook method`); + assert.equal(e.message, '\'wrongMethod\' is not a valid hook method'); } }); }); diff --git a/packages/feathers/test/hooks/error.test.js b/packages/feathers/test/hooks/error.test.ts similarity index 77% rename from packages/feathers/test/hooks/error.test.js rename to packages/feathers/test/hooks/error.test.ts index a9539fcf8b..1512ef189a 100644 --- a/packages/feathers/test/hooks/error.test.js +++ b/packages/feathers/test/hooks/error.test.ts @@ -1,5 +1,5 @@ -const assert = require('assert'); -const feathers = require('../../lib'); +import assert from 'assert'; +import feathers, { Service, Application } from '../../src'; describe('`error` hooks', () => { describe('on direct service method errors', () => { @@ -16,7 +16,7 @@ describe('`error` hooks', () => { it('basic error hook', () => { service.hooks({ error: { - get (hook) { + get (hook: any) { assert.strictEqual(hook.type, 'error'); assert.strictEqual(hook.id, 'test'); assert.strictEqual(hook.method, 'get'); @@ -34,13 +34,13 @@ describe('`error` hooks', () => { it('can change the error', () => { service.hooks({ error: { - get (hook) { + get (hook: any) { hook.error = new Error(errorMessage); } } }); - return service.get('test').catch(error => { + return service.get('test').catch((error: any) => { assert.strictEqual(error.message, errorMessage); }); }); @@ -54,7 +54,7 @@ describe('`error` hooks', () => { } }); - return service.get('test').catch(error => { + return service.get('test').catch((error: any) => { assert.strictEqual(error.message, errorMessage); }); }); @@ -68,7 +68,7 @@ describe('`error` hooks', () => { } }); - return service.get('test').catch(error => { + return service.get('test').catch((error: any) => { assert.strictEqual(error.message, errorMessage); }); }); @@ -82,7 +82,7 @@ describe('`error` hooks', () => { } }); - return service.get('test').catch(error => { + return service.get('test').catch((error: any) => { assert.strictEqual(error.message, errorMessage); }); }); @@ -91,18 +91,18 @@ describe('`error` hooks', () => { service.hooks({ error: { get: [ - function (hook) { + function (hook: any) { hook.error = new Error(errorMessage); hook.error.first = true; }, - function (hook) { + function (hook: any) { hook.error.second = true; return Promise.resolve(hook); }, - function (hook) { + function (hook: any) { hook.error.third = true; return hook; @@ -111,7 +111,7 @@ describe('`error` hooks', () => { } }); - return service.get('test').catch(error => { + return service.get('test').catch((error: any) => { assert.strictEqual(error.message, errorMessage); assert.ok(error.first); assert.ok(error.second); @@ -126,14 +126,14 @@ describe('`error` hooks', () => { service.hooks({ error: { - get (hook) { + get (hook: any) { hook.result = data; } } }); return service.get(10) - .then(result => assert.deepStrictEqual(result, data)); + .then((result: any) => assert.deepStrictEqual(result, data)); }); it('allows to set `context.result = null` in error hooks (#865)', () => { @@ -145,14 +145,14 @@ describe('`error` hooks', () => { app.service('dummy').hooks({ error: { - get (context) { + get (context: any) { context.result = null; } } }); return app.service('dummy').get(1) - .then(result => assert.strictEqual(result, null)); + .then((result: any) => assert.strictEqual(result, null)); }); it('uses the current hook object if thrown in a service method', () => { @@ -165,17 +165,17 @@ describe('`error` hooks', () => { const service = app.service('dummy'); service.hooks({ - before (hook) { + before (hook: any) { return { ...hook, id: 42 }; }, - error (hook) { + error (hook: any) { assert.strictEqual(hook.id, 42); } }); return service.get(1).then( () => assert.fail('Should never get here'), - error => assert.strictEqual(error.message, 'Something went wrong') + (error: any) => assert.strictEqual(error.message, 'Something went wrong') ); }); }); @@ -183,12 +183,12 @@ describe('`error` hooks', () => { describe('error in hooks', () => { const errorMessage = 'before hook broke'; - let app; - let service; + let app: Application; + let service: Service; beforeEach(() => { app = feathers().use('/dummy', { - get (id) { + get (id: any) { return Promise.resolve({ id, text: `You have to do ${id}` }); @@ -204,8 +204,8 @@ describe('`error` hooks', () => { throw new Error(errorMessage); } }).hooks({ - error (hook) { - assert.strictEqual(hook.error.hook.type, 'before', + error (hook: any) { + assert.strictEqual(hook.original.type, 'before', 'Original hook still set' ); assert.strictEqual(hook.id, 'dishes'); @@ -226,8 +226,8 @@ describe('`error` hooks', () => { throw new Error(errorMessage); }, - error (hook) { - assert.strictEqual(hook.error.hook.type, 'after', + error (hook: any) { + assert.strictEqual(hook.original.type, 'after', 'Original hook still set' ); assert.strictEqual(hook.id, 'dishes'); @@ -248,13 +248,13 @@ describe('`error` hooks', () => { it('uses the current hook object if thrown in a hook and sets hook.original', () => { service.hooks({ - after (hook) { + after (hook: any) { hook.modified = true; throw new Error(errorMessage); }, - error (hook) { + error (hook: any) { assert.ok(hook.modified); assert.strictEqual(hook.original.type, 'after'); } @@ -266,13 +266,34 @@ describe('`error` hooks', () => { }) .catch(error => assert.strictEqual(error.message, errorMessage)); }); + + it('error in async hook', () => { + service.hooks({ + async (hook: any) { + hook.modified = true; + + throw new Error(errorMessage); + }, + + error (hook: any) { + assert.ok(hook.modified); + assert.strictEqual(hook.original.type, 'before'); + } + }); + + return service.get('laundry') + .then(() => { + throw new Error('Should never get here'); + }) + .catch(error => assert.strictEqual(error.message, errorMessage)); + }); }); it('Error in before hook causes inter-service calls to have wrong hook context (https://github.com/feathersjs/feathers/issues/841)', () => { const app = feathers(); - let service1Params; - let service2Params; + let service1Params: any; + let service2Params: any; app.use('/service1', { find () { @@ -281,14 +302,14 @@ describe('`error` hooks', () => { }); app.service('service1').hooks({ - before (context) { + before (context: any) { service1Params = context.params; return Promise.reject(new Error('Error in service1 before hook')); } }); app.use('/service2', { - find (params) { + find () { return app.service('/service1').find({}).then(() => { return { message: 'service2 success' }; }); @@ -296,11 +317,11 @@ describe('`error` hooks', () => { }); app.service('service2').hooks({ - before (context) { + before (context: any) { service2Params = context.params; context.params.foo = 'bar'; }, - error (context) { + error (context: any) { assert.ok(service1Params !== context.params); assert.ok(service2Params === context.params); assert.strictEqual(context.path, 'service2'); @@ -308,7 +329,7 @@ describe('`error` hooks', () => { } }); - return app.service('/service2').find().catch(error => { + return app.service('/service2').find().catch((error: any) => { assert.strictEqual(error.message, 'Error in service1 before hook'); }); }); diff --git a/packages/feathers/test/hooks/finally.test.js b/packages/feathers/test/hooks/finally.test.ts similarity index 80% rename from packages/feathers/test/hooks/finally.test.js rename to packages/feathers/test/hooks/finally.test.ts index 50dbd54180..42b4646324 100644 --- a/packages/feathers/test/hooks/finally.test.js +++ b/packages/feathers/test/hooks/finally.test.ts @@ -1,16 +1,16 @@ -const assert = require('assert'); -const feathers = require('../../lib'); +import assert from 'assert'; +import feathers from '../../src'; describe('`finally` hooks', () => { it('runs after `after` hooks, app level last', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: any) { return Promise.resolve({ id }); } }); app.hooks({ - finally (hook) { + finally (hook: any) { hook.result.chain.push('app finally'); } }); @@ -18,15 +18,15 @@ describe('`finally` hooks', () => { const service = app.service('dummy'); service.hooks({ - finally (hook) { + finally (hook: any) { hook.result.chain.push('service finally'); }, - after (hook) { + after (hook: any) { hook.result.chain = [ 'service after' ]; } }); - return service.get(42).then(data => { + return service.get(42).then((data: any) => { assert.deepStrictEqual(data, { id: 42, chain: [ 'service after', 'service finally', 'app finally' ] @@ -36,13 +36,13 @@ describe('`finally` hooks', () => { it('runs after `error` hooks, app level last', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: any) { return Promise.reject(new Error(`${id} is not the answer`)); } }); app.hooks({ - finally (hook) { + finally (hook: any) { hook.error.chain.push('app finally'); } }); @@ -50,20 +50,20 @@ describe('`finally` hooks', () => { const service = app.service('dummy'); service.hooks({ - finally (hook) { + finally (hook: any) { hook.error.chain.push('service finally'); } }); service.hooks({ - error (hook) { + error (hook: any) { hook.error.chain = [ 'service error' ]; } }); return service.get(42).then( () => assert(false, 'Should never get here'), - error => { + (error: any) => { assert.deepStrictEqual(error.chain, [ 'service error', 'service finally', @@ -76,7 +76,7 @@ describe('`finally` hooks', () => { it('runs once, sets error if throws', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: any) { return Promise.resolve({ id }); } }); @@ -86,15 +86,15 @@ describe('`finally` hooks', () => { let count = 0; service.hooks({ - error (hook) { + error () { assert.fail('Should never get here (error hook)'); }, finally: [ - function (hook) { + function () { assert.strictEqual(++count, 1, 'This should be called only once'); throw new Error('This did not work'); }, - function (hook) { + function () { assert.fail('Should never get here (second finally hook)'); } ] @@ -102,7 +102,7 @@ describe('`finally` hooks', () => { return service.get(42).then( () => assert.fail('Should never get here (result resolve)'), - error => assert.strictEqual(error.message, 'This did not work') + (error: any) => assert.strictEqual(error.message, 'This did not work') ); }); }); diff --git a/packages/feathers/test/hooks/hooks.test.js b/packages/feathers/test/hooks/hooks.test.ts similarity index 66% rename from packages/feathers/test/hooks/hooks.test.js rename to packages/feathers/test/hooks/hooks.test.ts index efe184c633..e553a7f0e8 100644 --- a/packages/feathers/test/hooks/hooks.test.js +++ b/packages/feathers/test/hooks/hooks.test.ts @@ -1,34 +1,105 @@ -const assert = require('assert'); -const feathers = require('../../lib'); +import assert from 'assert'; +import { hooks } from '@feathersjs/hooks'; +import feathers, { activateHooks, Id } from '../../src'; describe('hooks basics', () => { + it('mix @feathersjs/hooks and .hooks', async () => { + const svc = { + get (id: any, params: any) { + return Promise.resolve({ id, user: params.user }); + } + }; + + hooks(svc, { + get: [async (ctx: any, next: any) => { + ctx.chain.push('@hooks 1 before'); + await next(); + ctx.chain.push('@hooks 1 after'); + }] + }); + + const app = feathers().use('/dummy', svc); + const service = app.service('dummy'); + + service.hooks({ + before: { + get: (ctx: any) => { + ctx.chain.push('.hooks 1 before'); + } + }, + after: { + get: (ctx: any) => { + ctx.chain.push('.hooks 1 after'); + } + } + }); + + hooks(service, { + get: [async (ctx: any, next: any) => { + ctx.chain.push('@hooks 2 before'); + await next(); + ctx.chain.push('@hooks 2 after'); + }] + }); + + service.hooks({ + before: { + get: (ctx: any) => { + ctx.chain.push('.hooks 2 before'); + } + }, + after: { + get: (ctx: any) => { + ctx.chain.push('.hooks 2 after'); + } + } + }); + + const hookContext = service.get.createContext({ + chain: [] + }); + const resultContext = await service.get(1, {}, hookContext); + + assert.strictEqual(hookContext, resultContext); + assert.deepStrictEqual(resultContext.chain, [ + '@hooks 1 before', + '.hooks 1 before', + '.hooks 2 before', + '@hooks 2 before', + '@hooks 2 after', + '.hooks 1 after', + '.hooks 2 after', + '@hooks 1 after' + ]); + }); + it('validates arguments', () => { const app = feathers().use('/dummy', { - get (id, params) { + get (id: any, params: any) { return Promise.resolve({ id, user: params.user }); }, - create (data) { + create (data: any) { return Promise.resolve(data); } }); - return app.service('dummy').get(1, {}, function () {}).catch(e => { + return app.service('dummy').get(1, {}, function () {}).catch((e: any) => { assert.strictEqual(e.message, 'Callbacks are no longer supported. Use Promises or async/await instead.'); return app.service('dummy').get(); - }).catch(e => { - assert.strictEqual(e.message, `An id must be provided to the 'dummy.get' method`); + }).catch((e: any) => { + assert.strictEqual(e.message, 'An id must be provided to the \'dummy.get\' method'); }).then(() => app.service('dummy').create() - ).catch(e => { - assert.strictEqual(e.message, `A data object must be provided to the 'dummy.create' method`); + ).catch((e: any) => { + assert.strictEqual(e.message, 'A data object must be provided to the \'dummy.create\' method'); }); }); it('works with services that return a promise (feathers-hooks#28)', () => { const app = feathers().use('/dummy', { - get (id, params) { + get (id: any, params: any) { return Promise.resolve({ id, user: params.user }); } }); @@ -37,25 +108,25 @@ describe('hooks basics', () => { service.hooks({ before: { - get (hook) { + get (hook: any) { hook.params.user = 'David'; } }, after: { - get (hook) { + get (hook: any) { hook.result.after = true; } } }); - return service.get(10).then(data => { + return service.get(10).then((data: any) => { assert.deepStrictEqual(data, { id: 10, user: 'David', after: true }); }); }); it('has hook.app, hook.service and hook.path', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: any) { return Promise.resolve({ id }); } }); @@ -63,7 +134,7 @@ describe('hooks basics', () => { const service = app.service('dummy'); service.hooks({ - before (hook) { + before (hook: any) { assert.strictEqual(this, service); assert.strictEqual(hook.service, service); assert.strictEqual(hook.app, app); @@ -76,7 +147,7 @@ describe('hooks basics', () => { it('does not error when result is null', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: any) { return Promise.resolve({ id }); } }); @@ -86,7 +157,7 @@ describe('hooks basics', () => { service.hooks({ after: { get: [ - function (hook) { + function (hook: any) { hook.result = null; return hook; } @@ -95,12 +166,12 @@ describe('hooks basics', () => { }); return service.get(1) - .then(result => assert.strictEqual(result, null)); + .then((result: any) => assert.strictEqual(result, null)); }); it('invalid type in .hooks throws error', () => { const app = feathers().use('/dummy', { - get (id, params) { + get (id: any, params: any) { return Promise.resolve({ id, params }); } }); @@ -111,13 +182,13 @@ describe('hooks basics', () => { }); assert.ok(false); } catch (e) { - assert.strictEqual(e.message, `'invalid' is not a valid hook type`); + assert.strictEqual(e.message, '\'invalid\' is not a valid hook type'); } }); it('invalid hook method throws error', () => { const app = feathers().use('/dummy', { - get (id, params) { + get (id: any, params: any) { return Promise.resolve({ id, params }); } }); @@ -130,13 +201,13 @@ describe('hooks basics', () => { }); assert.ok(false); } catch (e) { - assert.strictEqual(e.message, `'invalid' is not a valid hook method`); + assert.strictEqual(e.message, '\'invalid\' is not a valid hook method'); } }); it('registering an already hooked service works (#154)', () => { const app = feathers().use('/dummy', { - get (id, params) { + get (id: any, params: any) { return Promise.resolve({ id, params }); } }); @@ -146,25 +217,25 @@ describe('hooks basics', () => { it('not returning a promise errors', () => { const app = feathers().use('/dummy', { - get () { + async get () { return {}; } }); - return app.service('dummy').get(1).catch(e => { - assert.strictEqual(e.message, `Service method 'get' for 'dummy' service must return a promise`); + return app.service('dummy').get(1).catch((e: any) => { + assert.strictEqual(e.message, 'Service method \'get\' for \'dummy\' service must return a promise'); }); }); describe('returns the hook object when passing true as last parameter', () => { it('on normal method call', () => { const app = feathers().use('/dummy', { - get (id, params) { + get (id: any, params: any) { return Promise.resolve({ id, params }); } }); - return app.service('dummy').get(10, {}, true).then(context => { + return app.service('dummy').get(10, {}, true).then((context: any) => { assert.strictEqual(context.service, app.service('dummy')); assert.strictEqual(context.type, 'after'); assert.strictEqual(context.path, 'dummy'); @@ -182,7 +253,7 @@ describe('hooks basics', () => { } }); - return app.service('dummy').get(10, {}, true).catch(context => { + return app.service('dummy').get(10, {}, true).catch((context: any) => { assert.strictEqual(context.service, app.service('dummy')); assert.strictEqual(context.type, 'error'); assert.strictEqual(context.path, 'dummy'); @@ -192,12 +263,12 @@ describe('hooks basics', () => { it('on argument validation error (https://github.com/feathersjs/express/issues/19)', () => { const app = feathers().use('/dummy', { - get (id) { + get (id: string) { return Promise.resolve({ id }); } }); - return app.service('dummy').get(undefined, {}, true).catch(context => { + return app.service('dummy').get(undefined, {}, true).catch((context: any) => { assert.strictEqual(context.service, app.service('dummy')); assert.strictEqual(context.type, 'error'); assert.strictEqual(context.path, 'dummy'); @@ -207,20 +278,20 @@ describe('hooks basics', () => { it('on error in error hook (https://github.com/feathersjs/express/issues/21)', () => { const app = feathers().use('/dummy', { - get (id) { + get () { return Promise.reject(new Error('Nope')); } }); app.service('dummy').hooks({ error: { - get (context) { + get () { throw new Error('Error in error hook'); } } }); - return app.service('dummy').get(10, {}, true).catch(context => { + return app.service('dummy').get(10, {}, true).catch((context: any) => { assert.strictEqual(context.service, app.service('dummy')); assert.strictEqual(context.type, 'error'); assert.strictEqual(context.path, 'dummy'); @@ -237,12 +308,12 @@ describe('hooks basics', () => { }); app.service('dummy').hooks({ - error (context) { + error (context: any) { context.result = result; } }); - return app.service('dummy').get(10, {}, true).then(hook => { + return app.service('dummy').get(10, {}, true).then((hook: any) => { assert.ok(hook.error); assert.deepStrictEqual(hook.result, result); }).catch(() => { @@ -256,13 +327,15 @@ describe('hooks basics', () => { methods: { custom: ['id', 'data', 'params'] }, - get () {}, - custom (id, data, params) { + async get (id: Id) { + return { id }; + }, + custom (id: any, data: any, params: any) { return Promise.resolve([id, data, params]); }, // activateHooks is usable as a decorator: @activateHooks(['id', 'data', 'params']) - other: feathers.activateHooks(['id', 'data', 'params'])( - (id, data, params) => { + other: activateHooks(['id', 'data', 'params'])( + (id: any, data: any, params: any) => { return Promise.resolve([id, data, params]); } ) @@ -270,18 +343,18 @@ describe('hooks basics', () => { app.service('dummy').hooks({ before: { - all (context) { + all (context: any) { context.test = ['all::before']; }, - custom (context) { + custom (context: any) { context.test.push('custom::before'); } }, after: { - all (context) { + all (context: any) { context.test.push('all::after'); }, - custom (context) { + custom (context: any) { context.test.push('custom::after'); } } @@ -301,12 +374,12 @@ describe('hooks basics', () => { }); return app.service('dummy').custom(...args, true) - .then(hook => { + .then((hook: any) => { assert.deepStrictEqual(hook.result, args); assert.deepStrictEqual(hook.test, ['all::before', 'custom::before', 'all::after', 'custom::after']); app.service('dummy').other(...args, true) - .then(hook => { + .then((hook: any) => { assert.deepStrictEqual(hook.result, args); assert.deepStrictEqual(hook.test, ['all::before', 'all::after']); }); @@ -318,18 +391,20 @@ describe('hooks basics', () => { methods: { custom: ['id', 'params'] }, - get () {}, - custom (id, params) { + async get (id: Id) { + return { id }; + }, + custom (id: any, params: any) { return Promise.resolve([id, params]); } }); app.service('dummy').hooks({ before: { - all (context) { + all (context: any) { context.test = ['all::before']; }, - custom (context) { + custom (context: any) { context.data = { post: 'title' }; } } @@ -338,19 +413,19 @@ describe('hooks basics', () => { const args = [1, { provider: 'rest' }]; return app.service('dummy').custom(...args) - .then(result => { + .then((result: any) => { assert.deepStrictEqual(result, args); }); }); it('normalizes params to object even when it is falsy (#1001)', () => { const app = feathers().use('/dummy', { - get (id, params) { + get (id: any, params: any) { return Promise.resolve({ id, params }); } }); - return app.service('dummy').get('test', null).then(result => { + return app.service('dummy').get('test', null).then((result: any) => { assert.deepStrictEqual(result, { id: 'test', params: {} diff --git a/packages/feathers/test/hooks/with-hooks.test.js b/packages/feathers/test/hooks/with-hooks.test.js deleted file mode 100755 index a053709676..0000000000 --- a/packages/feathers/test/hooks/with-hooks.test.js +++ /dev/null @@ -1,129 +0,0 @@ - -const assert = require('assert'); -const feathers = require('../../lib'); -const { withHooks } = require('../../lib/hooks'); - -function createApp (findResult) { - return feathers() - .use('svc', { - create (data) { - return Promise.resolve(data); - }, - find () { - return Promise.resolve(findResult); - } - }); -} - -const testHook = hook => { - hook._called = 'called'; - return hook; -}; - -describe('services withHooks', () => { - it('get expected hook & object result', () => { - const data = { name: 'john' }; - const params = {}; - - const app = createApp(); - const svc = app.service('svc'); - - return withHooks({ - app, - service: svc, - method: 'create' - })({ - before: testHook - })(data, params, true) - .then(hook => { - assert.deepStrictEqual(hook.result, data, 'test result'); - assert.deepStrictEqual(hook, { - app, - params, - service: svc, - method: 'create', - path: 'svc', - data, - _called: 'called', - result: data, - type: 'after', - arguments: [ data, params ] - }, 'test hook'); - }); - }); - - it('get expected array result', () => { - const data = [{ name: 'john' }]; - - const app = createApp(); - const svc = app.service('svc'); - - return withHooks({ - app, - service: svc, - method: 'create' - })({ - before: testHook - })(data) - .then(result => { - assert.deepStrictEqual(result, data, 'test result'); - }); - }); - - it('get expected find result', () => { - const data = { total: 1, data: [{ name: 'john' }] }; - - const app = createApp(data); - const svc = app.service('svc'); - - return withHooks({ - app, - service: svc, - method: 'find' - })({ - before: testHook - })() - .then(result => { - assert.deepStrictEqual(result, data, 'test result'); - }); - }); - - it('get expected find result with no hooks at all', () => { - const data = { total: 1, data: [{ name: 'john' }] }; - - const app = createApp(data); - const svc = app.service('svc'); - - return withHooks({ - app, - service: svc, - method: 'find' - })()().then(result => { - assert.deepStrictEqual(result, data, 'test result'); - }); - }); - - it('test using keep hook', () => { - const data = [{ name: 'John', job: 'dev', address: { city: 'Montreal', postal: 'H4T 2A1' } }]; - - const app = createApp(); - const svc = app.service('svc'); - - return withHooks({ - app, - service: svc, - method: 'create' - })({ - after: context => { - (Array.isArray(context.result) ? context.result : [context.result]) - .forEach(value => { - delete value.job; - delete value.address.postal; - }); - } - })(data) - .then(result => { - assert.deepStrictEqual(result, [{ name: 'John', address: { city: 'Montreal' } }]); - }); - }); -}); diff --git a/packages/feathers/tsconfig.json b/packages/feathers/tsconfig.json new file mode 100644 index 0000000000..316fd41336 --- /dev/null +++ b/packages/feathers/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "include": [ + "src/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib" + } +} diff --git a/packages/primus-client/CHANGELOG.md b/packages/primus-client/CHANGELOG.md deleted file mode 100644 index 1f821c204e..0000000000 --- a/packages/primus-client/CHANGELOG.md +++ /dev/null @@ -1,415 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - - -### Bug Fixes - -* Change this reference in client libraries to explicitly passed app ([#1597](https://github.com/feathersjs/feathers/issues/1597)) ([4e4d10a](https://github.com/feathersjs/feathers/commit/4e4d10a)) - - - - - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - - -### Bug Fixes - -* Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - - - - - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - - -### Bug Fixes - -* Use `export =` in TypeScript definitions ([#1285](https://github.com/feathersjs/feathers/issues/1285)) ([12d0f4b](https://github.com/feathersjs/feathers/commit/12d0f4b)) - - - - - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - - -### Bug Fixes - -* Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -* Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) - - -### Features - -* Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) - - - - - -## [1.1.7](https://github.com/feathersjs/feathers/compare/@feathersjs/primus-client@1.1.6...@feathersjs/primus-client@1.1.7) (2019-01-02) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - - -## [1.1.6](https://github.com/feathersjs/feathers/compare/@feathersjs/primus-client@1.1.5...@feathersjs/primus-client@1.1.6) (2018-12-16) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - - -## [1.1.5](https://github.com/feathersjs/feathers/compare/@feathersjs/primus-client@1.1.4...@feathersjs/primus-client@1.1.5) (2018-10-25) - - -### Bug Fixes - -* Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) - - - - - - -## [1.1.4](https://github.com/feathersjs/feathers/compare/@feathersjs/primus-client@1.1.3...@feathersjs/primus-client@1.1.4) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - - -## [1.1.3](https://github.com/feathersjs/feathers/compare/@feathersjs/primus-client@1.1.2...@feathersjs/primus-client@1.1.3) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/primus-client - - - - - - -## [1.1.2](https://github.com/feathersjs/feathers/compare/@feathersjs/primus-client@1.1.1...@feathersjs/primus-client@1.1.2) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/primus-client - - -## 1.1.1 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v1.1.0](https://github.com/feathersjs/primus-client/tree/v1.1.0) (2018-02-09) -[Full Changelog](https://github.com/feathersjs/primus-client/compare/v1.0.3...v1.1.0) - -**Merged pull requests:** - -- Update @feathersjs/transport-commons to the latest version 🚀 [\#12](https://github.com/feathersjs/primus-client/pull/12) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.3](https://github.com/feathersjs/primus-client/tree/v1.0.3) (2018-02-05) -[Full Changelog](https://github.com/feathersjs/primus-client/compare/v1.0.2...v1.0.3) - -**Merged pull requests:** - -- Move to use transport-commons [\#11](https://github.com/feathersjs/primus-client/pull/11) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#10](https://github.com/feathersjs/primus-client/pull/10) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update ws to the latest version 🚀 [\#9](https://github.com/feathersjs/primus-client/pull/9) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.2](https://github.com/feathersjs/primus-client/tree/v1.0.2) (2018-01-03) -[Full Changelog](https://github.com/feathersjs/primus-client/compare/v1.0.1...v1.0.2) - -**Merged pull requests:** - -- Update readme to correspond with latest release [\#8](https://github.com/feathersjs/primus-client/pull/8) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#7](https://github.com/feathersjs/primus-client/pull/7) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-memory to the latest version 🚀 [\#6](https://github.com/feathersjs/primus-client/pull/6) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update uws to the latest version 🚀 [\#5](https://github.com/feathersjs/primus-client/pull/5) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.1](https://github.com/feathersjs/primus-client/tree/v1.0.1) (2017-11-16) -[Full Changelog](https://github.com/feathersjs/primus-client/compare/v1.0.0...v1.0.1) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#4](https://github.com/feathersjs/primus-client/pull/4) ([daffl](https://github.com/daffl)) - -## [v1.0.0](https://github.com/feathersjs/primus-client/tree/v1.0.0) (2017-11-01) -[Full Changelog](https://github.com/feathersjs/primus-client/compare/v1.0.0-pre.2...v1.0.0) - -**Merged pull requests:** - -- Update dependencies for release [\#3](https://github.com/feathersjs/primus-client/pull/3) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.2](https://github.com/feathersjs/primus-client/tree/v1.0.0-pre.2) (2017-10-23) -[Full Changelog](https://github.com/feathersjs/primus-client/compare/v1.0.0-pre.1...v1.0.0-pre.2) - -**Merged pull requests:** - -- Use scoped npm packages [\#2](https://github.com/feathersjs/primus-client/pull/2) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.1](https://github.com/feathersjs/primus-client/tree/v1.0.0-pre.1) (2017-10-19) -**Merged pull requests:** - -- Update dependencies to enable Greenkeeper 🌴 [\#1](https://github.com/feathersjs/primus-client/pull/1) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - - - -\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* diff --git a/packages/primus-client/README.md b/packages/primus-client/README.md deleted file mode 100644 index 112209e509..0000000000 --- a/packages/primus-client/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/primus-client - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/primus-client)](https://david-dm.org/feathersjs/feathers?path=packages/primus-client) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/primus-client.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/primus-client) - -> Client services for Primus and feathers-primus - -## Installation - -``` -npm install @feathersjs/primus-client --save -``` - -## Documentation - -Refer to the [Feathers Primus client API documentation](https://docs.feathersjs.com/api/client/primus.html) for more details. - -## License - -Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/primus-client/index.d.ts b/packages/primus-client/index.d.ts deleted file mode 100644 index d394ee41ec..0000000000 --- a/packages/primus-client/index.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Primus removed its typings from the repo -// https://github.com/primus/primus/pull/623, as of 01/2018 there are none on -// DefinitelyTyped. - -declare const primusClient: FeathersPrimusClient; -export = primusClient; - -interface FeathersPrimusClient { - (socket: any, options?: primusClient.Options): () => void; - default: FeathersPrimusClient; -} - -declare namespace primusClient { - interface Options { - timeout?: number; - } -} diff --git a/packages/primus-client/lib/index.js b/packages/primus-client/lib/index.js deleted file mode 100644 index afd97f05b7..0000000000 --- a/packages/primus-client/lib/index.js +++ /dev/null @@ -1,32 +0,0 @@ -const Service = require('@feathersjs/transport-commons/client'); - -function primusClient (connection, options) { - if (!connection) { - throw new Error('Primus connection needs to be provided'); - } - - const defaultService = function (name) { - return new Service(Object.assign({}, options, { - name, - connection, - method: 'send' - })); - }; - - const initialize = function (app) { - if (typeof app.defaultService === 'function') { - throw new Error('Only one default client provider can be configured'); - } - - app.primus = connection; - app.defaultService = defaultService; - }; - - initialize.Service = Service; - initialize.service = defaultService; - - return initialize; -} - -module.exports = primusClient; -module.exports.default = primusClient; diff --git a/packages/primus-client/package.json b/packages/primus-client/package.json deleted file mode 100644 index 9c41188bf1..0000000000 --- a/packages/primus-client/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "@feathersjs/primus-client", - "description": "Client services for Primus and feathers-primus", - "version": "4.5.11", - "homepage": "https://feathersjs.com", - "main": "lib/index.js", - "types": "index.d.ts", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "test": "mocha --config ../../.mocharc.json" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/transport-commons": "^4.5.11" - }, - "devDependencies": { - "@feathersjs/commons": "^4.5.11", - "@feathersjs/feathers": "^4.5.11", - "@feathersjs/primus": "^4.5.11", - "@feathersjs/tests": "^4.5.11", - "feathers-memory": "^4.1.0", - "mocha": "^8.2.1", - "ws": "^7.4.1" - }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" -} diff --git a/packages/primus-client/test/index.test.js b/packages/primus-client/test/index.test.js deleted file mode 100644 index 25e480ddf4..0000000000 --- a/packages/primus-client/test/index.test.js +++ /dev/null @@ -1,80 +0,0 @@ -const assert = require('assert'); -const feathers = require('@feathersjs/feathers'); -const baseTests = require('@feathersjs/tests/lib/client'); - -const server = require('./server'); -const primus = require('../lib'); - -describe('feathers-primus/client', () => { - let srv; - let socket; - - const app = feathers().configure(primus({}, { timeout: 500 })); - const service = app.service('todos'); - - before(done => { - srv = server(primus => { - service.connection = socket = new primus.Socket('http://localhost:12012'); - }).listen(12012); - - srv.on('listening', () => done()); - }); - - after(done => { - socket.socket.close(); - srv.close(done); - }); - - it('exports default', () => { - assert.strictEqual(primus.default, primus); - }); - - it('throws an error with no connection', () => { - try { - feathers().configure(primus()); - assert.ok(false); - } catch (e) { - assert.strictEqual(e.message, 'Primus connection needs to be provided'); - } - }); - - it('app has the primus attribute', () => { - assert.ok(app.primus); - }); - - it('throws an error when configured twice', () => { - try { - app.configure(primus({})); - assert.ok(false, 'Should never get here'); - } catch (e) { - assert.strictEqual(e.message, 'Only one default client provider can be configured'); - } - }); - - it('can initialize a client instance', () => { - const init = primus(service.connection); - const todos = init.service('todos'); - - assert.ok(todos instanceof init.Service, 'Returned service is a client'); - - return todos.find().then(todos => assert.deepEqual(todos, [ // eslint-disable-line - { - text: 'some todo', - complete: false, - id: 0 - } - ])); - }); - - it('times out with error when using non-existent service', () => { - const notMe = app.service('not-me'); - // Hack because we didn't set the connection at the beginning - notMe.connection = socket; - - return notMe.remove(1).catch(e => { - assert.strictEqual(e.message, `Service 'not-me' not found`); - }); - }); - - baseTests(service); -}); diff --git a/packages/primus-client/test/server.js b/packages/primus-client/test/server.js deleted file mode 100644 index 95247b9464..0000000000 --- a/packages/primus-client/test/server.js +++ /dev/null @@ -1,43 +0,0 @@ -const feathers = require('@feathersjs/feathers'); -const primus = require('@feathersjs/primus'); -const { Service } = require('feathers-memory'); - -// eslint-disable-next-line no-extend-native -Object.defineProperty(Error.prototype, 'toJSON', { - value: function () { - var alt = {}; - - Object.getOwnPropertyNames(this).forEach(function (key) { - alt[key] = this[key]; - }, this); - - return alt; - }, - configurable: true -}); - -class TodoService extends Service { - get (id, params) { - if (params.query.error) { - return Promise.reject(new Error('Something went wrong')); - } - - return super.get(id) - .then(data => Object.assign({ query: params.query }, data)); - } -} - -module.exports = function (cb) { - const app = feathers() - .configure(primus({ - transformer: 'websockets' - }, cb)) - .use('/todos', new TodoService()); - - app.service('todos').create({ - text: 'some todo', - complete: false - }); - - return app; -}; diff --git a/packages/primus/CHANGELOG.md b/packages/primus/CHANGELOG.md deleted file mode 100644 index bf91853450..0000000000 --- a/packages/primus/CHANGELOG.md +++ /dev/null @@ -1,591 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - - -### Bug Fixes - -* Typing improvements ([#1580](https://github.com/feathersjs/feathers/issues/1580)) ([7818aec](https://github.com/feathersjs/feathers/commit/7818aec)) - - - - - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - - -### Bug Fixes - -* Use WeakMap to connect socket to connection ([#1509](https://github.com/feathersjs/feathers/issues/1509)) ([64807e3](https://github.com/feathersjs/feathers/commit/64807e3)) - - - - - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -**Note:** Version bump only for package @feathersjs/primus - - - - - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - - -### Bug Fixes - -* Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - - - - - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - - -### Bug Fixes - -* Use `export =` in TypeScript definitions ([#1285](https://github.com/feathersjs/feathers/issues/1285)) ([12d0f4b](https://github.com/feathersjs/feathers/commit/12d0f4b)) - - -### Features - -* Add global disconnect event ([#1355](https://github.com/feathersjs/feathers/issues/1355)) ([85afcca](https://github.com/feathersjs/feathers/commit/85afcca)) - - - - - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - - -### Features - -* Add params.headers to all transports when available ([#1303](https://github.com/feathersjs/feathers/issues/1303)) ([ebce79b](https://github.com/feathersjs/feathers/commit/ebce79b)) - - - - - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - - -### Bug Fixes - -* Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -* Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -* **package:** update debug to version 3.0.0 ([#59](https://github.com/feathersjs/feathers/issues/59)) ([fedcf06](https://github.com/feathersjs/feathers/commit/fedcf06)) - - -### Features - -* Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) - - - - - -## [3.2.8](https://github.com/feathersjs/feathers/compare/@feathersjs/primus@3.2.7...@feathersjs/primus@3.2.8) (2019-01-02) - -**Note:** Version bump only for package @feathersjs/primus - - - - - - -## [3.2.7](https://github.com/feathersjs/feathers/compare/@feathersjs/primus@3.2.6...@feathersjs/primus@3.2.7) (2018-12-16) - -**Note:** Version bump only for package @feathersjs/primus - - - - - - -## [3.2.6](https://github.com/feathersjs/feathers/compare/@feathersjs/primus@3.2.5...@feathersjs/primus@3.2.6) (2018-10-25) - - -### Bug Fixes - -* Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) - - - - - - -## [3.2.5](https://github.com/feathersjs/feathers/compare/@feathersjs/primus@3.2.4...@feathersjs/primus@3.2.5) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/primus - - - - - - -## [3.2.4](https://github.com/feathersjs/feathers/compare/@feathersjs/primus@3.2.3...@feathersjs/primus@3.2.4) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/primus - - - - - - -## [3.2.3](https://github.com/feathersjs/feathers/compare/@feathersjs/primus@3.2.2...@feathersjs/primus@3.2.3) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/primus - - -## 3.2.2 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v3.2.1](https://github.com/feathersjs/primus/tree/v3.2.1) (2018-06-03) -[Full Changelog](https://github.com/feathersjs/primus/compare/v3.2.0...v3.2.1) - -**Merged pull requests:** - -- Update uberproto to the latest version 🚀 [\#80](https://github.com/feathersjs/primus/pull/80) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update uws to the latest version 🚀 [\#79](https://github.com/feathersjs/primus/pull/79) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update ws to the latest version 🚀 [\#78](https://github.com/feathersjs/primus/pull/78) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.2.0](https://github.com/feathersjs/primus/tree/v3.2.0) (2018-02-09) -[Full Changelog](https://github.com/feathersjs/primus/compare/v3.1.0...v3.2.0) - -**Merged pull requests:** - -- Update @feathersjs/transport-commons to the latest version 🚀 [\#77](https://github.com/feathersjs/primus/pull/77) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.1.0](https://github.com/feathersjs/primus/tree/v3.1.0) (2018-01-30) -[Full Changelog](https://github.com/feathersjs/primus/compare/v3.0.3...v3.1.0) - -**Merged pull requests:** - -- Update dependency to @feathersjs/transport-commons [\#76](https://github.com/feathersjs/primus/pull/76) ([daffl](https://github.com/daffl)) - -## [v3.0.3](https://github.com/feathersjs/primus/tree/v3.0.3) (2018-01-18) -[Full Changelog](https://github.com/feathersjs/primus/compare/v3.0.2...v3.0.3) - -**Merged pull requests:** - -- Remove setMaxListeners [\#75](https://github.com/feathersjs/primus/pull/75) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#74](https://github.com/feathersjs/primus/pull/74) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update ws to the latest version 🚀 [\#73](https://github.com/feathersjs/primus/pull/73) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.0.2](https://github.com/feathersjs/primus/tree/v3.0.2) (2018-01-03) -[Full Changelog](https://github.com/feathersjs/primus/compare/v3.0.1...v3.0.2) - -**Merged pull requests:** - -- Update documentation to correspond with latest release [\#72](https://github.com/feathersjs/primus/pull/72) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#71](https://github.com/feathersjs/primus/pull/71) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-memory to the latest version 🚀 [\#70](https://github.com/feathersjs/primus/pull/70) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update uws to the latest version 🚀 [\#69](https://github.com/feathersjs/primus/pull/69) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.0.1](https://github.com/feathersjs/primus/tree/v3.0.1) (2017-11-16) -[Full Changelog](https://github.com/feathersjs/primus/compare/v3.0.0...v3.0.1) - -**Merged pull requests:** - -- Add default ES module default exports to make TypeScript integration … [\#68](https://github.com/feathersjs/primus/pull/68) ([daffl](https://github.com/daffl)) - -## [v3.0.0](https://github.com/feathersjs/primus/tree/v3.0.0) (2017-11-01) -[Full Changelog](https://github.com/feathersjs/primus/compare/v2.2.1...v3.0.0) - -**Merged pull requests:** - -- Update dependencies for release [\#67](https://github.com/feathersjs/primus/pull/67) ([daffl](https://github.com/daffl)) -- Throw an error when using an incompatible version of Feathers [\#66](https://github.com/feathersjs/primus/pull/66) ([daffl](https://github.com/daffl)) - -## [v2.2.1](https://github.com/feathersjs/primus/tree/v2.2.1) (2017-10-31) -[Full Changelog](https://github.com/feathersjs/primus/compare/v3.0.0-pre.4...v2.2.1) - -**Merged pull requests:** - -- Add an error when trying to use earlier versions with Feathers v3 [\#65](https://github.com/feathersjs/primus/pull/65) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.4](https://github.com/feathersjs/primus/tree/v3.0.0-pre.4) (2017-10-25) -[Full Changelog](https://github.com/feathersjs/primus/compare/v3.0.0-pre.3...v3.0.0-pre.4) - -## [v3.0.0-pre.3](https://github.com/feathersjs/primus/tree/v3.0.0-pre.3) (2017-10-23) -[Full Changelog](https://github.com/feathersjs/primus/compare/v3.0.0-pre.2...v3.0.0-pre.3) - -**Merged pull requests:** - -- Updates for Feathers v3 \(Buzzard\) [\#64](https://github.com/feathersjs/primus/pull/64) ([daffl](https://github.com/daffl)) -- Update to use npm scopes [\#63](https://github.com/feathersjs/primus/pull/63) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.2](https://github.com/feathersjs/primus/tree/v3.0.0-pre.2) (2017-10-19) -[Full Changelog](https://github.com/feathersjs/primus/compare/v3.0.0-pre.1...v3.0.0-pre.2) - -## [v3.0.0-pre.1](https://github.com/feathersjs/primus/tree/v3.0.0-pre.1) (2017-10-18) -[Full Changelog](https://github.com/feathersjs/primus/compare/v2.2.0...v3.0.0-pre.1) - -**Closed issues:** - -- An in-range update of babel-core is breaking the build 🚨 [\#56](https://github.com/feathersjs/primus/issues/56) -- Update npm version [\#55](https://github.com/feathersjs/primus/issues/55) - -**Merged pull requests:** - -- Compatibility and updates for Feathers v3 [\#62](https://github.com/feathersjs/primus/pull/62) ([daffl](https://github.com/daffl)) -- Update to new plugin infrastructure [\#61](https://github.com/feathersjs/primus/pull/61) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#60](https://github.com/feathersjs/primus/pull/60) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update debug to the latest version 🚀 [\#59](https://github.com/feathersjs/primus/pull/59) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update primus type definition [\#58](https://github.com/feathersjs/primus/pull/58) ([Sieabah](https://github.com/Sieabah)) -- Update uws to the latest version 🚀 [\#57](https://github.com/feathersjs/primus/pull/57) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.2.0](https://github.com/feathersjs/primus/tree/v2.2.0) (2017-05-29) -[Full Changelog](https://github.com/feathersjs/primus/compare/v2.1.0...v2.2.0) - -**Closed issues:** - -- An in-range update of feathers-hooks is breaking the build 🚨 [\#53](https://github.com/feathersjs/primus/issues/53) -- An in-range update of debug is breaking the build 🚨 [\#52](https://github.com/feathersjs/primus/issues/52) -- An in-range update of primus is breaking the build 🚨 [\#51](https://github.com/feathersjs/primus/issues/51) -- An in-range update of uws is breaking the build 🚨 [\#50](https://github.com/feathersjs/primus/issues/50) -- Expose headers and remote ip on feathers object [\#46](https://github.com/feathersjs/primus/issues/46) -- docs are out of date [\#28](https://github.com/feathersjs/primus/issues/28) - -**Merged pull requests:** - -- Update ws to the latest version 🚀 [\#54](https://github.com/feathersjs/primus/pull/54) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#49](https://github.com/feathersjs/primus/pull/49) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-hooks to the latest version 🚀 [\#48](https://github.com/feathersjs/primus/pull/48) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#47](https://github.com/feathersjs/primus/pull/47) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update uws to version 0.14.0 🚀 [\#45](https://github.com/feathersjs/primus/pull/45) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v2.1.0](https://github.com/feathersjs/primus/tree/v2.1.0) (2017-03-01) -[Full Changelog](https://github.com/feathersjs/primus/compare/v2.0.0...v2.1.0) - -**Closed issues:** - -- Issues with using feathers-primus/client and feathers-client [\#41](https://github.com/feathersjs/primus/issues/41) -- Any breaking change in 2.0.0? [\#39](https://github.com/feathersjs/primus/issues/39) - -**Merged pull requests:** - -- Update uws to version 0.13.0 🚀 [\#44](https://github.com/feathersjs/primus/pull/44) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Typescript Definitions [\#43](https://github.com/feathersjs/primus/pull/43) ([AbraaoAlves](https://github.com/AbraaoAlves)) -- Update ws to version 2.0.0 🚀 [\#42](https://github.com/feathersjs/primus/pull/42) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update uws to version 0.12.0 🚀 [\#37](https://github.com/feathersjs/primus/pull/37) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v2.0.0](https://github.com/feathersjs/primus/tree/v2.0.0) (2016-12-02) -[Full Changelog](https://github.com/feathersjs/primus/compare/v1.4.1...v2.0.0) - -**Closed issues:** - -- uws [\#36](https://github.com/feathersjs/primus/issues/36) - -**Merged pull requests:** - -- Update feathers-memory to version 1.0.0 🚀 [\#35](https://github.com/feathersjs/primus/pull/35) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-commons to version 0.8.0 🚀 [\#34](https://github.com/feathersjs/primus/pull/34) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Swapping rm to rifraf and using relative path to \_mocha for windows support [\#33](https://github.com/feathersjs/primus/pull/33) ([corymsmith](https://github.com/corymsmith)) -- Update primus to version 6.0.5 🚀 [\#32](https://github.com/feathersjs/primus/pull/32) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- jshint —\> semistandard [\#30](https://github.com/feathersjs/primus/pull/30) ([corymsmith](https://github.com/corymsmith)) -- adding code coverage [\#29](https://github.com/feathersjs/primus/pull/29) ([ekryski](https://github.com/ekryski)) -- Update feathers-memory to version 0.8.0 🚀 [\#24](https://github.com/feathersjs/primus/pull/24) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update mocha to version 3.0.0 🚀 [\#22](https://github.com/feathersjs/primus/pull/22) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.4.1](https://github.com/feathersjs/primus/tree/v1.4.1) (2016-05-23) -[Full Changelog](https://github.com/feathersjs/primus/compare/v1.4.0...v1.4.1) - -**Merged pull requests:** - -- Update feathers-socket-commons to version 2.0.0 🚀 [\#18](https://github.com/feathersjs/primus/pull/18) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update babel-plugin-add-module-exports to version 0.2.0 🚀 [\#17](https://github.com/feathersjs/primus/pull/17) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.4.0](https://github.com/feathersjs/primus/tree/v1.4.0) (2016-04-28) -[Full Changelog](https://github.com/feathersjs/primus/compare/v1.3.3...v1.4.0) - -**Merged pull requests:** - -- Implement options for setting client timeout [\#16](https://github.com/feathersjs/primus/pull/16) ([daffl](https://github.com/daffl)) -- Update feathers-socket-commons to version 1.0.0 🚀 [\#15](https://github.com/feathersjs/primus/pull/15) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- More tests for error cases [\#14](https://github.com/feathersjs/primus/pull/14) ([daffl](https://github.com/daffl)) - -## [v1.3.3](https://github.com/feathersjs/primus/tree/v1.3.3) (2016-04-16) -[Full Changelog](https://github.com/feathersjs/primus/compare/v1.3.2...v1.3.3) - -**Merged pull requests:** - -- Increase the default number of maximum event listeners [\#13](https://github.com/feathersjs/primus/pull/13) ([daffl](https://github.com/daffl)) -- Update feathers-memory to version 0.7.0 🚀 [\#12](https://github.com/feathersjs/primus/pull/12) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update primus to version 5.0.1 🚀 [\#11](https://github.com/feathersjs/primus/pull/11) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update primus to version 5.0.0 🚀 [\#10](https://github.com/feathersjs/primus/pull/10) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.3.2](https://github.com/feathersjs/primus/tree/v1.3.2) (2016-02-11) -[Full Changelog](https://github.com/feathersjs/primus/compare/v1.3.1...v1.3.2) - -**Merged pull requests:** - -- Allow to instantiate a client instance [\#9](https://github.com/feathersjs/primus/pull/9) ([daffl](https://github.com/daffl)) - -## [v1.3.1](https://github.com/feathersjs/primus/tree/v1.3.1) (2016-02-09) -[Full Changelog](https://github.com/feathersjs/primus/compare/v1.3.0...v1.3.1) - -**Merged pull requests:** - -- Update feathers-commons to version 0.7.0 🚀 [\#8](https://github.com/feathersjs/primus/pull/8) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.3.0](https://github.com/feathersjs/primus/tree/v1.3.0) (2016-02-09) -[Full Changelog](https://github.com/feathersjs/primus/compare/v1.2.1...v1.3.0) - -**Merged pull requests:** - -- Update feathers-memory to version 0.6.0 🚀 [\#6](https://github.com/feathersjs/primus/pull/6) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update lodash to version 4.0.1 🚀 [\#5](https://github.com/feathersjs/primus/pull/5) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Adding nsp check [\#4](https://github.com/feathersjs/primus/pull/4) ([marshallswain](https://github.com/marshallswain)) - -## [v1.2.1](https://github.com/feathersjs/primus/tree/v1.2.1) (2016-01-21) -[Full Changelog](https://github.com/feathersjs/primus/compare/v1.2.0...v1.2.1) - -## [v1.2.0](https://github.com/feathersjs/primus/tree/v1.2.0) (2016-01-21) -[Full Changelog](https://github.com/feathersjs/primus/compare/v1.1.0...v1.2.0) - -**Merged pull requests:** - -- Refactoring to use feathers-socket-commons that support event filtering [\#3](https://github.com/feathersjs/primus/pull/3) ([daffl](https://github.com/daffl)) - -## [v1.1.0](https://github.com/feathersjs/primus/tree/v1.1.0) (2016-01-10) -[Full Changelog](https://github.com/feathersjs/primus/compare/v1.0.0...v1.1.0) - -**Merged pull requests:** - -- feathers-primus/client service and tests [\#1](https://github.com/feathersjs/primus/pull/1) ([daffl](https://github.com/daffl)) - -## [v1.0.0](https://github.com/feathersjs/primus/tree/v1.0.0) (2016-01-03) - - -\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* diff --git a/packages/primus/LICENSE b/packages/primus/LICENSE deleted file mode 100644 index 7139cac0dd..0000000000 --- a/packages/primus/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2020 Feathers - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/primus/README.md b/packages/primus/README.md deleted file mode 100644 index ed205180f7..0000000000 --- a/packages/primus/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/primus - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/primus)](https://david-dm.org/feathersjs/feathers?path=packages/primus) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/primus.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/primus) - -> The Feathers Primus real-time API provider - -## Installation - -``` -npm install @feathersjs/primus --save -``` - -## Documentation - -Refer to the [Feathers Primus API documentation](https://docs.feathersjs.com/api/primus.html) for more details. - -## License - -Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/primus/index.d.ts b/packages/primus/index.d.ts deleted file mode 100644 index 7226d5c3ea..0000000000 --- a/packages/primus/index.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Primus removed its typings from the repo -// https://github.com/primus/primus/pull/623, as of 01/2018 there are none on -// DefinitelyTyped. - -declare const configurePrimus: FeathersPrimus; -export = configurePrimus; - -interface FeathersPrimus { - (options?: any, callback?: (primus: any) => void): (app: any) => void; - default: FeathersPrimus; -} diff --git a/packages/primus/lib/index.js b/packages/primus/lib/index.js deleted file mode 100644 index 3ebc343185..0000000000 --- a/packages/primus/lib/index.js +++ /dev/null @@ -1,88 +0,0 @@ -const { socket: commons } = require('@feathersjs/transport-commons'); -const makeDebug = require('debug'); -const Proto = require('uberproto'); -const Primus = require('primus'); -const http = require('http'); -const Emitter = require('primus-emitter'); - -const debug = makeDebug('@feathersjs/primus'); - -function configurePrimus (config, configurer) { - return function (app) { - // Returns the connection object - const getParams = spark => spark.request.feathers; - // Mapping from connection back to its socket - const socketMap = new WeakMap(); - - if (!app.version || app.version < '3.0.0') { - throw new Error('@feathersjs/primus is not compatible with this version of Feathers. Use the latest at @feathersjs/feathers.'); - } - - const done = new Promise(resolve => { - Proto.mixin({ - listen (...args) { - if (typeof this._super === 'function') { - // If `listen` already exists - // usually the case when the app has been expressified - return this._super(...args); - } - - const server = http.createServer(); - - this.setup(server); - - return server.listen(...args); - }, - - setup (server) { - debug('Setting up Primus'); - - if (!this.primus) { - const primus = this.primus = new Primus(server, config); - - primus.plugin('emitter', Emitter); - - primus.use('feathers', function (req, res, next) { - req.feathers = { - headers: Object.keys(req.headers).reduce((result, key) => { - const value = req.headers[key]; - - if (typeof value !== 'object') { - result[key] = value; - } - - return result; - }, {}), - provider: 'primus' - }; - - next(); - }, 0); - - primus.on('connection', spark => socketMap.set(getParams(spark), spark)); - primus.on('disconnection', spark => app.emit('disconnect', getParams(spark))); - } - - if (typeof configurer === 'function') { - debug('Calling Primus configuration function'); - configurer.call(this, this.primus); - } - - resolve(this.primus); - - return this._super.apply(this, arguments); - } - }, app); - }); - - app.configure(commons({ - done, - socketMap, - getParams, - emit: 'send' - })); - }; -} - -module.exports = configurePrimus; -module.exports.default = configurePrimus; diff --git a/packages/primus/package.json b/packages/primus/package.json deleted file mode 100644 index 9686b2cf00..0000000000 --- a/packages/primus/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "@feathersjs/primus", - "description": "The Feathers Primus real-time API provider", - "version": "4.5.11", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "index.d.ts", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 10" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "test": "mocha --config ../../.mocharc.json" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/transport-commons": "^4.5.11", - "debug": "^4.3.1", - "primus": "^8.0.0", - "primus-emitter": "^3.1.1", - "uberproto": "^2.0.6" - }, - "devDependencies": { - "@feathersjs/commons": "^4.5.11", - "@feathersjs/express": "^4.5.11", - "@feathersjs/feathers": "^4.5.11", - "@feathersjs/tests": "^4.5.11", - "feathers-memory": "^4.1.0", - "lodash": "^4.17.20", - "mocha": "^8.2.1", - "ws": "^7.4.1" - }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" -} diff --git a/packages/primus/test/events.js b/packages/primus/test/events.js deleted file mode 100644 index 784303a181..0000000000 --- a/packages/primus/test/events.js +++ /dev/null @@ -1,221 +0,0 @@ -const assert = require('assert'); -const { verify } = require('@feathersjs/tests/lib/fixture'); - -module.exports = function (name, options) { - const call = (method, ...args) => { - return new Promise((resolve, reject) => { - const { socket } = options; - const emitArgs = [ method, name ].concat(args); - - socket.send(...emitArgs, (error, result) => - error ? reject(error) : resolve(result) - ); - }); - }; - - const verifyEvent = (done, callback) => { - return function (data) { - try { - callback(data); - done(); - } catch (error) { - done(error); - } - }; - }; - - describe(`Basic ${name} service events`, () => { - let socket; - let connection; - - before(done => { - setTimeout(() => { - socket = new options.primus.Socket('http://localhost:7888'); - - options.app.once('connection', conn => { - connection = conn; - - options.app.channel('default').join(connection); - options.app.publish(() => options.app.channel('default')); - - done(); - }); - }, 250); - }); - - after(() => { - socket.socket.close(); - }); - - it(`${name} created`, done => { - let original = { - name: `created event` - }; - - socket.once(`${name} created`, verifyEvent(done, data => - verify.create(original, data) - )); - - call('create', original); - }); - - it(`${name} updated`, done => { - let original = { - name: `updated event` - }; - - socket.once(`${name} updated`, verifyEvent(done, data => - verify.update(10, original, data) - )); - - call('update', 10, original); - }); - - it(`${name} patched`, done => { - let original = { - name: `patched event` - }; - - socket.once(`${name} patched`, verifyEvent(done, data => - verify.patch(12, original, data) - )); - - call('patch', 12, original); - }); - - it(`${name} removed`, done => { - socket.once(`${name} removed`, verifyEvent(done, data => - verify.remove(333, data) - )); - - call('remove', 333); - }); - - it(`${name} custom events`, done => { - let service = options.app.service(name); - let original = { - name: `created event` - }; - let old = service.create; - - service.create = function (data) { - this.emit('log', { message: 'Custom log event', data }); - service.create = old; - return old.apply(this, arguments); - }; - - socket.once(`${name} log`, verifyEvent(done, data => { - // Primus does something that makes strict equal fail - assert.deepEqual(data, { // eslint-disable-line - message: `Custom log event`, data: original - }); - service.create = old; - })); - - call('create', original); - }); - }); - - describe('Event channels', () => { - const eventName = `${name} created`; - let connections; - let sockets; - - before(done => { - let counter = 0; - - connections = []; - sockets = []; - - options.app.on('connection', connection => { - if (connection.channel) { - counter++; - - options.app.channel(connection.channel).join(connection); - - connections.push(connection); - - if (counter === 3) { - done(); - } - } - }); - - sockets.push( - new options.primus.Socket('http://localhost:7888?channel=first'), - new options.primus.Socket('http://localhost:7888?channel=second'), - new options.primus.Socket('http://localhost:7888?channel=second') - ); - }); - - after(done => { - let counter = 0; - - sockets.forEach(socket => { - socket.once('close', () => { - if (++counter === sockets.length) { - done(); - } - }); - socket.socket.close(); - }); - }); - - it(`filters '${eventName}' event for a single channel`, done => { - const service = options.app.service(name); - const [ socket, otherSocket ] = sockets; - const onError = () => { - done(new Error('Should not get this event')); - }; - - service.publish('created', data => - options.app.channel(data.room) - ); - - socket.once(eventName, data => { - assert.strictEqual(data.room, 'first'); - otherSocket.removeListener(eventName, onError); - done(); - }); - - otherSocket.once(eventName, onError); - - service.create({ - text: 'Event dispatching test', - room: 'first' - }); - }); - - it(`filters '${name} created' event for a channel with multiple connections`, done => { - let counter = 0; - - const service = options.app.service(name); - const [ otherSocket, socketOne, socketTwo ] = sockets; - const onError = () => { - done(new Error('Should not get this event')); - }; - const onEvent = data => { - counter++; - assert.strictEqual(data.room, 'second'); - - if (++counter === 2) { - otherSocket.removeListener(eventName, onError); - done(); - } - }; - - service.publish('created', data => - options.app.channel(data.room) - ); - - socketOne.once(eventName, onEvent); - socketTwo.once(eventName, onEvent); - otherSocket.once(eventName, onError); - - service.create({ - text: 'Event dispatching test', - room: 'second' - }); - }); - }); -}; diff --git a/packages/primus/test/index.test.js b/packages/primus/test/index.test.js deleted file mode 100644 index e1b0b3b233..0000000000 --- a/packages/primus/test/index.test.js +++ /dev/null @@ -1,216 +0,0 @@ -const feathers = require('@feathersjs/feathers'); -const express = require('@feathersjs/express'); -const assert = require('assert'); -const request = require('request'); -const omit = require('lodash/omit'); -const extend = require('lodash/extend'); -const { Service } = require('@feathersjs/tests/lib/fixture'); - -const primus = require('../lib'); -const methodTests = require('./methods.js'); -const eventTests = require('./events'); - -describe('@feathersjs/primus', () => { - let options = { - socketParams: { - user: { name: 'David' }, - provider: 'primus' - } - }; - - before(done => { - const errorHook = function (hook) { - if (hook.params.query.hookError) { - throw new Error(`Error from ${hook.method}, ${hook.type} hook`); - } - }; - const app = options.app = feathers() - .configure(primus({ - transformer: 'websockets' - }, function (primus) { - primus.authorize(function (req, done) { - req.feathers.user = { name: 'David' }; - options.socketParams.headers = req.feathers.headers; - - const { channel } = req.query; - - if (channel) { - req.feathers.channel = channel; - } - - done(); - }); - - options.primus = primus; - options.socket = new primus.Socket('http://localhost:7888'); - })) - .use('todo', Service); - - app.service('todo').hooks({ - before: { get: errorHook } - }); - - options.server = app.listen(7888, function () { - app.use('tasks', Service); - app.service('tasks').hooks({ - before: { get: errorHook } - }); - done(); - }); - }); - - after(done => { - options.socket.socket.close(); - options.server.close(done); - }); - - it('exports default', () => { - assert.strictEqual(primus, primus.default); - }); - - it('is CommonJS compatible', () => { - assert.strictEqual(typeof require('../lib'), 'function'); - }); - - it('runs primus before setup (#131)', done => { - let counter = 0; - const app = feathers() - .configure(primus({ - transformer: 'websockets' - }, function () { - assert.strictEqual(counter, 0); - counter++; - })) - .use('/todos', { - find () { - return Promise.resolve([]); - }, - setup (app) { - assert.ok(app.primus); - assert.strictEqual(counter, 1, 'Primus configuration ran first'); - } - }); - - const srv = app.listen(9119); - srv.on('listening', () => srv.close(done)); - }); - - it('expressified app works', done => { - const data = { message: 'Hello world' }; - const app = express(feathers()) - .configure(primus({ - transformer: 'websockets' - })) - .use('/test', (req, res) => res.json(data)); - - const srv = app.listen(8993).on('listening', () => { - const url = 'http://localhost:8993/test'; - - request({ url, json: true }, (err, res) => { - assert.ok(!err); - assert.deepStrictEqual(res.body, data); - srv.close(done); - }); - }); - }); - - it('Passes handshake as service parameters.', function (done) { - const service = options.app.service('todo'); - const old = { - find: service.find, - create: service.create, - update: service.update, - remove: service.remove - }; - - service.find = function (params) { - assert.deepStrictEqual(omit(params, 'query', 'route', 'connection'), options.socketParams, - 'Handshake parameters passed on proper position'); - - return old.find.apply(this, arguments); - }; - - service.create = function (data, params) { - assert.deepStrictEqual(omit(params, 'query', 'route', 'connection'), options.socketParams, - 'Passed handshake parameters'); - - return old.create.apply(this, arguments); - }; - - service.update = function (id, data, params) { - assert.deepStrictEqual(params, extend({ - connection: options.socketParams, - route: {}, - query: { - test: 'param' - } - }, options.socketParams), 'Passed handshake parameters as query'); - - return old.update.apply(this, arguments); - }; - - options.socket.send('create', 'todo', {}, {}, error => { - assert.ok(!error); - - options.socket.send('update', 'todo', 1, {}, { test: 'param' }, () => { - assert.ok(!error); - extend(service, old); - done(); - }); - }); - }); - - it('Missing parameters in socket call works. (#88)', function (done) { - const service = options.app.service('todo'); - const old = { - find: service.find - }; - - service.find = function (params) { - assert.deepStrictEqual(omit(params, 'query', 'route', 'connection'), options.socketParams, - 'Handshake parameters passed on proper position'); - - return old.find.apply(this, arguments); - }; - - options.socket.send('find', 'todo', function () { - extend(service, old); - done(); - }); - }); - - it('connection and disconnect events (#1243, #1238)', (done) => { - const { app, primus } = options; - const mySocket = new primus.Socket('http://localhost:7888?channel=dctest'); - - app.on('connection', connection => { - if (connection.channel === 'dctest') { - assert.strictEqual(connection.channel, 'dctest'); - app.once('disconnect', disconnection => { - assert.strictEqual(disconnection.channel, 'dctest'); - done(); - }); - setTimeout(() => mySocket.end(), 100); - } - }); - - assert.ok(mySocket); - }); - - describe('Service method calls', () => { - describe('(\'method\', \'service\') event format', () => { - describe('Service', () => methodTests('todo', options)); - describe('Dynamic Service', () => methodTests('todo', options)); - }); - - describe('(\'service::method\') legacy event format', () => { - describe('Service', () => methodTests('tasks', options, true)); - describe('Dynamic Service', () => methodTests('tasks', options, true)); - }); - }); - - describe('Service events', () => { - describe('Service', () => eventTests('todo', options)); - describe('Dynamic Service', () => eventTests('tasks', options)); - }); -}); diff --git a/packages/primus/test/methods.js b/packages/primus/test/methods.js deleted file mode 100644 index ed7ab7828b..0000000000 --- a/packages/primus/test/methods.js +++ /dev/null @@ -1,113 +0,0 @@ -const assert = require('assert'); -const { verify } = require('@feathersjs/tests/lib/fixture'); - -module.exports = function (name, options, legacy = false) { - const call = (method, ...args) => - new Promise((resolve, reject) => { - const { socket } = options; - const prefix = legacy ? [ `${name}::${method}` ] - : [ method, name ]; - const emitArgs = prefix.concat(args); - - socket.send(...emitArgs, (error, result) => - error ? reject(error) : resolve(result) - ); - } - ); - - it(`invalid arguments cause an error`, () => - call('find', 1, {}).catch(e => - assert.strictEqual(e.message, 'Too many arguments for \'find\' method') - ) - ); - - it('.find', () => - call('find', {}).then(data => verify.find(data)) - ); - - it('.get', () => - call('get', 'laundry').then(data => verify.get('laundry', data)) - ); - - it('.get with error', () => - call('get', 'laundry', { error: true }) - .then(() => assert.ok(false, 'Should never get here')) - .catch(error => assert.strictEqual(error.message, 'Something for laundry went wrong')) - ); - - it('.get with runtime error', () => - call('get', 'laundry', { runtimeError: true }) - .then(() => assert.ok(false, 'Should never get here')) - .catch(error => assert.strictEqual(error.message, 'thingThatDoesNotExist is not defined')) - ); - - it('.get with error in hook', () => - call('get', 'laundry', { hookError: true }) - .then(() => assert.ok(false, 'Should never get here')) - .catch(error => assert.strictEqual(error.message, 'Error from get, before hook')) - ); - - it(`.create`, () => { - let original = { - name: `creating` - }; - - return call('create', original, {}) - .then(data => verify.create(original, data)); - }); - - it(`.create without parameters`, () => { - let original = { - name: `creating again` - }; - - return call('create', original) - .then(data => verify.create(original, data)); - }); - - it('.update', () => { - let original = { - name: 'updating' - }; - - return call('update', 23, original, {}) - .then(data => verify.update(23, original, data)); - }); - - it('.update many', () => { - const original = { - name: `updating`, - many: true - }; - - return call('update', null, original) - .then(data => verify.update(null, original, data)); - }); - - it('.patch', () => { - let original = { - name: `patching` - }; - - return call('patch', 25, original) - .then(data => verify.patch(25, original, data)); - }); - - it('.patch many', () => { - let original = { - name: `patching`, - many: true - }; - - return call('patch', null, original) - .then(data => verify.patch(null, original, data)); - }); - - it('.remove', () => - call('remove', 11).then(data => verify.remove(11, data)) - ); - - it('.remove many', () => - call('remove', null).then(data => verify.remove(null, data)) - ); -}; diff --git a/packages/rest-client/CHANGELOG.md b/packages/rest-client/CHANGELOG.md index 3d5a65ed3d..65fefd6e47 100644 --- a/packages/rest-client/CHANGELOG.md +++ b/packages/rest-client/CHANGELOG.md @@ -3,7 +3,11 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) **Note:** Version bump only for package @feathersjs/rest-client @@ -11,7 +15,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + + +## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) **Note:** Version bump only for package @feathersjs/rest-client @@ -19,6 +27,12 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline +## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) + +**Note:** Version bump only for package @feathersjs/rest-client + + + ## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) diff --git a/packages/rest-client/index.d.ts b/packages/rest-client/index.d.ts deleted file mode 100644 index 54f574b968..0000000000 --- a/packages/rest-client/index.d.ts +++ /dev/null @@ -1,40 +0,0 @@ -// todo: get rid of all the anys - -declare const restClient: FeathersRestClient; -export = restClient; - -interface FeathersRestClient { - (base?: string): restClient.Transport; - default: FeathersRestClient; -} - -declare namespace restClient { - interface HandlerResult extends Function { - /** - * initialize service - */ - (): void; - - /** - * Transport Service - */ - Service: any; - - /** - * default Service - */ - service: any; - } - - type Handler = (connection: any, options?: any) => () => HandlerResult; - - interface Transport { - jquery: Handler; - superagent: Handler; - request: Handler; - fetch: Handler; - axios: Handler; - angular: Handler; - angularHttpClient: Handler; - } -} diff --git a/packages/rest-client/lib/angular-http-client.js b/packages/rest-client/lib/angular-http-client.js deleted file mode 100644 index 529fdbc69a..0000000000 --- a/packages/rest-client/lib/angular-http-client.js +++ /dev/null @@ -1,43 +0,0 @@ -const Base = require('./base'); - -class AngularHttpService extends Base { - request (options, params) { - const httpClient = this.connection; - const HttpHeaders = this.options.HttpHeaders; - - if (!httpClient || !HttpHeaders) { - throw new Error(`Please pass angular's 'httpClient' (instance) and and object with 'HttpHeaders' (class) to feathers-rest`); - } - - const url = options.url; - const { connection = {} } = params; - const headers = new HttpHeaders( - Object.assign( - { Accept: 'application/json' }, - this.options.headers, - options.headers, - connection.headers - ) - ); - const requestOptions = Object.assign({ - // method: options.method, - body: options.body - }, params.connection, { headers }); - - return new Promise((resolve, reject) => { - httpClient.request(options.method, url, requestOptions) - .subscribe(resolve, reject); - }) - .catch(error => { - const e = error.error; - - if (e) { - throw (typeof e === 'string' ? JSON.parse(e) : e); - } - - throw error; - }); - } -} - -module.exports = AngularHttpService; diff --git a/packages/rest-client/lib/angular.js b/packages/rest-client/lib/angular.js deleted file mode 100644 index cfd6ded73e..0000000000 --- a/packages/rest-client/lib/angular.js +++ /dev/null @@ -1,40 +0,0 @@ -const Base = require('./base'); - -class AngularService extends Base { - request (options, params) { - const http = this.connection; - const Headers = this.options.Headers; - - if (!http || !Headers) { - throw new Error(`Please pass angular's 'http' (instance) and and object with 'Headers' (class) to feathers-rest`); - } - - const url = options.url; - const { connection = {} } = params; - const headers = new Headers( - Object.assign( - { Accept: 'application/json' }, - this.options.headers, - options.headers, - connection.headers - ) - ); - const requestOptions = Object.assign({ - method: options.method, - body: options.body - }, connection, { headers }); - - return new Promise((resolve, reject) => { - http.request(url, requestOptions) - .subscribe(resolve, reject); - }) - .then(res => res.json()) - .catch(error => { - const response = error.response || error; - - throw response instanceof Error ? response : (response.json() || response); - }); - } -} - -module.exports = AngularService; diff --git a/packages/rest-client/lib/index.js b/packages/rest-client/lib/index.js deleted file mode 100644 index bbc1a75458..0000000000 --- a/packages/rest-client/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -const jQueryClient = require('./jquery'); -const SuperagentClient = require('./superagent'); -const RequestClient = require('./request'); -const FetchClient = require('./fetch'); -const AxiosClient = require('./axios'); -const AngularClient = require('./angular'); -const Base = require('./base'); -const AngularHttpClient = require('./angular-http-client'); - -const transports = { - jquery: jQueryClient, - superagent: SuperagentClient, - request: RequestClient, - fetch: FetchClient, - axios: AxiosClient, - angular: AngularClient, - angularHttpClient: AngularHttpClient -}; - -function restClient (base = '') { - const result = { Base }; - - Object.keys(transports).forEach(key => { - result[key] = function (connection, options = {}, Service = transports[key]) { - if (!connection) { - throw new Error(`${key} has to be provided to feathers-rest`); - } - - if (typeof options === 'function') { - Service = options; - options = {}; - } - - const defaultService = function (name) { - return new Service({ base, name, connection, options }); - }; - - const initialize = function (app) { - if (typeof app.defaultService === 'function') { - throw new Error('Only one default client provider can be configured'); - } - - app.rest = connection; - app.defaultService = defaultService; - }; - - initialize.Service = Service; - initialize.service = defaultService; - - return initialize; - }; - }); - - return result; -} - -module.exports = Object.assign(restClient, { SuperagentClient, FetchClient, jQueryClient, RequestClient, AxiosClient, AngularClient, AngularHttpClient }); -module.exports.default = restClient; diff --git a/packages/rest-client/lib/jquery.js b/packages/rest-client/lib/jquery.js deleted file mode 100644 index 6fa20eaece..0000000000 --- a/packages/rest-client/lib/jquery.js +++ /dev/null @@ -1,37 +0,0 @@ -const Base = require('./base'); - -class JQueryService extends Base { - request (options, params) { - const { connection = {} } = params; - const headers = Object.assign({}, options.headers, this.options.headers, connection.headers); - const opts = Object.assign({ - dataType: options.type || 'json' - }, connection, options, { headers }); - - if (options.body) { - opts.data = JSON.stringify(options.body); - opts.contentType = 'application/json'; - } - - delete opts.type; - delete opts.body; - - return new Promise((resolve, reject) => { - this.connection.ajax(opts).then(resolve, xhr => { - let error = xhr.responseText; - - try { - error = JSON.parse(error); - } catch (e) { - error = new Error(xhr.responseText); - } - - error.xhr = error.response = xhr; - - reject(error); - }); - }); - } -} - -module.exports = JQueryService; diff --git a/packages/rest-client/lib/request.js b/packages/rest-client/lib/request.js deleted file mode 100644 index 7f9497c723..0000000000 --- a/packages/rest-client/lib/request.js +++ /dev/null @@ -1,32 +0,0 @@ -const Base = require('./base'); - -class RequestService extends Base { - request (options, params) { - return new Promise((resolve, reject) => { - const { connection = {} } = params; - const headers = Object.assign({}, options.headers, connection.headers); - - this.connection(Object.assign({ - json: true - }, options, params.connection, { headers }), function (error, res, data) { - if (error) { - return reject(error); - } - - if (!error && res.statusCode >= 400) { - if (typeof data === 'string') { - return reject(new Error(data)); - } - - data.response = res; - - return reject(Object.assign(new Error(data.message), data)); - } - - resolve(data); - }); - }); - } -} - -module.exports = RequestService; diff --git a/packages/rest-client/package.json b/packages/rest-client/package.json index d7251099de..5ace188072 100644 --- a/packages/rest-client/package.json +++ b/packages/rest-client/package.json @@ -1,10 +1,9 @@ { "name": "@feathersjs/rest-client", "description": "REST client services for different Ajax libraries", - "version": "4.5.11", + "version": "5.0.0-pre.1", "homepage": "https://feathersjs.com", "main": "lib/index.js", - "types": "index.d.ts", "keywords": [ "feathers", "feathers-plugin" @@ -40,7 +39,9 @@ "*.js" ], "scripts": { - "test": "mocha --config ../../.mocharc.json" + "prepublish": "npm run compile", + "compile": "shx rm -rf lib/ && tsc", + "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -49,27 +50,28 @@ "access": "public" }, "dependencies": { - "@feathersjs/commons": "^4.5.11", - "@feathersjs/errors": "^4.5.11", + "@feathersjs/commons": "^5.0.0-pre.1", + "@feathersjs/errors": "^5.0.0-pre.1", + "@types/node-fetch": "^2.5.7", + "@types/superagent": "^4.1.10", "qs": "^6.9.4" }, "devDependencies": { - "@angular/common": "^11.0.3", - "@angular/core": "^11.0.3", - "@angular/http": "^7.2.16", - "@angular/platform-browser": "^11.0.3", - "@feathersjs/express": "^4.5.11", - "@feathersjs/feathers": "^4.5.11", - "@feathersjs/tests": "^4.5.11", + "@feathersjs/adapter-memory": "^5.0.0-pre.1", + "@feathersjs/express": "^5.0.0-pre.1", + "@feathersjs/feathers": "^5.0.0-pre.1", + "@feathersjs/tests": "^5.0.0-pre.1", + "@types/mocha": "^8.0.4", + "@types/node": "^14.14.10", "axios": "^0.21.0", "body-parser": "^1.19.0", - "feathers-memory": "^4.1.0", "mocha": "^8.2.1", "node-fetch": "^2.6.1", - "request": "^2.88.2", "rxjs": "^6.6.3", "shx": "^0.3.3", - "superagent": "^6.1.0" + "superagent": "^6.1.0", + "ts-node": "^9.1.0", + "typescript": "^4.1.2" }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/rest-client/lib/axios.js b/packages/rest-client/src/axios.ts similarity index 66% rename from packages/rest-client/lib/axios.js rename to packages/rest-client/src/axios.ts index 5378e2665a..e90b8b76f4 100644 --- a/packages/rest-client/lib/axios.js +++ b/packages/rest-client/src/axios.ts @@ -1,7 +1,8 @@ -const Base = require('./base'); +import { Params } from '@feathersjs/feathers'; +import { Base } from './base'; -class AxiosService extends Base { - request (options, params) { +export class AxiosClient extends Base { + request (options: any, params: Params) { const config = Object.assign({ url: options.url, method: options.method, @@ -12,13 +13,11 @@ class AxiosService extends Base { }, params.connection); return this.connection.request(config) - .then(res => res.data) - .catch(error => { + .then((res: any) => res.data) + .catch((error: any) => { const response = error.response || error; throw response instanceof Error ? response : (response.data || response); }); } } - -module.exports = AxiosService; diff --git a/packages/rest-client/lib/base.js b/packages/rest-client/src/base.ts similarity index 58% rename from packages/rest-client/lib/base.js rename to packages/rest-client/src/base.ts index 635b50bcd7..2b26257e37 100644 --- a/packages/rest-client/lib/base.js +++ b/packages/rest-client/src/base.ts @@ -1,10 +1,11 @@ -const qs = require('qs'); -const { Unavailable } = require('@feathersjs/errors'); -const { _ } = require('@feathersjs/commons'); -const { stripSlashes } = require('@feathersjs/commons'); -const { convert } = require('@feathersjs/errors'); - -function toError (error) { +import qs from 'qs'; +import { Unavailable } from '@feathersjs/errors'; +import { _ } from '@feathersjs/commons'; +import { stripSlashes } from '@feathersjs/commons'; +import { convert } from '@feathersjs/errors'; +import { Params, Id, Query, NullableId } from '@feathersjs/feathers'; + +function toError (error: Error & { code: string }) { if (error.code === 'ECONNREFUSED') { throw new Unavailable(error.message, _.pick(error, 'address', 'port', 'config')); } @@ -12,15 +13,27 @@ function toError (error) { throw convert(error); } -class Base { - constructor (settings) { +interface RestClientSettings { + name: string; + base: string; + connection: any; + options: any; +} + +export abstract class Base { + name: string; + base: string; + connection: any; + options: any; + + constructor (settings: RestClientSettings) { this.name = stripSlashes(settings.name); this.options = settings.options; this.connection = settings.connection; this.base = `${settings.base}/${this.name}`; } - makeUrl (query, id) { + makeUrl (query: Query, id?: string|number|null) { query = query || {}; let url = this.base; @@ -31,7 +44,7 @@ class Base { return url + this.getQuery(query); } - getQuery (query) { + getQuery (query: Query) { if (Object.keys(query).length !== 0) { const queryString = qs.stringify(query); @@ -41,7 +54,9 @@ class Base { return ''; } - find (params = {}) { + abstract request (options: any, params: Params): any; + + find (params: Params = {}) { return this.request({ url: this.makeUrl(params.query), method: 'GET', @@ -49,9 +64,9 @@ class Base { }, params).catch(toError); } - get (id, params = {}) { + get (id: Id, params: Params = {}) { if (typeof id === 'undefined') { - return Promise.reject(new Error(`id for 'get' can not be undefined`)); + return Promise.reject(new Error('id for \'get\' can not be undefined')); } return this.request({ @@ -61,7 +76,7 @@ class Base { }, params).catch(toError); } - create (body, params = {}) { + create (body: any, params: Params = {}) { return this.request({ url: this.makeUrl(params.query), body, @@ -70,9 +85,9 @@ class Base { }, params).catch(toError); } - update (id, body, params = {}) { + update (id: NullableId, body: any, params: Params = {}) { if (typeof id === 'undefined') { - return Promise.reject(new Error(`id for 'update' can not be undefined, only 'null' when updating multiple entries`)); + return Promise.reject(new Error('id for \'update\' can not be undefined, only \'null\' when updating multiple entries')); } return this.request({ @@ -83,9 +98,9 @@ class Base { }, params).catch(toError); } - patch (id, body, params = {}) { + patch (id: NullableId, body: any, params: Params = {}) { if (typeof id === 'undefined') { - return Promise.reject(new Error(`id for 'patch' can not be undefined, only 'null' when updating multiple entries`)); + return Promise.reject(new Error('id for \'patch\' can not be undefined, only \'null\' when updating multiple entries')); } return this.request({ @@ -96,9 +111,9 @@ class Base { }, params).catch(toError); } - remove (id, params = {}) { + remove (id: NullableId, params: Params = {}) { if (typeof id === 'undefined') { - return Promise.reject(new Error(`id for 'remove' can not be undefined, only 'null' when removing multiple entries`)); + return Promise.reject(new Error('id for \'remove\' can not be undefined, only \'null\' when removing multiple entries')); } return this.request({ @@ -108,5 +123,3 @@ class Base { }, params).catch(toError); } } - -module.exports = Base; diff --git a/packages/rest-client/lib/fetch.js b/packages/rest-client/src/fetch.ts similarity index 59% rename from packages/rest-client/lib/fetch.js rename to packages/rest-client/src/fetch.ts index 7c5f39f0df..8166ed3c93 100644 --- a/packages/rest-client/lib/fetch.js +++ b/packages/rest-client/src/fetch.ts @@ -1,8 +1,10 @@ -const Base = require('./base'); +import { Params } from '@feathersjs/feathers'; +import { errors } from '@feathersjs/errors'; +import { Base } from './base'; -class FetchService extends Base { - request (options, params) { - let fetchOptions = Object.assign({}, options, params.connection); +export class FetchClient extends Base { + request (options: any, params: Params) { + const fetchOptions = Object.assign({}, options, params.connection); fetchOptions.headers = Object.assign({ Accept: 'application/json' @@ -16,7 +18,7 @@ class FetchService extends Base { return fetch(options.url, fetchOptions) .then(this.checkStatus) - .then(response => { + .then((response: any) => { if (response.status === 204) { return null; } @@ -25,20 +27,18 @@ class FetchService extends Base { }); } - checkStatus (response) { + checkStatus (response: any) { if (response.ok) { return response; } return response.json().catch(() => { - const ErrorClass = errors[response.status] || Error; - + const ErrorClass = (errors as any)[response.status] || Error; + return new ErrorClass('JSON parsing error'); - }).then(error => { + }).then((error: any) => { error.response = response; throw error; }); } } - -module.exports = FetchService; diff --git a/packages/rest-client/src/index.ts b/packages/rest-client/src/index.ts new file mode 100644 index 0000000000..c3398ed3ee --- /dev/null +++ b/packages/rest-client/src/index.ts @@ -0,0 +1,78 @@ +import { Base } from './base'; +import { AxiosClient } from './axios'; +import { FetchClient } from './fetch'; +import { SuperagentClient } from './superagent'; + +export { AxiosClient, FetchClient, SuperagentClient }; + +const transports = { + superagent: SuperagentClient, + fetch: FetchClient, + axios: AxiosClient +}; + +interface HandlerResult extends Function { + /** + * initialize service + */ + (): void; + + /** + * Transport Service + */ + Service: any; + + /** + * default Service + */ + service: any; +} + +export type Handler = (connection: any, options?: any, Service?: any) => HandlerResult; + +export interface Transport { + superagent: Handler; + fetch: Handler; + axios: Handler; +} + +export default function restClient (base = '') { + const result: any = { Base }; + + Object.keys(transports).forEach(key => { + result[key] = function (connection: any, options: any = {}, Service: Base = (transports as any)[key]) { + if (!connection) { + throw new Error(`${key} has to be provided to feathers-rest`); + } + + if (typeof options === 'function') { + Service = options; + options = {}; + } + + const defaultService = function (name: string) { + return new (Service as any)({ base, name, connection, options }); + }; + + const initialize = (app: any) => { + if (typeof app.defaultService === 'function') { + throw new Error('Only one default client provider can be configured'); + } + + app.rest = connection; + app.defaultService = defaultService; + }; + + initialize.Service = Service; + initialize.service = defaultService; + + return initialize; + }; + }); + + return result as Transport; +} + +if (typeof module !== 'undefined') { + module.exports = Object.assign(restClient, module.exports); +} diff --git a/packages/rest-client/lib/superagent.js b/packages/rest-client/src/superagent.ts similarity index 76% rename from packages/rest-client/lib/superagent.js rename to packages/rest-client/src/superagent.ts index 2cca8962a5..72ea80c187 100644 --- a/packages/rest-client/lib/superagent.js +++ b/packages/rest-client/src/superagent.ts @@ -1,7 +1,8 @@ -const Base = require('./base'); +import { Params } from '@feathersjs/feathers'; +import { Base } from './base'; -class SuperagentService extends Base { - request (options, params) { +export class SuperagentClient extends Base { + request (options: any, params: Params) { const superagent = this.connection(options.method, options.url) .set(this.options.headers || {}) .set('Accept', 'application/json') @@ -16,7 +17,7 @@ class SuperagentService extends Base { superagent.send(options.body); } - superagent.end(function (error, res) { + superagent.end(function (error: any, res: any) { if (error) { try { const response = error.response; @@ -32,5 +33,3 @@ class SuperagentService extends Base { }); } } - -module.exports = SuperagentService; diff --git a/packages/rest-client/test/angular-http-client.test.js b/packages/rest-client/test/angular-http-client.test.js deleted file mode 100644 index 0f81f06f77..0000000000 --- a/packages/rest-client/test/angular-http-client.test.js +++ /dev/null @@ -1,126 +0,0 @@ -const assert = require('assert'); -const feathers = require('@feathersjs/feathers'); -const baseTests = require('@feathersjs/tests/lib/client'); -const errors = require('@feathersjs/errors'); - -const server = require('./server'); -const rest = require('../lib/index'); - -const { - HttpClient, - HttpHeaders, - HttpXhrBackend -} = require('@angular/common/http'); - -const xhr2 = require('xhr2'); - -function createAngularHTTPClient () { - const serverXHR = { build: () => new xhr2.XMLHttpRequest() }; - - return new HttpClient( - new HttpXhrBackend(serverXHR) - ); -} - -describe('@angular/common/http REST connector', function () { - const angularHttpClient = createAngularHTTPClient(); - - const url = 'http://localhost:8889'; - const setup = rest(url).angularHttpClient(angularHttpClient, { HttpHeaders }); - const app = feathers().configure(setup); - const service = app.service('todos'); - - before(function (done) { - this.server = server().listen(8889, done); - }); - - after(function (done) { - this.server.close(done); - }); - - baseTests(service); - - it('supports custom headers', () => { - const headers = { - 'Authorization': 'let-me-in' - }; - - return service.get(0, { headers }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - ); - }); - - it('supports params.connection', () => { - const connection = { - headers: { - 'Authorization': 'let-me-in' - } - }; - - return service.get(0, { connection }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - ); - }); - - it('throws an error without Headers set', () => { - const app = feathers().configure(rest(url) - .angularHttpClient(angularHttpClient)); - - return app.service('dummy').find().catch(e => - assert.strictEqual(e.message, `Please pass angular's 'httpClient' (instance) and and object with 'HttpHeaders' (class) to feathers-rest`) - ); - }); - - it('can initialize a client instance', () => { - const init = rest(url).angularHttpClient(angularHttpClient, { HttpHeaders }); - const todos = init.service('todos'); - - assert.ok(todos instanceof init.Service, 'Returned service is a client'); - - return todos.find({}).then(todos => - assert.deepStrictEqual(todos, [ - { - text: 'some todo', - complete: false, - id: 0 - } - ]) - ); - }); - - it('supports nested arrays in queries', () => { - const query = { test: { $in: [ '0', '1', '2' ] } }; - - return service.get(0, { query }).then(data => - assert.deepStrictEqual(data.query, query) - ); - }); - - it('remove many', () => { - return service.remove(null).then(todo => { - assert.strictEqual(todo.id, null); - assert.strictEqual(todo.text, 'deleted many'); - }); - }); - - it('converts feathers errors (#50)', () => { - return service.get(0, { query: { feathersError: true } }) - .catch(error => { - assert.ok(error instanceof errors.NotAcceptable); - assert.strictEqual(error.message, 'This is a Feathers error'); - assert.strictEqual(error.code, 406); - }); - }); -}); diff --git a/packages/rest-client/test/angular.test.js b/packages/rest-client/test/angular.test.js deleted file mode 100644 index 776c4f14a4..0000000000 --- a/packages/rest-client/test/angular.test.js +++ /dev/null @@ -1,131 +0,0 @@ -const assert = require('assert'); -const feathers = require('@feathersjs/feathers'); -const baseTests = require('@feathersjs/tests/lib/client'); -const errors = require('@feathersjs/errors'); -const server = require('./server'); -const rest = require('../lib/index'); - -const { - Http, - Headers, - BaseRequestOptions, - XHRBackend -} = require('@angular/http'); - -const xhr2 = require('xhr2'); - -function createAngularHTTP () { - const XSRFStrategyShim = { configureRequest: () => {} }; - const serverXHR = { build: () => new xhr2.XMLHttpRequest() }; - - return new Http( - new XHRBackend( - serverXHR, - new BaseRequestOptions(), - XSRFStrategyShim - ), - new BaseRequestOptions() - ); -} - -describe('angular REST connector', function () { - const angularHttp = createAngularHTTP(); - - const url = 'http://localhost:8889'; - const setup = rest(url).angular(angularHttp, { Headers }); - const app = feathers().configure(setup); - const service = app.service('todos'); - - before(function (done) { - this.server = server().listen(8889, done); - }); - - after(function (done) { - this.server.close(done); - }); - - baseTests(service); - - it('throws an error without Headers set', () => { - const app = feathers().configure(rest(url).angular(angularHttp)); - - return app.service('dummy').find().catch(e => - assert.strictEqual(e.message, `Please pass angular's 'http' (instance) and and object with 'Headers' (class) to feathers-rest`) - ); - }); - - it('supports custom headers', () => { - let headers = { - 'Authorization': 'let-me-in' - }; - - return service.get(0, { headers }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - ); - }); - - it('supports params.connection', () => { - const connection = { - headers: { - 'Authorization': 'let-me-in' - } - }; - - return service.get(0, { connection }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - ); - }); - - it('can initialize a client instance', () => { - const init = rest(url).angular(angularHttp, { Headers }); - const todos = init.service('todos'); - - assert.ok(todos instanceof init.Service, 'Returned service is a client'); - - return todos.find({}).then(todos => - assert.deepStrictEqual(todos, [ - { - text: 'some todo', - complete: false, - id: 0 - } - ]) - ); - }); - - it('supports nested arrays in queries', () => { - const query = { test: { $in: [ '0', '1', '2' ] } }; - - return service.get(0, { query }).then(data => - assert.deepStrictEqual(data.query, query) - ); - }); - - it('remove many', () => { - return service.remove(null).then(todo => { - assert.strictEqual(todo.id, null); - assert.strictEqual(todo.text, 'deleted many'); - }); - }); - - it('converts feathers errors (#50)', () => { - return service.get(0, { query: { feathersError: true } }) - .catch(error => { - assert.ok(error instanceof errors.NotAcceptable); - assert.strictEqual(error.message, 'This is a Feathers error'); - assert.strictEqual(error.code, 406); - }); - }); -}); diff --git a/packages/rest-client/test/axios.test.js b/packages/rest-client/test/axios.test.js deleted file mode 100644 index 04effc48a9..0000000000 --- a/packages/rest-client/test/axios.test.js +++ /dev/null @@ -1,113 +0,0 @@ -const assert = require('assert'); -const axios = require('axios'); -const feathers = require('@feathersjs/feathers'); -const baseTests = require('@feathersjs/tests/lib/client'); -const errors = require('@feathersjs/errors'); -const server = require('./server'); -const rest = require('../lib/index'); - -describe('Axios REST connector', function () { - const url = 'http://localhost:8889'; - const setup = rest(url).axios(axios); - const app = feathers().configure(setup); - const service = app.service('todos'); - - before(function (done) { - this.server = server().listen(8889, done); - }); - - after(function (done) { - this.server.close(done); - }); - - baseTests(service); - - it('supports custom headers', () => { - let headers = { - 'Authorization': 'let-me-in' - }; - - return service.get(0, { headers }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - ); - }); - - it('uses params.connection for additional options', () => { - const connection = { - headers: { - 'Authorization': 'let-me-in' - } - }; - - return service.get(0, { connection }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - ); - }); - - it('can initialize a client instance', () => { - const init = rest(url).axios(axios); - const todos = init.service('todos'); - - assert.ok(todos instanceof init.Service, 'Returned service is a client'); - - return todos.find({}).then(todos => - assert.deepStrictEqual(todos, [ - { - text: 'some todo', - complete: false, - id: 0 - } - ]) - ); - }); - - it('supports nested arrays in queries', () => { - const query = { test: { $in: [ '0', '1', '2' ] } }; - - return service.get(0, { query }).then(data => - assert.deepStrictEqual(data.query, query) - ); - }); - - it('remove many', () => { - return service.remove(null).then(todo => { - assert.strictEqual(todo.id, null); - assert.strictEqual(todo.text, 'deleted many'); - }); - }); - - it('converts feathers errors (#50)', () => { - return service.get(0, { query: { feathersError: true } }) - .catch(error => { - assert.ok(error instanceof errors.NotAcceptable); - assert.strictEqual(error.message, 'This is a Feathers error'); - assert.strictEqual(error.code, 406); - }); - }); - - it('ECONNREFUSED errors are serializable', () => { - const url = 'http://localhost:60000'; - const setup = rest(url).axios(axios); - const app = feathers().configure(setup); - - return app.service('something').find().catch(e => { - const err = JSON.parse(JSON.stringify(e)); - - assert.strictEqual(err.name, 'Unavailable'); - assert.strictEqual(err.message, 'connect ECONNREFUSED 127.0.0.1:60000'); - assert.ok(e.data.config); - }); - }); -}); diff --git a/packages/rest-client/test/axios.test.ts b/packages/rest-client/test/axios.test.ts new file mode 100644 index 0000000000..c7e67e9c5a --- /dev/null +++ b/packages/rest-client/test/axios.test.ts @@ -0,0 +1,118 @@ +import { strict as assert } from 'assert'; + +import axios from 'axios'; +import { Server } from 'http'; +import feathers from '@feathersjs/feathers'; +import { setupTests } from '@feathersjs/tests/src/client'; +import { NotAcceptable } from '@feathersjs/errors'; + +import createServer from './server'; +import rest from '../src'; + +describe('Axios REST connector', function () { + const url = 'http://localhost:8889'; + const setup = rest(url).axios(axios); + const app = feathers().configure(setup); + const service = app.service('todos'); + let server: Server; + + before(done => { + server = createServer().listen(8889, done); + }); + + after(done => server.close(done)); + + setupTests(service, 'todos'); + + it('supports custom headers', async () => { + const headers = { + 'Authorization': 'let-me-in' + }; + + const todo = await service.get(0, { headers }); + + assert.deepStrictEqual(todo, { + id: 0, + authorization: 'let-me-in', + text: 'some todo', + complete: false, + query: {} + }); + }); + + it('uses params.connection for additional options', async () => { + const connection = { + headers: { + 'Authorization': 'let-me-in' + } + }; + + const todo = await service.get(0, { connection }); + + assert.deepStrictEqual(todo, { + id: 0, + authorization: 'let-me-in', + text: 'some todo', + complete: false, + query: {} + }); + }); + + it('can initialize a client instance', async () => { + const init = rest(url).axios(axios); + const todoService = init.service('todos'); + + assert.ok(todoService instanceof init.Service, 'Returned service is a client'); + + const todos = await todoService.find({}); + + assert.deepStrictEqual(todos, [{ + text: 'some todo', + complete: false, + id: 0 + }]); + }); + + it('supports nested arrays in queries', async () => { + const query = { test: { $in: [ '0', '1', '2' ] } }; + + const data = await service.get(0, { query }); + + assert.deepStrictEqual(data.query, query) + }); + + it('remove many', async () => { + const todo = await service.remove(null); + + assert.strictEqual(todo.id, null); + assert.strictEqual(todo.text, 'deleted many'); + }); + + it('converts feathers errors (#50)', async () => { + try { + await service.get(0, { query: { feathersError: true } }); + assert.fail('Should never get here'); + } catch (error) { + assert.ok(error instanceof NotAcceptable); + assert.strictEqual(error.message, 'This is a Feathers error'); + assert.strictEqual(error.code, 406); + } + }); + + it('ECONNREFUSED errors are serializable', async () => { + const url = 'http://localhost:60000'; + const setup = rest(url).axios(axios); + const app = feathers().configure(setup); + + try { + await app.service('something').find(); + assert.fail('Should never get here'); + } catch(e) { + const err = JSON.parse(JSON.stringify(e)); + + assert.strictEqual(err.name, 'Unavailable'); + assert.strictEqual(err.message, 'connect ECONNREFUSED 127.0.0.1:60000'); + assert.ok(e.data.config); + } + }); +}); diff --git a/packages/rest-client/test/fetch.test.js b/packages/rest-client/test/fetch.test.js deleted file mode 100644 index 9c19041a87..0000000000 --- a/packages/rest-client/test/fetch.test.js +++ /dev/null @@ -1,113 +0,0 @@ -const fetch = require('node-fetch'); -const assert = require('assert'); -const feathers = require('@feathersjs/feathers'); -const errors = require('@feathersjs/errors'); -const baseTests = require('@feathersjs/tests/lib/client'); -const server = require('./server'); -const rest = require('../lib/index'); - -describe('fetch REST connector', function () { - const url = 'http://localhost:8889'; - const setup = rest(url).fetch(fetch); - const app = feathers().configure(setup); - const service = app.service('todos'); - - before(function (done) { - this.server = server().listen(8889, done); - }); - - after(function (done) { - this.server.close(done); - }); - - baseTests(service); - - it('supports custom headers', () => { - let headers = { - 'Authorization': 'let-me-in' - }; - - return service.get(0, { headers }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - text: 'some todo', - authorization: 'let-me-in', - complete: false, - query: {} - }) - ); - }); - - it('supports params.connection', () => { - const connection = { - headers: { - 'Authorization': 'let-me-in' - } - }; - - return service.get(0, { connection }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - text: 'some todo', - authorization: 'let-me-in', - complete: false, - query: {} - }) - ); - }); - - it('handles errors properly', () => { - return service.get(-1, {}).catch(error => - assert.strictEqual(error.code, 404) - ); - }); - - it('supports nested arrays in queries', () => { - const query = { test: { $in: [ '0', '1', '2' ] } }; - - return service.get(0, { query }).then(data => - assert.deepStrictEqual(data.query, query) - ); - }); - - it('can initialize a client instance', () => { - const init = rest(url).fetch(fetch); - const todos = init.service('todos'); - - assert.ok(todos instanceof init.Service, 'Returned service is a client'); - - return todos.find({}).then(todos => - assert.deepStrictEqual(todos, [ - { - text: 'some todo', - complete: false, - id: 0 - } - ]) - ); - }); - - it('remove many', () => { - return service.remove(null).then(todo => { - assert.strictEqual(todo.id, null); - assert.strictEqual(todo.text, 'deleted many'); - }); - }); - - it('converts feathers errors (#50)', () => { - return service.get(0, { query: { feathersError: true } }).catch(error => { - assert.ok(error instanceof errors.NotAcceptable); - assert.strictEqual(error.message, 'This is a Feathers error'); - assert.strictEqual(error.code, 406); - assert.deepStrictEqual(error.data, { data: true }); - assert.ok(error.response); - }); - }); - - it('returns null for 204 responses', () => { - return service.remove(0, { query: { noContent: true } }) - .then(response => - assert.strictEqual(response, null) - ); - }); -}); diff --git a/packages/rest-client/test/fetch.test.ts b/packages/rest-client/test/fetch.test.ts new file mode 100644 index 0000000000..87df37c606 --- /dev/null +++ b/packages/rest-client/test/fetch.test.ts @@ -0,0 +1,120 @@ +import { strict as assert } from 'assert'; + +import feathers from '@feathersjs/feathers'; +import { setupTests } from '@feathersjs/tests/src/client'; +import { NotAcceptable } from '@feathersjs/errors'; +import fetch from 'node-fetch'; + +import createServer from './server'; +import rest from '../src'; +import { Server } from 'http'; + +describe('fetch REST connector', function () { + const url = 'http://localhost:8889'; + const setup = rest(url).fetch(fetch); + const app = feathers().configure(setup); + const service = app.service('todos'); + let server: Server; + + before(done => { + server = createServer().listen(8889, done); + }); + + after(done => server.close(done)); + + setupTests(service, 'todos'); + + it('supports custom headers', async () => { + const headers = { + 'Authorization': 'let-me-in' + }; + + const todo = await service.get(0, { headers }); + + assert.deepStrictEqual(todo, { + id: 0, + text: 'some todo', + authorization: 'let-me-in', + complete: false, + query: {} + }) + }); + + it('supports params.connection', async () => { + const connection = { + headers: { + 'Authorization': 'let-me-in' + } + }; + + const todo = await service.get(0, { connection }); + + assert.deepStrictEqual(todo, { + id: 0, + text: 'some todo', + authorization: 'let-me-in', + complete: false, + query: {} + }) + }); + + it('handles errors properly', async () => { + try { + await service.get(-1, {}); + assert.fail('Should never get here'); + } catch(error) { + assert.strictEqual(error.code, 404) + } + }); + + it('supports nested arrays in queries', async () => { + const query = { test: { $in: [ '0', '1', '2' ] } }; + + const data = await service.get(0, { query }); + + assert.deepStrictEqual(data.query, query) + }); + + it('can initialize a client instance', async () => { + const init = rest(url).fetch(fetch); + const todoService = init.service('todos'); + + assert.ok(todoService instanceof init.Service, 'Returned service is a client'); + + const todos = await todoService.find({}); + + assert.deepStrictEqual(todos, [{ + text: 'some todo', + complete: false, + id: 0 + }]); + }); + + it('remove many', async () => { + const todo = await service.remove(null); + + assert.strictEqual(todo.id, null); + assert.strictEqual(todo.text, 'deleted many'); + }); + + it('converts feathers errors (#50)', async () => { + try { + await service.get(0, { query: { feathersError: true } }); + assert.fail('Should never get here'); + } catch (error) { + assert.ok(error.response); + assert.ok(error instanceof NotAcceptable); + assert.strictEqual(error.message, 'This is a Feathers error'); + assert.strictEqual(error.code, 406); + assert.deepStrictEqual(error.data, { data: true }); + } + }); + + it('returns null for 204 responses', async () => { + const response = await service.remove(0, { + query: { noContent: true } + }); + + assert.strictEqual(response, null) + }); +}); diff --git a/packages/rest-client/test/index.test.js b/packages/rest-client/test/index.test.js deleted file mode 100644 index e1f6f00e1c..0000000000 --- a/packages/rest-client/test/index.test.js +++ /dev/null @@ -1,144 +0,0 @@ -const fetch = require('node-fetch'); -const feathers = require('@feathersjs/feathers'); -const rest = require('../lib/index'); -const { FetchClient } = require('../lib/index'); -const assert = require('assert'); - -const init = require('../lib'); - -describe('REST client tests', function () { - it('is built correctly', () => { - const transports = init(); - - assert.strictEqual(typeof init, 'function'); - assert.strictEqual(typeof transports.jquery, 'function'); - assert.strictEqual(typeof transports.request, 'function'); - assert.strictEqual(typeof transports.superagent, 'function'); - assert.strictEqual(typeof transports.fetch, 'function'); - }); - - it('exports default', () => { - assert.strictEqual(init.default, init); - }); - - it('base errors (backwards compatibility)', () => { - const { Base } = init(); - const service = new Base({ name: 'test' }); - - return service.get().catch(error => { - assert.strictEqual(error.message, `id for 'get' can not be undefined`); - - return service.update(); - }).catch(error => { - assert.strictEqual(error.message, `id for 'update' can not be undefined, only 'null' when updating multiple entries`); - - return service.patch(); - }).catch(error => { - assert.strictEqual(error.message, `id for 'patch' can not be undefined, only 'null' when updating multiple entries`); - - return service.remove(); - }).catch(error => { - assert.strictEqual(error.message, `id for 'remove' can not be undefined, only 'null' when removing multiple entries`); - }); - }); - - it('throw errors when no connection is provided', () => { - const transports = init(); - - try { - transports.fetch(); - } catch (e) { - assert.strictEqual(e.message, 'fetch has to be provided to feathers-rest'); - } - }); - - it('app has the rest attribute', () => { - const app = feathers(); - - app.configure(rest('http://localhost:8889').fetch(fetch)); - - assert.ok(app.rest); - }); - - it('throws an error when configured twice', () => { - const app = feathers(); - - app.configure(rest('http://localhost:8889').fetch(fetch)); - - try { - app.configure(rest('http://localhost:8889').fetch(fetch)); - assert.ok(false, 'Should never get here'); - } catch (e) { - assert.strictEqual(e.message, 'Only one default client provider can be configured'); - } - }); - - it('errors when id property for get, patch, update or remove is undefined', () => { - const app = feathers().configure(rest('http://localhost:8889') - .fetch(fetch)); - - const service = app.service('todos'); - - return service.get().catch(error => { - assert.strictEqual(error.message, `An id must be provided to the 'todos.get' method`); - - return service.remove(); - }).catch(error => { - assert.strictEqual(error.message, `An id must be provided to the 'todos.remove' method`); - - return service.update(); - }).catch(error => { - assert.strictEqual(error.message, `An id must be provided to the 'todos.update' method`); - - return service.patch(); - }).catch(error => { - assert.strictEqual(error.message, `An id must be provided to the 'todos.patch' method`); - }); - }); - - it('uses a custom client', () => { - const app = feathers(); - class MyFetchClient extends FetchClient { - find () { - return Promise.resolve({ - connection: this.connection, - base: this.base, - message: 'Custom fetch client' - }); - } - } - - app.configure(rest('http://localhost:8889').fetch(fetch, {}, MyFetchClient)); - - return app.service('messages').find().then(data => { - assert.deepStrictEqual(data, { - connection: fetch, - base: 'http://localhost:8889/messages', - message: 'Custom fetch client' - }); - }); - }); - - it('uses a custom client as second arg', () => { - const app = feathers(); - class MyFetchClient extends FetchClient { - find () { - return Promise.resolve({ - connection: this.connection, - base: this.base, - message: 'Custom fetch client' - }); - } - } - - app.configure(rest('http://localhost:8889').fetch(fetch, MyFetchClient)); - - return app.service('messages').find().then(data => { - assert.deepStrictEqual(data, { - connection: fetch, - base: 'http://localhost:8889/messages', - message: 'Custom fetch client' - }); - }); - }); -}); diff --git a/packages/rest-client/test/index.test.ts b/packages/rest-client/test/index.test.ts new file mode 100644 index 0000000000..edf71e1d53 --- /dev/null +++ b/packages/rest-client/test/index.test.ts @@ -0,0 +1,117 @@ + +import { strict as assert } from 'assert'; +import feathers from '@feathersjs/feathers'; +import fetch from 'node-fetch'; +import { default as init, FetchClient } from '../src'; + +describe('REST client tests', function () { + it('is built correctly', () => { + const transports = init(); + + assert.strictEqual(typeof init, 'function'); + assert.strictEqual(typeof transports.superagent, 'function'); + assert.strictEqual(typeof transports.fetch, 'function'); + assert.strictEqual(typeof transports.axios, 'function'); + }); + + it('throw errors when no connection is provided', () => { + const transports = init(); + + try { + // @ts-ignore + transports.fetch(); + } catch (e) { + assert.strictEqual(e.message, 'fetch has to be provided to feathers-rest'); + } + }); + + it('app has the rest attribute', () => { + const app = feathers(); + + app.configure(init('http://localhost:8889').fetch(fetch)); + + assert.ok((app as any).rest); + }); + + it('throws an error when configured twice', () => { + const app = feathers(); + + app.configure(init('http://localhost:8889').fetch(fetch)); + + try { + app.configure(init('http://localhost:8889').fetch(fetch)); + assert.ok(false, 'Should never get here'); + } catch (e) { + assert.strictEqual(e.message, 'Only one default client provider can be configured'); + } + }); + + it('errors when id property for get, patch, update or remove is undefined', () => { + const app = feathers().configure(init('http://localhost:8889') + .fetch(fetch)); + + const service = app.service('todos'); + + return service.get().catch((error: any) => { + assert.strictEqual(error.message, 'An id must be provided to the \'todos.get\' method'); + + return service.remove(); + }).catch((error: any) => { + assert.strictEqual(error.message, 'An id must be provided to the \'todos.remove\' method'); + + return service.update(); + }).catch((error: any) => { + assert.strictEqual(error.message, 'An id must be provided to the \'todos.update\' method'); + + return service.patch(); + }).catch((error: any) => { + assert.strictEqual(error.message, 'An id must be provided to the \'todos.patch\' method'); + }); + }); + + it('uses a custom client', async () => { + const app = feathers(); + class MyFetchClient extends FetchClient { + find () { + return Promise.resolve({ + connection: this.connection, + base: this.base, + message: 'Custom fetch client' + }); + } + } + + app.configure(init('http://localhost:8889').fetch(fetch, {}, MyFetchClient)); + + const data = await app.service('messages').find(); + + assert.deepStrictEqual(data, { + connection: fetch, + base: 'http://localhost:8889/messages', + message: 'Custom fetch client' + }); + }); + + it('uses a custom client as second arg', async () => { + const app = feathers(); + class MyFetchClient extends FetchClient { + find () { + return Promise.resolve({ + connection: this.connection, + base: this.base, + message: 'Custom fetch client' + }); + } + } + + app.configure(init('http://localhost:8889').fetch(fetch, MyFetchClient)); + + const data = await app.service('messages').find(); + + assert.deepStrictEqual(data, { + connection: fetch, + base: 'http://localhost:8889/messages', + message: 'Custom fetch client' + }); + }); +}); diff --git a/packages/rest-client/test/jquery.test.js b/packages/rest-client/test/jquery.test.js deleted file mode 100644 index 79e57a6a6a..0000000000 --- a/packages/rest-client/test/jquery.test.js +++ /dev/null @@ -1,104 +0,0 @@ -const assert = require('assert'); -const feathers = require('@feathersjs/feathers'); -const { JSDOM } = require('jsdom'); -const jquery = require('jquery'); -const baseTests = require('@feathersjs/tests/lib/client'); -const errors = require('@feathersjs/errors'); -const server = require('./server'); -const rest = require('../lib/index'); - -describe('jQuery REST connector', function () { - const url = 'http://localhost:7676'; - const { window } = new JSDOM(); - const setup = rest(url).jquery(jquery(window)); - const app = feathers().configure(setup); - const service = app.service('todos'); - - before(function (done) { - this.server = server().listen(7676); - this.server.on('listening', () => done()); - }); - - after(function () { - this.server.close(); - }); - - baseTests(service); - - it('supports custom headers', () => { - let headers = { - 'Authorization': 'let-me-in' - }; - - return service.get(0, { headers }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - ); - }); - - it('supports params.connection', () => { - const connection = { - headers: { - 'Authorization': 'let-me-in' - } - }; - - return service.get(0, { connection }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - ); - }); - - it('can initialize a client instance', () => { - const init = rest(url).jquery(service.connection); - const todos = init.service('todos'); - - assert.ok(todos instanceof init.Service, 'Returned service is a client'); - - return todos.find({}).then(todos => - assert.deepStrictEqual(todos, [ - { - text: 'some todo', - complete: false, - id: 0 - } - ]) - ); - }); - - it('supports nested arrays in queries', () => { - const query = { test: { $in: [ '0', '1', '2' ] } }; - - return service.get(0, { query }).then(data => - assert.deepStrictEqual(data.query, query) - ); - }); - - it('remove many', () => { - return service.remove(null).then(todo => { - assert.strictEqual(todo.id, null); - assert.strictEqual(todo.text, 'deleted many'); - }); - }); - - it('converts feathers errors (#50)', () => { - return service.get(0, { query: { feathersError: true } }) - .catch(error => { - assert.ok(error instanceof errors.NotAcceptable); - assert.strictEqual(error.message, 'This is a Feathers error'); - assert.strictEqual(error.code, 406); - assert.deepStrictEqual(error.data, { data: true }); - assert.ok(error.response); - }); - }); -}); diff --git a/packages/rest-client/test/request.test.js b/packages/rest-client/test/request.test.js deleted file mode 100644 index 3c93c4c072..0000000000 --- a/packages/rest-client/test/request.test.js +++ /dev/null @@ -1,115 +0,0 @@ -const assert = require('assert'); -const request = require('request'); -const feathers = require('@feathersjs/feathers'); -const baseTests = require('@feathersjs/tests/lib/client'); -const errors = require('@feathersjs/errors'); -const server = require('./server'); -const rest = require('../lib/index'); - -describe('node-request REST connector', function () { - const url = 'http://localhost:6777'; - const setup = rest(url).request(request); - const app = feathers().configure(setup); - const service = app.service('todos'); - - before(function (done) { - this.server = server().listen(6777, done); - }); - - after(function (done) { - this.server.close(done); - }); - - baseTests(service); - - it('supports custom headers', () => { - const headers = { - 'Authorization': 'let-me-in' - }; - - return service.get(0, { headers }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - ); - }); - - it('supports params.connection', () => { - const connection = { - headers: { - 'Authorization': 'let-me-in' - } - }; - - return service.get(0, { connection }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - ); - }); - - it('can initialize a client instance', () => { - const init = rest(url).request(request); - const todos = init.service('todos'); - - assert.ok(todos instanceof init.Service, 'Returned service is a client'); - - return todos.find({}).then(todos => - assert.deepStrictEqual(todos, [ - { - text: 'some todo', - complete: false, - id: 0 - } - ]) - ); - }); - - it('catches connection errors', () => { - const init = rest('nowhere').request(request); - const todos = init.service('todos'); - - return todos.find().catch(error => - assert.strictEqual(error.message, 'Invalid URI "nowhere/todos"') - ); - }); - - it('supports nested arrays in queries', () => { - const query = { test: { $in: [ '0', '1', '2' ] } }; - - return service.get(0, { query }).then(data => - assert.deepStrictEqual(data.query, query) - ); - }); - - it('converts errors properly', () => { - return service.get(1, { query: { error: true } }).catch(e => - assert.strictEqual(e.message, 'Something went wrong') - ); - }); - - it('remove many', () => { - return service.remove(null).then(todo => { - assert.strictEqual(todo.id, null); - assert.strictEqual(todo.text, 'deleted many'); - }); - }); - - it('converts feathers errors (#50)', () => { - return service.get(0, { query: { feathersError: true } }).catch(error => { - assert.ok(error instanceof errors.NotAcceptable); - assert.strictEqual(error.message, 'This is a Feathers error'); - assert.strictEqual(error.code, 406); - assert.deepStrictEqual(error.data, { data: true }); - assert.ok(error.response); - }); - }); -}); diff --git a/packages/rest-client/test/server.js b/packages/rest-client/test/server.ts similarity index 66% rename from packages/rest-client/test/server.js rename to packages/rest-client/test/server.ts index 2f7fb3d2af..d24b1f2763 100644 --- a/packages/rest-client/test/server.js +++ b/packages/rest-client/test/server.ts @@ -1,16 +1,15 @@ -const feathers = require('@feathersjs/feathers'); -const expressify = require('@feathersjs/express'); -const bodyParser = require('body-parser'); -const { Service } = require('feathers-memory'); -const errors = require('@feathersjs/errors'); -const rest = require('@feathersjs/express/rest'); +import bodyParser from 'body-parser'; +import feathers, { Id, NullableId, Params } from '@feathersjs/feathers'; +import expressify, { rest } from '@feathersjs/express'; +import { Service } from '@feathersjs/adapter-memory'; +import { FeathersError, NotAcceptable } from '@feathersjs/errors'; // eslint-disable-next-line no-extend-native Object.defineProperty(Error.prototype, 'toJSON', { - value: function () { - var alt = {}; + value () { + const alt: any = {}; - Object.getOwnPropertyNames(this).forEach(function (key) { + Object.getOwnPropertyNames(this).forEach((key: string) => { alt[key] = this[key]; }, this); @@ -20,27 +19,26 @@ Object.defineProperty(Error.prototype, 'toJSON', { writable: true }); -let errorHandler = function (error, req, res, next) { - const code = !isNaN(parseInt(error.code, 10)) ? parseInt(error.code, 10) : 500; +const errorHandler = function (error: FeathersError, _req: any, res: any, _next: any) { // eslint-disable-line @typescript-eslint/no-unused-vars + const code = !isNaN(parseInt(error.code as any, 10)) ? parseInt(error.code as any, 10) : 500; res.status(code); res.format({ - 'application/json': function () { - let output = Object.assign({}, error.toJSON()); - res.json(output); + 'application/json' () { + res.json(Object.assign({}, error.toJSON())); } }); }; // Create an in-memory CRUD service for our Todos class TodoService extends Service { - get (id, params) { + get (id: Id, params: Params) { if (params.query.error) { throw new Error('Something went wrong'); } if (params.query.feathersError) { - throw new errors.NotAcceptable('This is a Feathers error', { data: true }); + throw new NotAcceptable('This is a Feathers error', { data: true }); } return super.get(id) @@ -55,7 +53,7 @@ class TodoService extends Service { }); } - remove (id, params) { + remove (id: NullableId, params: Params) { if (id === null) { return Promise.resolve({ id, text: 'deleted many' @@ -70,9 +68,9 @@ class TodoService extends Service { } } -module.exports = function (configurer) { +export default (configurer?: any) => { const app = expressify(feathers()) - .configure(rest(function formatter (req, res, next) { + .configure(rest(function formatter (_req, res, next) { if (!res.data) { next(); } diff --git a/packages/rest-client/test/superagent.test.js b/packages/rest-client/test/superagent.test.js deleted file mode 100644 index dae27fe82d..0000000000 --- a/packages/rest-client/test/superagent.test.js +++ /dev/null @@ -1,98 +0,0 @@ -const assert = require('assert'); -const superagent = require('superagent'); -const feathers = require('@feathersjs/feathers'); -const baseTests = require('@feathersjs/tests/lib/client'); -const errors = require('@feathersjs/errors'); -const server = require('./server'); -const rest = require('../lib/index'); - -describe('Superagent REST connector', function () { - const url = 'http://localhost:8889'; - const setup = rest(url).superagent(superagent); - const app = feathers().configure(setup); - const service = app.service('todos'); - - before(function (done) { - this.server = server().listen(8889, done); - }); - - after(function (done) { - this.server.close(done); - }); - - baseTests(service); - - it('supports custom headers', () => { - const headers = { - 'Authorization': 'let-me-in' - }; - - return service.get(0, { headers }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - ); - }); - - it('supports params.connection', () => { - const connection = { - 'Authorization': 'let-me-in' - }; - - return service.get(0, { connection }).then(todo => - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - ); - }); - - it('can initialize a client instance', () => { - const init = rest(url).superagent(superagent); - const todos = init.service('todos'); - - assert.ok(todos instanceof init.Service, 'Returned service is a client'); - - return todos.find({}).then(todos => - assert.deepStrictEqual(todos, [ - { - text: 'some todo', - complete: false, - id: 0 - } - ]) - ); - }); - - it('supports nested arrays in queries', () => { - const query = { test: { $in: [ '0', '1', '2' ] } }; - - return service.get(0, { query }).then(data => - assert.deepStrictEqual(data.query, query) - ); - }); - - it('remove many', () => { - return service.remove(null).then(todo => { - assert.strictEqual(todo.id, null); - assert.strictEqual(todo.text, 'deleted many'); - }); - }); - - it('converts feathers errors (#50)', () => { - return service.get(0, { query: { feathersError: true } }) - .catch(error => { - assert.ok(error instanceof errors.NotAcceptable); - assert.strictEqual(error.message, 'This is a Feathers error'); - assert.strictEqual(error.code, 406); - assert.ok(error.response); - }); - }); -}); diff --git a/packages/rest-client/test/superagent.test.ts b/packages/rest-client/test/superagent.test.ts new file mode 100644 index 0000000000..7d27b3255f --- /dev/null +++ b/packages/rest-client/test/superagent.test.ts @@ -0,0 +1,101 @@ +import { strict as assert } from 'assert'; + +import superagent from 'superagent'; +import { Server } from 'http'; +import feathers from '@feathersjs/feathers'; +import { setupTests } from '@feathersjs/tests/src/client'; +import { NotAcceptable } from '@feathersjs/errors'; + +import createServer from './server'; +import rest from '../src'; + +describe('Superagent REST connector', function () { + let server: Server; + + const url = 'http://localhost:8889'; + const setup = rest(url).superagent(superagent); + const app = feathers().configure(setup); + const service = app.service('todos'); + + before(done => { + server = createServer().listen(8889, done); + }); + + after(done => server.close(done)); + + setupTests(service, 'todos'); + + it('supports custom headers', async () => { + const headers = { + 'Authorization': 'let-me-in' + }; + + const todo = await service.get(0, { headers }); + + assert.deepStrictEqual(todo, { + id: 0, + authorization: 'let-me-in', + text: 'some todo', + complete: false, + query: {} + }) + }); + + it('supports params.connection', async () => { + const connection = { + 'Authorization': 'let-me-in' + }; + + const todo = await service.get(0, { connection }); + + assert.deepStrictEqual(todo, { + id: 0, + authorization: 'let-me-in', + text: 'some todo', + complete: false, + query: {} + }) + }); + + it('can initialize a client instance', async () => { + const init = rest(url).superagent(superagent); + const todoService = init.service('todos'); + + assert.ok(todoService instanceof init.Service, 'Returned service is a client'); + + const todos = await todoService.find({}); + + assert.deepStrictEqual(todos, [{ + text: 'some todo', + complete: false, + id: 0 + }]) + }); + + it('supports nested arrays in queries', async () => { + const query = { test: { $in: [ '0', '1', '2' ] } }; + + const data = await service.get(0, { query }); + + assert.deepStrictEqual(data.query, query) + }); + + it('remove many', async () => { + const todo = await service.remove(null); + + assert.strictEqual(todo.id, null); + assert.strictEqual(todo.text, 'deleted many'); + }); + + it('converts feathers errors (#50)', async () => { + try { + await service.get(0, { query: { feathersError: true } }); + assert.fail('Should never get here'); + } catch(error) { + assert.ok(error instanceof NotAcceptable); + assert.strictEqual(error.message, 'This is a Feathers error'); + assert.strictEqual(error.code, 406); + assert.ok((error as any).response); + } + }); +}); diff --git a/packages/rest-client/tsconfig.json b/packages/rest-client/tsconfig.json new file mode 100644 index 0000000000..316fd41336 --- /dev/null +++ b/packages/rest-client/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "include": [ + "src/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib" + } +} diff --git a/packages/socketio-client/.npmignore b/packages/socketio-client/.npmignore deleted file mode 100644 index 65e3ba2eda..0000000000 --- a/packages/socketio-client/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test/ diff --git a/packages/socketio-client/CHANGELOG.md b/packages/socketio-client/CHANGELOG.md index c5d7f933aa..1edc97a199 100644 --- a/packages/socketio-client/CHANGELOG.md +++ b/packages/socketio-client/CHANGELOG.md @@ -3,6 +3,21 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + ## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) @@ -24,9 +39,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) -**Note:** Version bump only for package @feathersjs/socketio-client +## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) + +**Note:** Version bump only for package @feathersjs/socketio-client diff --git a/packages/socketio-client/README.md b/packages/socketio-client/README.md index be1451ab3d..f2f283a965 100644 --- a/packages/socketio-client/README.md +++ b/packages/socketio-client/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers SocketIO API documentation](https://docs.feathersjs.com/a ## License -Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) +Copyright (c) 2020 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/socketio-client/index.d.ts b/packages/socketio-client/index.d.ts deleted file mode 100644 index 770112ec7b..0000000000 --- a/packages/socketio-client/index.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import 'socket.io-client'; - -declare const socketioClient: FeathersSocketIOClient; -export = socketioClient; - -interface FeathersSocketIOClient { - (socket: SocketIOClient.Socket, options?: socketioClient.Options): () => void; - default: FeathersSocketIOClient; -} - -declare namespace socketioClient { - interface Options { - timeout?: number; - } -} diff --git a/packages/socketio-client/lib/index.js b/packages/socketio-client/lib/index.js deleted file mode 100644 index 23f8e5c89a..0000000000 --- a/packages/socketio-client/lib/index.js +++ /dev/null @@ -1,47 +0,0 @@ -const Service = require('@feathersjs/transport-commons/client'); - -function socketioClient (connection, options) { - if (!connection) { - throw new Error('Socket.io connection needs to be provided'); - } - - if (connection && connection.io && connection.io.engine && - connection.io.engine.transport && connection.io.engine.transport.query && - connection.io.engine.transport.query.EIO > 3 - ) { - // tslint:disable-next-line - console.error('You are trying to use the Socket.io client version 3 or later with Feathers v4 which only supports Socket.io version 2. Please use socket.io-client version 2 instead.'); - throw new Error('socket.io-client must be version 2.x'); - } - - const defaultService = function (name) { - const events = Object.keys(this.eventMappings || {}) - .map(method => this.eventMappings[method]); - - const settings = Object.assign({}, options, { - events, - name, - connection, - method: 'emit' - }); - - return new Service(settings); - }; - - const initialize = function (app) { - if (typeof app.defaultService === 'function') { - throw new Error('Only one default client provider can be configured'); - } - - app.io = connection; - app.defaultService = defaultService; - }; - - initialize.Service = Service; - initialize.service = defaultService; - - return initialize; -} - -module.exports = socketioClient; -module.exports.default = socketioClient; diff --git a/packages/socketio-client/package.json b/packages/socketio-client/package.json index 3470bb2213..3b662c6eee 100644 --- a/packages/socketio-client/package.json +++ b/packages/socketio-client/package.json @@ -1,10 +1,9 @@ { "name": "@feathersjs/socketio-client", "description": "The client for Socket.io through feathers-socketio", - "version": "4.5.11", + "version": "5.0.0-pre.1", "homepage": "https://feathersjs.com", "main": "lib/index.js", - "types": "index.d.ts", "keywords": [ "feathers", "feathers-plugin" @@ -31,26 +30,42 @@ "node": ">= 10" }, "scripts": { - "test": "mocha --config ../../.mocharc.json" + "prepublish": "npm run compile", + "compile": "shx rm -rf lib/ && tsc", + "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" }, + "files": [ + "CHANGELOG.md", + "LICENSE", + "README.md", + "src/**", + "lib/**", + "*.d.ts", + "*.js" + ], "publishConfig": { "access": "public" }, "dependencies": { - "@feathersjs/transport-commons": "^4.5.11", - "@types/socket.io-client": "^1.4.34" + "@feathersjs/transport-commons": "^5.0.0-pre.1" }, "devDependencies": { - "@feathersjs/commons": "^4.5.11", - "@feathersjs/feathers": "^4.5.11", - "@feathersjs/socketio": "^4.5.11", - "@feathersjs/tests": "^4.5.11", - "feathers-memory": "^4.1.0", + "@feathersjs/adapter-memory": "^5.0.0-pre.1", + "@feathersjs/commons": "^5.0.0-pre.1", + "@feathersjs/feathers": "^5.0.0-pre.1", + "@feathersjs/socketio": "^5.0.0-pre.1", + "@feathersjs/tests": "^5.0.0-pre.1", + "@feathersjs/transport-commons": "^5.0.0-pre.0", + "@types/mocha": "^8.0.4", + "@types/node": "^14.14.10", "mocha": "^8.2.1", - "socket.io-client": "^2.3.1" + "shx": "^0.3.3", + "socket.io-client": "^3.0.3", + "ts-node": "^9.1.0", + "typescript": "^4.1.2" }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/socketio-client/src/index.ts b/packages/socketio-client/src/index.ts new file mode 100644 index 0000000000..082961d6f3 --- /dev/null +++ b/packages/socketio-client/src/index.ts @@ -0,0 +1,42 @@ +import { Service } from '@feathersjs/transport-commons/src/client'; +import { Socket } from 'socket.io-client'; + +interface SocketIOClientOptions { + timeout?: number; +} + +function socketioClient (connection: Socket, options?: SocketIOClientOptions) { + if (!connection) { + throw new Error('Socket.io connection needs to be provided'); + } + + const defaultService = function (this: any, name: string) { + const events = Object.keys(this.eventMappings || {}) + .map(method => this.eventMappings[method]); + + const settings = Object.assign({}, options, { + events, + name, + connection, + method: 'emit' + }); + + return new Service(settings); + }; + + const initialize = function (app: any) { + if (typeof app.defaultService === 'function') { + throw new Error('Only one default client provider can be configured'); + } + + app.io = connection; + app.defaultService = defaultService; + }; + + initialize.Service = Service; + initialize.service = defaultService; + + return initialize; +} + +export = socketioClient; diff --git a/packages/socketio-client/test/index.test.js b/packages/socketio-client/test/index.test.js deleted file mode 100644 index c027441b8a..0000000000 --- a/packages/socketio-client/test/index.test.js +++ /dev/null @@ -1,76 +0,0 @@ -const assert = require('assert'); -const feathers = require('@feathersjs/feathers'); -const io = require('socket.io-client'); -const baseTests = require('@feathersjs/tests/lib/client'); - -const server = require('./server'); -const socketio = require('../lib'); - -describe('@feathersjs/socketio-client', () => { - const app = feathers(); - - let socket; - - before(function (done) { - this.server = server().listen(9988, () => { - socket = io('http://localhost:9988'); - app.configure(socketio(socket)); - done(); - }); - }); - - after(function (done) { - socket.disconnect(); - this.server.close(done); - }); - - it('exports default', () => - assert.strictEqual(socketio.default, socketio) - ); - - it('throws an error with no connection', () => { - try { - feathers().configure(socketio()); - assert.ok(false); - } catch (e) { - assert.strictEqual(e.message, - 'Socket.io connection needs to be provided' - ); - } - }); - - it('app has the io attribute', () => { - assert.ok(app.io); - }); - - it('throws an error when configured twice', () => { - try { - app.configure(socketio(socket)); - assert.ok(false, 'Should never get here'); - } catch (e) { - assert.strictEqual(e.message, 'Only one default client provider can be configured'); - } - }); - - it('can initialize a client instance', () => { - const init = socketio(socket); - const todos = init.service('todos'); - - assert.ok(todos instanceof init.Service, 'Returned service is a client'); - - return todos.find().then(todos => assert.deepStrictEqual(todos, [{ - text: 'some todo', - complete: false, - id: 0 - }])); - }); - - it('return 404 for non-existent service', () => { - return app.service('not-me').create({}).catch(e => - assert.strictEqual(e.message, 'Service \'not-me\' not found') - ); - }); - - baseTests(app, 'todos'); - baseTests(app, '/'); -}); diff --git a/packages/socketio-client/test/index.test.ts b/packages/socketio-client/test/index.test.ts new file mode 100644 index 0000000000..365143c066 --- /dev/null +++ b/packages/socketio-client/test/index.test.ts @@ -0,0 +1,81 @@ +import { strict as assert } from 'assert'; +import { Server } from 'http'; +import feathers from '@feathersjs/feathers'; +import { io, Socket } from 'socket.io-client'; +import { setupTests } from '@feathersjs/tests/src/client'; + +import { createServer } from './server'; +import socketio from '../src'; + +describe('@feathersjs/socketio-client', () => { + const app = feathers(); + + let socket: Socket; + let server: Server; + + before(done => { + server = createServer().listen(9988); + server.once('listening', () => { + socket = io('http://localhost:9988'); + app.configure(socketio(socket)); + done(); + }); + }); + + after(done => { + socket.disconnect(); + server.close(done); + }); + + it('throws an error with no connection', () => { + try { + // @ts-ignore + feathers().configure(socketio()); + assert.ok(false); + } catch (e) { + assert.strictEqual(e.message, + 'Socket.io connection needs to be provided' + ); + } + }); + + it('app has the io attribute', () => { + assert.ok((app as any).io); + }); + + it('throws an error when configured twice', () => { + try { + app.configure(socketio(socket)); + assert.ok(false, 'Should never get here'); + } catch (e) { + assert.strictEqual(e.message, 'Only one default client provider can be configured'); + } + }); + + it('can initialize a client instance', async () => { + const init = socketio(socket); + const totoService = init.service('todos'); + + assert.ok(totoService instanceof init.Service, 'Returned service is a client'); + + const todos = await totoService.find(); + + assert.deepEqual(todos, [{ + text: 'some todo', + complete: false, + id: 0 + }]); + }); + + it('return 404 for non-existent service', async () => { + try { + await app.service('not-me').create({}); + assert.fail('Should never get here'); + } catch(e) { + assert.strictEqual(e.message, 'Service \'not-me\' not found') + } + }); + + setupTests(app, 'todos'); + setupTests(app, '/'); +}); diff --git a/packages/socketio-client/test/server.js b/packages/socketio-client/test/server.ts similarity index 59% rename from packages/socketio-client/test/server.js rename to packages/socketio-client/test/server.ts index 1ce1ada465..60a43bea96 100644 --- a/packages/socketio-client/test/server.js +++ b/packages/socketio-client/test/server.ts @@ -1,35 +1,37 @@ -const feathers = require('@feathersjs/feathers'); -const socketio = require('@feathersjs/socketio'); -const { Service } = require('feathers-memory'); +import feathers, { Id, Params } from '@feathersjs/feathers'; +import socketio from '@feathersjs/socketio'; +import '@feathersjs/transport-commons'; +import { Service } from '@feathersjs/adapter-memory'; // eslint-disable-next-line no-extend-native Object.defineProperty(Error.prototype, 'toJSON', { - value: function () { - var alt = {}; + value () { + const alt: any = {}; - Object.getOwnPropertyNames(this).forEach(function (key) { + Object.getOwnPropertyNames(this).forEach((key: string) => { alt[key] = this[key]; }, this); return alt; }, - configurable: true + configurable: true, + writable: true }); // Create an in-memory CRUD service for our Todos class TodoService extends Service { - get (id, params) { + async get (id: Id, params: Params) { if (params.query.error) { - return Promise.reject(new Error('Something went wrong')); + throw new Error('Something went wrong'); } - return super.get(id).then(data => - Object.assign({ query: params.query }, data) - ); + const data = await super.get(id); + + return Object.assign({ query: params.query }, data) } } -module.exports = function () { +export function createServer () { const app = feathers() .configure(socketio()) .use('/', new TodoService()) @@ -53,4 +55,4 @@ module.exports = function () { service.publish(publisher); return app; -}; +} diff --git a/packages/socketio-client/tsconfig.json b/packages/socketio-client/tsconfig.json new file mode 100644 index 0000000000..316fd41336 --- /dev/null +++ b/packages/socketio-client/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "include": [ + "src/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib" + } +} diff --git a/packages/socketio/CHANGELOG.md b/packages/socketio/CHANGELOG.md index d0d1f66982..1efa850b39 100644 --- a/packages/socketio/CHANGELOG.md +++ b/packages/socketio/CHANGELOG.md @@ -3,6 +3,40 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### Features + +* **transport-commons:** Remove legacy message format and unnecessary client timeouts ([#1939](https://github.com/feathersjs/feathers/issues/1939)) ([5538881](https://github.com/feathersjs/feathers/commit/5538881a08bc130de42c5984055729d8336f8615)) + + +### BREAKING CHANGES + +* **transport-commons:** Removes the old message format and client service timeout + + + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### Features + +* **transport-commons:** Remove legacy message format and unnecessary client timeouts ([#1939](https://github.com/feathersjs/feathers/issues/1939)) ([5538881](https://github.com/feathersjs/feathers/commit/5538881a08bc130de42c5984055729d8336f8615)) + + +### BREAKING CHANGES + +* **transport-commons:** Removes the old message format and client service timeout + + + ## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) **Note:** Version bump only for package @feathersjs/socketio diff --git a/packages/socketio/client.js b/packages/socketio/client.js deleted file mode 100644 index e1250b097a..0000000000 --- a/packages/socketio/client.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/client'); diff --git a/packages/socketio/index.d.ts b/packages/socketio/index.d.ts deleted file mode 100644 index 3bd63b2d5c..0000000000 --- a/packages/socketio/index.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import http from 'http'; -import io from 'socket.io'; - -declare const socketio: FeathersSocketIO; -export = socketio; - -interface FeathersSocketIO { - (callback?: (io: io.Server) => void): (app: any) => void; - (options: number | io.ServerOptions, callback?: (io: io.Server) => void): (app: any) => void; - (port: number, options?: io.ServerOptions, callback?: (io: io.Server) => void): (app: any) => void; - default: FeathersSocketIO; -} diff --git a/packages/socketio/lib/middleware.js b/packages/socketio/lib/middleware.js deleted file mode 100644 index 10f626621f..0000000000 --- a/packages/socketio/lib/middleware.js +++ /dev/null @@ -1,46 +0,0 @@ -const debug = require('debug')('@feathersjs/socketio/middleware'); - -exports.disconnect = (app, getParams) => (socket, next) => { - socket.once('disconnect', () => app.emit('disconnect', getParams(socket))); - next(); -}; - -exports.params = (app, socketMap) => (socket, next) => { - socket.feathers = { - provider: 'socketio', - headers: socket.handshake.headers - }; - - socketMap.set(socket.feathers, socket); - - next(); -}; - -exports.authentication = (app, getParams, settings = {}) => (socket, next) => { - const service = app.defaultAuthentication ? app.defaultAuthentication(settings.service) : null; - - if (service === null) { - return next(); - } - - const config = service.configuration; - const authStrategies = config.parseStrategies || config.authStrategies || []; - - if (authStrategies.length === 0) { - return next(); - } - - service.parse(socket.handshake, null, ...authStrategies) - .then(async authentication => { - if (authentication) { - debug('Parsed authentication from HTTP header', authentication); - socket.feathers.authentication = authentication; - await service.create(authentication, { - provider: 'socketio', - connection: getParams(socket) - }); - } - - next(); - }).catch(next); -}; diff --git a/packages/socketio/package.json b/packages/socketio/package.json index f05884836a..269b4a65da 100644 --- a/packages/socketio/package.json +++ b/packages/socketio/package.json @@ -1,10 +1,9 @@ { "name": "@feathersjs/socketio", "description": "The Feathers Socket.io real-time API provider", - "version": "4.5.11", + "version": "5.0.0-pre.1", "homepage": "https://feathersjs.com", "main": "lib/", - "types": "index.d.ts", "keywords": [ "feathers", "feathers-plugin" @@ -40,7 +39,9 @@ "*.js" ], "scripts": { - "test": "mocha --config ../../.mocharc.json" + "prepublish": "npm run compile", + "compile": "shx rm -rf lib/ && tsc", + "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -49,24 +50,24 @@ "access": "public" }, "dependencies": { - "@feathersjs/transport-commons": "^4.5.11", - "@types/socket.io": "^2.1.11", + "@feathersjs/transport-commons": "^5.0.0-pre.1", "debug": "^4.3.1", - "socket.io": "^2.3.0", + "socket.io": "^3.0.3", "uberproto": "^2.0.6" }, "devDependencies": { - "@feathersjs/commons": "^4.5.11", - "@feathersjs/express": "^4.5.11", - "@feathersjs/feathers": "^4.5.11", - "@feathersjs/tests": "^4.5.11", + "@feathersjs/adapter-memory": "^5.0.0-pre.1", + "@feathersjs/commons": "^5.0.0-pre.1", + "@feathersjs/express": "^5.0.0-pre.1", + "@feathersjs/feathers": "^5.0.0-pre.1", + "@feathersjs/tests": "^5.0.0-pre.1", "@types/mocha": "^8.0.4", - "@types/mongodb": "^3.6.1", "@types/node": "^14.14.10", - "feathers-memory": "^4.1.0", "lodash": "^4.17.20", "mocha": "^8.2.1", - "socket.io-client": "^2.3.1" + "shx": "^0.3.3", + "socket.io-client": "^3.0.3", + "typescript": "^4.1.2" }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/socketio/lib/index.js b/packages/socketio/src/index.ts similarity index 57% rename from packages/socketio/lib/index.js rename to packages/socketio/src/index.ts index 36734660dd..28fb08e64e 100644 --- a/packages/socketio/lib/index.js +++ b/packages/socketio/src/index.ts @@ -1,12 +1,19 @@ -const socketio = require('socket.io'); -const Proto = require('uberproto'); -const http = require('http'); -const { socket: commons } = require('@feathersjs/transport-commons'); -const debug = require('debug')('@feathersjs/socketio'); - -const middleware = require('./middleware'); - -function configureSocketio (port, options, config) { +// @ts-ignore +import Proto from 'uberproto'; +import Debug from 'debug'; +import { Server, ServerOptions } from 'socket.io'; +import http from 'http'; +import { Application } from '@feathersjs/feathers'; +import { socket } from '@feathersjs/transport-commons'; + +import { disconnect, params, authentication, FeathersSocket } from './middleware'; + +const debug = Debug('@feathersjs/socketio'); + +function configureSocketio (callback?: (io: Server) => void): (app: Application) => void; +function configureSocketio (options: number | Partial, callback?: (io: Server) => void): (app: Application) => void; +function configureSocketio (port: number, options?: Partial, callback?: (io: Server) => void): (app: Application) => void; +function configureSocketio (port?: any, options?: any, config?: any) { if (typeof port !== 'number') { config = options; options = port; @@ -18,9 +25,9 @@ function configureSocketio (port, options, config) { options = {}; } - return function (app) { + return (app: Application) => { // Function that gets the connection - const getParams = socket => socket.feathers; + const getParams = (socket: FeathersSocket) => socket.feathers; // A mapping from connection to socket instance const socketMap = new WeakMap(); @@ -32,7 +39,7 @@ function configureSocketio (port, options, config) { // when `setup` has been called (with a server) const done = new Promise(resolve => { Proto.mixin({ - listen (...args) { + listen (...args: any[]) { if (typeof this._super === 'function') { // If `listen` already exists // usually the case when the app has been expressified @@ -46,13 +53,13 @@ function configureSocketio (port, options, config) { return server.listen(...args); }, - setup (server) { + setup (server: http.Server) { if (!this.io) { - const io = this.io = socketio.listen(port || server, options); + const io = this.io = new Server(port || server, options); - io.use(middleware.disconnect(app, getParams)); - io.use(middleware.params(app, socketMap)); - io.use(middleware.authentication(app, getParams)); + io.use(disconnect(app, getParams)); + io.use(params(app, socketMap)); + io.use(authentication(app, getParams)); // In Feathers it is easy to hit the standard Node warning limit // of event listeners (e.g. by registering 10 services). @@ -72,7 +79,7 @@ function configureSocketio (port, options, config) { }, app); }); - app.configure(commons({ + app.configure(socket({ done, socketMap, getParams, @@ -81,5 +88,4 @@ function configureSocketio (port, options, config) { }; } -module.exports = configureSocketio; -module.exports.default = configureSocketio; +export = configureSocketio; diff --git a/packages/socketio/src/middleware.ts b/packages/socketio/src/middleware.ts new file mode 100644 index 0000000000..ca5ff43bdf --- /dev/null +++ b/packages/socketio/src/middleware.ts @@ -0,0 +1,59 @@ +import { Application, Params } from '@feathersjs/feathers'; +import Debug from 'debug'; +import { Socket } from 'socket.io'; + +const debug = Debug('@feathersjs/socketio/middleware'); + +export type ParamsGetter = (socket: Socket) => any; +export type NextFunction = (err?: any) => void; +export interface FeathersSocket extends Socket { + feathers?: Params +} + +export const disconnect = (app: Application, getParams: ParamsGetter) => + (socket: FeathersSocket, next: NextFunction) => { + socket.once('disconnect', () => app.emit('disconnect', getParams(socket))); + next(); + } + +export const params = (_app: Application, socketMap: WeakMap) => + (socket: FeathersSocket, next: NextFunction) => { + socket.feathers = { + provider: 'socketio', + headers: socket.handshake.headers + }; + + socketMap.set(socket.feathers, socket); + + next(); + } + +export const authentication = (app: Application, getParams: ParamsGetter, settings: any = {}) => + (socket: FeathersSocket, next: NextFunction) => { + const service = (app as any).defaultAuthentication ? (app as any).defaultAuthentication(settings.service) : null; + + if (service === null) { + return next(); + } + + const config = service.configuration; + const authStrategies = config.parseStrategies || config.authStrategies || []; + + if (authStrategies.length === 0) { + return next(); + } + + service.parse(socket.handshake, null, ...authStrategies) + .then(async (authentication: any) => { + if (authentication) { + debug('Parsed authentication from HTTP header', authentication); + socket.feathers.authentication = authentication; + await service.create(authentication, { + provider: 'socketio', + connection: getParams(socket) + }); + } + + next(); + }).catch(next); + } diff --git a/packages/socketio/test/events.js b/packages/socketio/test/events.ts similarity index 70% rename from packages/socketio/test/events.js rename to packages/socketio/test/events.ts index 00dcb79040..5e6744d37c 100644 --- a/packages/socketio/test/events.js +++ b/packages/socketio/test/events.ts @@ -1,21 +1,22 @@ -const assert = require('assert'); -const io = require('socket.io-client'); -const { verify } = require('@feathersjs/tests/lib/fixture'); +import { strict as assert } from 'assert'; +import { io, Socket } from 'socket.io-client'; +import { verify } from '@feathersjs/tests/src/fixture'; +import { RealTimeConnection } from '@feathersjs/transport-commons/src/channels/channel/base'; -module.exports = function (name, options) { - const call = (method, ...args) => { +export default (name: string, options: any) => { + const call = (method: string, ...args: any[]) => { return new Promise((resolve, reject) => { const { socket } = options; const emitArgs = [ method, name ].concat(args); - socket.emit(...emitArgs, (error, result) => + socket.emit(...emitArgs, (error: any, result: any) => error ? reject(error) : resolve(result) ); }); }; - const verifyEvent = (done, callback) => { - return function (data) { + const verifyEvent = (done: (err?: any) => void, callback: (data: any) => void) => { + return function (data: any) { try { callback(data); done(); @@ -26,11 +27,11 @@ module.exports = function (name, options) { }; describe('Basic service events', () => { - let socket; - let connection; + let socket: Socket; + let connection: RealTimeConnection; before(done => { - options.app.once('connection', conn => { + options.app.once('connection', (conn: RealTimeConnection) => { connection = conn; options.app.channel('default').join(connection); @@ -46,8 +47,8 @@ module.exports = function (name, options) { }); it(`${name} created`, done => { - let original = { - name: `created event` + const original = { + name: 'created event' }; socket.once(`${name} created`, verifyEvent(done, data => @@ -58,11 +59,11 @@ module.exports = function (name, options) { }); it(`${name} updated`, done => { - let original = { - name: `updated event` + const original = { + name: 'updated event' }; - socket.once(`${name} updated`, verifyEvent(done, data => + socket.once(`${name} updated`, verifyEvent(done, (data: any) => verify.update(10, original, data) )); @@ -70,11 +71,11 @@ module.exports = function (name, options) { }); it(`${name} patched`, done => { - let original = { - name: `patched event` + const original = { + name: 'patched event' }; - socket.once(`${name} patched`, verifyEvent(done, data => + socket.once(`${name} patched`, verifyEvent(done, (data: any) => verify.patch(12, original, data) )); @@ -82,7 +83,7 @@ module.exports = function (name, options) { }); it(`${name} removed`, done => { - socket.once(`${name} removed`, verifyEvent(done, data => + socket.once(`${name} removed`, verifyEvent(done, (data: any) => verify.remove(333, data) )); @@ -90,21 +91,21 @@ module.exports = function (name, options) { }); it(`${name} custom events`, done => { - let service = options.app.service(name); - let original = { - name: `created event` + const service = options.app.service(name); + const original = { + name: 'created event' }; - let old = service.create; + const old = service.create; - service.create = function (data) { + service.create = function (data: any) { this.emit('log', { message: 'Custom log event', data }); service.create = old; return old.apply(this, arguments); }; - socket.once(`${name} log`, verifyEvent(done, data => { + socket.once(`${name} log`, verifyEvent(done, (data: any) => { assert.deepStrictEqual(data, { - message: `Custom log event`, data: original + message: 'Custom log event', data: original }); service.create = old; })); @@ -115,12 +116,13 @@ module.exports = function (name, options) { describe('Event channels', () => { const eventName = `${name} created`; - let connections; - let sockets; + + let connections: RealTimeConnection[]; + let sockets: any[]; before(done => { let counter = 0; - const handler = connection => { + const handler = (connection: RealTimeConnection) => { counter++; options.app.channel(connection.channel).join(connection); @@ -164,11 +166,11 @@ module.exports = function (name, options) { done(new Error('Should not get this event')); }; - service.publish('created', data => + service.publish('created', (data: any) => options.app.channel(data.room) ); - socket.once(eventName, data => { + socket.once(eventName, (data: any) => { assert.strictEqual(data.room, 'first'); otherSocket.removeEventListener(eventName, onError); done(); @@ -190,7 +192,7 @@ module.exports = function (name, options) { const onError = () => { done(new Error('Should not get this event')); }; - const onEvent = data => { + const onEvent = (data: any) => { counter++; assert.strictEqual(data.room, 'second'); @@ -200,7 +202,7 @@ module.exports = function (name, options) { } }; - service.publish('created', data => + service.publish('created', (data: any) => options.app.channel(data.room) ); diff --git a/packages/socketio/test/index.test.js b/packages/socketio/test/index.test.ts similarity index 58% rename from packages/socketio/test/index.test.js rename to packages/socketio/test/index.test.ts index 98a4983735..43901fa606 100644 --- a/packages/socketio/test/index.test.js +++ b/packages/socketio/test/index.test.ts @@ -1,22 +1,24 @@ -const feathers = require('@feathersjs/feathers'); -const express = require('@feathersjs/express'); -const assert = require('assert'); -const omit = require('lodash/omit'); -const extend = require('lodash/extend'); -const io = require('socket.io-client'); -const request = require('request'); -const { Service } = require('@feathersjs/tests/lib/fixture'); - -const methodTests = require('./methods.js'); -const eventTests = require('./events'); -const socketio = require('../lib'); +import { strict as assert } from 'assert'; +import feathers, { Application, HookContext, NullableId, Params } from '@feathersjs/feathers'; +import express from '@feathersjs/express'; +import { omit, extend } from 'lodash'; +import { io } from 'socket.io-client'; +import axios from 'axios'; +import { Server } from 'http'; +import { Service } from '@feathersjs/tests/src/fixture'; +import { Socket } from 'socket.io-client'; + +import methodTests from './methods'; +import eventTests from './events'; +import socketio from '../src'; +import { FeathersSocket, NextFunction } from '../src/middleware.js'; describe('@feathersjs/socketio', () => { - let app; - let server; - let socket; + let app: Application; + let server: Server; + let socket: Socket; - const socketParams = { + const socketParams: any = { user: { name: 'David' }, provider: 'socketio' }; @@ -31,19 +33,19 @@ describe('@feathersjs/socketio', () => { }; before(done => { - const errorHook = function (hook) { + const errorHook = (hook: HookContext) => { if (hook.params.query.hookError) { throw new Error(`Error from ${hook.method}, ${hook.type} hook`); } }; app = feathers() - .configure(socketio(function (io) { - io.use(function (socket, next) { + .configure(socketio(io => { + io.use(function (socket: FeathersSocket, next: NextFunction) { socket.feathers.user = { name: 'David' }; socketParams.headers = socket.feathers.headers; - const { channel } = socket.handshake.query; + const { channel } = socket.handshake.query as any; if (channel) { socket.feathers.channel = channel; @@ -60,7 +62,8 @@ describe('@feathersjs/socketio', () => { } }); - server = app.listen(7886, function () { + server = app.listen(7886); + server.once('listening', () => { app.use('/tasks', Service); app.service('tasks').hooks({ before: { @@ -78,27 +81,23 @@ describe('@feathersjs/socketio', () => { server.close(done); }); - it('exports default', () => { - assert.strictEqual(socketio, socketio.default); - }); - it('runs io before setup (#131)', done => { let counter = 0; - let app = feathers().configure(socketio(() => { + const app = feathers().configure(socketio(() => { assert.strictEqual(counter, 0); counter++; })); - let srv = app.listen(8887).on('listening', () => srv.close(done)); + const srv: Server = app.listen(8887).on('listening', () => srv.close(done)); }); it('can set MaxListeners', done => { - let app = feathers().configure(socketio(io => + const app = feathers().configure(socketio(io => io.sockets.setMaxListeners(100) )); - let srv = app.listen(8987).on('listening', () => { - assert.strictEqual(app.io.sockets.getMaxListeners(), 100); + const srv = app.listen(8987).on('listening', () => { + assert.strictEqual((app as any).io.sockets.getMaxListeners(), 100); srv.close(done); }); }); @@ -107,54 +106,50 @@ describe('@feathersjs/socketio', () => { const data = { message: 'Hello world' }; const app = express(feathers()) .configure(socketio()) - .use('/test', (req, res) => res.json(data)); - const srv = app.listen(8992).on('listening', () => { - const url = 'http://localhost:8992/socket.io/socket.io.js'; + .use('/test', (_req, res) => res.json(data)); - request(url, (err, res) => { - assert.ok(!err); - assert.strictEqual(res.statusCode, 200); + const srv = app.listen(8992).on('listening', async () => { + const response = await axios({ + url: 'http://localhost:8992/socket.io/socket.io.js' + }); - const url = 'http://localhost:8992/test'; + assert.strictEqual(response.status, 200); - request({ url, json: true }, (err, res) => { - assert.ok(!err); - assert.deepStrictEqual(res.body, data); - srv.close(done); - }); + const res = await axios({ + url: 'http://localhost:8992/test' }); + + assert.deepStrictEqual(res.data, data); + srv.close(done); }); }); it('can set options (#12)', done => { - let application = feathers().configure(socketio({ + const application = feathers().configure(socketio({ path: '/test/' }, ioInstance => assert.ok(ioInstance))); - let srv = application.listen(8987).on('listening', () => { - const url = 'http://localhost:8987/test/socket.io.js'; + const srv = application.listen(8987).on('listening', async () => { + const { status } = await axios('http://localhost:8987/test/socket.io.js'); - // eslint-disable-next-line handle-callback-err - request(url, (err, res) => { - assert.strictEqual(res.statusCode, 200); - srv.close(done); - }); + assert.strictEqual(status, 200); + srv.close(done); }); }); it('passes handshake as service parameters', done => { - let service = app.service('todo'); - let old = { + const service = app.service('todo'); + const old = { create: service.create, update: service.update }; - service.create = function (data, params) { + service.create = function (_data: any, params: Params) { assert.deepStrictEqual(omit(params, 'query', 'route', 'connection'), socketParams, 'Passed handshake parameters'); return old.create.apply(this, arguments); }; - service.update = function (id, data, params) { + service.update = function (_id: NullableId, _data: any, params: Params) { assert.deepStrictEqual(params, extend({ route: {}, connection: socketParams, @@ -165,12 +160,12 @@ describe('@feathersjs/socketio', () => { return old.update.apply(this, arguments); }; - socket.emit('create', 'todo', {}, error => { + socket.emit('create', 'todo', {}, (error: any) => { assert.ok(!error); socket.emit('update', 'todo', 1, {}, { test: 'param' - }, error => { + }, (error: any) => { assert.ok(!error); extend(service, old); done(); @@ -194,15 +189,15 @@ describe('@feathersjs/socketio', () => { }); it('missing parameters in socket call works (#88)', done => { - let service = app.service('todo'); - let old = { find: service.find }; + const service = app.service('todo'); + const old = { find: service.find }; - service.find = function (params) { + service.find = function (params: Params) { assert.deepStrictEqual(omit(params, 'query', 'route', 'connection'), socketParams, 'Handshake parameters passed on proper position'); return old.find.apply(this, arguments); }; - socket.emit('find', 'todo', error => { + socket.emit('find', 'todo', (error: any) => { assert.ok(!error); extend(service, old); done(); @@ -214,11 +209,6 @@ describe('@feathersjs/socketio', () => { describe('Service', () => methodTests('todo', options)); describe('Dynamic Service', () => methodTests('todo', options)); }); - - describe('(\'service::method\') legacy event format', () => { - describe('Service', () => methodTests('tasks', options, true)); - describe('Dynamic Service', () => methodTests('tasks', options, true)); - }); }); describe('Service events', () => { diff --git a/packages/socketio/test/methods.js b/packages/socketio/test/methods.js deleted file mode 100644 index 6ca75c588f..0000000000 --- a/packages/socketio/test/methods.js +++ /dev/null @@ -1,113 +0,0 @@ -const assert = require('assert'); -const { verify } = require('@feathersjs/tests/lib/fixture'); - -module.exports = function (name, options, legacy = false) { - const call = (method, ...args) => - new Promise((resolve, reject) => { - const { socket } = options; - const prefix = legacy ? [ `${name}::${method}` ] - : [ method, name ]; - const emitArgs = prefix.concat(args); - - socket.emit(...emitArgs, (error, result) => - error ? reject(error) : resolve(result) - ); - } - ); - - it(`invalid arguments cause an error`, () => - call('find', 1, {}).catch(e => - assert.strictEqual(e.message, 'Too many arguments for \'find\' method') - ) - ); - - it('.find', () => - call('find', {}).then(data => verify.find(data)) - ); - - it('.get', () => - call('get', 'laundry').then(data => verify.get('laundry', data)) - ); - - it('.get with error', () => - call('get', 'laundry', { error: true }) - .then(() => assert.ok(false, 'Should never get here')) - .catch(error => assert.strictEqual(error.message, 'Something for laundry went wrong')) - ); - - it('.get with runtime error', () => - call('get', 'laundry', { runtimeError: true }) - .then(() => assert.ok(false, 'Should never get here')) - .catch(error => assert.strictEqual(error.message, 'thingThatDoesNotExist is not defined')) - ); - - it('.get with error in hook', () => - call('get', 'laundry', { hookError: true }) - .then(() => assert.ok(false, 'Should never get here')) - .catch(error => assert.strictEqual(error.message, 'Error from get, before hook')) - ); - - it(`.create`, () => { - let original = { - name: `creating` - }; - - return call('create', original, {}) - .then(data => verify.create(original, data)); - }); - - it(`.create without parameters`, () => { - let original = { - name: `creating again` - }; - - return call('create', original) - .then(data => verify.create(original, data)); - }); - - it('.update', () => { - let original = { - name: 'updating' - }; - - return call('update', 23, original, {}) - .then(data => verify.update(23, original, data)); - }); - - it('.update many', () => { - const original = { - name: `updating`, - many: true - }; - - return call('update', null, original) - .then(data => verify.update(null, original, data)); - }); - - it('.patch', () => { - let original = { - name: `patching` - }; - - return call('patch', 25, original) - .then(data => verify.patch(25, original, data)); - }); - - it('.patch many', () => { - let original = { - name: `patching`, - many: true - }; - - return call('patch', null, original) - .then(data => verify.patch(null, original, data)); - }); - - it('.remove', () => - call('remove', 11).then(data => verify.remove(11, data)) - ); - - it('.remove many', () => - call('remove', null).then(data => verify.remove(null, data)) - ); -}; diff --git a/packages/socketio/test/methods.ts b/packages/socketio/test/methods.ts new file mode 100644 index 0000000000..3fd86f7124 --- /dev/null +++ b/packages/socketio/test/methods.ts @@ -0,0 +1,130 @@ +import { strict as assert } from 'assert'; +import { verify } from '@feathersjs/tests/src/fixture'; + +export default (name: string, options: any) => { + const call = (method: string, ...args: any[]) => + new Promise((resolve, reject) => { + const { socket } = options; + const prefix = [method, name]; + const emitArgs = prefix.concat(args); + + socket.emit(...emitArgs, (error: any, result: any) => + error ? reject(error) : resolve(result) + ); + }); + + it('invalid arguments cause an error', () => + call('find', 1, {}).catch(e => + assert.strictEqual(e.message, 'Too many arguments for \'find\' method') + ) + ); + + it('.find', () => async () => { + await call('find', {}).then(data => verify.find(data)); + }); + + it('.get', () => async () => { + await call('get', 'laundry').then(data => verify.get('laundry', data)); + }); + + it('.get with error', () => async () => { + try { + await call('get', 'laundry', { error: true }); + assert.fail('Should never get here'); + } catch (error) { + assert.strictEqual(error.message, 'Something for laundry went wrong'); + } + }); + + it('.get with runtime error', () => async () => { + try { + await call('get', 'laundry', { runtimeError: true }); + assert.fail('Should never get here'); + } catch (error) { + assert.strictEqual(error.message, 'thingThatDoesNotExist is not defined') + } + }); + + it('.get with error in hook', () => async () => { + try { + await call('get', 'laundry', { hookError: true }); + assert.fail('Should never get here'); + } catch (error) { + assert.strictEqual(error.message, 'Error from get, before hook'); + } + }); + + it('.create', async () => { + const original = { + name: 'creating' + }; + + const data = await call('create', original, {}); + + verify.create(original, data); + }); + + it('.create without parameters', async () => { + const original = { + name: 'creating again' + }; + + const data = await call('create', original); + + verify.create(original, data); + }); + + it('.update', async () => { + const original = { + name: 'updating' + }; + + const data = await call('update', 23, original, {}); + + verify.update(23, original, data); + }); + + it('.update many', async () => { + const original = { + name: 'updating', + many: true + }; + + const data = await call('update', null, original); + + verify.update(null, original, data); + }); + + it('.patch', async () => { + const original = { + name: 'patching' + }; + + const data = await call('patch', 25, original); + + verify.patch(25, original, data); + }); + + it('.patch many', async () => { + const original = { + name: 'patching', + many: true + }; + + const data = await call('patch', null, original); + + verify.patch(null, original, data); + }); + + it('.remove', () => async () => { + const data = await call('remove', 11); + + verify.remove(11, data); + }); + + it('.remove many', async () => { + const data = await call('remove', null); + + verify.remove(null, data); + }); +}; diff --git a/packages/socketio/tsconfig.json b/packages/socketio/tsconfig.json new file mode 100644 index 0000000000..316fd41336 --- /dev/null +++ b/packages/socketio/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "include": [ + "src/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib" + } +} diff --git a/packages/tests/.npmignore b/packages/tests/.npmignore deleted file mode 100644 index d423d51243..0000000000 --- a/packages/tests/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -test/ -tsconfig.json diff --git a/packages/tests/CHANGELOG.md b/packages/tests/CHANGELOG.md index 7c618a523f..d9c03bff11 100644 --- a/packages/tests/CHANGELOG.md +++ b/packages/tests/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + + ## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) **Note:** Version bump only for package @feathersjs/tests @@ -32,7 +48,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline **Note:** Version bump only for package @feathersjs/tests - +## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) ## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) diff --git a/packages/tests/package.json b/packages/tests/package.json index bb441c544e..85b0806752 100644 --- a/packages/tests/package.json +++ b/packages/tests/package.json @@ -2,7 +2,7 @@ "name": "@feathersjs/tests", "private": true, "description": "Feathers core module common tests", - "version": "4.5.11", + "version": "5.0.0-pre.1", "homepage": "https://feathersjs.com", "main": "lib/", "keywords": [ @@ -33,7 +33,7 @@ "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", "test": "npm run compile && npm run mocha", - "mocha": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" + "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -46,7 +46,7 @@ "lodash": "^4.17.20" }, "devDependencies": { - "@feathersjs/feathers": "^4.5.11", + "@feathersjs/feathers": "^5.0.0-pre.1", "@types/axios": "^0.14.0", "@types/debug": "^4.1.5", "@types/lodash": "^4.14.165", diff --git a/packages/tests/src/client.ts b/packages/tests/src/client.ts index 4fc00d9d26..e5e5c98fcb 100644 --- a/packages/tests/src/client.ts +++ b/packages/tests/src/client.ts @@ -1,4 +1,4 @@ -import assert from 'assert'; +import { strict as assert } from 'assert'; export interface Todo { text: string; @@ -92,7 +92,3 @@ export function setupTests (app: any, name: string) { }); }); } - -if (typeof module !== 'undefined') { - module.exports = Object.assign(setupTests, module.exports); -} diff --git a/packages/transport-commons/.npmignore b/packages/transport-commons/.npmignore deleted file mode 100644 index d423d51243..0000000000 --- a/packages/transport-commons/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -test/ -tsconfig.json diff --git a/packages/transport-commons/CHANGELOG.md b/packages/transport-commons/CHANGELOG.md index 6678c7a4d9..78994e00e9 100644 --- a/packages/transport-commons/CHANGELOG.md +++ b/packages/transport-commons/CHANGELOG.md @@ -3,6 +3,42 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### Features + +* **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) +* **transport-commons:** Remove legacy message format and unnecessary client timeouts ([#1939](https://github.com/feathersjs/feathers/issues/1939)) ([5538881](https://github.com/feathersjs/feathers/commit/5538881a08bc130de42c5984055729d8336f8615)) + + +### BREAKING CHANGES + +* **transport-commons:** Removes the old message format and client service timeout + + + + + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + + +### Features + +* **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) +* **transport-commons:** Remove legacy message format and unnecessary client timeouts ([#1939](https://github.com/feathersjs/feathers/issues/1939)) ([5538881](https://github.com/feathersjs/feathers/commit/5538881a08bc130de42c5984055729d8336f8615)) + + +### BREAKING CHANGES + +* **transport-commons:** Removes the old message format and client service timeout + + + ## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) diff --git a/packages/transport-commons/client.js b/packages/transport-commons/client.js deleted file mode 100644 index 14321055e8..0000000000 --- a/packages/transport-commons/client.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/client').Service; diff --git a/packages/transport-commons/package.json b/packages/transport-commons/package.json index f490b3206e..c75ba937eb 100644 --- a/packages/transport-commons/package.json +++ b/packages/transport-commons/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/transport-commons", "description": "Shared functionality for websocket providers", - "version": "4.5.11", + "version": "5.0.0-pre.1", "homepage": "https://feathersjs.com", "main": "lib/", "types": "lib/", @@ -34,7 +34,7 @@ "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", "test": "npm run compile && npm run mocha", - "mocha": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" + "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -42,15 +42,24 @@ "publishConfig": { "access": "public" }, + "files": [ + "CHANGELOG.md", + "LICENSE", + "README.md", + "src/**", + "lib/**", + "*.d.ts", + "*.js" + ], "dependencies": { - "@feathersjs/commons": "^4.5.11", - "@feathersjs/errors": "^4.5.11", + "@feathersjs/commons": "^5.0.0-pre.1", + "@feathersjs/errors": "^5.0.0-pre.1", "debug": "^4.3.1", "lodash": "^4.17.20", "radix-router": "^3.0.1" }, "devDependencies": { - "@feathersjs/feathers": "^4.5.11", + "@feathersjs/feathers": "^5.0.0-pre.1", "@types/debug": "^4.1.5", "@types/mocha": "^8.0.4", "@types/node": "^14.14.10", @@ -59,5 +68,5 @@ "ts-node": "^9.1.0", "typescript": "^4.1.2" }, - "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" + "gitHead": "e6b82b809c21da298501a12b82e72e166468994b" } diff --git a/packages/transport-commons/src/channels/index.ts b/packages/transport-commons/src/channels/index.ts index 2ef89d880c..1f3c9eef72 100644 --- a/packages/transport-commons/src/channels/index.ts +++ b/packages/transport-commons/src/channels/index.ts @@ -1,7 +1,5 @@ import Debug from 'debug'; -import compact from 'lodash/compact'; -import flattenDeep from 'lodash/flattenDeep'; -import noop from 'lodash/noop'; +import { compact, flattenDeep, noop } from 'lodash'; import { Channel, RealTimeConnection } from './channel/base'; import { CombinedChannel } from './channel/combined'; import { channelMixin, publishMixin, keys, PublishMixin, Event, Publisher } from './mixins'; @@ -10,7 +8,7 @@ import { Application, Service } from '@feathersjs/feathers'; const debug = Debug('@feathersjs/transport-commons/channels'); const { CHANNELS } = keys; -declare module '@feathersjs/feathers' { +declare module '@feathersjs/feathers/lib/declarations' { interface ServiceAddons { publish (publisher: Publisher): this; publish (event: Event, publisher: Publisher): this; @@ -19,7 +17,7 @@ declare module '@feathersjs/feathers' { registerPublisher (event: Event, publisher: Publisher): this; } - interface Application { + interface Application { // eslint-disable-line channels: string[]; channel (name: string[]): Channel; @@ -93,7 +91,7 @@ export function channels () { return; } - const results = Array.isArray(result) ? compact(flattenDeep(result)) : [result]; + const results = (Array.isArray(result) ? compact(flattenDeep(result)) : [result] as Channel[]); const channel = new CombinedChannel(results); if (channel && channel.length > 0) { diff --git a/packages/transport-commons/src/channels/mixins.ts b/packages/transport-commons/src/channels/mixins.ts index 7a5588ae29..2ab0a68f23 100644 --- a/packages/transport-commons/src/channels/mixins.ts +++ b/packages/transport-commons/src/channels/mixins.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */ import Debug from 'debug'; import { Channel } from './channel/base'; import { CombinedChannel } from './channel/combined'; diff --git a/packages/transport-commons/src/client.ts b/packages/transport-commons/src/client.ts index 872aa060ab..ae34bf5619 100644 --- a/packages/transport-commons/src/client.ts +++ b/packages/transport-commons/src/client.ts @@ -1,5 +1,5 @@ import Debug from 'debug'; -import { convert, Timeout } from '@feathersjs/errors'; +import { convert } from '@feathersjs/errors'; import { Params } from '@feathersjs/feathers'; const debug = Debug('@feathersjs/transport-commons/client'); @@ -57,7 +57,6 @@ interface ServiceOptions { connection: any; method: string; events?: string[]; - timeout?: number; } export class Service { @@ -65,34 +64,21 @@ export class Service { path: string; connection: any; method: string; - timeout: number; constructor (options: ServiceOptions) { this.events = options.events; this.path = options.name; this.connection = options.connection; this.method = options.method; - this.timeout = options.timeout || 5000; addEmitterMethods(this); } send (method: string, ...args: any[]) { return new Promise((resolve, reject) => { - const timeoutId = setTimeout(() => reject( - new Timeout(`Timeout of ${this.timeout}ms exceeded calling ${method} on ${this.path}`, { - timeout: this.timeout, - method, - path: this.path - }) - ), this.timeout); - args.unshift(method, this.path); args.push(function (error: any, data: any) { - error = convert(error); - clearTimeout(timeoutId); - - return error ? reject(error) : resolve(data); + return error ? reject(convert(error)) : resolve(data); }); debug(`Sending socket.${this.method}`, args); diff --git a/packages/transport-commons/src/routing.ts b/packages/transport-commons/src/routing.ts index 0bb2e7a349..6c9696e36e 100644 --- a/packages/transport-commons/src/routing.ts +++ b/packages/transport-commons/src/routing.ts @@ -5,8 +5,8 @@ import { Application } from '@feathersjs/feathers'; export const ROUTER = Symbol('@feathersjs/transport-commons/router'); -declare module '@feathersjs/feathers' { - interface Application { +declare module '@feathersjs/feathers/lib/declarations' { + interface Application { // eslint-disable-line lookup (path: string): { [key: string]: string }; } } diff --git a/packages/transport-commons/src/socket/index.ts b/packages/transport-commons/src/socket/index.ts index 89c1f57105..3e68ac7e81 100644 --- a/packages/transport-commons/src/socket/index.ts +++ b/packages/transport-commons/src/socket/index.ts @@ -68,24 +68,5 @@ export function socket ({ done, emit, socketMap, socketKey, getParams }: SocketO } }); })); - - // Legacy `socket.emit('serviceName::methodName', ...args)` handlers - app.mixins.push((service, path) => done.then(provider => { - provider.on('connection', (socket: any) => { - const methods = app.methods.filter(current => - // @ts-ignore - typeof service[current] === 'function' - ); - - for (const method of methods) { - const eventName = `${path}::${method}`; - - socket.on(eventName, (...args: any[]) => { - debug(`Got legacy method call '${eventName}'`); - runMethod(app, getParams(socket), path, method, args); - }); - } - }); - })); }; } diff --git a/packages/transport-commons/src/socket/utils.ts b/packages/transport-commons/src/socket/utils.ts index fbf9a5c0d8..524806ccbf 100644 --- a/packages/transport-commons/src/socket/utils.ts +++ b/packages/transport-commons/src/socket/utils.ts @@ -1,6 +1,6 @@ import Debug from 'debug'; import isEqual from 'lodash/isEqual'; -import errors from '@feathersjs/errors'; +import { NotFound, MethodNotAllowed } from '@feathersjs/errors'; import { HookContext, Application } from '@feathersjs/feathers'; import { CombinedChannel } from '../channels/channel/combined'; import { RealTimeConnection } from '../channels/channel/base'; @@ -81,7 +81,7 @@ export function runMethod (app: Application, connection: RealTimeConnection, pat // No valid service was found, return a 404 // just like a REST route would if (lookup === null) { - return Promise.reject(new errors.NotFound(`Service '${path}' not found`)); + return Promise.reject(new NotFound(`Service '${path}' not found`)); } const { service, params: route = {} } = lookup; @@ -89,7 +89,7 @@ export function runMethod (app: Application, connection: RealTimeConnection, pat // Only service methods are allowed // @ts-ignore if (paramsPositions[method] === undefined || typeof service[method] !== 'function') { - return Promise.reject(new errors.MethodNotAllowed(`Method '${method}' not allowed on service '${path}'`)); + return Promise.reject(new MethodNotAllowed(`Method '${method}' not allowed on service '${path}'`)); } const position = paramsPositions[method]; diff --git a/packages/transport-commons/test/channels/dispatch.test.ts b/packages/transport-commons/test/channels/dispatch.test.ts index 543fab9c58..d1830a7c54 100644 --- a/packages/transport-commons/test/channels/dispatch.test.ts +++ b/packages/transport-commons/test/channels/dispatch.test.ts @@ -2,7 +2,7 @@ import assert from 'assert'; import feathers, { Application, HookContext } from '@feathersjs/feathers'; import { channels } from '../../src/channels'; import { Channel } from '../../src/channels/channel/base'; -import { CombinedChannel } from '../../lib/channels/channel/combined'; +import { CombinedChannel } from '../../src/channels/channel/combined'; describe('app.publish', () => { let app: Application; @@ -23,7 +23,7 @@ describe('app.publish', () => { app.service('test').registerPublisher('bla', function () {}); assert.ok(false, 'Should never get here'); } catch (e) { - assert.strictEqual(e.message, `'bla' is not a valid service event`); + assert.strictEqual(e.message, '\'bla\' is not a valid service event'); } }); diff --git a/packages/transport-commons/test/client.test.ts b/packages/transport-commons/test/client.test.ts index a5d11af48f..9c7b70df17 100644 --- a/packages/transport-commons/test/client.test.ts +++ b/packages/transport-commons/test/client.test.ts @@ -1,6 +1,6 @@ import assert from 'assert'; import { EventEmitter } from 'events'; -import errors from '@feathersjs/errors'; +import { NotAuthenticated } from '@feathersjs/errors'; import { Service } from '../src/client'; declare type DummyCallback = (err: any, data?: any) => void; @@ -17,7 +17,6 @@ describe('client', () => { events: [ 'created' ], name: 'todos', method: 'emit', - timeout: 50, connection }) as Service & EventEmitter; }); @@ -30,7 +29,6 @@ describe('client', () => { const clientService = new Service({ name: 'todos', method: 'emit', - timeout: 50, connection: {} }) as Service & EventEmitter; @@ -125,29 +123,13 @@ describe('client', () => { }); }); - it('times out on undefined methods', () => { - return service.remove(10).then(() => { - throw new Error('Should never get here'); - }).catch(error => - assert.strictEqual(error.message, 'Timeout of 50ms exceeded calling remove on todos') - ); - }); - - it('throws a Timeout error when send times out waiting for a response', () => { - return service.remove(10).then(() => { - throw new Error('Should never get here'); - }).catch(error => - assert.strictEqual(error.name, 'Timeout') - ); - }); - it('converts to feathers-errors (#19)', () => { connection.once('create', (_path: any, _data: any, _params: any, callback: DummyCallback) => - callback(new errors.NotAuthenticated('Test', { hi: 'me' }).toJSON()) + callback(new NotAuthenticated('Test', { hi: 'me' }).toJSON()) ); return service.create(testData).catch(error => { - assert.ok(error instanceof errors.NotAuthenticated); + assert.ok(error instanceof NotAuthenticated); assert.strictEqual(error.name, 'NotAuthenticated'); assert.strictEqual(error.message, 'Test'); assert.strictEqual(error.code, 401); @@ -218,7 +200,6 @@ describe('client', () => { const client = new Service({ name: 'todos', method: 'emit', - timeout: 50, connection: conn }); diff --git a/packages/transport-commons/test/index.test.ts b/packages/transport-commons/test/index.test.ts deleted file mode 100644 index 14f5a61f04..0000000000 --- a/packages/transport-commons/test/index.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import assert from 'assert'; - -describe('@feathersjs/transport-commons', () => { - it('re-exports commons', () => { - const commons = require('../lib'); - - assert.ok(commons.socket); - assert.ok(commons.routing); - assert.ok(commons.channels); - }); -}); diff --git a/packages/transport-commons/test/socket/index.test.ts b/packages/transport-commons/test/socket/index.test.ts index f8842be78e..9bb147af59 100644 --- a/packages/transport-commons/test/socket/index.test.ts +++ b/packages/transport-commons/test/socket/index.test.ts @@ -79,7 +79,7 @@ describe('@feathersjs/transport-commons', () => { socket.emit('get', null, (error: any) => { assert.strictEqual(error.name, 'NotFound'); - assert.strictEqual(error.message, `Service 'null' not found`); + assert.strictEqual(error.message, 'Service \'null\' not found'); done(); }); }); @@ -111,84 +111,4 @@ describe('@feathersjs/transport-commons', () => { }); }); }); - - describe('legacy method socket event format', () => { - it('legacy `authenticate`', done => { - const socket = new EventEmitter(); - const data = { - test: 'data' - }; - - app.set('defaultAuthentication', 'myservice'); - provider.emit('connection', socket); - - socket.emit('authenticate', data, (error: any, result: any) => { - try { - const params = Object.assign({ - query: {}, - route: {}, - connection - }, connection); - - assert.ok(!error); - assert.deepStrictEqual(result, Object.assign({ params }, data)); - done(); - } catch (e) { - done(e); - } - }); - }); - - it('.get without params', done => { - const socket = new EventEmitter(); - - provider.emit('connection', socket); - - socket.emit('myservice::get', 10, (error: any, result: any) => { - try { - assert.ok(!error); - assert.deepStrictEqual(result, { - id: 10, - params: Object.assign({ - connection, - query: {}, - route: {} - }, connection) - }); - app.emit('disconnect', socket); - } catch (e) { - done(e); - } - }); - - app.once('disconnect', () => done()); - }); - - it('.create with params', done => { - const socket = new EventEmitter(); - const data = { - test: 'data' - }; - - provider.emit('connection', socket); - - socket.emit('myservice::create', data, { - fromQuery: true - }, (error: any, result: any) => { - const params = Object.assign({ - query: { fromQuery: true }, - route: {}, - connection - }, connection); - - try { - assert.ok(!error); - assert.deepStrictEqual(result, Object.assign({ params }, data)); - done(); - } catch (e) { - done(e); - } - }); - }); - }); }); diff --git a/packages/transport-commons/test/socket/utils.test.ts b/packages/transport-commons/test/socket/utils.test.ts index b2bc57d3aa..34e231dc4b 100644 --- a/packages/transport-commons/test/socket/utils.test.ts +++ b/packages/transport-commons/test/socket/utils.test.ts @@ -1,7 +1,7 @@ import assert from 'assert'; import { EventEmitter } from 'events'; import feathers, { Application, Params } from '@feathersjs/feathers'; -import errors from '@feathersjs/errors'; +import { NotAuthenticated } from '@feathersjs/errors'; import { routing } from '../../src/routing'; import { @@ -191,7 +191,7 @@ describe('socket commons utils', () => { app.use('/myservice', { get (id: number|string, params: Params) { if (params.query.error) { - return Promise.reject(new errors.NotAuthenticated('None shall pass')); + return Promise.reject(new NotAuthenticated('None shall pass')); } return Promise.resolve({ id }); } @@ -292,9 +292,7 @@ describe('socket commons utils', () => { assert.deepStrictEqual(error, { name: 'NotFound', message: 'Service \'ohmyservice\' not found', code: 404, - className: 'not-found', - data: undefined, - errors: {} + className: 'not-found' }); done(); } catch (e) { @@ -312,9 +310,7 @@ describe('socket commons utils', () => { name: 'MethodNotAllowed', message: 'Method \'create\' not allowed on service \'myservice\'', code: 405, - className: 'method-not-allowed', - data: undefined, - errors: {} + className: 'method-not-allowed' }); done(); } catch (e) { @@ -332,9 +328,7 @@ describe('socket commons utils', () => { name: 'MethodNotAllowed', message: 'Method \'blabla\' not allowed on service \'myservice\'', code: 405, - className: 'method-not-allowed', - data: undefined, - errors: {} + className: 'method-not-allowed' }); done(); } catch (e) { @@ -351,10 +345,8 @@ describe('socket commons utils', () => { assert.deepStrictEqual(error, { name: 'NotAuthenticated', message: 'None shall pass', - data: undefined, code: 401, - className: 'not-authenticated', - errors: {} + className: 'not-authenticated' }); done(); } catch (e) { diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 462ca5bfbf..0000000000 --- a/tslint.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "defaultSeverity": "error", - "extends": [ - "tslint:recommended" - ], - "linterOptions": { - "exclude": [ - "packages/authentication/lib/**", - "packages/authentication-local/lib/**", - "packages/authentication-client/lib/**", - "packages/authentication-oauth/lib/**", - "packages/configuration/lib/**", - "packages/commons/lib/**", - "packages/transport-commons/lib/**", - "packages/tests/lib/**", - "**/node_modules/**", - "**/coverage/**", - "**/dist/**", - "**/*.dist.js" - ] - }, - "rules": { - "trailing-comma": [ true, { "multiline": "never", "singleline": "never" } ], - "quotemark": [ true, "single", "jsx-double" ], - "member-access": [ true, "no-public" ], - "space-before-function-paren": true, - "variable-name": false, - "max-line-length": false, - "interface-name": false, - "object-literal-sort-keys": false, - "ordered-imports": false, - "arrow-parens": false, - "max-classes-per-file": false, - "only-arrow-functions": false, - "no-empty": false, - "no-shadowed-variable": false, - "no-namespace": [ true, "allow-declarations" ] - }, - "jsRules": true, - "rulesDirectory": [] -} \ No newline at end of file