From 51319e22c0c8e643c38eff4f3a415f661ca19c77 Mon Sep 17 00:00:00 2001 From: lucono Date: Tue, 2 Nov 2021 23:50:26 -0400 Subject: [PATCH] Bugfixes for issues #7 #9 #10, and various other fixes --- .gitattributes | 2 + .github/ISSUE_TEMPLATE/bug_report.md | 5 +- .vscode/settings.json | 1 - CHANGELOG.md | 2 +- README.md | 2 +- docs/documentation.md | 12 +- package-lock.json | 3042 +++++++++-------- package.json | 59 +- src/adapter.ts | 54 +- src/constants.ts | 5 +- src/core/config/config-setting.ts | 2 + src/core/config/extension-config.ts | 32 +- src/core/default-test-manager.ts | 1 + src/core/main-factory.ts | 21 +- src/core/spec-locator.ts | 36 +- src/core/test-suite-organizer.ts | 4 +- src/core/vscode/notifications.ts | 75 +- src/frameworks/angular/angular-factory.ts | 4 +- .../angular/angular-test-server-executor.ts | 33 +- .../karma/config/karma-configurator.ts | 112 +- src/frameworks/karma/config/karma.conf.ts | 11 +- .../karma/karma-environment-variable.ts | 3 +- src/frameworks/karma/karma-factory.ts | 4 +- src/frameworks/karma/karma-log-level.ts | 7 + src/frameworks/karma/karma-logger.ts | 6 - .../karma-command-line-test-run-executor.ts | 28 +- src/frameworks/karma/runner/karma-event.ts | 1 + .../runner/karma-http-test-run-executor.ts | 8 +- .../karma/runner/karma-test-event-listener.ts | 27 +- .../runner/karma-test-event-processor.ts | 170 +- .../runner/karma-test-explorer-reporter.ts | 77 +- ...spec-response-to-test-suite-info-mapper.ts | 6 +- ...karma-command-line-test-server-executor.ts | 28 +- src/main.ts | 105 +- src/util/logging/log-level.ts | 21 +- src/util/logging/logger-adapter.ts | 31 +- src/util/logging/logger.ts | 10 +- src/util/logging/simple-logger.ts | 7 +- .../process/command-line-process-handler.ts | 3 +- src/util/utils.ts | 27 + test/core/spec-locator.test.ts | 2 +- .../command-line-process-handler.test.ts | 5 +- 42 files changed, 2239 insertions(+), 1852 deletions(-) create mode 100644 src/frameworks/karma/karma-log-level.ts delete mode 100644 src/frameworks/karma/karma-logger.ts diff --git a/.gitattributes b/.gitattributes index 5a0d5e4..ce7609b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,4 @@ # Auto detect text files and perform LF normalization * text=auto eol=lf +*.{cmd,[cC][mM][dD]} text eol=crlf +*.{bat,[bB][aA][tT]} text eol=crlf diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 5d76f2a..bb8a7f4 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -22,9 +22,10 @@ assignees: '' - A clear and concise description of what you expected to happen. -**Debug Logs** +**Provide Debug Logs** -- With the `karmaTestExplorer.logLevel` set to `debug`, please capture and attach the logs from the `Karma Test Explorer` Output panel. +- With the `karmaTestExplorer.logLevel` set to `debug`, please capture and attach the logs from the `Karma Test Explorer` Output chanel when the issue occurs. +- Please also capture and attach the logs from the `Karma Server` Output channel when the issue occurs. **Screenshots** diff --git a/.vscode/settings.json b/.vscode/settings.json index 47e4325..bb5b3eb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,7 +2,6 @@ "[typescript]": { "editor.defaultFormatter": "dbaeumer.vscode-eslint", }, - "typescript.tsdk": "node_modules/typescript/lib", "eslint.format.enable": true, "files.exclude": { diff --git a/CHANGELOG.md b/CHANGELOG.md index 742fc35..f2c88ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ The format of this changelog is loosely based on [Keep a Changelog](https://keep ### Changed -- Test duplication is only now reported for tests but no longer reported for test suites because test suites are simply containers for tests, so that duplicated test suites are themselves not an indication that actual tests have also been duplicated +- Test duplication is no longer reported for test suites because test suites are simply containers for tests, so that duplicated test suites are themselves not an indication of actual test duplication ### Fixed - Fixed an issue where test duplicate detection was producing false-positives on Windows (thanks [@nwash57](https://github.com/nwash57)!) diff --git a/README.md b/README.md index 8bef14e..c61bb48 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ Special thanks to the [author](https://github.com/Raagh) and contributors of the ## Reporting Issues -If you encounter any problems using Karma Test Explorer, would like to request a feature, or have any questions, please open an issue [here](https://github.com/lucono/karma-test-explorer/issues/new). +If you encounter any problems using Karma Test Explorer, would like to request a feature, or have any questions, please open an issue [here](https://github.com/lucono/karma-test-explorer/issues/new/choose). ## See Also diff --git a/docs/documentation.md b/docs/documentation.md index bdfc21f..b436915 100644 --- a/docs/documentation.md +++ b/docs/documentation.md @@ -50,13 +50,13 @@ Note that Karma Test Explorer will briefly display updates (using available spac ## Project Types +### Karma Projects +Projects without an `angular.json` or `.angular-cli.json` file in the project root are treated as plain Karma projects. Use the various [extension options](#configuration) where necessary to customize Karma Test Explorer's behavior to the specific needs of your project and team. + ### Angular Projects By default, any project with an `angular.json` or `.angular-cli.json` file in the project root is loaded as an Angular project. Use the `karmaTestExplorer.defaultAngularProjectName` setting to specify which configured Angular project should be loaded for testing. Otherwise, the project specified as default in the `angular.json` config will be chosen. -### Non-Angular Projects -Projects without an `angular.json` or `.angular-cli.json` file in the project root are treated as plain Karma projects. Use the various [extension options](#configuration) where necessary to customize Karma Test Explorer's behavior to the specific needs of your project and team. - --- @@ -97,12 +97,13 @@ Setting | Description `karmaTestExplorer.customLauncher` | Specify the karma custom launcher configuration for launching the test browser, similar to a custom launcher entry in a karma config file `karmaTestExplorer.autoWatchEnabled` | Enables automatic re-run of tests when the files change `karmaTestExplorer.autoWatchBatchDelay` | The delay in milliseconds when autoWatch is enabled for batching multiple file changes into a single rerun. This is the same as Karma config's `autoWatchBatchDelay` option and overrides it when set +`karmaTestExplorer.nonHeadlessModeEnabled` | Enables non-headless testing so that the browser UI is displayed when running tests. Has no effect when running in a container, or when the default value of the `customLauncher` or `browser` config settings are overridden `karmaTestExplorer.env` | Additional environment variables to be set when running the tests. These override the values of the same variables if also provided through the `envFile` setting `karmaTestExplorer.envFile` | Path to a dotenv file containing environment variables to be set when running the tests `karmaTestExplorer.karmaProcessCommand` | The command or path to an executable to use for launching Karma. This is useful for using a custom script or different command other than the default `karmaTestExplorer.angularProcessCommand` | The command or path to an executable to use for launching or running Angular tests. This is useful for using a custom script or different command other than the default `karmaTestExplorer.testTriggerMethod` | Experimental. Specifies how test runs are triggered by default, either through the Karma CLI or Http interface. You will usually not need to use this setting unless working around specific issues -`karmaTestExplorer.failOnStandardError` | Treats any errors written to stderr as a failure. This can sometimes be useful for uncovering testing issues +`karmaTestExplorer.failOnStandardError` | Treats any Karma, Angular, or other testing stderr output as a failure. This can sometimes be useful for uncovering testing issues `karmaTestExplorer.testsBasePath` | The base folder containing the test files (relative to `projectRootPath`) `karmaTestExplorer.testFiles` | The path glob patterns identifying the test files (relative to `projectRootPath`) `karmaTestExplorer.excludeFiles` | The path glob patterns identifying files to be excluded from `testFiles` (relative to `projectRootPath`) @@ -114,6 +115,7 @@ Setting | Description `karmaTestExplorer.containerMode` | Enables additional support for easier testing when running in a container. Can be either `auto` (the default when not set), `enabled`, or `disabled` `karmaTestExplorer.logLevel` | Sets the level of logging detail produced in the output panel of the extension. More detailed levels such as the `debug` level can be helpful when troubleshooting issues with running Karma or the extension `karmaTestExplorer.karmaLogLevel` | Sets the level of logging detail for the Karma server in its output channel, which can be helpful when troubleshooting issues with running Karma or the extension +`karmaTestExplorer.karmaReporterLogLevel` | Sets the level of logging detail for the Karma Test Explorer reporter which logs additional details to the Karma server log related to the processing of test and browser events in Karma. This can be helpful when troubleshooting issues with how test and browser events are being processed in Karma and exchanged with the Karma Test Explorer. Set this to `disable` in order to not log any additional output from the reporter into the Karma server logs @@ -138,7 +140,7 @@ For example, the following files would all be detected as test files by default, ### Customizing Test Discovery -However, you can change this to the specific name pattern and paths of your test files by using the `karmaTestExplorer.testFiles` extension setting, which accepts an array of file glob patterns that identify the locations of your test files. +You can change the default test discovery behavior by customizing test file detection to the specific name pattern and paths for your test files by using the `karmaTestExplorer.testFiles` extension setting, which accepts an array of file glob patterns that identify the locations of your test files. For example: diff --git a/package-lock.json b/package-lock.json index 53932da..b212b22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "karma-test-explorer", - "version": "0.2.1", + "version": "0.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "karma-test-explorer", - "version": "0.2.1", + "version": "0.3.0", "license": "MIT", "dependencies": { "bluebird": "^3.7.2", - "cross-spawn": "^7.0.0", "dotenv": "^8.2.0", "dotenv-expand": "5.1.0", "express": "^4.17.1", + "get-installed-path": "^4.0.8", "globby": "11.0.4", "is-docker": "^2.2.1", "karma": "^6.3.2", @@ -33,8 +33,8 @@ }, "devDependencies": { "@types/bluebird": "^3.5.36", - "@types/cross-spawn": "^6.0.2", "@types/express": "~4.17.13", + "@types/get-installed-path": "^4.0.1", "@types/glob": "^7.1.4", "@types/jest": "^27.0.2", "@types/jest-when": "^2.7.3", @@ -43,7 +43,7 @@ "@types/node": "^14.14.31", "@types/semver": "~6.0.2", "@types/throttle-debounce": "^2.1.0", - "@types/vscode": "^1.60.0", + "@types/vscode": "^1.22.0", "@typescript-eslint/eslint-plugin": "^4.32.0", "@typescript-eslint/parser": "^4.32.0", "esbuild": "^0.13.3", @@ -58,10 +58,10 @@ "prettier-plugin-organize-imports": "^2.3.4", "ts-jest": "^27.0.5", "typescript": "^4.4.3", - "vsce": "^1.100.2" + "vsce": "^1.102.0" }, "engines": { - "vscode": "^1.60.0" + "vscode": "^1.22.0" } }, "node_modules/@babel/code-frame": { @@ -74,29 +74,29 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", + "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", - "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.15.8", - "@babel/generator": "^7.15.8", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.8", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.8", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -113,12 +113,12 @@ } }, "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.0" }, "engines": { "node": ">=6.9.0" @@ -143,12 +143,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", - "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", "dev": true, "dependencies": { - "@babel/types": "^7.15.6", + "@babel/types": "^7.16.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -166,12 +166,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", - "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz", + "integrity": "sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.15.0", + "@babel/compat-data": "^7.16.0", "@babel/helper-validator-option": "^7.14.5", "browserslist": "^4.16.6", "semver": "^6.3.0" @@ -193,93 +193,93 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", - "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-get-function-arity": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", - "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", - "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", - "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", - "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", - "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-simple-access": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6" + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", - "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" @@ -295,39 +295,39 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", - "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", - "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", - "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" @@ -352,26 +352,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.0.tgz", + "integrity": "sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==", "dev": true, "dependencies": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -451,9 +451,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", - "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.0.tgz", + "integrity": "sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -610,9 +610,9 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz", + "integrity": "sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -625,44 +625,44 @@ } }, "node_modules/@babel/template": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", - "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", - "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.0.tgz", + "integrity": "sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -671,12 +671,12 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.0" }, "engines": { "node": ">=6.9.0" @@ -692,12 +692,12 @@ } }, "node_modules/@babel/types": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", - "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.14.9", + "@babel/helper-validator-identifier": "^7.15.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -794,16 +794,16 @@ } }, "node_modules/@jest/console": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.2.5.tgz", - "integrity": "sha512-smtlRF9vNKorRMCUtJ+yllIoiY8oFmfFG7xlzsAE76nKEwXNhjPOJIsc7Dv+AUitVt76t+KjIpUP9m98Crn2LQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.3.1.tgz", + "integrity": "sha512-RkFNWmv0iui+qsOr/29q9dyfKTTT5DCuP31kUwg7rmOKPT/ozLeGLKJKVIiOfbiKyleUZKIrHwhmiZWVe8IMdw==", "dev": true, "dependencies": { "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.2.5", - "jest-util": "^27.2.5", + "jest-message-util": "^27.3.1", + "jest-util": "^27.3.1", "slash": "^3.0.0" }, "engines": { @@ -811,15 +811,15 @@ } }, "node_modules/@jest/core": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.2.5.tgz", - "integrity": "sha512-VR7mQ+jykHN4WO3OvusRJMk4xCa2MFLipMS+43fpcRGaYrN1KwMATfVEXif7ccgFKYGy5D1TVXTNE4mGq/KMMA==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.3.1.tgz", + "integrity": "sha512-DMNE90RR5QKx0EA+wqe3/TNEwiRpOkhshKNxtLxd4rt3IZpCt+RSL+FoJsGeblRZmqdK4upHA/mKKGPPRAifhg==", "dev": true, "dependencies": { - "@jest/console": "^27.2.5", - "@jest/reporters": "^27.2.5", - "@jest/test-result": "^27.2.5", - "@jest/transform": "^27.2.5", + "@jest/console": "^27.3.1", + "@jest/reporters": "^27.3.1", + "@jest/test-result": "^27.3.1", + "@jest/transform": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -827,19 +827,19 @@ "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.2.5", - "jest-config": "^27.2.5", - "jest-haste-map": "^27.2.5", - "jest-message-util": "^27.2.5", + "jest-changed-files": "^27.3.0", + "jest-config": "^27.3.1", + "jest-haste-map": "^27.3.1", + "jest-message-util": "^27.3.1", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.5", - "jest-resolve-dependencies": "^27.2.5", - "jest-runner": "^27.2.5", - "jest-runtime": "^27.2.5", - "jest-snapshot": "^27.2.5", - "jest-util": "^27.2.5", - "jest-validate": "^27.2.5", - "jest-watcher": "^27.2.5", + "jest-resolve": "^27.3.1", + "jest-resolve-dependencies": "^27.3.1", + "jest-runner": "^27.3.1", + "jest-runtime": "^27.3.1", + "jest-snapshot": "^27.3.1", + "jest-util": "^27.3.1", + "jest-validate": "^27.3.1", + "jest-watcher": "^27.3.1", "micromatch": "^4.0.4", "rimraf": "^3.0.0", "slash": "^3.0.0", @@ -857,102 +857,62 @@ } } }, - "node_modules/@jest/core/node_modules/jest-config": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.2.5.tgz", - "integrity": "sha512-QdENtn9b5rIIYGlbDNEcgY9LDL5kcokJnXrp7x8AGjHob/XFqw1Z6p+gjfna2sUulQsQ3ce2Fvntnv+7fKYDhQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.2.5", - "@jest/types": "^27.2.5", - "babel-jest": "^27.2.5", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", - "jest-circus": "^27.2.5", - "jest-environment-jsdom": "^27.2.5", - "jest-environment-node": "^27.2.5", - "jest-get-type": "^27.0.6", - "jest-jasmine2": "^27.2.5", - "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.5", - "jest-runner": "^27.2.5", - "jest-util": "^27.2.5", - "jest-validate": "^27.2.5", - "micromatch": "^4.0.4", - "pretty-format": "^27.2.5" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, "node_modules/@jest/environment": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.2.5.tgz", - "integrity": "sha512-XvUW3q6OUF+54SYFCgbbfCd/BKTwm5b2MGLoc2jINXQLKQDTCS2P2IrpPOtQ08WWZDGzbhAzVhOYta3J2arubg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.3.1.tgz", + "integrity": "sha512-BCKCj4mOVLme6Tanoyc9k0ultp3pnmuyHw73UHRPeeZxirsU/7E3HC4le/VDb/SMzE1JcPnto+XBKFOcoiJzVw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^27.2.5", + "@jest/fake-timers": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", - "jest-mock": "^27.2.5" + "jest-mock": "^27.3.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.2.5.tgz", - "integrity": "sha512-ZGUb6jg7BgwY+nmO0TW10bc7z7Hl2G/UTAvmxEyZ/GgNFoa31tY9/cgXmqcxnnZ7o5Xs7RAOz3G1SKIj8IVDlg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.3.1.tgz", + "integrity": "sha512-M3ZFgwwlqJtWZ+QkBG5NmC23A9w+A6ZxNsO5nJxJsKYt4yguBd3i8TpjQz5NfCX91nEve1KqD9RA2Q+Q1uWqoA==", "dev": true, "dependencies": { "@jest/types": "^27.2.5", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", - "jest-message-util": "^27.2.5", - "jest-mock": "^27.2.5", - "jest-util": "^27.2.5" + "jest-message-util": "^27.3.1", + "jest-mock": "^27.3.0", + "jest-util": "^27.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/globals": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.2.5.tgz", - "integrity": "sha512-naRI537GM+enFVJQs6DcwGYPn/0vgJNb06zGVbzXfDfe/epDPV73hP1vqO37PqSKDeOXM2KInr6ymYbL1HTP7g==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.3.1.tgz", + "integrity": "sha512-Q651FWiWQAIFiN+zS51xqhdZ8g9b88nGCobC87argAxA7nMfNQq0Q0i9zTfQYgLa6qFXk2cGANEqfK051CZ8Pg==", "dev": true, "dependencies": { - "@jest/environment": "^27.2.5", + "@jest/environment": "^27.3.1", "@jest/types": "^27.2.5", - "expect": "^27.2.5" + "expect": "^27.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/reporters": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.2.5.tgz", - "integrity": "sha512-zYuR9fap3Q3mxQ454VWF8I6jYHErh368NwcKHWO2uy2fwByqBzRHkf9j2ekMDM7PaSTWcLBSZyd7NNxR1iHxzQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.3.1.tgz", + "integrity": "sha512-m2YxPmL9Qn1emFVgZGEiMwDntDxRRQ2D58tiDQlwYTg5GvbFOKseYCcHtn0WsI8CG4vzPglo3nqbOiT8ySBT/w==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.2.5", - "@jest/test-result": "^27.2.5", - "@jest/transform": "^27.2.5", + "@jest/console": "^27.3.1", + "@jest/test-result": "^27.3.1", + "@jest/transform": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", @@ -965,10 +925,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.2.5", - "jest-resolve": "^27.2.5", - "jest-util": "^27.2.5", - "jest-worker": "^27.2.5", + "jest-haste-map": "^27.3.1", + "jest-resolve": "^27.3.1", + "jest-util": "^27.3.1", + "jest-worker": "^27.3.1", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -1002,12 +962,12 @@ } }, "node_modules/@jest/test-result": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.2.5.tgz", - "integrity": "sha512-ub7j3BrddxZ0BdSnM5JCF6cRZJ/7j3wgdX0+Dtwhw2Po+HKsELCiXUTvh+mgS4/89mpnU1CPhZxe2mTvuLPJJg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.3.1.tgz", + "integrity": "sha512-mLn6Thm+w2yl0opM8J/QnPTqrfS4FoXsXF2WIWJb2O/GBSyResL71BRuMYbYRsGt7ELwS5JGcEcGb52BNrumgg==", "dev": true, "dependencies": { - "@jest/console": "^27.2.5", + "@jest/console": "^27.3.1", "@jest/types": "^27.2.5", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1017,24 +977,24 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.2.5.tgz", - "integrity": "sha512-8j8fHZRfnjbbdMitMAGFKaBZ6YqvFRFJlMJzcy3v75edTOqc7RY65S9JpMY6wT260zAcL2sTQRga/P4PglCu3Q==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.3.1.tgz", + "integrity": "sha512-siySLo07IMEdSjA4fqEnxfIX8lB/lWYsBPwNFtkOvsFQvmBrL3yj3k3uFNZv/JDyApTakRpxbKLJ3CT8UGVCrA==", "dev": true, "dependencies": { - "@jest/test-result": "^27.2.5", + "@jest/test-result": "^27.3.1", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.5", - "jest-runtime": "^27.2.5" + "jest-haste-map": "^27.3.1", + "jest-runtime": "^27.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.2.5.tgz", - "integrity": "sha512-29lRtAHHYGALbZOx343v0zKmdOg4Sb0rsA1uSv0818bvwRhs3TyElOmTVXlrw0v1ZTqXJCAH/cmoDXimBhQOJQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.3.1.tgz", + "integrity": "sha512-3fSvQ02kuvjOI1C1ssqMVBKJpZf6nwoCiSu00zAKh5nrp3SptNtZy/8s5deayHnqxhjD9CWDJ+yqQwuQ0ZafXQ==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", @@ -1044,9 +1004,9 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.5", + "jest-haste-map": "^27.3.1", "jest-regex-util": "^27.0.6", - "jest-util": "^27.2.5", + "jest-util": "^27.3.1", "micromatch": "^4.0.4", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -1123,6 +1083,11 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", + "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==" + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -1196,9 +1161,9 @@ "dev": true }, "node_modules/@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==" + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==" }, "node_modules/@types/connect": { "version": "3.4.35", @@ -1219,15 +1184,6 @@ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" }, - "node_modules/@types/cross-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", - "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -1251,10 +1207,16 @@ "@types/range-parser": "*" } }, + "node_modules/@types/get-installed-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/get-installed-path/-/get-installed-path-4.0.1.tgz", + "integrity": "sha512-E5837Qz+MZWdD7415qrjK/2srkx41zdInNCGzgLvFeqMeZepTZmIPGD/Dwz9UuPvHmfCh0XeokvLreOXksIY9g==", + "dev": true + }, "node_modules/@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "dependencies": { "@types/minimatch": "*", @@ -1351,9 +1313,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "14.17.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.22.tgz", - "integrity": "sha512-6Mgu9YWd8j0dk9M8V9+5w6ktqIFCcn/fFXAVIDFk/niAOFiOiz4GeFAMWYAQjKrcsASbFqMkqR8/Y2wuVCAkNg==" + "version": "14.17.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.32.tgz", + "integrity": "sha512-JcII3D5/OapPGx+eJ+Ik1SQGyt6WvuqdRfh9jUwL6/iHGjmyOriBDciBUu7lEIBTL2ijxwrR70WUnw5AEDmFvQ==" }, "node_modules/@types/prettier": { "version": "2.4.1", @@ -1478,24 +1440,6 @@ "eslint": "*" } }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, "node_modules/@typescript-eslint/parser": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", @@ -1809,12 +1753,12 @@ } }, "node_modules/babel-jest": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.2.5.tgz", - "integrity": "sha512-GC9pWCcitBhSuF7H3zl0mftoKizlswaF0E3qi+rPL417wKkCB0d+Sjjb0OfXvxj7gWiBf497ldgRMii68Xz+2g==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.3.1.tgz", + "integrity": "sha512-SjIF8hh/ir0peae2D6S6ZKRhUy7q/DnpH7k/V6fT4Bgs/LXXUztOpX4G2tCgq8mLo5HA9mN6NmlFMeYtKmIsTQ==", "dev": true, "dependencies": { - "@jest/transform": "^27.2.5", + "@jest/transform": "^27.3.1", "@jest/types": "^27.2.5", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", @@ -1831,21 +1775,46 @@ } }, "node_modules/babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" }, "engines": { "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/babel-plugin-jest-hoist": { "version": "27.2.0", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.2.0.tgz", @@ -1911,9 +1880,9 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz", + "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==", "engines": { "node": ">= 0.6.0" } @@ -2005,16 +1974,16 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", - "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz", + "integrity": "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001264", - "electron-to-chromium": "^1.3.857", + "caniuse-lite": "^1.0.30001271", + "electron-to-chromium": "^1.3.878", "escalade": "^3.1.1", - "node-releases": "^1.1.77", - "picocolors": "^0.2.1" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" }, "bin": { "browserslist": "cli.js" @@ -2103,9 +2072,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001265", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", - "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", + "version": "1.0.30001274", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz", + "integrity": "sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew==", "dev": true, "funding": { "type": "opencollective", @@ -2377,6 +2346,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2688,9 +2658,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron-to-chromium": { - "version": "1.3.867", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.867.tgz", - "integrity": "sha512-WbTXOv7hsLhjJyl7jBfDkioaY++iVVZomZ4dU6TMe/SzucV6mUAs2VZn/AehBwuZMiNEQDaPuTGn22YK5o+aDw==", + "version": "1.3.885", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.885.tgz", + "integrity": "sha512-JXKFJcVWrdHa09n4CNZYfYaK6EW5aAew7/wr3L1OnsD1L+JHL+RCtd7QgIsxUbFPeTwPlvnpqNNTOLkoefmtXg==", "dev": true }, "node_modules/emittery": { @@ -2719,45 +2689,47 @@ } }, "node_modules/engine.io": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.0.tgz", - "integrity": "sha512-d1DexkQx87IFr1FLuV+0f5kAm1Hk1uOVijLOb+D1sDO2QMb7YjE02VHtZtxo7xIXMgcWLb+vl3HRT0rI9tr4jQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.0.0.tgz", + "integrity": "sha512-Ui7yl3JajEIaACg8MOUwWvuuwU7jepZqX3BKs1ho7NQRuP4LhN4XIykXhp8bEy+x/DhA0LBZZXYSCkZDqrwMMg==", "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~4.0.0", - "ws": "~7.4.2" + "engine.io-parser": "~5.0.0", + "ws": "~8.2.3" }, "engines": { "node": ">=10.0.0" } }, "node_modules/engine.io-client": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.2.0.tgz", - "integrity": "sha512-BcIBXGBkT7wKecwnfrSV79G2X5lSUSgeAGgoo60plXf8UsQEvCQww/KMwXSMhVjb98fFYNq20CC5eo8IOAPqsg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.0.2.tgz", + "integrity": "sha512-cAep9lhZV6Q8jMXx3TNSU5cydMzMed8/O7Tz5uzyqZvpNPtQ3WQXrLYGADxlsuaFmOLN7wZLmT7ImiFhUOku8g==", "dependencies": { - "base64-arraybuffer": "0.1.4", - "component-emitter": "~1.3.0", + "@socket.io/component-emitter": "~3.0.0", "debug": "~4.3.1", - "engine.io-parser": "~4.0.1", + "engine.io-parser": "~5.0.0", "has-cors": "1.1.0", "parseqs": "0.0.6", "parseuri": "0.0.6", - "ws": "~7.4.2", + "ws": "~8.2.3", "xmlhttprequest-ssl": "~2.0.0", "yeast": "0.1.2" } }, "node_modules/engine.io-client/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -2773,14 +2745,14 @@ } }, "node_modules/engine.io-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz", - "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.1.tgz", + "integrity": "sha512-j4p3WwJrG2k92VISM0op7wiq60vO92MlF3CRGxhKHy9ywG1/Dkc72g0dXeDQ+//hrcDn8gqQzoEkdO9FN0d9AA==", "dependencies": { - "base64-arraybuffer": "0.1.4" + "base64-arraybuffer": "~1.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=10.0.0" } }, "node_modules/engine.io/node_modules/cookie": { @@ -2792,11 +2764,11 @@ } }, "node_modules/engine.io/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -2838,37 +2810,38 @@ } }, "node_modules/esbuild": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.5.tgz", - "integrity": "sha512-Q9/f1njsZaO+Qqe3dqAdtu4zGHNZIbcEtdg44/NooyPhqCerns4FeC1UPYeB4pKD08iDuWcmyINFJTqpdN+pqg==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.12.tgz", + "integrity": "sha512-vTKKUt+yoz61U/BbrnmlG9XIjwpdIxmHB8DlPR0AAW6OdS+nBQBci6LUHU2q9WbBobMEIQxxDpKbkmOGYvxsow==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "optionalDependencies": { - "esbuild-android-arm64": "0.13.5", - "esbuild-darwin-64": "0.13.5", - "esbuild-darwin-arm64": "0.13.5", - "esbuild-freebsd-64": "0.13.5", - "esbuild-freebsd-arm64": "0.13.5", - "esbuild-linux-32": "0.13.5", - "esbuild-linux-64": "0.13.5", - "esbuild-linux-arm": "0.13.5", - "esbuild-linux-arm64": "0.13.5", - "esbuild-linux-mips64le": "0.13.5", - "esbuild-linux-ppc64le": "0.13.5", - "esbuild-openbsd-64": "0.13.5", - "esbuild-sunos-64": "0.13.5", - "esbuild-windows-32": "0.13.5", - "esbuild-windows-64": "0.13.5", - "esbuild-windows-arm64": "0.13.5" + "esbuild-android-arm64": "0.13.12", + "esbuild-darwin-64": "0.13.12", + "esbuild-darwin-arm64": "0.13.12", + "esbuild-freebsd-64": "0.13.12", + "esbuild-freebsd-arm64": "0.13.12", + "esbuild-linux-32": "0.13.12", + "esbuild-linux-64": "0.13.12", + "esbuild-linux-arm": "0.13.12", + "esbuild-linux-arm64": "0.13.12", + "esbuild-linux-mips64le": "0.13.12", + "esbuild-linux-ppc64le": "0.13.12", + "esbuild-netbsd-64": "0.13.12", + "esbuild-openbsd-64": "0.13.12", + "esbuild-sunos-64": "0.13.12", + "esbuild-windows-32": "0.13.12", + "esbuild-windows-64": "0.13.12", + "esbuild-windows-arm64": "0.13.12" } }, "node_modules/esbuild-android-arm64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.5.tgz", - "integrity": "sha512-xaNH58b9XRAWT5q0rwA2GNTgJynb51JhdotlNKdLmSCyKXPVlF87yqNLNdmlX/zndzRDrZdtpCWSALdn/J63Ug==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.12.tgz", + "integrity": "sha512-TSVZVrb4EIXz6KaYjXfTzPyyRpXV5zgYIADXtQsIenjZ78myvDGaPi11o4ZSaHIwFHsuwkB6ne5SZRBwAQ7maw==", "cpu": [ "arm64" ], @@ -2879,9 +2852,9 @@ ] }, "node_modules/esbuild-darwin-64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.5.tgz", - "integrity": "sha512-ClGQeUObXIxEpZviGzjTinDikXy9XodojP9jLKwqLCBpZ9wdV3MW7JOmw60fgXgnbNRvkZCqM6uEi+ur8p80Ow==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.12.tgz", + "integrity": "sha512-c51C+N+UHySoV2lgfWSwwmlnLnL0JWj/LzuZt9Ltk9ub1s2Y8cr6SQV5W3mqVH1egUceew6KZ8GyI4nwu+fhsw==", "cpu": [ "x64" ], @@ -2892,9 +2865,9 @@ ] }, "node_modules/esbuild-darwin-arm64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.5.tgz", - "integrity": "sha512-qro6M/qzs1dBPh14Ca+5moIkLo2KE3ll3dOpiN7aAususkM1HmqQptCEchi0XwX+6nfqWI96YvVqPJ3DfUUK5A==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.12.tgz", + "integrity": "sha512-JvAMtshP45Hd8A8wOzjkY1xAnTKTYuP/QUaKp5eUQGX+76GIie3fCdUUr2ZEKdvpSImNqxiZSIMziEiGB5oUmQ==", "cpu": [ "arm64" ], @@ -2905,9 +2878,9 @@ ] }, "node_modules/esbuild-freebsd-64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.5.tgz", - "integrity": "sha512-vklf7L7fghREEvS1sjAFcxcw/Qqt+Z+L0ySN+pEeb7rA8nPLfRBSFdXAru8UNuHsMWns6CrcZ5eDOKTerZZ5ng==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.12.tgz", + "integrity": "sha512-r6On/Skv9f0ZjTu6PW5o7pdXr8aOgtFOEURJZYf1XAJs0IQ+gW+o1DzXjVkIoT+n1cm3N/t1KRJfX71MPg/ZUA==", "cpu": [ "x64" ], @@ -2918,9 +2891,9 @@ ] }, "node_modules/esbuild-freebsd-arm64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.5.tgz", - "integrity": "sha512-kJoouhbZt4QvjiPak7/Lz57Azok0CgFnNtixiOsqEQXTabIaKmMmnq4qgjD6EBFeU/hvSXDrPe6U8dWhBZOrWQ==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.12.tgz", + "integrity": "sha512-F6LmI2Q1gii073kmBE3NOTt/6zLL5zvZsxNLF8PMAwdHc+iBhD1vzfI8uQZMJA1IgXa3ocr3L3DJH9fLGXy6Yw==", "cpu": [ "arm64" ], @@ -2931,9 +2904,9 @@ ] }, "node_modules/esbuild-linux-32": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.5.tgz", - "integrity": "sha512-/QufG6tTGKAf42pIYkOVZzKBPxF01xH1kCPyOFJZukZBV/Tk3TeOZfhJIAf7pxl4jhfa+c4Jcdp7CvIAjXrmJg==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.12.tgz", + "integrity": "sha512-U1UZwG3UIwF7/V4tCVAo/nkBV9ag5KJiJTt+gaCmLVWH3bPLX7y+fNlhIWZy8raTMnXhMKfaTvWZ9TtmXzvkuQ==", "cpu": [ "ia32" ], @@ -2944,9 +2917,9 @@ ] }, "node_modules/esbuild-linux-64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.5.tgz", - "integrity": "sha512-NmNFMXEthuFJTFaD4cLhAHCxg+y3uXzo7nqH/WNNSZ8PPY11jbeOvMbdArYlbo2Wy1N/mTHXMcK1synSJj+4Iw==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.12.tgz", + "integrity": "sha512-YpXSwtu2NxN3N4ifJxEdsgd6Q5d8LYqskrAwjmoCT6yQnEHJSF5uWcxv783HWN7lnGpJi9KUtDvYsnMdyGw71Q==", "cpu": [ "x64" ], @@ -2957,9 +2930,9 @@ ] }, "node_modules/esbuild-linux-arm": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.5.tgz", - "integrity": "sha512-69nQmbKLBRaAxf88diyaOyarrI7yIdBkZ8bmVzQ7XVWneY+nYIcGtugTSOs5znNGfPqGOElAjh1lX+0sGYHNpA==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.12.tgz", + "integrity": "sha512-SyiT/JKxU6J+DY2qUiSLZJqCAftIt3uoGejZ0HDnUM2MGJqEGSGh7p1ecVL2gna3PxS4P+j6WAehCwgkBPXNIw==", "cpu": [ "arm" ], @@ -2970,9 +2943,9 @@ ] }, "node_modules/esbuild-linux-arm64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.5.tgz", - "integrity": "sha512-dOS5EZsZj8Lw0TgEj3zy1/slTBbfBw4v7uHEqZXP34dUaRq2oltNaUYIj735CtgB7I5/MXrXEUYkXLqcVfzJQQ==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.12.tgz", + "integrity": "sha512-sgDNb8kb3BVodtAlcFGgwk+43KFCYjnFOaOfJibXnnIojNWuJHpL6aQJ4mumzNWw8Rt1xEtDQyuGK9f+Y24jGA==", "cpu": [ "arm64" ], @@ -2983,9 +2956,9 @@ ] }, "node_modules/esbuild-linux-mips64le": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.5.tgz", - "integrity": "sha512-dmKA8ZI/nHwpxIQW/L5crk7Ac4wJJ2Kquvdo1CdXPW1UljMyKUDuHc4K7D1Iws5igqJmNO6U5vdRUKrdnIov6Q==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.12.tgz", + "integrity": "sha512-qQJHlZBG+QwVIA8AbTEtbvF084QgDi4DaUsUnA+EolY1bxrG+UyOuGflM2ZritGhfS/k7THFjJbjH2wIeoKA2g==", "cpu": [ "mips64el" ], @@ -2996,9 +2969,9 @@ ] }, "node_modules/esbuild-linux-ppc64le": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.5.tgz", - "integrity": "sha512-HkVGKkPL3XOhJqNOJ752Q1li5zeidrJHv+XWX6qCnCipNsVuGqaAGfxeWbL/+A/giolMlP7wvAuiKgoe+a5UAw==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.12.tgz", + "integrity": "sha512-2dSnm1ldL7Lppwlo04CGQUpwNn5hGqXI38OzaoPOkRsBRWFBozyGxTFSee/zHFS+Pdh3b28JJbRK3owrrRgWNw==", "cpu": [ "ppc64" ], @@ -3008,10 +2981,23 @@ "linux" ] }, + "node_modules/esbuild-netbsd-64": { + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.12.tgz", + "integrity": "sha512-D4raxr02dcRiQNbxOLzpqBzcJNFAdsDNxjUbKkDMZBkL54Z0vZh4LRndycdZAMcIdizC/l/Yp/ZsBdAFxc5nbA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ] + }, "node_modules/esbuild-openbsd-64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.5.tgz", - "integrity": "sha512-BuOZzmdsdreSs0qDgbuiEhSbUDDW2Wyp4VtpNGBmaLwPMHftdprOJXLkeFud3HlnRB2n9qdiTVKg1B8YqMogSw==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.12.tgz", + "integrity": "sha512-KuLCmYMb2kh05QuPJ+va60bKIH5wHL8ypDkmpy47lzwmdxNsuySeCMHuTv5o2Af1RUn5KLO5ZxaZeq4GEY7DaQ==", "cpu": [ "x64" ], @@ -3022,9 +3008,9 @@ ] }, "node_modules/esbuild-sunos-64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.5.tgz", - "integrity": "sha512-YJNB6Og1QYAPikvYDbqvk5xCqr6WL2i5cRWPGGgWOEItQPnq6gFsWogS3DiYM8TQKe50KRiD3Lwu7eNYsdPO4w==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.12.tgz", + "integrity": "sha512-jBsF+e0woK3miKI8ufGWKG3o3rY9DpHvCVRn5eburMIIE+2c+y3IZ1srsthKyKI6kkXLvV4Cf/E7w56kLipMXw==", "cpu": [ "x64" ], @@ -3035,9 +3021,9 @@ ] }, "node_modules/esbuild-windows-32": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.5.tgz", - "integrity": "sha512-CigOlBSKsZ61IS+FyhD3luqCpl7LN9ntDaBZXumls/0IZ/8BJ5txqw4a6pv4LtnfIgt0ixGHSH7kAUmApw/HAw==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.12.tgz", + "integrity": "sha512-L9m4lLFQrFeR7F+eLZXG82SbXZfUhyfu6CexZEil6vm+lc7GDCE0Q8DiNutkpzjv1+RAbIGVva9muItQ7HVTkQ==", "cpu": [ "ia32" ], @@ -3048,9 +3034,9 @@ ] }, "node_modules/esbuild-windows-64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.5.tgz", - "integrity": "sha512-pg2BZXLpcPcrIcmToGapLRExzj6sm0VmQlqlmnMOtIJh0YQV9c0CRbhfIT0gYvJqCz5JEGiRvYpArRlxWADN3Q==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.12.tgz", + "integrity": "sha512-k4tX4uJlSbSkfs78W5d9+I9gpd+7N95W7H2bgOMFPsYREVJs31+Q2gLLHlsnlY95zBoPQMIzHooUIsixQIBjaQ==", "cpu": [ "x64" ], @@ -3061,9 +3047,9 @@ ] }, "node_modules/esbuild-windows-arm64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.5.tgz", - "integrity": "sha512-KKRDmUOIE4oCvJp0I4p4QyazK2X79spF29vsZr2U8qHhmxbTLSQWvYmb2WlF5Clb1URRsX0L013rhwHx1SEu0w==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.12.tgz", + "integrity": "sha512-2tTv/BpYRIvuwHpp2M960nG7uvL+d78LFW/ikPItO+2GfK51CswIKSetSpDii+cjz8e9iSPgs+BU4o8nWICBwQ==", "cpu": [ "arm64" ], @@ -3121,9 +3107,9 @@ } }, "node_modules/escodegen/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -3305,6 +3291,33 @@ } }, "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", @@ -3319,7 +3332,7 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "node_modules/eslint/node_modules/eslint-utils/node_modules/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==", @@ -3328,15 +3341,6 @@ "node": ">=4" } }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint/node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -3395,9 +3399,9 @@ } }, "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -3416,9 +3420,9 @@ } }, "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -3487,17 +3491,28 @@ "node": ">= 0.8.0" } }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/expect": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.5.tgz", - "integrity": "sha512-ZrO0w7bo8BgGoP/bLz+HDCI+0Hfei9jUSZs5yI/Wyn9VkG9w8oJ7rHRgYj+MA7yqqFa0IwHA3flJzZtYugShJA==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.3.1.tgz", + "integrity": "sha512-MrNXV2sL9iDRebWPGOGFdPQRl2eDQNu/uhxIMShjjx74T6kC6jFIkmQ6OqXDtevjGUkyB2IT56RzDBqXf/QPCg==", "dev": true, "dependencies": { "@jest/types": "^27.2.5", "ansi-styles": "^5.0.0", - "jest-get-type": "^27.0.6", - "jest-matcher-utils": "^27.2.5", - "jest-message-util": "^27.2.5", + "jest-get-type": "^27.3.1", + "jest-matcher-utils": "^27.3.1", + "jest-message-util": "^27.3.1", "jest-regex-util": "^27.0.6" }, "engines": { @@ -3725,9 +3740,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", + "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==", "funding": [ { "type": "individual", @@ -3833,6 +3848,19 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-installed-path": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-4.0.8.tgz", + "integrity": "sha512-PmANK1xElIHlHH2tXfOoTnSDUjX1X3GvKK6ZyLbUnSCCn1pADwu67eVWttuPzJWrXDDT2MfO6uAaKILOFfitmA==", + "dependencies": { + "global-modules": "1.0.0" + }, + "engines": { + "node": ">=6", + "npm": ">=5", + "yarn": ">=1" + } + }, "node_modules/get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -3909,10 +3937,49 @@ "node": ">=4" } }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3986,6 +4053,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/hosted-git-info": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", @@ -4197,22 +4275,10 @@ "node": ">=8" } }, - "node_modules/is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.1.1" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", - "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -4303,6 +4369,14 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isbinaryfile": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", @@ -4320,9 +4394,9 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "node_modules/istanbul-lib-coverage": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.2.tgz", - "integrity": "sha512-o5+eTUYzCJ11/+JhW5/FUCdfsdoYVdQ/8I/OveE2XsjehYn5DdeSnNQAbjYaO8gQ6hvGTN6GM6ddQqpTVG5j8g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, "engines": { "node": ">=8" @@ -4381,9 +4455,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-bFjUnc95rHjdCR63WMHUS7yfJJh8T9IPSWavvR02hhjVwezWALZ5axF9EqjmwZHpXqkzbgAMP8DmAtiyNxrdrQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", + "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -4394,19 +4468,19 @@ } }, "node_modules/jasmine-core": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.9.0.tgz", - "integrity": "sha512-Tv3kVbPCGVrjsnHBZ38NsPU3sDOtNa0XmbG2baiyJqdb5/SPpDO6GVwJYtUryl6KB4q1Ssckwg612ES9Z0dreQ==" + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.10.1.tgz", + "integrity": "sha512-ooZWSDVAdh79Rrj4/nnfklL3NQVra0BcuhcuWoAwwi+znLDoUeH87AFfeX8s+YeYi6xlv5nveRyaA1v7CintfA==" }, "node_modules/jest": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.2.5.tgz", - "integrity": "sha512-vDMzXcpQN4Ycaqu+vO7LX8pZwNNoKMhc+gSp6q1D8S6ftRk8gNW8cni3YFxknP95jxzQo23Lul0BI2FrWgnwYQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.3.1.tgz", + "integrity": "sha512-U2AX0AgQGd5EzMsiZpYt8HyZ+nSVIh5ujQ9CPp9EQZJMjXIiSZpJNweZl0swatKRoqHWgGKM3zaSwm4Zaz87ng==", "dev": true, "dependencies": { - "@jest/core": "^27.2.5", + "@jest/core": "^27.3.1", "import-local": "^3.0.2", - "jest-cli": "^27.2.5" + "jest-cli": "^27.3.1" }, "bin": { "jest": "bin/jest.js" @@ -4424,9 +4498,9 @@ } }, "node_modules/jest-changed-files": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.2.5.tgz", - "integrity": "sha512-jfnNJzF89csUKRPKJ4MwZ1SH27wTmX2xiAIHUHrsb/OYd9Jbo4/SXxJ17/nnx6RIifpthk3Y+LEeOk+/dDeGdw==", + "version": "27.3.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.3.0.tgz", + "integrity": "sha512-9DJs9garMHv4RhylUMZgbdCJ3+jHSkpL9aaVKp13xtXAD80qLTLrqcDZL1PHA9dYA0bCI86Nv2BhkLpLhrBcPg==", "dev": true, "dependencies": { "@jest/types": "^27.2.5", @@ -4438,27 +4512,27 @@ } }, "node_modules/jest-circus": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.2.5.tgz", - "integrity": "sha512-eyL9IcrAxm3Saq3rmajFCwpaxaRMGJ1KJs+7hlTDinXpJmeR3P02bheM3CYohE7UfwOBmrFMJHjgo/WPcLTM+Q==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.3.1.tgz", + "integrity": "sha512-v1dsM9II6gvXokgqq6Yh2jHCpfg7ZqV4jWY66u7npz24JnhP3NHxI0sKT7+ZMQ7IrOWHYAaeEllOySbDbWsiXw==", "dev": true, "dependencies": { - "@jest/environment": "^27.2.5", - "@jest/test-result": "^27.2.5", + "@jest/environment": "^27.3.1", + "@jest/test-result": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^27.2.5", + "expect": "^27.3.1", "is-generator-fn": "^2.0.0", - "jest-each": "^27.2.5", - "jest-matcher-utils": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-runtime": "^27.2.5", - "jest-snapshot": "^27.2.5", - "jest-util": "^27.2.5", - "pretty-format": "^27.2.5", + "jest-each": "^27.3.1", + "jest-matcher-utils": "^27.3.1", + "jest-message-util": "^27.3.1", + "jest-runtime": "^27.3.1", + "jest-snapshot": "^27.3.1", + "jest-util": "^27.3.1", + "pretty-format": "^27.3.1", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" @@ -4468,21 +4542,21 @@ } }, "node_modules/jest-cli": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.2.5.tgz", - "integrity": "sha512-XzfcOXi5WQrXqFYsDxq5RDOKY4FNIgBgvgf3ZBz4e/j5/aWep5KnsAYH5OFPMdX/TP/LFsYQMRH7kzJUMh6JKg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.3.1.tgz", + "integrity": "sha512-WHnCqpfK+6EvT62me6WVs8NhtbjAS4/6vZJnk7/2+oOr50cwAzG4Wxt6RXX0hu6m1169ZGMlhYYUNeKBXCph/Q==", "dev": true, "dependencies": { - "@jest/core": "^27.2.5", - "@jest/test-result": "^27.2.5", + "@jest/core": "^27.3.1", + "@jest/test-result": "^27.3.1", "@jest/types": "^27.2.5", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.2.5", - "jest-util": "^27.2.5", - "jest-validate": "^27.2.5", + "jest-config": "^27.3.1", + "jest-util": "^27.3.1", + "jest-validate": "^27.3.1", "prompts": "^2.0.1", "yargs": "^16.2.0" }, @@ -4501,33 +4575,33 @@ } } }, - "node_modules/jest-cli/node_modules/jest-config": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.2.5.tgz", - "integrity": "sha512-QdENtn9b5rIIYGlbDNEcgY9LDL5kcokJnXrp7x8AGjHob/XFqw1Z6p+gjfna2sUulQsQ3ce2Fvntnv+7fKYDhQ==", + "node_modules/jest-config": { + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.3.1.tgz", + "integrity": "sha512-KY8xOIbIACZ/vdYCKSopL44I0xboxC751IX+DXL2+Wx6DKNycyEfV3rryC3BPm5Uq/BBqDoMrKuqLEUNJmMKKg==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.2.5", + "@jest/test-sequencer": "^27.3.1", "@jest/types": "^27.2.5", - "babel-jest": "^27.2.5", + "babel-jest": "^27.3.1", "chalk": "^4.0.0", + "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", - "jest-circus": "^27.2.5", - "jest-environment-jsdom": "^27.2.5", - "jest-environment-node": "^27.2.5", - "jest-get-type": "^27.0.6", - "jest-jasmine2": "^27.2.5", + "jest-circus": "^27.3.1", + "jest-environment-jsdom": "^27.3.1", + "jest-environment-node": "^27.3.1", + "jest-get-type": "^27.3.1", + "jest-jasmine2": "^27.3.1", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.5", - "jest-runner": "^27.2.5", - "jest-util": "^27.2.5", - "jest-validate": "^27.2.5", + "jest-resolve": "^27.3.1", + "jest-runner": "^27.3.1", + "jest-util": "^27.3.1", + "jest-validate": "^27.3.1", "micromatch": "^4.0.4", - "pretty-format": "^27.2.5" + "pretty-format": "^27.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -4542,15 +4616,15 @@ } }, "node_modules/jest-diff": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.5.tgz", - "integrity": "sha512-7gfwwyYkeslOOVQY4tVq5TaQa92mWfC9COsVYMNVYyJTOYAqbIkoD3twi5A+h+tAPtAelRxkqY6/xu+jwTr0dA==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.3.1.tgz", + "integrity": "sha512-PCeuAH4AWUo2O5+ksW4pL9v5xJAcIKPUPfIhZBcG1RKv/0+dvaWTQK1Nrau8d67dp65fOqbeMdoil+6PedyEPQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.0.6", - "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.5" + "jest-get-type": "^27.3.1", + "pretty-format": "^27.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -4569,33 +4643,33 @@ } }, "node_modules/jest-each": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.2.5.tgz", - "integrity": "sha512-HUPWIbJT0bXarRwKu/m7lYzqxR4GM5EhKOsu0z3t0SKtbFN6skQhpAUADM4qFShBXb9zoOuag5lcrR1x/WM+Ag==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.3.1.tgz", + "integrity": "sha512-E4SwfzKJWYcvOYCjOxhZcxwL+AY0uFMvdCOwvzgutJiaiodFjkxQQDxHm8FQBeTqDnSmKsQWn7ldMRzTn2zJaQ==", "dev": true, "dependencies": { "@jest/types": "^27.2.5", "chalk": "^4.0.0", - "jest-get-type": "^27.0.6", - "jest-util": "^27.2.5", - "pretty-format": "^27.2.5" + "jest-get-type": "^27.3.1", + "jest-util": "^27.3.1", + "pretty-format": "^27.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-environment-jsdom": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.2.5.tgz", - "integrity": "sha512-QtRpOh/RQKuXniaWcoFE2ElwP6tQcyxHu0hlk32880g0KczdonCs5P1sk5+weu/OVzh5V4Bt1rXuQthI01mBLg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.3.1.tgz", + "integrity": "sha512-3MOy8qMzIkQlfb3W1TfrD7uZHj+xx8Olix5vMENkj5djPmRqndMaXtpnaZkxmxM+Qc3lo+yVzJjzuXbCcZjAlg==", "dev": true, "dependencies": { - "@jest/environment": "^27.2.5", - "@jest/fake-timers": "^27.2.5", + "@jest/environment": "^27.3.1", + "@jest/fake-timers": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", - "jest-mock": "^27.2.5", - "jest-util": "^27.2.5", + "jest-mock": "^27.3.0", + "jest-util": "^27.3.1", "jsdom": "^16.6.0" }, "engines": { @@ -4603,35 +4677,35 @@ } }, "node_modules/jest-environment-node": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.2.5.tgz", - "integrity": "sha512-0o1LT4grm7iwrS8fIoLtwJxb/hoa3GsH7pP10P02Jpj7Mi4BXy65u46m89vEM2WfD1uFJQ2+dfDiWZNA2e6bJg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.3.1.tgz", + "integrity": "sha512-T89F/FgkE8waqrTSA7/ydMkcc52uYPgZZ6q8OaZgyiZkJb5QNNCF6oPZjH9IfPFfcc9uBWh1574N0kY0pSvTXw==", "dev": true, "dependencies": { - "@jest/environment": "^27.2.5", - "@jest/fake-timers": "^27.2.5", + "@jest/environment": "^27.3.1", + "@jest/fake-timers": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", - "jest-mock": "^27.2.5", - "jest-util": "^27.2.5" + "jest-mock": "^27.3.0", + "jest-util": "^27.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-get-type": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", - "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.3.1.tgz", + "integrity": "sha512-+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg==", "dev": true, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-haste-map": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.2.5.tgz", - "integrity": "sha512-pzO+Gw2WLponaSi0ilpzYBE0kuVJstoXBX8YWyUebR8VaXuX4tzzn0Zp23c/WaETo7XYTGv2e8KdnpiskAFMhQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.3.1.tgz", + "integrity": "sha512-lYfNZIzwPccDJZIyk9Iz5iQMM/MH56NIIcGj7AFU1YyA4ewWFBl8z+YPJuSCRML/ee2cCt2y3W4K3VXPT6Nhzg==", "dev": true, "dependencies": { "@jest/types": "^27.2.5", @@ -4642,8 +4716,8 @@ "graceful-fs": "^4.2.4", "jest-regex-util": "^27.0.6", "jest-serializer": "^27.0.6", - "jest-util": "^27.2.5", - "jest-worker": "^27.2.5", + "jest-util": "^27.3.1", + "jest-worker": "^27.3.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, @@ -4655,28 +4729,28 @@ } }, "node_modules/jest-jasmine2": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.2.5.tgz", - "integrity": "sha512-hdxY9Cm/CjLqu2tXeAoQHPgA4vcqlweVXYOg1+S9FeFdznB9Rti+eEBKDDkmOy9iqr4Xfbq95OkC4NFbXXPCAQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.3.1.tgz", + "integrity": "sha512-WK11ZUetDQaC09w4/j7o4FZDUIp+4iYWH/Lik34Pv7ukL+DuXFGdnmmi7dT58J2ZYKFB5r13GyE0z3NPeyJmsg==", "dev": true, "dependencies": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.2.5", + "@jest/environment": "^27.3.1", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.2.5", + "@jest/test-result": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.2.5", + "expect": "^27.3.1", "is-generator-fn": "^2.0.0", - "jest-each": "^27.2.5", - "jest-matcher-utils": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-runtime": "^27.2.5", - "jest-snapshot": "^27.2.5", - "jest-util": "^27.2.5", - "pretty-format": "^27.2.5", + "jest-each": "^27.3.1", + "jest-matcher-utils": "^27.3.1", + "jest-message-util": "^27.3.1", + "jest-runtime": "^27.3.1", + "jest-snapshot": "^27.3.1", + "jest-util": "^27.3.1", + "pretty-format": "^27.3.1", "throat": "^6.0.1" }, "engines": { @@ -4684,37 +4758,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.2.5.tgz", - "integrity": "sha512-HYsi3GUR72bYhOGB5C5saF9sPdxGzSjX7soSQS+BqDRysc7sPeBwPbhbuT8DnOpijnKjgwWQ8JqvbmReYnt3aQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.3.1.tgz", + "integrity": "sha512-78QstU9tXbaHzwlRlKmTpjP9k4Pvre5l0r8Spo4SbFFVy/4Abg9I6ZjHwjg2QyKEAMg020XcjP+UgLZIY50yEg==", "dev": true, "dependencies": { - "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.5" + "jest-get-type": "^27.3.1", + "pretty-format": "^27.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.5.tgz", - "integrity": "sha512-qNR/kh6bz0Dyv3m68Ck2g1fLW5KlSOUNcFQh87VXHZwWc/gY6XwnKofx76Qytz3x5LDWT09/2+yXndTkaG4aWg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.3.1.tgz", + "integrity": "sha512-hX8N7zXS4k+8bC1Aj0OWpGb7D3gIXxYvPNK1inP5xvE4ztbz3rc4AkI6jGVaerepBnfWB17FL5lWFJT3s7qo8w==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^27.2.5", - "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.5" + "jest-diff": "^27.3.1", + "jest-get-type": "^27.3.1", + "pretty-format": "^27.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-message-util": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.2.5.tgz", - "integrity": "sha512-ggXSLoPfIYcbmZ8glgEJZ8b+e0Msw/iddRmgkoO7lDAr9SmI65IIfv7VnvTnV4FGnIIUIjzM+fHRHO5RBvyAbQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.3.1.tgz", + "integrity": "sha512-bh3JEmxsTZ/9rTm0jQrPElbY2+y48Rw2t47uMfByNyUVR+OfPh4anuyKsGqsNkXk/TI4JbLRZx+7p7Hdt6q1yg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -4723,7 +4797,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.4", - "pretty-format": "^27.2.5", + "pretty-format": "^27.3.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -4732,21 +4806,21 @@ } }, "node_modules/jest-message-util/node_modules/@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/jest-mock": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.2.5.tgz", - "integrity": "sha512-HiMB3LqE9RzmeMzZARi2Bz3NoymxyP0gCid4y42ca1djffNtYFKgI220aC1VP1mUZ8rbpqZbHZOJ15093bZV/Q==", + "version": "27.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.3.0.tgz", + "integrity": "sha512-ziZiLk0elZOQjD08bLkegBzv5hCABu/c8Ytx45nJKkysQwGaonvmTxwjLqEA4qGdasq9o2I8/HtdGMNnVsMTGw==", "dev": true, "dependencies": { "@jest/types": "^27.2.5", @@ -4796,20 +4870,20 @@ } }, "node_modules/jest-resolve": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.2.5.tgz", - "integrity": "sha512-q5irwS3oS73SKy3+FM/HL2T7WJftrk9BRzrXF92f7net5HMlS7lJMg/ZwxLB4YohKqjSsdksEw7n/jvMxV7EKg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.3.1.tgz", + "integrity": "sha512-Dfzt25CFSPo3Y3GCbxynRBZzxq9AdyNN+x/v2IqYx6KVT5Z6me2Z/PsSGFSv3cOSUZqJ9pHxilao/I/m9FouLw==", "dev": true, "dependencies": { "@jest/types": "^27.2.5", "chalk": "^4.0.0", - "escalade": "^3.1.1", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.5", + "jest-haste-map": "^27.3.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.2.5", - "jest-validate": "^27.2.5", + "jest-util": "^27.3.1", + "jest-validate": "^27.3.1", "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", "slash": "^3.0.0" }, "engines": { @@ -4817,29 +4891,29 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.5.tgz", - "integrity": "sha512-BSjefped31bcvvCh++/pN9ueqqN1n0+p8/58yScuWfklLm2tbPbS9d251vJhAy0ZI2pL/0IaGhOTJrs9Y4FJlg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.3.1.tgz", + "integrity": "sha512-X7iLzY8pCiYOnvYo2YrK3P9oSE8/3N2f4pUZMJ8IUcZnT81vlSonya1KTO9ZfKGuC+svE6FHK/XOb8SsoRUV1A==", "dev": true, "dependencies": { "@jest/types": "^27.2.5", "jest-regex-util": "^27.0.6", - "jest-snapshot": "^27.2.5" + "jest-snapshot": "^27.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runner": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.2.5.tgz", - "integrity": "sha512-n41vw9RLg5TKAnEeJK9d6pGOsBOpwE89XBniK+AD1k26oIIy3V7ogM1scbDjSheji8MUPC9pNgCrZ/FHLVDNgg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.3.1.tgz", + "integrity": "sha512-r4W6kBn6sPr3TBwQNmqE94mPlYVn7fLBseeJfo4E2uCTmAyDFm2O5DYAQAFP7Q3YfiA/bMwg8TVsciP7k0xOww==", "dev": true, "dependencies": { - "@jest/console": "^27.2.5", - "@jest/environment": "^27.2.5", - "@jest/test-result": "^27.2.5", - "@jest/transform": "^27.2.5", + "@jest/console": "^27.3.1", + "@jest/environment": "^27.3.1", + "@jest/test-result": "^27.3.1", + "@jest/transform": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", @@ -4847,15 +4921,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.0.6", - "jest-environment-jsdom": "^27.2.5", - "jest-environment-node": "^27.2.5", - "jest-haste-map": "^27.2.5", - "jest-leak-detector": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-resolve": "^27.2.5", - "jest-runtime": "^27.2.5", - "jest-util": "^27.2.5", - "jest-worker": "^27.2.5", + "jest-environment-jsdom": "^27.3.1", + "jest-environment-node": "^27.3.1", + "jest-haste-map": "^27.3.1", + "jest-leak-detector": "^27.3.1", + "jest-message-util": "^27.3.1", + "jest-resolve": "^27.3.1", + "jest-runtime": "^27.3.1", + "jest-util": "^27.3.1", + "jest-worker": "^27.3.1", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -4864,18 +4938,17 @@ } }, "node_modules/jest-runtime": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.2.5.tgz", - "integrity": "sha512-N0WRZ3QszKyZ3Dm27HTBbBuestsSd3Ud5ooVho47XZJ8aSKO/X1Ag8M1dNx9XzfGVRNdB/xCA3lz8MJwIzPLLA==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.3.1.tgz", + "integrity": "sha512-qtO6VxPbS8umqhEDpjA4pqTkKQ1Hy4ZSi9mDVeE9Za7LKBo2LdW2jmT+Iod3XFaJqINikZQsn2wEi0j9wPRbLg==", "dev": true, "dependencies": { - "@jest/console": "^27.2.5", - "@jest/environment": "^27.2.5", - "@jest/fake-timers": "^27.2.5", - "@jest/globals": "^27.2.5", + "@jest/console": "^27.3.1", + "@jest/environment": "^27.3.1", + "@jest/globals": "^27.3.1", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.2.5", - "@jest/transform": "^27.2.5", + "@jest/test-result": "^27.3.1", + "@jest/transform": "^27.3.1", "@jest/types": "^27.2.5", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -4885,14 +4958,14 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-mock": "^27.2.5", + "jest-haste-map": "^27.3.1", + "jest-message-util": "^27.3.1", + "jest-mock": "^27.3.0", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.5", - "jest-snapshot": "^27.2.5", - "jest-util": "^27.2.5", - "jest-validate": "^27.2.5", + "jest-resolve": "^27.3.1", + "jest-snapshot": "^27.3.1", + "jest-util": "^27.3.1", + "jest-validate": "^27.3.1", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^16.2.0" @@ -4915,9 +4988,9 @@ } }, "node_modules/jest-snapshot": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.2.5.tgz", - "integrity": "sha512-2/Jkn+VN6Abwz0llBltZaiJMnL8b1j5Bp/gRIxe9YR3FCEh9qp0TXVV0dcpTGZ8AcJV1SZGQkczewkI9LP5yGw==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.3.1.tgz", + "integrity": "sha512-APZyBvSgQgOT0XumwfFu7X3G5elj6TGhCBLbBdn3R1IzYustPGPE38F51dBWMQ8hRXa9je0vAdeVDtqHLvB6lg==", "dev": true, "dependencies": { "@babel/core": "^7.7.2", @@ -4926,23 +4999,23 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.2.5", + "@jest/transform": "^27.3.1", "@jest/types": "^27.2.5", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.2.5", + "expect": "^27.3.1", "graceful-fs": "^4.2.4", - "jest-diff": "^27.2.5", - "jest-get-type": "^27.0.6", - "jest-haste-map": "^27.2.5", - "jest-matcher-utils": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-resolve": "^27.2.5", - "jest-util": "^27.2.5", + "jest-diff": "^27.3.1", + "jest-get-type": "^27.3.1", + "jest-haste-map": "^27.3.1", + "jest-matcher-utils": "^27.3.1", + "jest-message-util": "^27.3.1", + "jest-resolve": "^27.3.1", + "jest-util": "^27.3.1", "natural-compare": "^1.4.0", - "pretty-format": "^27.2.5", + "pretty-format": "^27.3.1", "semver": "^7.3.2" }, "engines": { @@ -4950,16 +5023,16 @@ } }, "node_modules/jest-util": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.2.5.tgz", - "integrity": "sha512-QRhDC6XxISntMzFRd/OQ6TGsjbzA5ONO0tlAj2ElHs155x1aEr0rkYJBEysG6H/gZVH3oGFzCdAB/GA8leh8NQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.3.1.tgz", + "integrity": "sha512-8fg+ifEH3GDryLQf/eKZck1DEs2YuVPBCMOaHQxVVLmQwl/CDhWzrvChTX4efLZxGrw+AA0mSXv78cyytBt/uw==", "dev": true, "dependencies": { "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", + "ci-info": "^3.2.0", "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", "picomatch": "^2.2.3" }, "engines": { @@ -4967,17 +5040,17 @@ } }, "node_modules/jest-validate": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.2.5.tgz", - "integrity": "sha512-XgYtjS89nhVe+UfkbLgcm+GgXKWgL80t9nTcNeejyO3t0Sj/yHE8BtIJqjZu9NXQksYbGImoQRXmQ1gP+Guffw==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.3.1.tgz", + "integrity": "sha512-3H0XCHDFLA9uDII67Bwi1Vy7AqwA5HqEEjyy934lgVhtJ3eisw6ShOF1MDmRPspyikef5MyExvIm0/TuLzZ86Q==", "dev": true, "dependencies": { "@jest/types": "^27.2.5", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^27.0.6", + "jest-get-type": "^27.3.1", "leven": "^3.1.0", - "pretty-format": "^27.2.5" + "pretty-format": "^27.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -4996,17 +5069,17 @@ } }, "node_modules/jest-watcher": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.2.5.tgz", - "integrity": "sha512-umV4qGozg2Dn6DTTtqAh9puPw+DGLK9AQas7+mWjiK8t0fWMpxKg8ZXReZw7L4C88DqorsGUiDgwHNZ+jkVrkQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.3.1.tgz", + "integrity": "sha512-9/xbV6chABsGHWh9yPaAGYVVKurWoP3ZMCv6h+O1v9/+pkOroigs6WzZ0e9gLP/njokUwM7yQhr01LKJVMkaZA==", "dev": true, "dependencies": { - "@jest/test-result": "^27.2.5", + "@jest/test-result": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.2.5", + "jest-util": "^27.3.1", "string-length": "^4.0.1" }, "engines": { @@ -5014,18 +5087,18 @@ } }, "node_modules/jest-when": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/jest-when/-/jest-when-3.4.1.tgz", - "integrity": "sha512-oFxeKarvTsuE46SPTzX+znKb+vzQKUxhkPF/fOfhMJE19EcW+sk9dKiACgFVE3K82GgALDH1pjCvHU+uE91QYA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/jest-when/-/jest-when-3.4.2.tgz", + "integrity": "sha512-vO1r+1XsyeavhoSapj7q4xD5xuM9i+UdopfhmJJK/aKaDpzDesxZ6hreLSO1JUZhZInqdM7CCn+At7c0SI2EEw==", "dev": true, "peerDependencies": { "jest": ">= 25" } }, "node_modules/jest-worker": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.5.tgz", - "integrity": "sha512-HTjEPZtcNKZ4LnhSp02NEH4vE+5OpJ0EsOWYvGQpHgUMLngydESAAMH5Wd/asPf29+XUDQZszxpLg1BkIIA2aw==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz", + "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==", "dev": true, "dependencies": { "@types/node": "*", @@ -5176,9 +5249,9 @@ } }, "node_modules/karma": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.4.tgz", - "integrity": "sha512-hbhRogUYIulfkBTZT7xoPrCYhRBnBoqbbL4fszWD0ReFGUxU+LYBr3dwKdAluaDQ/ynT9/7C+Lf7pPNW4gSx4Q==", + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.6.tgz", + "integrity": "sha512-xsiu3D6AjCv6Uq0YKXJgC6TvXX2WloQ5+XtHXmC1lwiLVG617DDV3W2DdM4BxCMKHlmz6l3qESZHFQGHAKvrew==", "dependencies": { "body-parser": "^1.19.0", "braces": "^3.0.2", @@ -5198,10 +5271,10 @@ "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^3.1.0", + "socket.io": "^4.2.0", "source-map": "^0.6.1", "tmp": "^0.2.1", - "ua-parser-js": "^0.7.28", + "ua-parser-js": "^0.7.30", "yargs": "^16.1.1" }, "bin": { @@ -5244,75 +5317,6 @@ "karma": "*" } }, - "node_modules/karma/node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/karma/node_modules/engine.io": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.1.tgz", - "integrity": "sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w==", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~4.0.0", - "ws": "~7.4.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/karma/node_modules/socket.io": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", - "integrity": "sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==", - "dependencies": { - "@types/cookie": "^0.4.0", - "@types/cors": "^2.8.8", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.1", - "engine.io": "~4.1.0", - "socket.io-adapter": "~2.1.0", - "socket.io-parser": "~4.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/karma/node_modules/socket.io-adapter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", - "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==" - }, - "node_modules/karma/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -5376,6 +5380,12 @@ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -5451,12 +5461,12 @@ "dev": true }, "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "dependencies": { - "tmpl": "1.0.x" + "tmpl": "1.0.5" } }, "node_modules/markdown-it": { @@ -5626,9 +5636,9 @@ } }, "node_modules/node": { - "version": "14.18.0", - "resolved": "https://registry.npmjs.org/node/-/node-14.18.0.tgz", - "integrity": "sha512-ho+MOL09f9W1lQ4ECUGv+2wuShttuZ6QnOIomhQ6ZQ2ZYovOCUtK0Z0796mnag2DZmA+v+R/4qsiXFnlMGBn3w==", + "version": "14.18.1", + "resolved": "https://registry.npmjs.org/node/-/node-14.18.1.tgz", + "integrity": "sha512-gBt7GlSQp68Bj5KoYx3dGgMCaE2PN0Qox3oiemTDINYHhJjML/Xd24jXuo7X1ehyJuVNZsLWYrJgX6DhHCze6w==", "hasInstallScript": true, "dependencies": { "node-bin-setup": "^1.0.0" @@ -5661,9 +5671,9 @@ } }, "node_modules/node-releases": { - "version": "1.1.77", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", - "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", "dev": true }, "node_modules/normalize-path": { @@ -5848,6 +5858,14 @@ "node": ">=6" } }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", @@ -5920,6 +5938,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -5950,9 +5969,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "node_modules/picomatch": { @@ -6055,9 +6074,9 @@ } }, "node_modules/pretty-format": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.5.tgz", - "integrity": "sha512-+nYn2z9GgicO9JiqmY25Xtq8SYfZ/5VCpEU3pppHHNAhd1y+ZXxmNPd1evmNcAd6Hz4iBV2kf0UpGth5A/VJ7g==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.3.1.tgz", + "integrity": "sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA==", "dev": true, "dependencies": { "@jest/types": "^27.2.5", @@ -6284,6 +6303,18 @@ "node": ">=8" } }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -6304,6 +6335,15 @@ "node": ">=8" } }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -6472,6 +6512,7 @@ "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, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -6483,6 +6524,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -6539,17 +6581,14 @@ } }, "node_modules/socket.io": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.2.0.tgz", - "integrity": "sha512-sjlGfMmnaWvTRVxGRGWyhd9ctpg4APxWAxu85O/SxekkxHhfxmePWZbaYCkeX5QQX0z1YEnKOlNt6w82E4Nzug==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.3.1.tgz", + "integrity": "sha512-HC5w5Olv2XZ0XJ4gOLGzzHEuOCfj3G0SmoW3jLHYYh34EVsIr3EkW9h6kgfW+K3TFEcmYy8JcPWe//KUkBp5jA==", "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~5.2.0", + "engine.io": "~6.0.0", "socket.io-adapter": "~2.3.2", "socket.io-parser": "~4.0.4" }, @@ -6563,17 +6602,28 @@ "integrity": "sha512-PBZpxUPYjmoogY0aoaTmo1643JelsaS1CiAwNjRVdrI0X9Seuc19Y2Wife8k88avW6haG8cznvwbubAZwH4Mtg==" }, "node_modules/socket.io-client": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.2.0.tgz", - "integrity": "sha512-3GJ2KMh7inJUNAOjgf8NaKJZJa9uRyfryh2LrVJyKyxmzoXlfW9DeDNqylJn0ovOFt4e/kRLNWzMt/YqqEWYSA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.3.2.tgz", + "integrity": "sha512-2B9LqSunN60yV8F7S84CCEEcgbYNfrn7ejIInZtLZ7ppWtiX8rGZAjvdCvbnC8bqo/9RlCNOUsORLyskxSFP1g==", "dependencies": { - "@types/component-emitter": "^1.2.10", + "@socket.io/component-emitter": "~3.0.0", "backo2": "~1.0.2", - "component-emitter": "~1.3.0", "debug": "~4.3.2", - "engine.io-client": "~5.2.0", + "engine.io-client": "~6.0.1", "parseuri": "0.0.6", - "socket.io-parser": "~4.0.4" + "socket.io-parser": "~4.1.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/socket.io-parser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.1.tgz", + "integrity": "sha512-USQVLSkDWE5nbcY760ExdKaJxCE65kcsG/8k5FDGZVVxpD1pA7hABYXYkCUvxUuYYh/+uQw0N/fvBzfT8o07KA==", + "dependencies": { + "@socket.io/component-emitter": "~3.0.0", + "debug": "~4.3.1" }, "engines": { "node": ">=10.0.0" @@ -6942,16 +6992,16 @@ } }, "node_modules/ts-jest": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.5.tgz", - "integrity": "sha512-lIJApzfTaSSbtlksfFNHkWOzLJuuSm4faFAfo5kvzOiRAuoN4/eKxVJ2zEAho8aecE04qX6K1pAzfH5QHL1/8w==", + "version": "27.0.7", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.7.tgz", + "integrity": "sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==", "dev": true, "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^27.0.0", "json5": "2.x", - "lodash": "4.x", + "lodash.memoize": "4.x", "make-error": "1.x", "semver": "7.x", "yargs-parser": "20.x" @@ -7104,9 +7154,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.28", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", - "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", "funding": [ { "type": "opencollective", @@ -7218,9 +7268,9 @@ } }, "node_modules/vsce": { - "version": "1.100.2", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.100.2.tgz", - "integrity": "sha512-eDeubJNc0iav6mbTESZ90E9WcSzqAAl/lunb4KbNjRrz9tf+657i1mKhnWUyvK7Y4D8kN5NBD2FXD4FFMZj7ig==", + "version": "1.102.0", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.102.0.tgz", + "integrity": "sha512-fICfop2CvO4AwdkWmJyjxJSQoIJ0ke9owwBhvtQpXvgcH4kW0uV9jwdNviOEy0QYlhM3sAZJkf3/Nta3UPWvKQ==", "dev": true, "dependencies": { "azure-devops-node-api": "^11.0.1", @@ -7387,12 +7437,12 @@ } }, "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "dependencies": { - "makeerror": "1.0.x" + "makeerror": "1.0.12" } }, "node_modules/webidl-conversions": { @@ -7437,6 +7487,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -7627,26 +7678,26 @@ } }, "@babel/compat-data": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", + "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", "dev": true }, "@babel/core": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", - "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.15.8", - "@babel/generator": "^7.15.8", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.8", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.8", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -7656,12 +7707,12 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.0" } }, "semver": { @@ -7679,12 +7730,12 @@ } }, "@babel/generator": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", - "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", "dev": true, "requires": { - "@babel/types": "^7.15.6", + "@babel/types": "^7.16.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -7698,12 +7749,12 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", - "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz", + "integrity": "sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==", "dev": true, "requires": { - "@babel/compat-data": "^7.15.0", + "@babel/compat-data": "^7.16.0", "@babel/helper-validator-option": "^7.14.5", "browserslist": "^4.16.6", "semver": "^6.3.0" @@ -7718,75 +7769,75 @@ } }, "@babel/helper-function-name": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", - "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" } }, "@babel/helper-get-function-arity": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", - "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-hoist-variables": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", - "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", - "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-module-imports": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", - "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-module-transforms": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", - "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-simple-access": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6" + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" } }, "@babel/helper-optimise-call-expression": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", - "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-plugin-utils": { @@ -7796,33 +7847,33 @@ "dev": true }, "@babel/helper-replace-supers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", - "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" } }, "@babel/helper-simple-access": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", - "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", - "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-validator-identifier": { @@ -7838,23 +7889,23 @@ "dev": true }, "@babel/helpers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.0.tgz", + "integrity": "sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==", "dev": true, "requires": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" } }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -7918,9 +7969,9 @@ } }, "@babel/parser": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", - "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.0.tgz", + "integrity": "sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -8032,60 +8083,60 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz", + "integrity": "sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/template": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", - "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", "dev": true, "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.0" } } } }, "@babel/traverse": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", - "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.0.tgz", + "integrity": "sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.0" } }, "globals": { @@ -8097,12 +8148,12 @@ } }, "@babel/types": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", - "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.9", + "@babel/helper-validator-identifier": "^7.15.7", "to-fast-properties": "^2.0.0" } }, @@ -8182,29 +8233,29 @@ "dev": true }, "@jest/console": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.2.5.tgz", - "integrity": "sha512-smtlRF9vNKorRMCUtJ+yllIoiY8oFmfFG7xlzsAE76nKEwXNhjPOJIsc7Dv+AUitVt76t+KjIpUP9m98Crn2LQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.3.1.tgz", + "integrity": "sha512-RkFNWmv0iui+qsOr/29q9dyfKTTT5DCuP31kUwg7rmOKPT/ozLeGLKJKVIiOfbiKyleUZKIrHwhmiZWVe8IMdw==", "dev": true, "requires": { "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.2.5", - "jest-util": "^27.2.5", + "jest-message-util": "^27.3.1", + "jest-util": "^27.3.1", "slash": "^3.0.0" } }, "@jest/core": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.2.5.tgz", - "integrity": "sha512-VR7mQ+jykHN4WO3OvusRJMk4xCa2MFLipMS+43fpcRGaYrN1KwMATfVEXif7ccgFKYGy5D1TVXTNE4mGq/KMMA==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.3.1.tgz", + "integrity": "sha512-DMNE90RR5QKx0EA+wqe3/TNEwiRpOkhshKNxtLxd4rt3IZpCt+RSL+FoJsGeblRZmqdK4upHA/mKKGPPRAifhg==", "dev": true, "requires": { - "@jest/console": "^27.2.5", - "@jest/reporters": "^27.2.5", - "@jest/test-result": "^27.2.5", - "@jest/transform": "^27.2.5", + "@jest/console": "^27.3.1", + "@jest/reporters": "^27.3.1", + "@jest/test-result": "^27.3.1", + "@jest/transform": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -8212,103 +8263,72 @@ "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.2.5", - "jest-config": "^27.2.5", - "jest-haste-map": "^27.2.5", - "jest-message-util": "^27.2.5", + "jest-changed-files": "^27.3.0", + "jest-config": "^27.3.1", + "jest-haste-map": "^27.3.1", + "jest-message-util": "^27.3.1", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.5", - "jest-resolve-dependencies": "^27.2.5", - "jest-runner": "^27.2.5", - "jest-runtime": "^27.2.5", - "jest-snapshot": "^27.2.5", - "jest-util": "^27.2.5", - "jest-validate": "^27.2.5", - "jest-watcher": "^27.2.5", + "jest-resolve": "^27.3.1", + "jest-resolve-dependencies": "^27.3.1", + "jest-runner": "^27.3.1", + "jest-runtime": "^27.3.1", + "jest-snapshot": "^27.3.1", + "jest-util": "^27.3.1", + "jest-validate": "^27.3.1", + "jest-watcher": "^27.3.1", "micromatch": "^4.0.4", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "jest-config": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.2.5.tgz", - "integrity": "sha512-QdENtn9b5rIIYGlbDNEcgY9LDL5kcokJnXrp7x8AGjHob/XFqw1Z6p+gjfna2sUulQsQ3ce2Fvntnv+7fKYDhQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.2.5", - "@jest/types": "^27.2.5", - "babel-jest": "^27.2.5", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", - "jest-circus": "^27.2.5", - "jest-environment-jsdom": "^27.2.5", - "jest-environment-node": "^27.2.5", - "jest-get-type": "^27.0.6", - "jest-jasmine2": "^27.2.5", - "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.5", - "jest-runner": "^27.2.5", - "jest-util": "^27.2.5", - "jest-validate": "^27.2.5", - "micromatch": "^4.0.4", - "pretty-format": "^27.2.5" - } - } } }, "@jest/environment": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.2.5.tgz", - "integrity": "sha512-XvUW3q6OUF+54SYFCgbbfCd/BKTwm5b2MGLoc2jINXQLKQDTCS2P2IrpPOtQ08WWZDGzbhAzVhOYta3J2arubg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.3.1.tgz", + "integrity": "sha512-BCKCj4mOVLme6Tanoyc9k0ultp3pnmuyHw73UHRPeeZxirsU/7E3HC4le/VDb/SMzE1JcPnto+XBKFOcoiJzVw==", "dev": true, "requires": { - "@jest/fake-timers": "^27.2.5", + "@jest/fake-timers": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", - "jest-mock": "^27.2.5" + "jest-mock": "^27.3.0" } }, "@jest/fake-timers": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.2.5.tgz", - "integrity": "sha512-ZGUb6jg7BgwY+nmO0TW10bc7z7Hl2G/UTAvmxEyZ/GgNFoa31tY9/cgXmqcxnnZ7o5Xs7RAOz3G1SKIj8IVDlg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.3.1.tgz", + "integrity": "sha512-M3ZFgwwlqJtWZ+QkBG5NmC23A9w+A6ZxNsO5nJxJsKYt4yguBd3i8TpjQz5NfCX91nEve1KqD9RA2Q+Q1uWqoA==", "dev": true, "requires": { "@jest/types": "^27.2.5", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", - "jest-message-util": "^27.2.5", - "jest-mock": "^27.2.5", - "jest-util": "^27.2.5" + "jest-message-util": "^27.3.1", + "jest-mock": "^27.3.0", + "jest-util": "^27.3.1" } }, "@jest/globals": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.2.5.tgz", - "integrity": "sha512-naRI537GM+enFVJQs6DcwGYPn/0vgJNb06zGVbzXfDfe/epDPV73hP1vqO37PqSKDeOXM2KInr6ymYbL1HTP7g==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.3.1.tgz", + "integrity": "sha512-Q651FWiWQAIFiN+zS51xqhdZ8g9b88nGCobC87argAxA7nMfNQq0Q0i9zTfQYgLa6qFXk2cGANEqfK051CZ8Pg==", "dev": true, "requires": { - "@jest/environment": "^27.2.5", + "@jest/environment": "^27.3.1", "@jest/types": "^27.2.5", - "expect": "^27.2.5" + "expect": "^27.3.1" } }, "@jest/reporters": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.2.5.tgz", - "integrity": "sha512-zYuR9fap3Q3mxQ454VWF8I6jYHErh368NwcKHWO2uy2fwByqBzRHkf9j2ekMDM7PaSTWcLBSZyd7NNxR1iHxzQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.3.1.tgz", + "integrity": "sha512-m2YxPmL9Qn1emFVgZGEiMwDntDxRRQ2D58tiDQlwYTg5GvbFOKseYCcHtn0WsI8CG4vzPglo3nqbOiT8ySBT/w==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.2.5", - "@jest/test-result": "^27.2.5", - "@jest/transform": "^27.2.5", + "@jest/console": "^27.3.1", + "@jest/test-result": "^27.3.1", + "@jest/transform": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", @@ -8321,10 +8341,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.2.5", - "jest-resolve": "^27.2.5", - "jest-util": "^27.2.5", - "jest-worker": "^27.2.5", + "jest-haste-map": "^27.3.1", + "jest-resolve": "^27.3.1", + "jest-util": "^27.3.1", + "jest-worker": "^27.3.1", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -8344,33 +8364,33 @@ } }, "@jest/test-result": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.2.5.tgz", - "integrity": "sha512-ub7j3BrddxZ0BdSnM5JCF6cRZJ/7j3wgdX0+Dtwhw2Po+HKsELCiXUTvh+mgS4/89mpnU1CPhZxe2mTvuLPJJg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.3.1.tgz", + "integrity": "sha512-mLn6Thm+w2yl0opM8J/QnPTqrfS4FoXsXF2WIWJb2O/GBSyResL71BRuMYbYRsGt7ELwS5JGcEcGb52BNrumgg==", "dev": true, "requires": { - "@jest/console": "^27.2.5", + "@jest/console": "^27.3.1", "@jest/types": "^27.2.5", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.2.5.tgz", - "integrity": "sha512-8j8fHZRfnjbbdMitMAGFKaBZ6YqvFRFJlMJzcy3v75edTOqc7RY65S9JpMY6wT260zAcL2sTQRga/P4PglCu3Q==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.3.1.tgz", + "integrity": "sha512-siySLo07IMEdSjA4fqEnxfIX8lB/lWYsBPwNFtkOvsFQvmBrL3yj3k3uFNZv/JDyApTakRpxbKLJ3CT8UGVCrA==", "dev": true, "requires": { - "@jest/test-result": "^27.2.5", + "@jest/test-result": "^27.3.1", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.5", - "jest-runtime": "^27.2.5" + "jest-haste-map": "^27.3.1", + "jest-runtime": "^27.3.1" } }, "@jest/transform": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.2.5.tgz", - "integrity": "sha512-29lRtAHHYGALbZOx343v0zKmdOg4Sb0rsA1uSv0818bvwRhs3TyElOmTVXlrw0v1ZTqXJCAH/cmoDXimBhQOJQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.3.1.tgz", + "integrity": "sha512-3fSvQ02kuvjOI1C1ssqMVBKJpZf6nwoCiSu00zAKh5nrp3SptNtZy/8s5deayHnqxhjD9CWDJ+yqQwuQ0ZafXQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", @@ -8380,9 +8400,9 @@ "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.5", + "jest-haste-map": "^27.3.1", "jest-regex-util": "^27.0.6", - "jest-util": "^27.2.5", + "jest-util": "^27.3.1", "micromatch": "^4.0.4", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -8444,6 +8464,11 @@ "@sinonjs/commons": "^1.7.0" } }, + "@socket.io/component-emitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", + "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==" + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -8514,9 +8539,9 @@ "dev": true }, "@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==" + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==" }, "@types/connect": { "version": "3.4.35", @@ -8537,15 +8562,6 @@ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" }, - "@types/cross-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", - "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -8569,10 +8585,16 @@ "@types/range-parser": "*" } }, + "@types/get-installed-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/get-installed-path/-/get-installed-path-4.0.1.tgz", + "integrity": "sha512-E5837Qz+MZWdD7415qrjK/2srkx41zdInNCGzgLvFeqMeZepTZmIPGD/Dwz9UuPvHmfCh0XeokvLreOXksIY9g==", + "dev": true + }, "@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -8669,9 +8691,9 @@ "dev": true }, "@types/node": { - "version": "14.17.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.22.tgz", - "integrity": "sha512-6Mgu9YWd8j0dk9M8V9+5w6ktqIFCcn/fFXAVIDFk/niAOFiOiz4GeFAMWYAQjKrcsASbFqMkqR8/Y2wuVCAkNg==" + "version": "14.17.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.32.tgz", + "integrity": "sha512-JcII3D5/OapPGx+eJ+Ik1SQGyt6WvuqdRfh9jUwL6/iHGjmyOriBDciBUu7lEIBTL2ijxwrR70WUnw5AEDmFvQ==" }, "@types/prettier": { "version": "2.4.1", @@ -8768,17 +8790,6 @@ "@typescript-eslint/typescript-estree": "4.33.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - } } }, "@typescript-eslint/parser": { @@ -8994,12 +9005,12 @@ } }, "babel-jest": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.2.5.tgz", - "integrity": "sha512-GC9pWCcitBhSuF7H3zl0mftoKizlswaF0E3qi+rPL417wKkCB0d+Sjjb0OfXvxj7gWiBf497ldgRMii68Xz+2g==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.3.1.tgz", + "integrity": "sha512-SjIF8hh/ir0peae2D6S6ZKRhUy7q/DnpH7k/V6fT4Bgs/LXXUztOpX4G2tCgq8mLo5HA9mN6NmlFMeYtKmIsTQ==", "dev": true, "requires": { - "@jest/transform": "^27.2.5", + "@jest/transform": "^27.3.1", "@jest/types": "^27.2.5", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", @@ -9010,16 +9021,37 @@ } }, "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.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 + } } }, "babel-plugin-jest-hoist": { @@ -9075,9 +9107,9 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz", + "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==" }, "base64id": { "version": "2.0.0", @@ -9156,16 +9188,16 @@ "dev": true }, "browserslist": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", - "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz", + "integrity": "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001264", - "electron-to-chromium": "^1.3.857", + "caniuse-lite": "^1.0.30001271", + "electron-to-chromium": "^1.3.878", "escalade": "^3.1.1", - "node-releases": "^1.1.77", - "picocolors": "^0.2.1" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" } }, "bs-logger": { @@ -9226,9 +9258,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001265", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", - "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", + "version": "1.0.30001274", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz", + "integrity": "sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew==", "dev": true }, "chalk": { @@ -9446,6 +9478,7 @@ "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", @@ -9684,9 +9717,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.867", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.867.tgz", - "integrity": "sha512-WbTXOv7hsLhjJyl7jBfDkioaY++iVVZomZ4dU6TMe/SzucV6mUAs2VZn/AehBwuZMiNEQDaPuTGn22YK5o+aDw==", + "version": "1.3.885", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.885.tgz", + "integrity": "sha512-JXKFJcVWrdHa09n4CNZYfYaK6EW5aAew7/wr3L1OnsD1L+JHL+RCtd7QgIsxUbFPeTwPlvnpqNNTOLkoefmtXg==", "dev": true }, "emittery": { @@ -9706,17 +9739,20 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "engine.io": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.0.tgz", - "integrity": "sha512-d1DexkQx87IFr1FLuV+0f5kAm1Hk1uOVijLOb+D1sDO2QMb7YjE02VHtZtxo7xIXMgcWLb+vl3HRT0rI9tr4jQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.0.0.tgz", + "integrity": "sha512-Ui7yl3JajEIaACg8MOUwWvuuwU7jepZqX3BKs1ho7NQRuP4LhN4XIykXhp8bEy+x/DhA0LBZZXYSCkZDqrwMMg==", "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~4.0.0", - "ws": "~7.4.2" + "engine.io-parser": "~5.0.0", + "ws": "~8.2.3" }, "dependencies": { "cookie": { @@ -9725,44 +9761,43 @@ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" }, "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "requires": {} } } }, "engine.io-client": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.2.0.tgz", - "integrity": "sha512-BcIBXGBkT7wKecwnfrSV79G2X5lSUSgeAGgoo60plXf8UsQEvCQww/KMwXSMhVjb98fFYNq20CC5eo8IOAPqsg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.0.2.tgz", + "integrity": "sha512-cAep9lhZV6Q8jMXx3TNSU5cydMzMed8/O7Tz5uzyqZvpNPtQ3WQXrLYGADxlsuaFmOLN7wZLmT7ImiFhUOku8g==", "requires": { - "base64-arraybuffer": "0.1.4", - "component-emitter": "~1.3.0", + "@socket.io/component-emitter": "~3.0.0", "debug": "~4.3.1", - "engine.io-parser": "~4.0.1", + "engine.io-parser": "~5.0.0", "has-cors": "1.1.0", "parseqs": "0.0.6", "parseuri": "0.0.6", - "ws": "~7.4.2", + "ws": "~8.2.3", "xmlhttprequest-ssl": "~2.0.0", "yeast": "0.1.2" }, "dependencies": { "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "requires": {} } } }, "engine.io-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz", - "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.1.tgz", + "integrity": "sha512-j4p3WwJrG2k92VISM0op7wiq60vO92MlF3CRGxhKHy9ywG1/Dkc72g0dXeDQ+//hrcDn8gqQzoEkdO9FN0d9AA==", "requires": { - "base64-arraybuffer": "0.1.4" + "base64-arraybuffer": "~1.0.1" } }, "enquirer": { @@ -9786,138 +9821,146 @@ "dev": true }, "esbuild": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.5.tgz", - "integrity": "sha512-Q9/f1njsZaO+Qqe3dqAdtu4zGHNZIbcEtdg44/NooyPhqCerns4FeC1UPYeB4pKD08iDuWcmyINFJTqpdN+pqg==", - "dev": true, - "requires": { - "esbuild-android-arm64": "0.13.5", - "esbuild-darwin-64": "0.13.5", - "esbuild-darwin-arm64": "0.13.5", - "esbuild-freebsd-64": "0.13.5", - "esbuild-freebsd-arm64": "0.13.5", - "esbuild-linux-32": "0.13.5", - "esbuild-linux-64": "0.13.5", - "esbuild-linux-arm": "0.13.5", - "esbuild-linux-arm64": "0.13.5", - "esbuild-linux-mips64le": "0.13.5", - "esbuild-linux-ppc64le": "0.13.5", - "esbuild-openbsd-64": "0.13.5", - "esbuild-sunos-64": "0.13.5", - "esbuild-windows-32": "0.13.5", - "esbuild-windows-64": "0.13.5", - "esbuild-windows-arm64": "0.13.5" + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.12.tgz", + "integrity": "sha512-vTKKUt+yoz61U/BbrnmlG9XIjwpdIxmHB8DlPR0AAW6OdS+nBQBci6LUHU2q9WbBobMEIQxxDpKbkmOGYvxsow==", + "dev": true, + "requires": { + "esbuild-android-arm64": "0.13.12", + "esbuild-darwin-64": "0.13.12", + "esbuild-darwin-arm64": "0.13.12", + "esbuild-freebsd-64": "0.13.12", + "esbuild-freebsd-arm64": "0.13.12", + "esbuild-linux-32": "0.13.12", + "esbuild-linux-64": "0.13.12", + "esbuild-linux-arm": "0.13.12", + "esbuild-linux-arm64": "0.13.12", + "esbuild-linux-mips64le": "0.13.12", + "esbuild-linux-ppc64le": "0.13.12", + "esbuild-netbsd-64": "0.13.12", + "esbuild-openbsd-64": "0.13.12", + "esbuild-sunos-64": "0.13.12", + "esbuild-windows-32": "0.13.12", + "esbuild-windows-64": "0.13.12", + "esbuild-windows-arm64": "0.13.12" } }, "esbuild-android-arm64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.5.tgz", - "integrity": "sha512-xaNH58b9XRAWT5q0rwA2GNTgJynb51JhdotlNKdLmSCyKXPVlF87yqNLNdmlX/zndzRDrZdtpCWSALdn/J63Ug==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.12.tgz", + "integrity": "sha512-TSVZVrb4EIXz6KaYjXfTzPyyRpXV5zgYIADXtQsIenjZ78myvDGaPi11o4ZSaHIwFHsuwkB6ne5SZRBwAQ7maw==", "dev": true, "optional": true }, "esbuild-darwin-64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.5.tgz", - "integrity": "sha512-ClGQeUObXIxEpZviGzjTinDikXy9XodojP9jLKwqLCBpZ9wdV3MW7JOmw60fgXgnbNRvkZCqM6uEi+ur8p80Ow==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.12.tgz", + "integrity": "sha512-c51C+N+UHySoV2lgfWSwwmlnLnL0JWj/LzuZt9Ltk9ub1s2Y8cr6SQV5W3mqVH1egUceew6KZ8GyI4nwu+fhsw==", "dev": true, "optional": true }, "esbuild-darwin-arm64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.5.tgz", - "integrity": "sha512-qro6M/qzs1dBPh14Ca+5moIkLo2KE3ll3dOpiN7aAususkM1HmqQptCEchi0XwX+6nfqWI96YvVqPJ3DfUUK5A==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.12.tgz", + "integrity": "sha512-JvAMtshP45Hd8A8wOzjkY1xAnTKTYuP/QUaKp5eUQGX+76GIie3fCdUUr2ZEKdvpSImNqxiZSIMziEiGB5oUmQ==", "dev": true, "optional": true }, "esbuild-freebsd-64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.5.tgz", - "integrity": "sha512-vklf7L7fghREEvS1sjAFcxcw/Qqt+Z+L0ySN+pEeb7rA8nPLfRBSFdXAru8UNuHsMWns6CrcZ5eDOKTerZZ5ng==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.12.tgz", + "integrity": "sha512-r6On/Skv9f0ZjTu6PW5o7pdXr8aOgtFOEURJZYf1XAJs0IQ+gW+o1DzXjVkIoT+n1cm3N/t1KRJfX71MPg/ZUA==", "dev": true, "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.5.tgz", - "integrity": "sha512-kJoouhbZt4QvjiPak7/Lz57Azok0CgFnNtixiOsqEQXTabIaKmMmnq4qgjD6EBFeU/hvSXDrPe6U8dWhBZOrWQ==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.12.tgz", + "integrity": "sha512-F6LmI2Q1gii073kmBE3NOTt/6zLL5zvZsxNLF8PMAwdHc+iBhD1vzfI8uQZMJA1IgXa3ocr3L3DJH9fLGXy6Yw==", "dev": true, "optional": true }, "esbuild-linux-32": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.5.tgz", - "integrity": "sha512-/QufG6tTGKAf42pIYkOVZzKBPxF01xH1kCPyOFJZukZBV/Tk3TeOZfhJIAf7pxl4jhfa+c4Jcdp7CvIAjXrmJg==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.12.tgz", + "integrity": "sha512-U1UZwG3UIwF7/V4tCVAo/nkBV9ag5KJiJTt+gaCmLVWH3bPLX7y+fNlhIWZy8raTMnXhMKfaTvWZ9TtmXzvkuQ==", "dev": true, "optional": true }, "esbuild-linux-64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.5.tgz", - "integrity": "sha512-NmNFMXEthuFJTFaD4cLhAHCxg+y3uXzo7nqH/WNNSZ8PPY11jbeOvMbdArYlbo2Wy1N/mTHXMcK1synSJj+4Iw==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.12.tgz", + "integrity": "sha512-YpXSwtu2NxN3N4ifJxEdsgd6Q5d8LYqskrAwjmoCT6yQnEHJSF5uWcxv783HWN7lnGpJi9KUtDvYsnMdyGw71Q==", "dev": true, "optional": true }, "esbuild-linux-arm": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.5.tgz", - "integrity": "sha512-69nQmbKLBRaAxf88diyaOyarrI7yIdBkZ8bmVzQ7XVWneY+nYIcGtugTSOs5znNGfPqGOElAjh1lX+0sGYHNpA==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.12.tgz", + "integrity": "sha512-SyiT/JKxU6J+DY2qUiSLZJqCAftIt3uoGejZ0HDnUM2MGJqEGSGh7p1ecVL2gna3PxS4P+j6WAehCwgkBPXNIw==", "dev": true, "optional": true }, "esbuild-linux-arm64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.5.tgz", - "integrity": "sha512-dOS5EZsZj8Lw0TgEj3zy1/slTBbfBw4v7uHEqZXP34dUaRq2oltNaUYIj735CtgB7I5/MXrXEUYkXLqcVfzJQQ==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.12.tgz", + "integrity": "sha512-sgDNb8kb3BVodtAlcFGgwk+43KFCYjnFOaOfJibXnnIojNWuJHpL6aQJ4mumzNWw8Rt1xEtDQyuGK9f+Y24jGA==", "dev": true, "optional": true }, "esbuild-linux-mips64le": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.5.tgz", - "integrity": "sha512-dmKA8ZI/nHwpxIQW/L5crk7Ac4wJJ2Kquvdo1CdXPW1UljMyKUDuHc4K7D1Iws5igqJmNO6U5vdRUKrdnIov6Q==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.12.tgz", + "integrity": "sha512-qQJHlZBG+QwVIA8AbTEtbvF084QgDi4DaUsUnA+EolY1bxrG+UyOuGflM2ZritGhfS/k7THFjJbjH2wIeoKA2g==", "dev": true, "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.5.tgz", - "integrity": "sha512-HkVGKkPL3XOhJqNOJ752Q1li5zeidrJHv+XWX6qCnCipNsVuGqaAGfxeWbL/+A/giolMlP7wvAuiKgoe+a5UAw==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.12.tgz", + "integrity": "sha512-2dSnm1ldL7Lppwlo04CGQUpwNn5hGqXI38OzaoPOkRsBRWFBozyGxTFSee/zHFS+Pdh3b28JJbRK3owrrRgWNw==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.12.tgz", + "integrity": "sha512-D4raxr02dcRiQNbxOLzpqBzcJNFAdsDNxjUbKkDMZBkL54Z0vZh4LRndycdZAMcIdizC/l/Yp/ZsBdAFxc5nbA==", "dev": true, "optional": true }, "esbuild-openbsd-64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.5.tgz", - "integrity": "sha512-BuOZzmdsdreSs0qDgbuiEhSbUDDW2Wyp4VtpNGBmaLwPMHftdprOJXLkeFud3HlnRB2n9qdiTVKg1B8YqMogSw==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.12.tgz", + "integrity": "sha512-KuLCmYMb2kh05QuPJ+va60bKIH5wHL8ypDkmpy47lzwmdxNsuySeCMHuTv5o2Af1RUn5KLO5ZxaZeq4GEY7DaQ==", "dev": true, "optional": true }, "esbuild-sunos-64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.5.tgz", - "integrity": "sha512-YJNB6Og1QYAPikvYDbqvk5xCqr6WL2i5cRWPGGgWOEItQPnq6gFsWogS3DiYM8TQKe50KRiD3Lwu7eNYsdPO4w==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.12.tgz", + "integrity": "sha512-jBsF+e0woK3miKI8ufGWKG3o3rY9DpHvCVRn5eburMIIE+2c+y3IZ1srsthKyKI6kkXLvV4Cf/E7w56kLipMXw==", "dev": true, "optional": true }, "esbuild-windows-32": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.5.tgz", - "integrity": "sha512-CigOlBSKsZ61IS+FyhD3luqCpl7LN9ntDaBZXumls/0IZ/8BJ5txqw4a6pv4LtnfIgt0ixGHSH7kAUmApw/HAw==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.12.tgz", + "integrity": "sha512-L9m4lLFQrFeR7F+eLZXG82SbXZfUhyfu6CexZEil6vm+lc7GDCE0Q8DiNutkpzjv1+RAbIGVva9muItQ7HVTkQ==", "dev": true, "optional": true }, "esbuild-windows-64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.5.tgz", - "integrity": "sha512-pg2BZXLpcPcrIcmToGapLRExzj6sm0VmQlqlmnMOtIJh0YQV9c0CRbhfIT0gYvJqCz5JEGiRvYpArRlxWADN3Q==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.12.tgz", + "integrity": "sha512-k4tX4uJlSbSkfs78W5d9+I9gpd+7N95W7H2bgOMFPsYREVJs31+Q2gLLHlsnlY95zBoPQMIzHooUIsixQIBjaQ==", "dev": true, "optional": true }, "esbuild-windows-arm64": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.5.tgz", - "integrity": "sha512-KKRDmUOIE4oCvJp0I4p4QyazK2X79spF29vsZr2U8qHhmxbTLSQWvYmb2WlF5Clb1URRsX0L013rhwHx1SEu0w==", + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.12.tgz", + "integrity": "sha512-2tTv/BpYRIvuwHpp2M960nG7uvL+d78LFW/ikPItO+2GfK51CswIKSetSpDii+cjz8e9iSPgs+BU4o8nWICBwQ==", "dev": true, "optional": true }, @@ -9951,9 +9994,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "levn": { @@ -10045,6 +10088,23 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { + "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": { + "eslint-visitor-keys": "^1.1.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==", + "dev": true + } + } + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -10089,20 +10149,12 @@ } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.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==", - "dev": true - } + "eslint-visitor-keys": "^2.0.0" } }, "eslint-visitor-keys": { @@ -10146,9 +10198,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -10163,9 +10215,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -10215,17 +10267,25 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "expect": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.5.tgz", - "integrity": "sha512-ZrO0w7bo8BgGoP/bLz+HDCI+0Hfei9jUSZs5yI/Wyn9VkG9w8oJ7rHRgYj+MA7yqqFa0IwHA3flJzZtYugShJA==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.3.1.tgz", + "integrity": "sha512-MrNXV2sL9iDRebWPGOGFdPQRl2eDQNu/uhxIMShjjx74T6kC6jFIkmQ6OqXDtevjGUkyB2IT56RzDBqXf/QPCg==", "dev": true, "requires": { "@jest/types": "^27.2.5", "ansi-styles": "^5.0.0", - "jest-get-type": "^27.0.6", - "jest-matcher-utils": "^27.2.5", - "jest-message-util": "^27.2.5", + "jest-get-type": "^27.3.1", + "jest-matcher-utils": "^27.3.1", + "jest-message-util": "^27.3.1", "jest-regex-util": "^27.0.6" }, "dependencies": { @@ -10429,9 +10489,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", + "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==" }, "form-data": { "version": "3.0.1", @@ -10498,6 +10558,14 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-installed-path": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-4.0.8.tgz", + "integrity": "sha512-PmANK1xElIHlHH2tXfOoTnSDUjX1X3GvKK6ZyLbUnSCCn1pADwu67eVWttuPzJWrXDDT2MfO6uAaKILOFfitmA==", + "requires": { + "global-modules": "1.0.0" + } + }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -10550,10 +10618,42 @@ "ini": "^1.3.4" } }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -10603,6 +10703,14 @@ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hosted-git-info": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", @@ -10759,19 +10867,10 @@ "binary-extensions": "^2.0.0" } }, - "is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", - "dev": true, - "requires": { - "ci-info": "^3.1.1" - } - }, "is-core-module": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", - "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", "dev": true, "requires": { "has": "^1.0.3" @@ -10829,6 +10928,11 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "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==" + }, "isbinaryfile": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", @@ -10840,9 +10944,9 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "istanbul-lib-coverage": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.2.tgz", - "integrity": "sha512-o5+eTUYzCJ11/+JhW5/FUCdfsdoYVdQ/8I/OveE2XsjehYn5DdeSnNQAbjYaO8gQ6hvGTN6GM6ddQqpTVG5j8g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-instrument": { @@ -10888,9 +10992,9 @@ } }, "istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-bFjUnc95rHjdCR63WMHUS7yfJJh8T9IPSWavvR02hhjVwezWALZ5axF9EqjmwZHpXqkzbgAMP8DmAtiyNxrdrQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", + "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -10898,25 +11002,25 @@ } }, "jasmine-core": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.9.0.tgz", - "integrity": "sha512-Tv3kVbPCGVrjsnHBZ38NsPU3sDOtNa0XmbG2baiyJqdb5/SPpDO6GVwJYtUryl6KB4q1Ssckwg612ES9Z0dreQ==" + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.10.1.tgz", + "integrity": "sha512-ooZWSDVAdh79Rrj4/nnfklL3NQVra0BcuhcuWoAwwi+znLDoUeH87AFfeX8s+YeYi6xlv5nveRyaA1v7CintfA==" }, "jest": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.2.5.tgz", - "integrity": "sha512-vDMzXcpQN4Ycaqu+vO7LX8pZwNNoKMhc+gSp6q1D8S6ftRk8gNW8cni3YFxknP95jxzQo23Lul0BI2FrWgnwYQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.3.1.tgz", + "integrity": "sha512-U2AX0AgQGd5EzMsiZpYt8HyZ+nSVIh5ujQ9CPp9EQZJMjXIiSZpJNweZl0swatKRoqHWgGKM3zaSwm4Zaz87ng==", "dev": true, "requires": { - "@jest/core": "^27.2.5", + "@jest/core": "^27.3.1", "import-local": "^3.0.2", - "jest-cli": "^27.2.5" + "jest-cli": "^27.3.1" } }, "jest-changed-files": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.2.5.tgz", - "integrity": "sha512-jfnNJzF89csUKRPKJ4MwZ1SH27wTmX2xiAIHUHrsb/OYd9Jbo4/SXxJ17/nnx6RIifpthk3Y+LEeOk+/dDeGdw==", + "version": "27.3.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.3.0.tgz", + "integrity": "sha512-9DJs9garMHv4RhylUMZgbdCJ3+jHSkpL9aaVKp13xtXAD80qLTLrqcDZL1PHA9dYA0bCI86Nv2BhkLpLhrBcPg==", "dev": true, "requires": { "@jest/types": "^27.2.5", @@ -10925,93 +11029,91 @@ } }, "jest-circus": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.2.5.tgz", - "integrity": "sha512-eyL9IcrAxm3Saq3rmajFCwpaxaRMGJ1KJs+7hlTDinXpJmeR3P02bheM3CYohE7UfwOBmrFMJHjgo/WPcLTM+Q==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.3.1.tgz", + "integrity": "sha512-v1dsM9II6gvXokgqq6Yh2jHCpfg7ZqV4jWY66u7npz24JnhP3NHxI0sKT7+ZMQ7IrOWHYAaeEllOySbDbWsiXw==", "dev": true, "requires": { - "@jest/environment": "^27.2.5", - "@jest/test-result": "^27.2.5", + "@jest/environment": "^27.3.1", + "@jest/test-result": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^27.2.5", + "expect": "^27.3.1", "is-generator-fn": "^2.0.0", - "jest-each": "^27.2.5", - "jest-matcher-utils": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-runtime": "^27.2.5", - "jest-snapshot": "^27.2.5", - "jest-util": "^27.2.5", - "pretty-format": "^27.2.5", + "jest-each": "^27.3.1", + "jest-matcher-utils": "^27.3.1", + "jest-message-util": "^27.3.1", + "jest-runtime": "^27.3.1", + "jest-snapshot": "^27.3.1", + "jest-util": "^27.3.1", + "pretty-format": "^27.3.1", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" } }, "jest-cli": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.2.5.tgz", - "integrity": "sha512-XzfcOXi5WQrXqFYsDxq5RDOKY4FNIgBgvgf3ZBz4e/j5/aWep5KnsAYH5OFPMdX/TP/LFsYQMRH7kzJUMh6JKg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.3.1.tgz", + "integrity": "sha512-WHnCqpfK+6EvT62me6WVs8NhtbjAS4/6vZJnk7/2+oOr50cwAzG4Wxt6RXX0hu6m1169ZGMlhYYUNeKBXCph/Q==", "dev": true, "requires": { - "@jest/core": "^27.2.5", - "@jest/test-result": "^27.2.5", + "@jest/core": "^27.3.1", + "@jest/test-result": "^27.3.1", "@jest/types": "^27.2.5", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.2.5", - "jest-util": "^27.2.5", - "jest-validate": "^27.2.5", + "jest-config": "^27.3.1", + "jest-util": "^27.3.1", + "jest-validate": "^27.3.1", "prompts": "^2.0.1", "yargs": "^16.2.0" - }, - "dependencies": { - "jest-config": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.2.5.tgz", - "integrity": "sha512-QdENtn9b5rIIYGlbDNEcgY9LDL5kcokJnXrp7x8AGjHob/XFqw1Z6p+gjfna2sUulQsQ3ce2Fvntnv+7fKYDhQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.2.5", - "@jest/types": "^27.2.5", - "babel-jest": "^27.2.5", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", - "jest-circus": "^27.2.5", - "jest-environment-jsdom": "^27.2.5", - "jest-environment-node": "^27.2.5", - "jest-get-type": "^27.0.6", - "jest-jasmine2": "^27.2.5", - "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.5", - "jest-runner": "^27.2.5", - "jest-util": "^27.2.5", - "jest-validate": "^27.2.5", - "micromatch": "^4.0.4", - "pretty-format": "^27.2.5" - } - } + } + }, + "jest-config": { + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.3.1.tgz", + "integrity": "sha512-KY8xOIbIACZ/vdYCKSopL44I0xboxC751IX+DXL2+Wx6DKNycyEfV3rryC3BPm5Uq/BBqDoMrKuqLEUNJmMKKg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^27.3.1", + "@jest/types": "^27.2.5", + "babel-jest": "^27.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-circus": "^27.3.1", + "jest-environment-jsdom": "^27.3.1", + "jest-environment-node": "^27.3.1", + "jest-get-type": "^27.3.1", + "jest-jasmine2": "^27.3.1", + "jest-regex-util": "^27.0.6", + "jest-resolve": "^27.3.1", + "jest-runner": "^27.3.1", + "jest-util": "^27.3.1", + "jest-validate": "^27.3.1", + "micromatch": "^4.0.4", + "pretty-format": "^27.3.1" } }, "jest-diff": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.5.tgz", - "integrity": "sha512-7gfwwyYkeslOOVQY4tVq5TaQa92mWfC9COsVYMNVYyJTOYAqbIkoD3twi5A+h+tAPtAelRxkqY6/xu+jwTr0dA==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.3.1.tgz", + "integrity": "sha512-PCeuAH4AWUo2O5+ksW4pL9v5xJAcIKPUPfIhZBcG1RKv/0+dvaWTQK1Nrau8d67dp65fOqbeMdoil+6PedyEPQ==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^27.0.6", - "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.5" + "jest-get-type": "^27.3.1", + "pretty-format": "^27.3.1" } }, "jest-docblock": { @@ -11024,57 +11126,57 @@ } }, "jest-each": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.2.5.tgz", - "integrity": "sha512-HUPWIbJT0bXarRwKu/m7lYzqxR4GM5EhKOsu0z3t0SKtbFN6skQhpAUADM4qFShBXb9zoOuag5lcrR1x/WM+Ag==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.3.1.tgz", + "integrity": "sha512-E4SwfzKJWYcvOYCjOxhZcxwL+AY0uFMvdCOwvzgutJiaiodFjkxQQDxHm8FQBeTqDnSmKsQWn7ldMRzTn2zJaQ==", "dev": true, "requires": { "@jest/types": "^27.2.5", "chalk": "^4.0.0", - "jest-get-type": "^27.0.6", - "jest-util": "^27.2.5", - "pretty-format": "^27.2.5" + "jest-get-type": "^27.3.1", + "jest-util": "^27.3.1", + "pretty-format": "^27.3.1" } }, "jest-environment-jsdom": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.2.5.tgz", - "integrity": "sha512-QtRpOh/RQKuXniaWcoFE2ElwP6tQcyxHu0hlk32880g0KczdonCs5P1sk5+weu/OVzh5V4Bt1rXuQthI01mBLg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.3.1.tgz", + "integrity": "sha512-3MOy8qMzIkQlfb3W1TfrD7uZHj+xx8Olix5vMENkj5djPmRqndMaXtpnaZkxmxM+Qc3lo+yVzJjzuXbCcZjAlg==", "dev": true, "requires": { - "@jest/environment": "^27.2.5", - "@jest/fake-timers": "^27.2.5", + "@jest/environment": "^27.3.1", + "@jest/fake-timers": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", - "jest-mock": "^27.2.5", - "jest-util": "^27.2.5", + "jest-mock": "^27.3.0", + "jest-util": "^27.3.1", "jsdom": "^16.6.0" } }, "jest-environment-node": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.2.5.tgz", - "integrity": "sha512-0o1LT4grm7iwrS8fIoLtwJxb/hoa3GsH7pP10P02Jpj7Mi4BXy65u46m89vEM2WfD1uFJQ2+dfDiWZNA2e6bJg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.3.1.tgz", + "integrity": "sha512-T89F/FgkE8waqrTSA7/ydMkcc52uYPgZZ6q8OaZgyiZkJb5QNNCF6oPZjH9IfPFfcc9uBWh1574N0kY0pSvTXw==", "dev": true, "requires": { - "@jest/environment": "^27.2.5", - "@jest/fake-timers": "^27.2.5", + "@jest/environment": "^27.3.1", + "@jest/fake-timers": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", - "jest-mock": "^27.2.5", - "jest-util": "^27.2.5" + "jest-mock": "^27.3.0", + "jest-util": "^27.3.1" } }, "jest-get-type": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", - "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.3.1.tgz", + "integrity": "sha512-+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg==", "dev": true }, "jest-haste-map": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.2.5.tgz", - "integrity": "sha512-pzO+Gw2WLponaSi0ilpzYBE0kuVJstoXBX8YWyUebR8VaXuX4tzzn0Zp23c/WaETo7XYTGv2e8KdnpiskAFMhQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.3.1.tgz", + "integrity": "sha512-lYfNZIzwPccDJZIyk9Iz5iQMM/MH56NIIcGj7AFU1YyA4ewWFBl8z+YPJuSCRML/ee2cCt2y3W4K3VXPT6Nhzg==", "dev": true, "requires": { "@jest/types": "^27.2.5", @@ -11086,64 +11188,64 @@ "graceful-fs": "^4.2.4", "jest-regex-util": "^27.0.6", "jest-serializer": "^27.0.6", - "jest-util": "^27.2.5", - "jest-worker": "^27.2.5", + "jest-util": "^27.3.1", + "jest-worker": "^27.3.1", "micromatch": "^4.0.4", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.2.5.tgz", - "integrity": "sha512-hdxY9Cm/CjLqu2tXeAoQHPgA4vcqlweVXYOg1+S9FeFdznB9Rti+eEBKDDkmOy9iqr4Xfbq95OkC4NFbXXPCAQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.3.1.tgz", + "integrity": "sha512-WK11ZUetDQaC09w4/j7o4FZDUIp+4iYWH/Lik34Pv7ukL+DuXFGdnmmi7dT58J2ZYKFB5r13GyE0z3NPeyJmsg==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.2.5", + "@jest/environment": "^27.3.1", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.2.5", + "@jest/test-result": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.2.5", + "expect": "^27.3.1", "is-generator-fn": "^2.0.0", - "jest-each": "^27.2.5", - "jest-matcher-utils": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-runtime": "^27.2.5", - "jest-snapshot": "^27.2.5", - "jest-util": "^27.2.5", - "pretty-format": "^27.2.5", + "jest-each": "^27.3.1", + "jest-matcher-utils": "^27.3.1", + "jest-message-util": "^27.3.1", + "jest-runtime": "^27.3.1", + "jest-snapshot": "^27.3.1", + "jest-util": "^27.3.1", + "pretty-format": "^27.3.1", "throat": "^6.0.1" } }, "jest-leak-detector": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.2.5.tgz", - "integrity": "sha512-HYsi3GUR72bYhOGB5C5saF9sPdxGzSjX7soSQS+BqDRysc7sPeBwPbhbuT8DnOpijnKjgwWQ8JqvbmReYnt3aQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.3.1.tgz", + "integrity": "sha512-78QstU9tXbaHzwlRlKmTpjP9k4Pvre5l0r8Spo4SbFFVy/4Abg9I6ZjHwjg2QyKEAMg020XcjP+UgLZIY50yEg==", "dev": true, "requires": { - "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.5" + "jest-get-type": "^27.3.1", + "pretty-format": "^27.3.1" } }, "jest-matcher-utils": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.5.tgz", - "integrity": "sha512-qNR/kh6bz0Dyv3m68Ck2g1fLW5KlSOUNcFQh87VXHZwWc/gY6XwnKofx76Qytz3x5LDWT09/2+yXndTkaG4aWg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.3.1.tgz", + "integrity": "sha512-hX8N7zXS4k+8bC1Aj0OWpGb7D3gIXxYvPNK1inP5xvE4ztbz3rc4AkI6jGVaerepBnfWB17FL5lWFJT3s7qo8w==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^27.2.5", - "jest-get-type": "^27.0.6", - "pretty-format": "^27.2.5" + "jest-diff": "^27.3.1", + "jest-get-type": "^27.3.1", + "pretty-format": "^27.3.1" } }, "jest-message-util": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.2.5.tgz", - "integrity": "sha512-ggXSLoPfIYcbmZ8glgEJZ8b+e0Msw/iddRmgkoO7lDAr9SmI65IIfv7VnvTnV4FGnIIUIjzM+fHRHO5RBvyAbQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.3.1.tgz", + "integrity": "sha512-bh3JEmxsTZ/9rTm0jQrPElbY2+y48Rw2t47uMfByNyUVR+OfPh4anuyKsGqsNkXk/TI4JbLRZx+7p7Hdt6q1yg==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", @@ -11152,26 +11254,26 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.4", - "pretty-format": "^27.2.5", + "pretty-format": "^27.3.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.0" } } } }, "jest-mock": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.2.5.tgz", - "integrity": "sha512-HiMB3LqE9RzmeMzZARi2Bz3NoymxyP0gCid4y42ca1djffNtYFKgI220aC1VP1mUZ8rbpqZbHZOJ15093bZV/Q==", + "version": "27.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.3.0.tgz", + "integrity": "sha512-ziZiLk0elZOQjD08bLkegBzv5hCABu/c8Ytx45nJKkysQwGaonvmTxwjLqEA4qGdasq9o2I8/HtdGMNnVsMTGw==", "dev": true, "requires": { "@jest/types": "^27.2.5", @@ -11201,44 +11303,44 @@ "dev": true }, "jest-resolve": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.2.5.tgz", - "integrity": "sha512-q5irwS3oS73SKy3+FM/HL2T7WJftrk9BRzrXF92f7net5HMlS7lJMg/ZwxLB4YohKqjSsdksEw7n/jvMxV7EKg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.3.1.tgz", + "integrity": "sha512-Dfzt25CFSPo3Y3GCbxynRBZzxq9AdyNN+x/v2IqYx6KVT5Z6me2Z/PsSGFSv3cOSUZqJ9pHxilao/I/m9FouLw==", "dev": true, "requires": { "@jest/types": "^27.2.5", "chalk": "^4.0.0", - "escalade": "^3.1.1", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.5", + "jest-haste-map": "^27.3.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.2.5", - "jest-validate": "^27.2.5", + "jest-util": "^27.3.1", + "jest-validate": "^27.3.1", "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.5.tgz", - "integrity": "sha512-BSjefped31bcvvCh++/pN9ueqqN1n0+p8/58yScuWfklLm2tbPbS9d251vJhAy0ZI2pL/0IaGhOTJrs9Y4FJlg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.3.1.tgz", + "integrity": "sha512-X7iLzY8pCiYOnvYo2YrK3P9oSE8/3N2f4pUZMJ8IUcZnT81vlSonya1KTO9ZfKGuC+svE6FHK/XOb8SsoRUV1A==", "dev": true, "requires": { "@jest/types": "^27.2.5", "jest-regex-util": "^27.0.6", - "jest-snapshot": "^27.2.5" + "jest-snapshot": "^27.3.1" } }, "jest-runner": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.2.5.tgz", - "integrity": "sha512-n41vw9RLg5TKAnEeJK9d6pGOsBOpwE89XBniK+AD1k26oIIy3V7ogM1scbDjSheji8MUPC9pNgCrZ/FHLVDNgg==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.3.1.tgz", + "integrity": "sha512-r4W6kBn6sPr3TBwQNmqE94mPlYVn7fLBseeJfo4E2uCTmAyDFm2O5DYAQAFP7Q3YfiA/bMwg8TVsciP7k0xOww==", "dev": true, "requires": { - "@jest/console": "^27.2.5", - "@jest/environment": "^27.2.5", - "@jest/test-result": "^27.2.5", - "@jest/transform": "^27.2.5", + "@jest/console": "^27.3.1", + "@jest/environment": "^27.3.1", + "@jest/test-result": "^27.3.1", + "@jest/transform": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", @@ -11246,32 +11348,31 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.0.6", - "jest-environment-jsdom": "^27.2.5", - "jest-environment-node": "^27.2.5", - "jest-haste-map": "^27.2.5", - "jest-leak-detector": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-resolve": "^27.2.5", - "jest-runtime": "^27.2.5", - "jest-util": "^27.2.5", - "jest-worker": "^27.2.5", + "jest-environment-jsdom": "^27.3.1", + "jest-environment-node": "^27.3.1", + "jest-haste-map": "^27.3.1", + "jest-leak-detector": "^27.3.1", + "jest-message-util": "^27.3.1", + "jest-resolve": "^27.3.1", + "jest-runtime": "^27.3.1", + "jest-util": "^27.3.1", + "jest-worker": "^27.3.1", "source-map-support": "^0.5.6", "throat": "^6.0.1" } }, "jest-runtime": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.2.5.tgz", - "integrity": "sha512-N0WRZ3QszKyZ3Dm27HTBbBuestsSd3Ud5ooVho47XZJ8aSKO/X1Ag8M1dNx9XzfGVRNdB/xCA3lz8MJwIzPLLA==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.3.1.tgz", + "integrity": "sha512-qtO6VxPbS8umqhEDpjA4pqTkKQ1Hy4ZSi9mDVeE9Za7LKBo2LdW2jmT+Iod3XFaJqINikZQsn2wEi0j9wPRbLg==", "dev": true, "requires": { - "@jest/console": "^27.2.5", - "@jest/environment": "^27.2.5", - "@jest/fake-timers": "^27.2.5", - "@jest/globals": "^27.2.5", + "@jest/console": "^27.3.1", + "@jest/environment": "^27.3.1", + "@jest/globals": "^27.3.1", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.2.5", - "@jest/transform": "^27.2.5", + "@jest/test-result": "^27.3.1", + "@jest/transform": "^27.3.1", "@jest/types": "^27.2.5", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", @@ -11281,14 +11382,14 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-mock": "^27.2.5", + "jest-haste-map": "^27.3.1", + "jest-message-util": "^27.3.1", + "jest-mock": "^27.3.0", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.2.5", - "jest-snapshot": "^27.2.5", - "jest-util": "^27.2.5", - "jest-validate": "^27.2.5", + "jest-resolve": "^27.3.1", + "jest-snapshot": "^27.3.1", + "jest-util": "^27.3.1", + "jest-validate": "^27.3.1", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^16.2.0" @@ -11305,9 +11406,9 @@ } }, "jest-snapshot": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.2.5.tgz", - "integrity": "sha512-2/Jkn+VN6Abwz0llBltZaiJMnL8b1j5Bp/gRIxe9YR3FCEh9qp0TXVV0dcpTGZ8AcJV1SZGQkczewkI9LP5yGw==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.3.1.tgz", + "integrity": "sha512-APZyBvSgQgOT0XumwfFu7X3G5elj6TGhCBLbBdn3R1IzYustPGPE38F51dBWMQ8hRXa9je0vAdeVDtqHLvB6lg==", "dev": true, "requires": { "@babel/core": "^7.7.2", @@ -11316,52 +11417,52 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.2.5", + "@jest/transform": "^27.3.1", "@jest/types": "^27.2.5", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.2.5", + "expect": "^27.3.1", "graceful-fs": "^4.2.4", - "jest-diff": "^27.2.5", - "jest-get-type": "^27.0.6", - "jest-haste-map": "^27.2.5", - "jest-matcher-utils": "^27.2.5", - "jest-message-util": "^27.2.5", - "jest-resolve": "^27.2.5", - "jest-util": "^27.2.5", + "jest-diff": "^27.3.1", + "jest-get-type": "^27.3.1", + "jest-haste-map": "^27.3.1", + "jest-matcher-utils": "^27.3.1", + "jest-message-util": "^27.3.1", + "jest-resolve": "^27.3.1", + "jest-util": "^27.3.1", "natural-compare": "^1.4.0", - "pretty-format": "^27.2.5", + "pretty-format": "^27.3.1", "semver": "^7.3.2" } }, "jest-util": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.2.5.tgz", - "integrity": "sha512-QRhDC6XxISntMzFRd/OQ6TGsjbzA5ONO0tlAj2ElHs155x1aEr0rkYJBEysG6H/gZVH3oGFzCdAB/GA8leh8NQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.3.1.tgz", + "integrity": "sha512-8fg+ifEH3GDryLQf/eKZck1DEs2YuVPBCMOaHQxVVLmQwl/CDhWzrvChTX4efLZxGrw+AA0mSXv78cyytBt/uw==", "dev": true, "requires": { "@jest/types": "^27.2.5", "@types/node": "*", "chalk": "^4.0.0", + "ci-info": "^3.2.0", "graceful-fs": "^4.2.4", - "is-ci": "^3.0.0", "picomatch": "^2.2.3" } }, "jest-validate": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.2.5.tgz", - "integrity": "sha512-XgYtjS89nhVe+UfkbLgcm+GgXKWgL80t9nTcNeejyO3t0Sj/yHE8BtIJqjZu9NXQksYbGImoQRXmQ1gP+Guffw==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.3.1.tgz", + "integrity": "sha512-3H0XCHDFLA9uDII67Bwi1Vy7AqwA5HqEEjyy934lgVhtJ3eisw6ShOF1MDmRPspyikef5MyExvIm0/TuLzZ86Q==", "dev": true, "requires": { "@jest/types": "^27.2.5", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^27.0.6", + "jest-get-type": "^27.3.1", "leven": "^3.1.0", - "pretty-format": "^27.2.5" + "pretty-format": "^27.3.1" }, "dependencies": { "camelcase": { @@ -11373,31 +11474,31 @@ } }, "jest-watcher": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.2.5.tgz", - "integrity": "sha512-umV4qGozg2Dn6DTTtqAh9puPw+DGLK9AQas7+mWjiK8t0fWMpxKg8ZXReZw7L4C88DqorsGUiDgwHNZ+jkVrkQ==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.3.1.tgz", + "integrity": "sha512-9/xbV6chABsGHWh9yPaAGYVVKurWoP3ZMCv6h+O1v9/+pkOroigs6WzZ0e9gLP/njokUwM7yQhr01LKJVMkaZA==", "dev": true, "requires": { - "@jest/test-result": "^27.2.5", + "@jest/test-result": "^27.3.1", "@jest/types": "^27.2.5", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.2.5", + "jest-util": "^27.3.1", "string-length": "^4.0.1" } }, "jest-when": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/jest-when/-/jest-when-3.4.1.tgz", - "integrity": "sha512-oFxeKarvTsuE46SPTzX+znKb+vzQKUxhkPF/fOfhMJE19EcW+sk9dKiACgFVE3K82GgALDH1pjCvHU+uE91QYA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/jest-when/-/jest-when-3.4.2.tgz", + "integrity": "sha512-vO1r+1XsyeavhoSapj7q4xD5xuM9i+UdopfhmJJK/aKaDpzDesxZ6hreLSO1JUZhZInqdM7CCn+At7c0SI2EEw==", "dev": true, "requires": {} }, "jest-worker": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.5.tgz", - "integrity": "sha512-HTjEPZtcNKZ4LnhSp02NEH4vE+5OpJ0EsOWYvGQpHgUMLngydESAAMH5Wd/asPf29+XUDQZszxpLg1BkIIA2aw==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz", + "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==", "dev": true, "requires": { "@types/node": "*", @@ -11511,9 +11612,9 @@ } }, "karma": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.4.tgz", - "integrity": "sha512-hbhRogUYIulfkBTZT7xoPrCYhRBnBoqbbL4fszWD0ReFGUxU+LYBr3dwKdAluaDQ/ynT9/7C+Lf7pPNW4gSx4Q==", + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.6.tgz", + "integrity": "sha512-xsiu3D6AjCv6Uq0YKXJgC6TvXX2WloQ5+XtHXmC1lwiLVG617DDV3W2DdM4BxCMKHlmz6l3qESZHFQGHAKvrew==", "requires": { "body-parser": "^1.19.0", "braces": "^3.0.2", @@ -11533,59 +11634,11 @@ "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^3.1.0", + "socket.io": "^4.2.0", "source-map": "^0.6.1", "tmp": "^0.2.1", - "ua-parser-js": "^0.7.28", + "ua-parser-js": "^0.7.30", "yargs": "^16.1.1" - }, - "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==" - }, - "engine.io": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.1.tgz", - "integrity": "sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w==", - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~4.0.0", - "ws": "~7.4.2" - } - }, - "socket.io": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", - "integrity": "sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==", - "requires": { - "@types/cookie": "^0.4.0", - "@types/cors": "^2.8.8", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.1", - "engine.io": "~4.1.0", - "socket.io-adapter": "~2.1.0", - "socket.io-parser": "~4.0.3" - } - }, - "socket.io-adapter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", - "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==" - }, - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "requires": {} - } } }, "karma-chrome-launcher": { @@ -11665,6 +11718,12 @@ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -11729,12 +11788,12 @@ "dev": true }, "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "requires": { - "tmpl": "1.0.x" + "tmpl": "1.0.5" } }, "markdown-it": { @@ -11867,9 +11926,9 @@ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "node": { - "version": "14.18.0", - "resolved": "https://registry.npmjs.org/node/-/node-14.18.0.tgz", - "integrity": "sha512-ho+MOL09f9W1lQ4ECUGv+2wuShttuZ6QnOIomhQ6ZQ2ZYovOCUtK0Z0796mnag2DZmA+v+R/4qsiXFnlMGBn3w==", + "version": "14.18.1", + "resolved": "https://registry.npmjs.org/node/-/node-14.18.1.tgz", + "integrity": "sha512-gBt7GlSQp68Bj5KoYx3dGgMCaE2PN0Qox3oiemTDINYHhJjML/Xd24jXuo7X1ehyJuVNZsLWYrJgX6DhHCze6w==", "requires": { "node-bin-setup": "^1.0.0" } @@ -11892,9 +11951,9 @@ "dev": true }, "node-releases": { - "version": "1.1.77", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", - "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", "dev": true }, "normalize-path": { @@ -12031,6 +12090,11 @@ "callsites": "^3.0.0" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, "parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", @@ -12092,7 +12156,8 @@ "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, "path-parse": { "version": "1.0.7", @@ -12117,9 +12182,9 @@ "dev": true }, "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { @@ -12194,9 +12259,9 @@ "requires": {} }, "pretty-format": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.5.tgz", - "integrity": "sha512-+nYn2z9GgicO9JiqmY25Xtq8SYfZ/5VCpEU3pppHHNAhd1y+ZXxmNPd1evmNcAd6Hz4iBV2kf0UpGth5A/VJ7g==", + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.3.1.tgz", + "integrity": "sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA==", "dev": true, "requires": { "@jest/types": "^27.2.5", @@ -12353,6 +12418,15 @@ } } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -12367,6 +12441,12 @@ "global-dirs": "^0.1.1" } }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -12494,6 +12574,7 @@ "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" } @@ -12501,7 +12582,8 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true }, "side-channel": { "version": "1.0.4", @@ -12543,17 +12625,14 @@ } }, "socket.io": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.2.0.tgz", - "integrity": "sha512-sjlGfMmnaWvTRVxGRGWyhd9ctpg4APxWAxu85O/SxekkxHhfxmePWZbaYCkeX5QQX0z1YEnKOlNt6w82E4Nzug==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.3.1.tgz", + "integrity": "sha512-HC5w5Olv2XZ0XJ4gOLGzzHEuOCfj3G0SmoW3jLHYYh34EVsIr3EkW9h6kgfW+K3TFEcmYy8JcPWe//KUkBp5jA==", "requires": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~5.2.0", + "engine.io": "~6.0.0", "socket.io-adapter": "~2.3.2", "socket.io-parser": "~4.0.4" } @@ -12564,17 +12643,27 @@ "integrity": "sha512-PBZpxUPYjmoogY0aoaTmo1643JelsaS1CiAwNjRVdrI0X9Seuc19Y2Wife8k88avW6haG8cznvwbubAZwH4Mtg==" }, "socket.io-client": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.2.0.tgz", - "integrity": "sha512-3GJ2KMh7inJUNAOjgf8NaKJZJa9uRyfryh2LrVJyKyxmzoXlfW9DeDNqylJn0ovOFt4e/kRLNWzMt/YqqEWYSA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.3.2.tgz", + "integrity": "sha512-2B9LqSunN60yV8F7S84CCEEcgbYNfrn7ejIInZtLZ7ppWtiX8rGZAjvdCvbnC8bqo/9RlCNOUsORLyskxSFP1g==", "requires": { - "@types/component-emitter": "^1.2.10", + "@socket.io/component-emitter": "~3.0.0", "backo2": "~1.0.2", - "component-emitter": "~1.3.0", "debug": "~4.3.2", - "engine.io-client": "~5.2.0", + "engine.io-client": "~6.0.1", "parseuri": "0.0.6", - "socket.io-parser": "~4.0.4" + "socket.io-parser": "~4.1.1" + }, + "dependencies": { + "socket.io-parser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.1.tgz", + "integrity": "sha512-USQVLSkDWE5nbcY760ExdKaJxCE65kcsG/8k5FDGZVVxpD1pA7hABYXYkCUvxUuYYh/+uQw0N/fvBzfT8o07KA==", + "requires": { + "@socket.io/component-emitter": "~3.0.0", + "debug": "~4.3.1" + } + } } }, "socket.io-parser": { @@ -12856,16 +12945,16 @@ "requires": {} }, "ts-jest": { - "version": "27.0.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.5.tgz", - "integrity": "sha512-lIJApzfTaSSbtlksfFNHkWOzLJuuSm4faFAfo5kvzOiRAuoN4/eKxVJ2zEAho8aecE04qX6K1pAzfH5QHL1/8w==", + "version": "27.0.7", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.7.tgz", + "integrity": "sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==", "dev": true, "requires": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^27.0.0", "json5": "2.x", - "lodash": "4.x", + "lodash.memoize": "4.x", "make-error": "1.x", "semver": "7.x", "yargs-parser": "20.x" @@ -12959,9 +13048,9 @@ "dev": true }, "ua-parser-js": { - "version": "0.7.28", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", - "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==" }, "uc.micro": { "version": "1.0.6", @@ -13041,9 +13130,9 @@ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" }, "vsce": { - "version": "1.100.2", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.100.2.tgz", - "integrity": "sha512-eDeubJNc0iav6mbTESZ90E9WcSzqAAl/lunb4KbNjRrz9tf+657i1mKhnWUyvK7Y4D8kN5NBD2FXD4FFMZj7ig==", + "version": "1.102.0", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.102.0.tgz", + "integrity": "sha512-fICfop2CvO4AwdkWmJyjxJSQoIJ0ke9owwBhvtQpXvgcH4kW0uV9jwdNviOEy0QYlhM3sAZJkf3/Nta3UPWvKQ==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", @@ -13173,12 +13262,12 @@ } }, "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "requires": { - "makeerror": "1.0.x" + "makeerror": "1.0.12" } }, "webidl-conversions": { @@ -13217,6 +13306,7 @@ "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" } diff --git a/package.json b/package.json index dfb77f0..065f610 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "icon": "docs/img/extension-icon-128.png", "author": "Lucas Ononiwu", "publisher": "lucono", - "version": "0.2.1", + "version": "0.3.0", "preview": true, "license": "MIT", "homepage": "https://github.com/lucono/karma-test-explorer", @@ -48,10 +48,10 @@ }, "dependencies": { "bluebird": "^3.7.2", - "cross-spawn": "^7.0.0", "dotenv": "^8.2.0", "dotenv-expand": "5.1.0", "express": "^4.17.1", + "get-installed-path": "^4.0.8", "globby": "11.0.4", "is-docker": "^2.2.1", "karma": "^6.3.2", @@ -71,8 +71,8 @@ }, "devDependencies": { "@types/bluebird": "^3.5.36", - "@types/cross-spawn": "^6.0.2", "@types/express": "~4.17.13", + "@types/get-installed-path": "^4.0.1", "@types/glob": "^7.1.4", "@types/jest": "^27.0.2", "@types/jest-when": "^2.7.3", @@ -81,7 +81,7 @@ "@types/node": "^14.14.31", "@types/semver": "~6.0.2", "@types/throttle-debounce": "^2.1.0", - "@types/vscode": "^1.60.0", + "@types/vscode": "^1.22.0", "@typescript-eslint/eslint-plugin": "^4.32.0", "@typescript-eslint/parser": "^4.32.0", "esbuild": "^0.13.3", @@ -96,16 +96,27 @@ "prettier-plugin-organize-imports": "^2.3.4", "ts-jest": "^27.0.5", "typescript": "^4.4.3", - "vsce": "^1.100.2" + "vsce": "^1.102.0" }, "engines": { - "vscode": "^1.60.0" + "vscode": "^1.22.0" }, "extensionDependencies": [ "hbenl.vscode-test-explorer" ], "activationEvents": [ - "*" + "onLanguage:javascript", + "onLanguage:typescript", + "onStartupFinished", + "onView:test-explorer", + "onCommand:test-explorer.reload", + "onCommand:test-explorer.rerun", + "onCommand:test-explorer.redebug", + "onCommand:test-explorer.cancel", + "onCommand:test-explorer.run-all", + "onCommand:test-explorer.run-file", + "onCommand:test-explorer.run-test-at-cursor", + "onCommand:test-explorer.debug-test-at-cursor" ], "contributes": { "configuration": { @@ -149,8 +160,14 @@ "Test runs are triggered using the Karma Http interface" ] }, + "karmaTestExplorer.nonHeadlessModeEnabled": { + "description": "Enables non-headless testing so that the browser UI is displayed when running tests. Has no effect when running in a container, or when the default value of the `customLauncher` or `browser` config settings are overridden", + "type": "boolean", + "scope": "resource", + "default": false + }, "karmaTestExplorer.failOnStandardError": { - "description": "Treats any errors written to stderr as a failure. This can sometimes be useful for uncovering testing issues", + "description": "Treats any Karma, Angular, or other testing stderr output as a failure. This can sometimes be useful for uncovering testing issues", "type": "boolean", "scope": "resource", "default": false @@ -274,6 +291,27 @@ "info", "debug" ], + "enumDescriptions": [ + "Disable logging", + "Log only errors", + "Log only errors and warnings", + "Log errors, warnings and info level messages", + "More detailed logging which includes debug level information" + ] + }, + "karmaTestExplorer.karmaReporterLogLevel": { + "description": "Sets the level of logging detail for the Karma Test Explorer reporter which logs additional details to the Karma server log related to the processing of test and browser events in Karma. This can be helpful when troubleshooting issues with how test and browser events are being processed in Karma and exchanged with the Karma Test Explorer. Set this to `disable` in order to not log any additional output from the reporter into the Karma server logs", + "type": "string", + "scope": "resource", + "default": "disable", + "enum": [ + "disable", + "error", + "warn", + "info", + "debug", + "trace" + ], "enumDescriptions": [ "Disable logging", "Log only errors", @@ -330,8 +368,11 @@ "base" ], "default": { - "base": "ChromeHeadless", + "base": "Chrome", "flags": [ + "--headless", + "--disable-gpu", + "--disable-dev-shm-usage", "--remote-debugging-port=9222" ] } diff --git a/src/adapter.ts b/src/adapter.ts index c06d36d..f0b0580 100644 --- a/src/adapter.ts +++ b/src/adapter.ts @@ -1,4 +1,4 @@ -import { resolve } from 'path'; +import { join, relative } from 'path'; import { debounce } from 'throttle-debounce'; import { commands, @@ -9,6 +9,8 @@ import { EventEmitter, FileChangeType, FileSystemWatcher, + RelativePattern, + window, workspace, WorkspaceFolder } from 'vscode'; @@ -30,7 +32,6 @@ import { DEBUG_SESSION_START_TIMEOUT, EXTENSION_CONFIG_PREFIX, EXTENSION_NAME, - EXTENSION_OUTPUT_CHANNEL_NAME, WATCHED_FILE_CHANGE_BATCH_DELAY } from './constants'; import { TestLoadEvent, TestResultEvent, TestRunEvent } from './core/base/test-events'; @@ -50,7 +51,7 @@ import { Disposable } from './util/disposable/disposable'; import { Disposer } from './util/disposable/disposer'; import { DeferredPromise } from './util/future/deferred-promise'; import { Execution } from './util/future/execution'; -import { LogLevel, LogLevelName } from './util/logging/log-level'; +import { LogLevel } from './util/logging/log-level'; import { SimpleLogger } from './util/logging/simple-logger'; import { getCircularReferenceReplacer, normalizePath } from './util/utils'; @@ -68,7 +69,6 @@ export class Adapter implements TestAdapter, Disposable { private readonly testLoadEmitter = new EventEmitter(); private readonly testRunEmitter = new EventEmitter(); private readonly autorunEmitter = new EventEmitter(); - private readonly extensionOutputChannelLog: OutputChannelLog; private config!: ExtensionConfig; private logger!: SimpleLogger; @@ -77,9 +77,10 @@ export class Adapter implements TestAdapter, Disposable { private testManager!: TestManager; private factory!: MainFactory; - constructor(public readonly workspaceFolder: WorkspaceFolder) { - this.extensionOutputChannelLog = new OutputChannelLog(EXTENSION_OUTPUT_CHANNEL_NAME); - + constructor( + public readonly workspaceFolder: WorkspaceFolder, + private readonly extensionOutputChannelLog: OutputChannelLog + ) { this.init(); const debouncedConfigChangeHandler = debounce( @@ -89,7 +90,6 @@ export class Adapter implements TestAdapter, Disposable { ); this.disposables.push( - this.extensionOutputChannelLog, this.testLoadEmitter, this.testRunEmitter, this.autorunEmitter, @@ -112,8 +112,11 @@ export class Adapter implements TestAdapter, Disposable { () => `Using extension configuration: ${JSON.stringify(this.config, getCircularReferenceReplacer(), 2)}` ); - this.logger.debug(() => 'Creating status bar display'); - this.notifications = new Notifications(new SimpleLogger(this.logger, Notifications.name)); + this.logger.debug(() => 'Creating notifications manager'); + this.notifications = new Notifications( + window.createStatusBarItem(), + new SimpleLogger(this.logger, Notifications.name) + ); this.initDisposables.push(this.notifications); this.logger.debug(() => 'Creating main factory'); @@ -343,7 +346,11 @@ export class Adapter implements TestAdapter, Disposable { } else if (isForcedRefresh) { await this.testManager.restart(); } - await this.specLocator?.ready(); + + const testFileLoadCompletion = this.specLocator?.ready(); + this.notifications.notifyStatus(StatusType.Busy, 'Loading test files...', testFileLoadCompletion); + await testFileLoadCompletion; + discoveredTests = await this.testManager.discoverTests(); testLoadFinishedEvent.suite = discoveredTests; @@ -411,7 +418,7 @@ export class Adapter implements TestAdapter, Disposable { private createConfig(): ExtensionConfig { const config: ConfigStore = workspace.getConfiguration(EXTENSION_CONFIG_PREFIX, this.workspaceFolder.uri); - const logLevel = LogLevel[config.get(ConfigSetting.LogLevel)!.toUpperCase() as LogLevelName]; + const logLevel = config.get(ConfigSetting.LogLevel); const configLogger = new SimpleLogger(this.extensionOutputChannelLog, ExtensionConfig.name, logLevel); return new ExtensionConfig(config, this.workspaceFolder.uri.path, configLogger); } @@ -427,8 +434,12 @@ export class Adapter implements TestAdapter, Disposable { reloadTriggerFiles.push(this.config.envFile); } + const reloadTriggerFilesRelativePaths = reloadTriggerFiles.map(triggerFile => + normalizePath(relative(this.config.projectRootPath, triggerFile)) + ); + const reloadTriggerFilesWatchers = this.registerFileHandler( - reloadTriggerFiles, + reloadTriggerFilesRelativePaths, debounce(WATCHED_FILE_CHANGE_BATCH_DELAY, filePath => { this.logger.info(() => `Requesting adapter reset - monitored file changed: ${filePath}`); this.reset(); @@ -451,7 +462,7 @@ export class Adapter implements TestAdapter, Disposable { : this.specLocator.refreshFiles([changedTestFile])); } else { const changedTestIds: string[] = Array.from(this.loadedTestsById.values()) - .filter(loadedTest => loadedTest.file === changedTestFile) + .filter(loadedTest => loadedTest.file === changedTestFile && loadedTest.type === TestType.Test) .map(changedTest => changedTest.id); if (changedTestIds.length > 0) { @@ -469,19 +480,26 @@ export class Adapter implements TestAdapter, Disposable { handler: (filePath: string, changeType: FileChangeType) => void ): FileSystemWatcher[] { const fileWatchers: FileSystemWatcher[] = []; + const workspaceRootPath = normalizePath(this.workspaceFolder.uri.fsPath); + const relativeProjectRootPath = relative(workspaceRootPath, this.config.projectRootPath); + const isProjectRootSameAsWorkspace = this.config.projectRootPath === workspaceRootPath; this.logger.debug(() => `Registering file handler for files: ${JSON.stringify(filePatterns, null, 2)}`); for (const fileOrPattern of filePatterns) { - const absoluteFileOrPattern = normalizePath(resolve(this.config.projectRootPath, fileOrPattern)); - const fileWatcher = workspace.createFileSystemWatcher(absoluteFileOrPattern); - fileWatchers.push(fileWatcher); + const relativeFileOrPattern = isProjectRootSameAsWorkspace + ? fileOrPattern + : normalizePath(join(relativeProjectRootPath, fileOrPattern)); + + const absoluteFileOrPattern = new RelativePattern(this.workspaceFolder, relativeFileOrPattern); this.logger.debug( () => `Creating file watcher for file or pattern '${fileOrPattern}' ` + - `using absolute file or pattern: ${absoluteFileOrPattern}` + `using base path: ${absoluteFileOrPattern.base}` ); + const fileWatcher = workspace.createFileSystemWatcher(absoluteFileOrPattern); + fileWatchers.push(fileWatcher); this.disposables.push( fileWatcher.onDidChange(fileUri => handler(normalizePath(fileUri.fsPath), FileChangeType.Changed)), diff --git a/src/constants.ts b/src/constants.ts index b4bedd4..6ea042b 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -6,7 +6,8 @@ export const EXTENSION_CONFIG_PREFIX = 'karmaTestExplorer'; export const EXTENSION_OUTPUT_CHANNEL_NAME = EXTENSION_NAME; export const DEFAULT_LOG_LEVEL = LogLevel.DEBUG; export const DEBUG_SESSION_START_TIMEOUT = 1000 * 15; -export const STATUS_BAR_MESASGE_MAX_DURATION = 1000 * 60 * 5; +export const STATUS_BAR_MESASGE_MIN_DURATION = 1000 * 60; +export const STATUS_BAR_MESASGE_MAX_DURATION = 1000 * 60 * 15; export const CONFIG_FILE_CHANGE_BATCH_DELAY = 1000 * 3; export const WATCHED_FILE_CHANGE_BATCH_DELAY = 2500; @@ -14,6 +15,7 @@ export const WATCHED_FILE_CHANGE_BATCH_DELAY = 2500; export const KARMA_SERVER_OUTPUT_CHANNEL_NAME = 'Karma Server'; export const KARMA_CUSTOM_LAUNCHER_BROWSER_NAME = 'KarmaTestExplorer_CustomLauncher'; export const KARMA_BROWSER_CONTAINER_NO_SANDBOX_FLAG = '--no-sandbox'; +export const KARMA_BROWSER_CONTAINER_HEADLESS_FLAGS = ['--headless', '--disable-gpu', '--disable-dev-shm-usage']; export const KARMA_TEST_RUN_ID_FLAG = '--testRunId'; export const KARMA_SOCKET_PING_INTERVAL = 1000 * 60 * 60 * 24; export const KARMA_SOCKET_PING_TIMEOUT = 1000 * 60 * 60 * 24; @@ -21,6 +23,7 @@ export const KARMA_READY_DEFAULT_TIMEOUT = 1000 * 60 * 15; export const KARMA_TEST_EVENT_INTERVAL_TIMEOUT = 1000 * 60; // Others +export const DEFAULT_KARMA_AND_ANGULAR_CONFIG_GLOBS = ['**/karma.conf.*', '**/angular.json', '**/.angular-cli.json']; export const ALWAYS_EXCLUDED_TEST_FILE_GLOBS = ['**/node_modules/**/*']; export const CHROME_BROWSER_DEBUGGING_PORT_FLAG = '--remote-debugging-port'; export const CHROME_DEFAULT_DEBUGGING_PORT = 9222; diff --git a/src/core/config/config-setting.ts b/src/core/config/config-setting.ts index 6e1221f..04e8f88 100644 --- a/src/core/config/config-setting.ts +++ b/src/core/config/config-setting.ts @@ -8,6 +8,7 @@ export enum ConfigSetting { TestTriggerMethod = 'testTriggerMethod', Browser = 'browser', CustomLauncher = 'customLauncher', + NonHeadlessModeEnabled = 'nonHeadlessModeEnabled', TestsBasePath = 'testsBasePath', TestFiles = 'testFiles', ExcludeFiles = 'excludeFiles', @@ -20,6 +21,7 @@ export enum ConfigSetting { DebuggerConfigName = 'debuggerConfigName', LogLevel = 'logLevel', KarmaLogLevel = 'karmaLogLevel', + KarmaReporterLogLevel = 'karmaReporterLogLevel', Env = 'env', EnvFile = 'envFile', AutoWatchEnabled = 'autoWatchEnabled', diff --git a/src/core/config/extension-config.ts b/src/core/config/extension-config.ts index 891082f..69d2434 100644 --- a/src/core/config/extension-config.ts +++ b/src/core/config/extension-config.ts @@ -9,12 +9,13 @@ import { ALWAYS_EXCLUDED_TEST_FILE_GLOBS, CHROME_BROWSER_DEBUGGING_PORT_FLAG, CHROME_DEFAULT_DEBUGGING_PORT, + KARMA_BROWSER_CONTAINER_HEADLESS_FLAGS, KARMA_BROWSER_CONTAINER_NO_SANDBOX_FLAG } from '../../constants'; -import { KarmaLogLevel } from '../../frameworks/karma/karma-logger'; +import { KarmaLogLevel } from '../../frameworks/karma/karma-log-level'; import { Disposable } from '../../util/disposable/disposable'; import { Disposer } from '../../util/disposable/disposer'; -import { LogLevel, LogLevelName } from '../../util/logging/log-level'; +import { LogLevel } from '../../util/logging/log-level'; import { Logger } from '../../util/logging/logger'; import { asNonBlankStringOrUndefined, normalizePath, toSingleUniqueArray } from '../../util/utils'; import { TestFrameworkName } from '../base/test-framework-name'; @@ -29,8 +30,8 @@ export enum ContainerMode { } export enum TestTriggerMethod { - Http = 'HTTP', - Cli = 'CLI' + Http = 'http', + Cli = 'cli' } export class ExtensionConfig implements Disposable { @@ -46,9 +47,10 @@ export class ExtensionConfig implements Disposable { public readonly envFile?: string; public readonly environment: Readonly>; public readonly excludeFiles: readonly string[]; - public readonly logLevel?: LogLevel; public readonly flattenSingleChildFolders: boolean; + public readonly logLevel: LogLevel; public readonly karmaLogLevel: KarmaLogLevel; + public readonly karmaReporterLogLevel: LogLevel; public readonly karmaPort: number; public readonly defaultSocketConnectionPort: number; public readonly defaultDebugPort?: number; @@ -72,12 +74,13 @@ export class ExtensionConfig implements Disposable { this.karmaPort = config.get(ConfigSetting.KarmaPort)!; this.karmaProcessCommand = asNonBlankStringOrUndefined(config.get(ConfigSetting.KarmaProcessCommand)); this.angularProcessCommand = asNonBlankStringOrUndefined(config.get(ConfigSetting.AngularProcessCommand)); - this.testTriggerMethod = config.get(ConfigSetting.TestTriggerMethod)!.toUpperCase() as TestTriggerMethod; + this.testTriggerMethod = config.get(ConfigSetting.TestTriggerMethod); this.failOnStandardError = !!config.get(ConfigSetting.FailOnStandardError); this.testsBasePath = normalizePath(resolve(this.projectRootPath, config.get(ConfigSetting.TestsBasePath)!)); this.defaultSocketConnectionPort = config.get(ConfigSetting.DefaultSocketConnectionPort)!; - this.logLevel = LogLevel[config.get(ConfigSetting.LogLevel)!.toUpperCase() as LogLevelName]; - this.karmaLogLevel = config.get(ConfigSetting.KarmaLogLevel)!.toUpperCase() as KarmaLogLevel; + this.logLevel = config.get(ConfigSetting.LogLevel); + this.karmaLogLevel = config.get(ConfigSetting.KarmaLogLevel); + this.karmaReporterLogLevel = config.get(ConfigSetting.KarmaReporterLogLevel); this.autoWatchEnabled = !!config.get(ConfigSetting.AutoWatchEnabled); this.autoWatchBatchDelay = config.get(ConfigSetting.AutoWatchBatchDelay); this.karmaReadyTimeout = config.get(ConfigSetting.KarmaReadyTimeout)!; @@ -151,6 +154,7 @@ export class ExtensionConfig implements Disposable { private getCustomLauncher(config: ConfigStore): CustomLauncher { const configuredLauncher: CustomLauncher = config.get(ConfigSetting.CustomLauncher); const configuredContainerMode: ContainerMode = config.get(ConfigSetting.ContainerMode); + const isNonHeadlessMode = !!config.get(ConfigSetting.NonHeadlessModeEnabled); const isContainerMode = configuredContainerMode === ContainerMode.Enabled @@ -159,15 +163,19 @@ export class ExtensionConfig implements Disposable { ? false : isDocker(); - if (!isContainerMode || (configuredLauncher.base ?? '').toLowerCase().indexOf('chrome') === -1) { + if ((configuredLauncher.base ?? '').toLowerCase().indexOf('chrome') === -1) { return configuredLauncher; } let launcherFlags = (configuredLauncher.flags ??= []); - launcherFlags = launcherFlags.includes(KARMA_BROWSER_CONTAINER_NO_SANDBOX_FLAG) - ? launcherFlags - : [...launcherFlags, KARMA_BROWSER_CONTAINER_NO_SANDBOX_FLAG]; + if (isContainerMode && !launcherFlags.includes(KARMA_BROWSER_CONTAINER_NO_SANDBOX_FLAG)) { + launcherFlags = [...launcherFlags, KARMA_BROWSER_CONTAINER_NO_SANDBOX_FLAG]; + } + + if (!isContainerMode && configuredLauncher.base === 'Chrome' && isNonHeadlessMode) { + launcherFlags = launcherFlags.filter(flag => !KARMA_BROWSER_CONTAINER_HEADLESS_FLAGS.includes(flag)); + } const customLauncher: CustomLauncher = { ...configuredLauncher, flags: launcherFlags }; return customLauncher; diff --git a/src/core/default-test-manager.ts b/src/core/default-test-manager.ts index 6004927..6cb51b9 100644 --- a/src/core/default-test-manager.ts +++ b/src/core/default-test-manager.ts @@ -246,6 +246,7 @@ export class DefaultTestManager implements TestManager { await this.restart(); } this.logger.info(() => 'Discovering tests'); + this.notifications.notifyStatus( StatusType.Busy, 'Discovering tests...', diff --git a/src/core/main-factory.ts b/src/core/main-factory.ts index a59b234..5695afc 100644 --- a/src/core/main-factory.ts +++ b/src/core/main-factory.ts @@ -7,6 +7,7 @@ import { AngularProject } from '../frameworks/angular/angular-project'; import { getDefaultAngularProject } from '../frameworks/angular/angular-util'; import { JasmineTestFramework } from '../frameworks/jasmine/jasmine-test-framework'; import { KarmaFactory, KarmaFactoryConfig } from '../frameworks/karma/karma-factory'; +import { KarmaLogLevel } from '../frameworks/karma/karma-log-level'; import { KarmaAutoWatchTestEventProcessor } from '../frameworks/karma/runner/karma-auto-watch-test-event-processor'; import { KarmaTestEventListener } from '../frameworks/karma/runner/karma-test-event-listener'; import { KarmaTestEventProcessor } from '../frameworks/karma/runner/karma-test-event-processor'; @@ -18,7 +19,6 @@ import { Disposable } from '../util/disposable/disposable'; import { Disposer } from '../util/disposable/disposer'; import { FileHandler } from '../util/file-handler'; import { LogAppender } from '../util/logging/log-appender'; -import { LogLevel } from '../util/logging/log-level'; import { SimpleLogger } from '../util/logging/simple-logger'; import { PortAcquisitionManager } from '../util/port-acquisition-manager'; import { CommandLineProcessLog } from '../util/process/command-line-process-log'; @@ -30,7 +30,6 @@ import { TestFramework } from './base/test-framework'; import { TestFrameworkName } from './base/test-framework-name'; import { TestResolver } from './base/test-resolver'; import { CascadingTestFactory } from './cascading-test-factory'; -import { ConfigSetting } from './config/config-setting'; import { ExtensionConfig } from './config/extension-config'; import { DefaultTestFileParser } from './default-test-file-parser'; import { DefaultTestManager } from './default-test-manager'; @@ -56,7 +55,7 @@ export class MainFactory { this.disposables.push(logger); this.angularProject = getDefaultAngularProject(this.config.projectRootPath, this.config.defaultAngularProjectName); - this.logger.info(() => `Project detected as ${this.angularProject ? 'Angular' : 'non-Angular'} project`); + this.logger.info(() => `Project detected as ${this.angularProject ? 'Angular' : 'plain Karma'} project`); const fileHandler = new FileHandler(this.createLogger(FileHandler.name)); const karmaConfigPath = this.angularProject?.karmaConfigPath ?? this.config.userKarmaConfFilePath; @@ -68,7 +67,7 @@ export class MainFactory { this.disposables.push(this.specLocator); this.testServerLog = new OutputChannelLog(KARMA_SERVER_OUTPUT_CHANNEL_NAME, { - enabled: config.karmaLogLevel !== LogLevel[LogLevel.DISABLE] + enabled: config.karmaLogLevel !== KarmaLogLevel.DISABLE }); this.disposables.push(this.testServerLog); } @@ -85,11 +84,7 @@ export class MainFactory { const watchModeEnabled = watchModeRequested && watchModeSupported; if (watchModeRequested && !watchModeSupported) { - this.logger.warn( - () => - `Auto-watch setting '${ConfigSetting.AutoWatchEnabled}' is enabled but not supported ` + - `for the current test framework '${this.testFramework.name}'` - ); + this.logger.info(() => `Auto-watch is unavailable for the current test framework: ${this.testFramework.name}`); } const testSuiteOrganizer = new TestSuiteOrganizer(this.createLogger(TestSuiteOrganizer.name)); @@ -201,6 +196,7 @@ export class MainFactory { autoWatchEnabled: watchModeEnabled, autoWatchBatchDelay: this.config.autoWatchBatchDelay, karmaLogLevel: this.config.karmaLogLevel, + karmaReporterLogLevel: this.config.karmaReporterLogLevel, customLauncher: this.config.customLauncher, environment: this.config.environment, browser: this.config.browser, @@ -228,6 +224,7 @@ export class MainFactory { autoWatchEnabled: watchModeEnabled, autoWatchBatchDelay: this.config.autoWatchBatchDelay, karmaLogLevel: this.config.karmaLogLevel, + karmaReporterLogLevel: this.config.karmaReporterLogLevel, customLauncher: this.config.customLauncher, environment: this.config.environment, browser: this.config.browser, @@ -268,6 +265,7 @@ export class MainFactory { specToTestSuiteMapper, testSuiteOrganizer, suiteTestResultProcessor, + this.specLocator, this.config.testGrouping, this.config.projectRootPath, this.config.testsBasePath, @@ -283,6 +281,7 @@ export class MainFactory { specToTestSuiteMapper, testSuiteOrganizer, suiteTestResultProcessor, + this.specLocator, this.config.testGrouping, this.config.projectRootPath, this.config.testsBasePath, @@ -304,9 +303,9 @@ export class MainFactory { return new KarmaTestEventListener( testRunEventProcessor, watchModeTestEventProcessor, - this.config.karmaReadyTimeout, this.notifications, - this.createLogger(KarmaTestEventListener.name) + this.createLogger(KarmaTestEventListener.name), + { karmaReadyTimeout: this.config.karmaReadyTimeout } ); } diff --git a/src/core/spec-locator.ts b/src/core/spec-locator.ts index e9f0c8d..254d4ab 100644 --- a/src/core/spec-locator.ts +++ b/src/core/spec-locator.ts @@ -1,6 +1,6 @@ import globby from 'globby'; import { isMatch } from 'micromatch'; -import { join, resolve } from 'path'; +import { join, relative, resolve } from 'path'; import { Disposable } from '../util/disposable/disposable'; import { Disposer } from '../util/disposable/disposer'; import { FileHandler } from '../util/file-handler'; @@ -26,7 +26,6 @@ export interface SpecLocatorOptions extends globby.GlobbyOptions { } export class SpecLocator implements Disposable { - private readonly fileGlobs: string[]; private readonly fileInfoMap: Map = new Map(); private readonly specFilesBySuite: Map = new Map(); private readonly specLocatorOptions: SpecLocatorOptions; @@ -35,13 +34,12 @@ export class SpecLocator implements Disposable { private readonly disposables: Disposable[] = []; public constructor( - fileGlobs: string[], + private readonly fileGlobs: string[], private readonly testFileParser: TestFileParser, private readonly fileHandler: FileHandler, private readonly logger: Logger, specLocatorOptions: SpecLocatorOptions = {} ) { - this.fileGlobs = fileGlobs.map(glob => normalizePath(glob)); this.disposables.push(logger, fileHandler); this.cwd = normalizePath(specLocatorOptions.cwd ?? process.cwd()); this.specLocatorOptions = { ...specLocatorOptions, cwd: this.cwd }; @@ -164,33 +162,39 @@ export class SpecLocator implements Disposable { this.addSuiteFileToCache(fileTopSuite, fileAbsolutePath); } - public getSpecLocation(specSuite: string[], specDescription?: string): SpecLocation[] { + public getSpecLocations( + specSuite: string[], + specDescription?: string, + withRelativePaths: boolean = false + ): SpecLocation[] { if (specSuite.length === 0) { return []; } const specFiles = this.getSuiteFilesFromCache(specSuite); + let specLocations: SpecLocation[] = []; if (specFiles) { - const specLocations: SpecLocation[] = specFiles + specLocations = specFiles .map((specFile: string): SpecLocation | undefined => { const specLine = this.getSpecLineNumber(this.fileInfoMap.get(specFile), specSuite, specDescription); return specLine ? { file: specFile, line: specLine } : undefined; }) .filter(specLocation => specLocation !== undefined) as SpecLocation[]; + } else { + for (const specFile of this.fileInfoMap.keys()) { + const specLineNumber = this.getSpecLineNumber(this.fileInfoMap.get(specFile), specSuite, specDescription); - return specLocations; + if (specLineNumber !== undefined) { + this.addSuiteFileToCache(specSuite, specFile); + specLocations.push({ file: specFile, line: specLineNumber }); + } + } } - const specLocations: SpecLocation[] = []; - - for (const specFile of this.fileInfoMap.keys()) { - const specLineNumber = this.getSpecLineNumber(this.fileInfoMap.get(specFile), specSuite, specDescription); - - if (specLineNumber !== undefined) { - this.addSuiteFileToCache(specSuite, specFile); - specLocations.push({ file: specFile, line: specLineNumber }); - } + if (withRelativePaths) { + specLocations.forEach(specLocation => (specLocation.file = normalizePath(relative(this.cwd, specLocation.file)))); } + return specLocations; } diff --git a/src/core/test-suite-organizer.ts b/src/core/test-suite-organizer.ts index 939a1b0..3b67707 100644 --- a/src/core/test-suite-organizer.ts +++ b/src/core/test-suite-organizer.ts @@ -1,4 +1,4 @@ -import { basename, dirname, isAbsolute, join, normalize, relative, resolve, sep as pathSeparator } from 'path'; +import { basename, dirname, isAbsolute, normalize, posix, relative, resolve, sep as pathSeparator } from 'path'; import { TestInfo, TestSuiteInfo } from 'vscode-test-adapter-api'; import { Disposable } from '../util/disposable/disposable'; import { Disposer } from '../util/disposable/disposer'; @@ -142,7 +142,7 @@ export class TestSuiteOrganizer implements Disposable { const flattenedTestSuite = flattenOptions.flattenSingleChildFolders && singleChild?.suiteType === TestSuiteType.Folder - ? { ...singleChild, label: join(suite.label, singleChild.label) } + ? { ...singleChild, label: posix.join(suite.label, singleChild.label) } : suite; return flattenedTestSuite; diff --git a/src/core/vscode/notifications.ts b/src/core/vscode/notifications.ts index 5455e5c..7a84934 100644 --- a/src/core/vscode/notifications.ts +++ b/src/core/vscode/notifications.ts @@ -1,5 +1,5 @@ -import { commands, StatusBarItem, window } from 'vscode'; -import { EXTENSION_NAME, STATUS_BAR_MESASGE_MAX_DURATION } from '../../constants'; +import { Command, commands, MarkdownString, window } from 'vscode'; +import { EXTENSION_NAME, STATUS_BAR_MESASGE_MAX_DURATION, STATUS_BAR_MESASGE_MIN_DURATION } from '../../constants'; import { Disposable } from '../../util/disposable/disposable'; import { Disposer } from '../../util/disposable/disposer'; import { DeferredPromise } from '../../util/future/deferred-promise'; @@ -53,14 +53,20 @@ const DEFAULT_NOTIFY_OPTIONS: NotifyOptions = { dismissAction: true }; +interface StatusDisplay extends Disposable { + text: string; + tooltip?: string | MarkdownString; + command: string | Command | undefined; + readonly show: () => void; + readonly hide: () => void; +} + export class Notifications implements Disposable { - private readonly statusBar: StatusBarItem; - private deferredStatus?: DeferredPromise; + private deferredStatusDismissal?: DeferredPromise; private disposables: Disposable[] = []; - public constructor(private readonly logger: Logger) { - this.statusBar = window.createStatusBarItem(); - this.disposables.push(this.statusBar, logger); + public constructor(private readonly statusDisplay: StatusDisplay, private readonly logger: Logger) { + this.disposables.push(statusDisplay, logger); } public notify( @@ -117,10 +123,14 @@ export class Notifications implements Disposable { this.logger.trace(() => `Setting '${statusName}' status with message '${message}' and tooltip: ${tooltip}`); - this.deferredStatus?.reject(); - this.statusBar.hide(); - this.statusBar.text = `$(${statusType}) ${EXTENSION_NAME} - ${message}`; - this.statusBar.tooltip = tooltip; + if (this.deferredStatusDismissal?.promise().isResolved() === false) { + this.logger.trace(() => 'Existing status is yet to dismiss - Will cancel future dismissal'); + this.deferredStatusDismissal.reject(`Displaying new status with message - ${message}`); + } + + this.statusDisplay.hide(); + this.statusDisplay.text = `$(${statusType}) ${EXTENSION_NAME} - ${message}`; + this.statusDisplay.tooltip = tooltip; const clickCommand = 'command' in action.handler @@ -132,25 +142,50 @@ export class Notifications implements Disposable { this.executeAction(clickCommand); }; - this.statusBar.command = { + this.statusDisplay.command = { title: clickCommand.title, command: ExtensionCommands.ExecuteFunction, arguments: [clickHandler] }; - this.statusBar.show(); + this.statusDisplay.show(); - const deferredStatus = new DeferredPromise(); - deferredStatus.autoFulfill(STATUS_BAR_MESASGE_MAX_DURATION); + const deferredStatusDismissal = new DeferredPromise(); + deferredStatusDismissal.autoFulfill(dismiss ? STATUS_BAR_MESASGE_MAX_DURATION : STATUS_BAR_MESASGE_MIN_DURATION); - const statusResolver = deferredStatus.fulfill.bind(deferredStatus); - dismiss?.then(statusResolver, statusResolver); + const fulfillFutureDismissal = () => { + this.logger.trace( + () => + `Dismissing promise has concluded for '${statusName}' ` + + `status with message '${message}' and tooltip: ${tooltip}` + ); + deferredStatusDismissal.fulfill(); + }; + + dismiss?.then(fulfillFutureDismissal, fulfillFutureDismissal); - deferredStatus.promise().then(() => { + const dismissStatus = () => { + if (this.deferredStatusDismissal !== deferredStatusDismissal) { + this.logger.trace( + () => + `Aborting dismiss of '${statusName}' status with message '${message}' - ` + + `Different status already displayed` + ); + return; + } this.logger.trace(() => `Dismissing '${statusName}' status with message '${message}' and tooltip: ${tooltip}`); - this.statusBar.hide(); + this.statusDisplay.hide(); + }; + + deferredStatusDismissal.promise().then(dismissStatus); + + deferredStatusDismissal.promise().catch(reason => { + this.logger.trace( + () => `Cancelled status dismisser for '${statusName}' status with message '${message}' due to reason: ${reason}` + ); }); - this.deferredStatus = deferredStatus; + + this.deferredStatusDismissal = deferredStatusDismissal; } private executeAction(handler: NotificationActionHandler) { diff --git a/src/frameworks/angular/angular-factory.ts b/src/frameworks/angular/angular-factory.ts index a9f9817..05209f3 100644 --- a/src/frameworks/angular/angular-factory.ts +++ b/src/frameworks/angular/angular-factory.ts @@ -21,6 +21,7 @@ export type AngularFactoryConfig = Pick< | 'environment' | 'failOnStandardError' | 'karmaLogLevel' + | 'karmaReporterLogLevel' | 'projectRootPath' >; @@ -53,7 +54,8 @@ export class AngularFactory implements Partial { [KarmaEnvironmentVariable.AutoWatchBatchDelay]: `${this.factoryConfig.autoWatchBatchDelay ?? ''}`, [KarmaEnvironmentVariable.Browser]: this.factoryConfig.browser ?? '', [KarmaEnvironmentVariable.CustomLauncher]: JSON.stringify(this.factoryConfig.customLauncher), - [KarmaEnvironmentVariable.KarmaLogLevel]: `${this.factoryConfig.karmaLogLevel}` + [KarmaEnvironmentVariable.KarmaLogLevel]: `${this.factoryConfig.karmaLogLevel}`, + [KarmaEnvironmentVariable.KarmaReporterLogLevel]: `${this.factoryConfig.karmaReporterLogLevel}` }; const options: AngularTestServerExecutorOptions = { diff --git a/src/frameworks/angular/angular-test-server-executor.ts b/src/frameworks/angular/angular-test-server-executor.ts index 9cb36dd..7015a15 100644 --- a/src/frameworks/angular/angular-test-server-executor.ts +++ b/src/frameworks/angular/angular-test-server-executor.ts @@ -1,6 +1,4 @@ -import { existsSync } from 'fs'; import { join } from 'path'; -import { silent } from 'resolve-global'; import { ServerStopExecutor, TestServerExecutor } from '../../api/test-server-executor'; import { Disposable } from '../../util/disposable/disposable'; import { Disposer } from '../../util/disposable/disposer'; @@ -12,6 +10,7 @@ import { CommandLineProcessHandlerOptions } from '../../util/process/command-line-process-handler'; import { CommandLineProcessLog } from '../../util/process/command-line-process-log'; +import { getPackageInstallPathForProjectRoot } from '../../util/utils'; import { KarmaEnvironmentVariable } from '../karma/karma-environment-variable'; import { AngularProject } from './angular-project'; @@ -62,29 +61,27 @@ export class AngularTestServerExecutor implements TestServerExecutor { failOnStandardError: this.options.failOnStandardError }; - const angularProcessCommand = this.options.angularProcessCommand; - const localAngularPath = join(this.workspaceRootPath, 'node_modules', '@angular', 'cli', 'bin', 'ng'); - const isAngularInstalledLocally = existsSync(localAngularPath); - const isAngularInstalledGlobally = silent('@angular/cli') !== undefined; + const angularInstallPath = getPackageInstallPathForProjectRoot('@angular/cli', this.workspaceRootPath); + const angularBinaryPath = angularInstallPath ? join(angularInstallPath, 'bin', 'ng') : undefined; - let command: string; - let processArguments: string[] = []; - - if (angularProcessCommand) { - command = angularProcessCommand; - } else if (isAngularInstalledLocally) { - command = 'npx'; - processArguments.push('ng'); - } else if (isAngularInstalledGlobally) { - command = 'ng'; - } else { + if (!angularBinaryPath) { throw new Error( - `@angular/cli does not seem to be installed - ` + + `Angular CLI does not seem to be installed - ` + `You may need to run 'npm install' in your project. ` + `Please install it and try again.` ); } + let command: string; + let processArguments: string[] = []; + + if (this.options.angularProcessCommand) { + command = this.options.angularProcessCommand; + } else { + command = process.execPath; + processArguments = [angularBinaryPath]; + } + processArguments = [ ...processArguments, 'test', diff --git a/src/frameworks/karma/config/karma-configurator.ts b/src/frameworks/karma/config/karma-configurator.ts index f23fb4b..16d41ad 100644 --- a/src/frameworks/karma/config/karma-configurator.ts +++ b/src/frameworks/karma/config/karma-configurator.ts @@ -1,9 +1,9 @@ -import { Config as KarmaConfig, ConfigOptions as KarmaConfigOptions, CustomLauncher } from 'karma'; +import { Config as KarmaConfig, ConfigOptions as KarmaConfigOptions, CustomLauncher, InlinePluginDef } from 'karma'; import { dirname, resolve } from 'path'; import { CHROME_BROWSER_DEBUGGING_PORT_FLAG, KARMA_CUSTOM_LAUNCHER_BROWSER_NAME } from '../../../constants'; import { KarmaEnvironmentVariable } from '../karma-environment-variable'; -import { KarmaLogLevel } from '../karma-logger'; -import { instance as customReporterInstance, name as customReporterName } from '../runner/karma-test-explorer-reporter'; +import { KarmaLogLevel } from '../karma-log-level'; +import { KarmaTestExplorerReporter } from '../runner/karma-test-explorer-reporter'; export class KarmaConfigurator { private readonly karmaPort: number; @@ -14,7 +14,7 @@ export class KarmaConfigurator { private readonly karmaLogLevel: KarmaLogLevel; public constructor() { - this.karmaLogLevel = (process.env[KarmaEnvironmentVariable.KarmaLogLevel]! as KarmaLogLevel) ?? 'INFO'; + this.karmaLogLevel = process.env[KarmaEnvironmentVariable.KarmaLogLevel] ?? KarmaLogLevel.INFO; this.autoWatchEnabled = (process.env[KarmaEnvironmentVariable.AutoWatchEnabled] ?? 'false').toLowerCase() === 'true'; @@ -45,37 +45,36 @@ export class KarmaConfigurator { } } - private addCustomLauncherDebugPort(customLaucher: CustomLauncher, debugPort: number | undefined) { - if (!customLaucher || !debugPort) { - return; - } - customLaucher.flags = customLaucher.flags?.map(flag => - flag.startsWith(CHROME_BROWSER_DEBUGGING_PORT_FLAG) ? `${CHROME_BROWSER_DEBUGGING_PORT_FLAG}=${debugPort}` : flag - ); - } - - public setMandatoryOptions(config: KarmaConfig) { + public applyConfigOverrides(config: KarmaConfig) { config.port = this.karmaPort; - config.logLevel = (config as any)[`LOG_${this.karmaLogLevel.toUpperCase()}`] ?? config.LOG_INFO; + config.logLevel = (config as any)[`LOG_${this.karmaLogLevel.toUpperCase()}`]; config.singleRun = false; config.autoWatch = this.autoWatchEnabled; config.autoWatchBatchDelay = this.autoWatchBatchDelay ?? config.autoWatchBatchDelay; config.restartOnFileChange = false; config.browsers = [this.browser]; config.customLaunchers = this.customLauncher ? { [this.browser]: this.customLauncher } : config.customLaunchers; - config.browserNoActivityTimeout = 1_000 * 60 * 60 * 24; - config.browserDisconnectTimeout = 30_000; - config.pingTimeout = 1_000 * 60 * 60 * 24; - config.captureTimeout = 60_000; + config.browserNoActivityTimeout = 1000 * 60 * 60 * 24; + config.browserDisconnectTimeout = Math.max(config.browserDisconnectTimeout || 0, 30_000); + config.pingTimeout = 1000 * 60 * 60 * 24; + config.captureTimeout = Math.max(config.captureTimeout || 0, 60_000); config.browserSocketTimeout = 30_000; - config.processKillTimeout = 2_000; - config.retryLimit = 3; + config.processKillTimeout = 2000; + config.retryLimit = Math.max(config.retryLimit || 0, 3); + (config.client ??= {}).clearContext = false; + } - config.client ??= {}; - config.client.clearContext = true; + public loadOriginalKarmaConfig(config: KarmaConfig, originalKarmaConfigPath: string) { + let originalKarmaConfigModule = require(originalKarmaConfigPath); // eslint-disable-line @typescript-eslint/no-var-requires + + // https://github.com/karma-runner/karma/blob/v1.7.0/lib/config.js#L364 + if (typeof originalKarmaConfigModule === 'object' && typeof originalKarmaConfigModule.default !== 'undefined') { + originalKarmaConfigModule = originalKarmaConfigModule.default; + } + originalKarmaConfigModule(config); } - public dontLoadOriginalConfigurationFileIntoBrowser(config: KarmaConfig, originalConfigPath: string) { + public addOriginalKarmaConfigToExcludes(config: KarmaConfig, originalConfigPath: string) { (config.exclude ??= []).push(originalConfigPath); } @@ -89,57 +88,34 @@ export class KarmaConfigurator { } } - public disableSingleRunPermanently(config: KarmaConfig) { - const prevSet = config.set; - if (typeof prevSet === 'function') { - config.set = (newConfig: KarmaConfigOptions) => { - if (newConfig != null) { - if (newConfig.singleRun === true) { - newConfig.singleRun = false; - } - prevSet(newConfig); - } - }; - } - } + public disableSingleRun(config: KarmaConfig) { + const originalConfigSet = config.set; - public cleanUpReporters(config: KarmaConfig) { - const filteredReporters = this.removeElementsFromArrayWithoutModifyingIt(config.reporters, ['dots', 'kjhtml']); - config.reporters = filteredReporters; - } - - public loadOriginalUserConfiguration(config: KarmaConfig, originalConfigPath: string) { - let originalConfigModule = require(originalConfigPath); // eslint-disable-line @typescript-eslint/no-var-requires - // https://github.com/karma-runner/karma/blob/v1.7.0/lib/config.js#L364 - if (typeof originalConfigModule === 'object' && typeof originalConfigModule.default !== 'undefined') { - originalConfigModule = originalConfigModule.default; + if (typeof originalConfigSet !== 'function') { + return; } - - originalConfigModule(config); + config.set = (newConfig?: KarmaConfigOptions) => { + if (newConfig) { + newConfig.singleRun = newConfig.singleRun === true ? false : newConfig.singleRun; + originalConfigSet.apply(config, [newConfig]); + } + }; } - public configureTestExplorerCustomReporter(config: KarmaConfig) { - this.addPlugin(config, { [`reporter:${customReporterName}`]: ['type', customReporterInstance] }); - (config.reporters ??= []).push(customReporterName); - } + public addReporter(config: KarmaConfig) { + const reporterName = KarmaTestExplorerReporter.name; + const karmaPlugin: InlinePluginDef = { [`reporter:${reporterName}`]: ['type', KarmaTestExplorerReporter] }; - private addPlugin(karmaConfig: KarmaConfigOptions, karmaPlugin: any) { - (karmaConfig.plugins ??= ['karma-*']).push(karmaPlugin); + (config.plugins ??= ['karma-*']).push(karmaPlugin); + (config.reporters ??= []).splice(0, config.reporters.length, reporterName); } - private removeElementsFromArrayWithoutModifyingIt(elements?: any[], elementsToRemove?: any[] | any) { - if (elements === undefined) { - return []; - } - - if (Array.isArray(elementsToRemove)) { - return elements.filter(element => - typeof element === 'object' - ? !elementsToRemove.some(x => Object.keys(element)[0] in x) - : elementsToRemove.indexOf(element) < 0 - ); - } else { - return elements.filter(element => element !== elementsToRemove); + private addCustomLauncherDebugPort(customLaucher: CustomLauncher, debugPort: number | undefined) { + if (!customLaucher || !debugPort) { + return; } + customLaucher.flags = customLaucher.flags?.map(flag => + flag.startsWith(CHROME_BROWSER_DEBUGGING_PORT_FLAG) ? `${CHROME_BROWSER_DEBUGGING_PORT_FLAG}=${debugPort}` : flag + ); } } diff --git a/src/frameworks/karma/config/karma.conf.ts b/src/frameworks/karma/config/karma.conf.ts index d22d784..c96e7ef 100644 --- a/src/frameworks/karma/config/karma.conf.ts +++ b/src/frameworks/karma/config/karma.conf.ts @@ -6,11 +6,10 @@ const originalConfigPath = process.env[KarmaEnvironmentVariable.UserKarmaConfigP const karmaConfigurator = new KarmaConfigurator(); module.exports = (config: KarmaConfig) => { - karmaConfigurator.loadOriginalUserConfiguration(config, originalConfigPath); - karmaConfigurator.setMandatoryOptions(config); - karmaConfigurator.cleanUpReporters(config); - karmaConfigurator.dontLoadOriginalConfigurationFileIntoBrowser(config, originalConfigPath); - karmaConfigurator.configureTestExplorerCustomReporter(config); + karmaConfigurator.loadOriginalKarmaConfig(config, originalConfigPath); + karmaConfigurator.applyConfigOverrides(config); + karmaConfigurator.addOriginalKarmaConfigToExcludes(config, originalConfigPath); + karmaConfigurator.addReporter(config); karmaConfigurator.setBasePath(config, originalConfigPath); - karmaConfigurator.disableSingleRunPermanently(config); + karmaConfigurator.disableSingleRun(config); }; diff --git a/src/frameworks/karma/karma-environment-variable.ts b/src/frameworks/karma/karma-environment-variable.ts index 992abf9..66bf690 100644 --- a/src/frameworks/karma/karma-environment-variable.ts +++ b/src/frameworks/karma/karma-environment-variable.ts @@ -7,5 +7,6 @@ export enum KarmaEnvironmentVariable { AutoWatchBatchDelay = 'KarmaTestExplorer_autoWatchBatchDelay', Browser = 'KarmaTestExplorer_browser', CustomLauncher = 'KarmaTestExplorer_customLauncher', - KarmaLogLevel = 'KarmaTestExplorer_karmaLogLevel' + KarmaLogLevel = 'KarmaTestExplorer_karmaLogLevel', + KarmaReporterLogLevel = 'KarmaTestExplorer_karmaReporterLogLevel' } diff --git a/src/frameworks/karma/karma-factory.ts b/src/frameworks/karma/karma-factory.ts index fc6a6c9..b3c2855 100644 --- a/src/frameworks/karma/karma-factory.ts +++ b/src/frameworks/karma/karma-factory.ts @@ -34,6 +34,7 @@ export type KarmaFactoryConfig = Pick< | 'environment' | 'failOnStandardError' | 'karmaLogLevel' + | 'karmaReporterLogLevel' | 'karmaProcessCommand' | 'projectRootPath' | 'testTriggerMethod' @@ -129,7 +130,8 @@ export class KarmaFactory implements TestFactory, Disposable { [KarmaEnvironmentVariable.AutoWatchBatchDelay]: `${this.factoryConfig.autoWatchBatchDelay ?? ''}`, [KarmaEnvironmentVariable.Browser]: this.factoryConfig.browser ?? '', [KarmaEnvironmentVariable.CustomLauncher]: JSON.stringify(this.factoryConfig.customLauncher), - [KarmaEnvironmentVariable.KarmaLogLevel]: `${this.factoryConfig.karmaLogLevel}` + [KarmaEnvironmentVariable.KarmaLogLevel]: `${this.factoryConfig.karmaLogLevel}`, + [KarmaEnvironmentVariable.KarmaReporterLogLevel]: `${this.factoryConfig.karmaReporterLogLevel}` }; const options: KarmaCommandLineTestServerExecutorOptions = { diff --git a/src/frameworks/karma/karma-log-level.ts b/src/frameworks/karma/karma-log-level.ts new file mode 100644 index 0000000..fa238f6 --- /dev/null +++ b/src/frameworks/karma/karma-log-level.ts @@ -0,0 +1,7 @@ +export enum KarmaLogLevel { + DISABLE = 'disable', + ERROR = 'error', + WARN = 'warn', + INFO = 'info', + DEBUG = 'debug' +} diff --git a/src/frameworks/karma/karma-logger.ts b/src/frameworks/karma/karma-logger.ts deleted file mode 100644 index fa7e5e5..0000000 --- a/src/frameworks/karma/karma-logger.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { LogLevelName } from '../../util/logging/log-level'; -import { Logger } from '../../util/logging/logger'; - -export type KarmaLogger = Omit; - -export type KarmaLogLevel = Exclude; diff --git a/src/frameworks/karma/runner/karma-command-line-test-run-executor.ts b/src/frameworks/karma/runner/karma-command-line-test-run-executor.ts index eb68517..2368fbd 100644 --- a/src/frameworks/karma/runner/karma-command-line-test-run-executor.ts +++ b/src/frameworks/karma/runner/karma-command-line-test-run-executor.ts @@ -1,6 +1,4 @@ -import { existsSync } from 'fs'; import { join } from 'path'; -import { silent } from 'resolve-global'; import { TestRunExecutor } from '../../../api/test-run-executor'; import { Disposable } from '../../../util/disposable/disposable'; import { Disposer } from '../../../util/disposable/disposer'; @@ -11,6 +9,7 @@ import { CommandLineProcessHandlerOptions, CommandLineProcessLogOutput } from '../../../util/process/command-line-process-handler'; +import { getPackageInstallPathForProjectRoot } from '../../../util/utils'; export interface KarmaCommandLineTestRunExecutorOptions { environment: Record; @@ -35,26 +34,25 @@ export class KarmaCommandLineTestRunExecutor implements TestRunExecutor { failOnStandardError: this.options.failOnStandardError }; - const localKarmaPath = join(this.projectRootPath, 'node_modules', 'karma', 'bin', 'karma'); - const isKarmaInstalledLocally = existsSync(localKarmaPath); - const isKarmaInstalledGlobally = silent('karma') !== undefined; + const karmaInstallPath = getPackageInstallPathForProjectRoot('karma', this.projectRootPath); + const karmaBinaryPath = karmaInstallPath ? join(karmaInstallPath, 'bin', 'karma') : undefined; + + if (!karmaBinaryPath) { + throw new Error( + `Karma does not seem to be installed - ` + + `You may need to run 'npm install' in your project. ` + + `Please install it and try again.` + ); + } let command: string; let processArguments: string[] = []; if (this.options.karmaProcessCommand) { command = this.options.karmaProcessCommand; - } else if (isKarmaInstalledLocally) { - command = 'npx'; - processArguments = ['karma']; - } else if (isKarmaInstalledGlobally) { - command = 'karma'; } else { - throw new Error( - `Karma does not seem to be installed - ` + - `You may need to run 'npm install' in your project. ` + - `Please install it and try again.` - ); + command = process.execPath; + processArguments = [karmaBinaryPath]; } const escapedClientArgs: string[] = clientArgs.map(arg => this.shellEscape(arg)); diff --git a/src/frameworks/karma/runner/karma-event.ts b/src/frameworks/karma/runner/karma-event.ts index 8731c30..24a6386 100644 --- a/src/frameworks/karma/runner/karma-event.ts +++ b/src/frameworks/karma/runner/karma-event.ts @@ -6,6 +6,7 @@ export interface KarmaEvent { readonly runId?: string; readonly runStatus?: TestRunStatus; readonly runInfo?: Record; + readonly exitCode?: number; readonly port?: number; readonly results?: LightSpecCompleteResponse; readonly browser?: BrowserInfo; diff --git a/src/frameworks/karma/runner/karma-http-test-run-executor.ts b/src/frameworks/karma/runner/karma-http-test-run-executor.ts index 3ac0454..22d8b84 100644 --- a/src/frameworks/karma/runner/karma-http-test-run-executor.ts +++ b/src/frameworks/karma/runner/karma-http-test-run-executor.ts @@ -6,7 +6,7 @@ import { DeferredExecution } from '../../../util/future/deferred-execution'; import { Execution } from '../../../util/future/execution'; import { Logger } from '../../../util/logging/logger'; -const defaultRunOptions = { +const DEFAULT_RUN_OPTIONS = { refresh: true, urlRoot: '/run', hostname: 'localhost', @@ -26,12 +26,12 @@ export class KarmaHttpTestRunExecutor implements TestRunExecutor { const karmaRequestData = { // See: https://github.com/karma-runner/karma/blob/94cf15e8fa4420c8716998873b77f0c4f59b9e94/lib/runner.js#L100-L105 args: clientArgs, - refresh: defaultRunOptions.refresh + refresh: DEFAULT_RUN_OPTIONS.refresh }; const httpRequestOptions: RequestOptions = { - hostname: defaultRunOptions.hostname, - path: defaultRunOptions.urlRoot, + hostname: DEFAULT_RUN_OPTIONS.hostname, + path: DEFAULT_RUN_OPTIONS.urlRoot, port: karmaPort, method: 'POST', headers: { 'Content-Type': 'application/json' } diff --git a/src/frameworks/karma/runner/karma-test-event-listener.ts b/src/frameworks/karma/runner/karma-test-event-listener.ts index 69d6820..6f801c0 100644 --- a/src/frameworks/karma/runner/karma-test-event-listener.ts +++ b/src/frameworks/karma/runner/karma-test-event-listener.ts @@ -41,6 +41,10 @@ interface TestCaptureSession { readonly testRunEnded: (testRunId?: string) => void; } +interface KarmaTestEventListenerOptions { + readonly karmaReadyTimeout?: number; +} + export type TestCapture = Record; export class KarmaTestEventListener implements Disposable { @@ -54,10 +58,11 @@ export class KarmaTestEventListener implements Disposable { public constructor( private readonly testEventProcessor: KarmaTestEventProcessor, private readonly watchModeTestEventProcessor: KarmaAutoWatchTestEventProcessor | undefined, - karmaReadyTimeout: number, private readonly notifications: Notifications, - private readonly logger: SimpleLogger + private readonly logger: SimpleLogger, + listenerOptions: KarmaTestEventListenerOptions = {} ) { + const karmaReadyTimeout = listenerOptions.karmaReadyTimeout ?? 0; this.karmaReadyTimeout = karmaReadyTimeout > 0 ? karmaReadyTimeout : KARMA_READY_DEFAULT_TIMEOUT; this.disposables.push(logger); } @@ -412,7 +417,7 @@ export class KarmaTestEventListener implements Disposable { if (!eventProcessor?.isProcessing()) { this.logger.debug( () => - `Not processing received spec id '${event.results?.id ?? ''}' - ` + + `Not processing received spec id '${event.results?.id || ''}' - ` + `Neither the test run nor watch mode test processors are currently active` ); return; @@ -421,13 +426,18 @@ export class KarmaTestEventListener implements Disposable { const results: LightSpecCompleteResponse = event.results!; const fullName: string = [...results.suite, results.description].join(' '); const testId: string = results.id || `${results.filePath ?? ''}:${fullName}`; - const specResults: SpecCompleteResponse = { ...results, id: testId, fullName }; - const testStatus: TestStatus = specResults.status; + const testStatus: TestStatus = results.status; const browserName = `${event.browser?.name ?? '(Unknwon browser)'}`; + const specResults: SpecCompleteResponse = { + ...results, + id: testId, + fullName + }; + this.logger.debug( () => - `Processing received spec id '${event.results?.id ?? ''}' ` + + `Processing received spec id '${specResults.id || ''}' ` + `with test processor: ${eventProcessor.constructor.name}` ); @@ -465,6 +475,11 @@ export class KarmaTestEventListener implements Disposable { : undefined; if (errorMsg) { + this.logger.warn( + () => + `${errorMsg} (Exit code: ${event.exitCode ?? ''}) - ` + + `${event.error?.split('\n')[0] || ''}` + ); this.processTestErrorEvent(errorMsg); return; } diff --git a/src/frameworks/karma/runner/karma-test-event-processor.ts b/src/frameworks/karma/runner/karma-test-event-processor.ts index 1e89995..df82af0 100644 --- a/src/frameworks/karma/runner/karma-test-event-processor.ts +++ b/src/frameworks/karma/runner/karma-test-event-processor.ts @@ -1,3 +1,4 @@ +import { isAbsolute, posix } from 'path'; import { EventEmitter } from 'vscode'; import { TestDecoration, TestEvent, TestInfo, TestSuiteInfo } from 'vscode-test-adapter-api'; import { TestResultEvent } from '../../../core/base/test-events'; @@ -7,12 +8,14 @@ import { TestResolver } from '../../../core/base/test-resolver'; import { TestResults } from '../../../core/base/test-results'; import { TestState } from '../../../core/base/test-state'; import { TestStatus } from '../../../core/base/test-status'; +import { SpecLocation, SpecLocator } from '../../../core/spec-locator'; import { SuiteAggregateTestResultProcessor } from '../../../core/suite-aggregate-test-result-processor'; import { TestSuiteOrganizationOptions, TestSuiteOrganizer } from '../../../core/test-suite-organizer'; import { Disposable } from '../../../util/disposable/disposable'; import { Disposer } from '../../../util/disposable/disposer'; import { DeferredPromise } from '../../../util/future/deferred-promise'; import { Logger } from '../../../util/logging/logger'; +import { escapeForRegExp } from '../../../util/utils'; import { TestCapture } from './karma-test-event-listener'; import { SpecCompleteResponse } from './spec-complete-response'; import { SpecResponseToTestSuiteInfoMapper } from './spec-response-to-test-suite-info-mapper'; @@ -52,6 +55,7 @@ export class KarmaTestEventProcessor { private readonly specToTestSuiteMapper: SpecResponseToTestSuiteInfoMapper, private readonly testSuiteOrganizer: TestSuiteOrganizer, private readonly suiteTestResultEmitter: SuiteAggregateTestResultProcessor, + private readonly specLocator: SpecLocator, private readonly testGrouping: TestGrouping, private readonly projectRootPath: string, private readonly testsBasePath: string, @@ -123,7 +127,7 @@ export class KarmaTestEventProcessor { this.concludeProcessing(); } - public processTestResultEvent(testResult: SpecCompleteResponse) { + public processTestResultEvent(testResult: Readonly) { this.logger.debug(() => `Request to process test result event having status: ${testResult.status}`); this.logger.trace(() => `Test result event for processing has Id: ${testResult.id}`); @@ -187,7 +191,7 @@ export class KarmaTestEventProcessor { ); } - private emitTestResultEvent(testResult: SpecCompleteResponse) { + private emitTestResultEvent(testResult: Readonly) { const testId = testResult.id; if (!this.currentProcessingInfo?.eventProcessingOptions.emitTestEvents?.includes(testResult.status)) { @@ -196,7 +200,6 @@ export class KarmaTestEventProcessor { `Skipping test result event for test id ${testId} - ` + `Emit events not enabled for test status ${testResult.status}` ); - return; } this.logger.debug(() => `Processing test result event for test id: ${testId}`); @@ -215,28 +218,48 @@ export class KarmaTestEventProcessor { ? 'Skipped' : ''; - let message: string | undefined; - let decorations: TestDecoration[] | undefined; - - if (testResult.failureMessages.length > 0) { - message = this.createErrorMessage(testResult); - decorations = this.createDecorations(testResult) ?? []; - - if (decorations.length === 0 && test?.line !== undefined) { - const { file, line } = test; - const hover = `${testResult.fullName} \n-------- Failure: --------\n${message || 'Failed'}`; - - decorations = [ - { - line, - file, - message: message || 'Failed', - hover: `\`${hover.replace(/`/g, '\\`')}\`` - } - ]; - } + let relativeTestLocation: SpecLocation | undefined = + test?.file && test?.line !== undefined + ? { file: posix.relative(this.projectRootPath, test.file), line: test.line } + : undefined; + + this.logger.debug( + () => + `Relative test location from loaded test: ` + + `${relativeTestLocation ? JSON.stringify(relativeTestLocation, null, 2) : ''}` + ); + + if (!relativeTestLocation) { + const candidateSpecLocations = this.specLocator.getSpecLocations(testResult.suite, testResult.description, true); + relativeTestLocation = candidateSpecLocations.length === 1 ? candidateSpecLocations[0] : relativeTestLocation; + + this.logger.debug( + () => + `Relative test location from ${candidateSpecLocations.length} resulting candidates from lookup: ` + + `${relativeTestLocation ? JSON.stringify(relativeTestLocation, null, 2) : ''}` + ); + } + + if (!relativeTestLocation && testResult.filePath && testResult.line !== undefined) { + relativeTestLocation = { file: posix.relative(this.projectRootPath, testResult.filePath), line: testResult.line }; + + this.logger.debug( + () => + `Relative test location from karma spec response: ` + + `${relativeTestLocation ? JSON.stringify(relativeTestLocation, null, 2) : ''}` + ); } + const testResultForErrorReporting: SpecCompleteResponse = { + ...testResult, + filePath: relativeTestLocation?.file, + line: relativeTestLocation?.line, + failureMessages: testResult.failureMessages.map(message => decodeURIComponent(message)) + }; + + const failureMessage = this.createFailureMessage(testResultForErrorReporting); + const failureDecorations = this.createTestFailureDecorations(testResultForErrorReporting); + if (test) { this.updateTestWithResultData(test, testResult); } @@ -246,8 +269,8 @@ export class KarmaTestEventProcessor { test: test ?? testId, state: testState, tooltip: `${testResult.fullName}`, - message, - decorations + message: failureMessage, + decorations: failureDecorations }; if (this.currentProcessingInfo.eventProcessingOptions.emitTestStats) { @@ -330,7 +353,7 @@ export class KarmaTestEventProcessor { test.label = testResult.description || test.label; test.fullName = testResult.fullName || test.fullName; test.file = testResult.filePath || test.file; - test.line = testResult.line || test.line; + test.line = testResult.line ?? test.line; } private mapTestResultToTestState(testStatus: TestStatus): TestState { @@ -344,17 +367,20 @@ export class KarmaTestEventProcessor { } } - private createErrorMessage(results: SpecCompleteResponse): string { - const failureMessage = results.failureMessages[0]; + private createFailureMessage(testResult: SpecCompleteResponse): string | undefined { + if (testResult.failureMessages.length === 0) { + return; + } + const failureMessage = testResult.failureMessages[0] || 'Failed'; const message = failureMessage.split('\n')[0]; - if (!results.filePath) { + if (!testResult.filePath) { return message; } try { const errorLineAndColumnCollection = failureMessage - .substring(failureMessage.indexOf(results.filePath)) + .substring(failureMessage.indexOf(testResult.filePath)) .split(':'); const lineNumber = parseInt(errorLineAndColumnCollection[1], undefined); const columnNumber = parseInt(errorLineAndColumnCollection[2], undefined); @@ -369,31 +395,73 @@ export class KarmaTestEventProcessor { } } - private createDecorations(results: SpecCompleteResponse): TestDecoration[] | undefined { - if (!results.filePath) { - return undefined; + private createTestFailureDecorations(testResult: SpecCompleteResponse): TestDecoration[] | undefined { + if (testResult.failureMessages.length === 0) { + return; } - - try { - const decorations = results.failureMessages.map((failureMessage: string) => { - const errorLineAndColumnCollection = failureMessage - .substring(failureMessage.indexOf(results.filePath as string)) - .split(':'); - const lineNumber = parseInt(errorLineAndColumnCollection[1], undefined); - return { - line: lineNumber, - message: failureMessage.split('\n')[0] - }; - }); - - if (decorations.some(x => isNaN(x.line))) { - return undefined; + this.logger.debug(() => `Creating detailed test failure decorations for test id: ${testResult.id}`); + + let failureDecorations: TestDecoration[] = []; + const testDescriptionHoverHeader = `'${testResult.fullName.replace(/'/g, "\\'")}'\n---`; + const relativeFilePath = testResult.filePath && !isAbsolute(testResult.filePath) ? testResult.filePath : undefined; + + this.logger.debug(() => `Using relative file path for test id '${testResult.id}': ${relativeFilePath || ''}`); + + if (relativeFilePath) { + try { + const decorations = testResult.failureMessages.map((failureMessage): TestDecoration => { + const errorLineAndColumnCollection = failureMessage + .substring(failureMessage.indexOf(relativeFilePath)) + .split(':'); + + const fileAndLinePattern = new RegExp( + `\\([^)]*${escapeForRegExp(relativeFilePath)}[^:)]*:(\\d+):(\\d+)\\)`, + 'gm' + ); + + const sanitizedFailureMessage = failureMessage.replace(fileAndLinePattern, `(${relativeFilePath}:$1:$2)`); + const lineNumber = parseInt(errorLineAndColumnCollection[1], undefined); + const hoverMessage = `${testDescriptionHoverHeader}\n${sanitizedFailureMessage}`; + + return { + line: lineNumber - 1, + message: sanitizedFailureMessage.split('\n')[0], + hover: hoverMessage + }; + }); + + if (decorations.every(decoration => !isNaN(decoration.line))) { + failureDecorations = decorations; + } else { + this.logger.debug( + () => + `Aborting creation of detailed test failure decorations for test id '${testResult.id}' - ` + + `Could not determine some failure line positions` + ); + this.logger.trace( + () => `Test result with undetermined failure line positions: ${JSON.stringify(testResult, null, 2)}` + ); + } + } catch (error) { + this.logger.debug( + () => `Error while creating detailed test failure decorations for test id '${testResult.id}': ${error}` + ); } + } else { + this.logger.debug( + () => + `Not able to create detailed test failure decoration - ` + + `Could not determine relative file path for test id: ${testResult.id}` + ); + } - return decorations; - } catch (error) { - return undefined; + if (failureDecorations?.length === 0 && testResult.line !== undefined) { + const failureMessage = testResult.failureMessages[0]?.split('\n')[0] || 'Failed'; + const hoverMessage = `${testDescriptionHoverHeader}\n${testResult.failureMessages.join('\n')}`; + + failureDecorations = [{ line: testResult.line, message: failureMessage, hover: hoverMessage }]; } + return failureDecorations; } public async dispose() { diff --git a/src/frameworks/karma/runner/karma-test-explorer-reporter.ts b/src/frameworks/karma/runner/karma-test-explorer-reporter.ts index a4b472f..ce5e865 100644 --- a/src/frameworks/karma/runner/karma-test-explorer-reporter.ts +++ b/src/frameworks/karma/runner/karma-test-explorer-reporter.ts @@ -1,42 +1,39 @@ import { EventEmitter } from 'events'; import { Server as HttpServer } from 'http'; -import { ConfigOptions as KarmaConfigOptions, TestResults as KarmaTestResults } from 'karma'; +import { TestResults as KarmaTestResults } from 'karma'; import { resolve } from 'path'; import { Worker } from 'worker_threads'; import { KARMA_SOCKET_PING_INTERVAL, KARMA_SOCKET_PING_TIMEOUT, KARMA_TEST_RUN_ID_FLAG } from '../../../constants'; import { TestStatus } from '../../../core/base/test-status'; -import { BasicLog } from '../../../util/logging/basic-log'; import { LogLevel } from '../../../util/logging/log-level'; import { Logger } from '../../../util/logging/logger'; import { LoggerAdapter } from '../../../util/logging/logger-adapter'; import { MultiEventHandler } from '../../../util/multi-event-handler'; +import { getCircularReferenceReplacer } from '../../../util/utils'; import { KarmaEnvironmentVariable } from '../karma-environment-variable'; -import { KarmaLogger, KarmaLogLevel } from '../karma-logger'; import { BrowserInfo, KarmaEvent, KarmaEventName } from './karma-event'; import { LightSpecCompleteResponse } from './spec-complete-response'; import { TestResultEmitterWorkerData } from './test-result-emitter-worker-data'; import { TestRunStatus } from './test-run-status'; -function KarmaTestExplorerReporter( +export function KarmaTestExplorerReporter( this: any, baseReporterDecorator: any, - config: KarmaConfigOptions, - logger: any, emitter: EventEmitter, + karmaLogger: any, injector: any ) { baseReporterDecorator(this); - this.config = config; - this.emitter = emitter; - // --- Setup logger --- - const karmaLogLevel: KarmaLogLevel = process.env[KarmaEnvironmentVariable.KarmaLogLevel]! as KarmaLogLevel; - const logLevel: LogLevel = LogLevel[karmaLogLevel]; - const log: BasicLog = logger.create(`reporter:${name}`); - const reporterLogger: Logger = LoggerAdapter.fromBasicLog(log, logLevel); - const karmaLogger: KarmaLogger = reporterLogger; + const logLevel = process.env[KarmaEnvironmentVariable.KarmaReporterLogLevel] as LogLevel; + + const logger: Logger = LoggerAdapter.fromBasicLog( + karmaLogger.create(`reporter:${KarmaTestExplorerReporter.name}`), + logLevel, + { bypassUnderlyingTraceMethod: true } + ); // --- Setup worker to communicate with extension --- @@ -51,11 +48,11 @@ function KarmaTestExplorerReporter( const workerScriptFile = resolve(__dirname, './test-result-emitter-worker.js'); const worker = new Worker(workerScriptFile, { workerData }); - karmaLogger.debug( + logger.debug( () => `Using socket port from '${KarmaEnvironmentVariable.KarmaSocketPort}' env variable: ${socketPort}` ); - karmaLogger.debug( + logger.debug( () => `Using ping timeout of '${KARMA_SOCKET_PING_TIMEOUT}' and ping interval of '${KARMA_SOCKET_PING_INTERVAL}'` ); @@ -68,28 +65,33 @@ function KarmaTestExplorerReporter( // --- Setup karma event listeners --- const karmaEventHandler: MultiEventHandler void> = - new MultiEventHandler(reporterLogger); + new MultiEventHandler(logger); - // eslint-disable-next-line @typescript-eslint/no-unused-vars karmaEventHandler.setDefaultHandler((eventName: string, ...args: any[]) => { - karmaLogger.debug(() => `No specific handler for event: ${eventName}`); + logger.debug(() => `No specific handler for event: ${eventName}`); const isErrorEvent = eventName.toLowerCase().includes('error'); if (isErrorEvent) { - karmaLogger.debug( - () => `No specific handler for received error event '${eventName}' with data: ${JSON.stringify(args, null, 2)}` + logger.trace( + () => + `No specific handler for received error event '${eventName}' with data: ` + + `${JSON.stringify(args, getCircularReferenceReplacer(), 2)}` ); } sendEvent({ name: eventName as KarmaEventName }); }); - // eslint-disable-next-line @typescript-eslint/no-unused-vars karmaEventHandler.setErrorHandler((eventName: string, error: Error, ...args: any[]) => { - karmaLogger.error(() => `Error while handling event '${eventName}': ${error}`); + logger.error(() => `Error while handling event '${eventName}': ${error}`); + logger.trace( + () => + `Event data for errored '${eventName}' event handling: ` + + `${JSON.stringify(args, getCircularReferenceReplacer(), 2)}` + ); }); interceptAllEmitterEvents(emitter, (eventName: string, ...args: any[]) => { - karmaLogger.debug(() => `New Karma event: ${eventName}`); + logger.trace(() => `New Karma event: ${JSON.stringify({ eventName, args }, getCircularReferenceReplacer(), 2)}`); karmaEventHandler.handleEvent(eventName as KarmaEventName, eventName as KarmaEventName, ...args); }); @@ -101,14 +103,14 @@ function KarmaTestExplorerReporter( const clientArgs: string[] = browsers?.emitter?._injector?._providers?.config?.[1]?.client?.args ?? []; let runId: string | undefined; - karmaLogger.debug(() => `Karma event '${name}' has client args: ${JSON.stringify(clientArgs, null, 2)}`); + logger.debug(() => `Karma event '${name}' has client args: ${JSON.stringify(clientArgs, null, 2)}`); if (clientArgs) { const runIdArg = clientArgs.find(clientArg => clientArg.startsWith(KARMA_TEST_RUN_ID_FLAG)); if (runIdArg) { runId = runIdArg.split('=')[1]; - karmaLogger.debug(() => `Karma event '${name}' has runId: ${runId}`); + logger.debug(() => `Karma event '${name}' has runId: ${runId}`); } } @@ -119,8 +121,9 @@ function KarmaTestExplorerReporter( }); }); - // eslint-disable-next-line @typescript-eslint/no-unused-vars karmaEventHandler.setEventHandler(KarmaEventName.BrowserStart, (name: KarmaEventName, browser: any, info: any) => { + logger.trace(() => `Karma event '${name}' has 'info': ${JSON.stringify(info, getCircularReferenceReplacer(), 2)}`); + sendEvent({ name, browser: getBrowserInfo(browser) @@ -155,8 +158,11 @@ function KarmaTestExplorerReporter( karmaEventHandler.setEventHandler( KarmaEventName.BrowserComplete, - // eslint-disable-next-line @typescript-eslint/no-unused-vars (name: KarmaEventName, browser: any, runInfo: any) => { + logger.trace( + () => `Karma event '${name}' has 'runInfo': ${JSON.stringify(runInfo, getCircularReferenceReplacer(), 2)}` + ); + sendEvent({ name, browser: getBrowserInfo(browser) @@ -170,14 +176,14 @@ function KarmaTestExplorerReporter( const clientArgs: string[] = browsers?.emitter?._injector?._providers?.config?.[1]?.client?.args ?? []; let runId: string | undefined; - karmaLogger.debug(() => `Karma event '${name}' has client args: ${JSON.stringify(clientArgs, null, 2)}`); + logger.debug(() => `Karma event '${name}' has client args: ${JSON.stringify(clientArgs, null, 2)}`); if (clientArgs) { const runIdArg = clientArgs.find(clientArg => clientArg.startsWith(KARMA_TEST_RUN_ID_FLAG)); if (runIdArg) { runId = runIdArg.split('=')[1]; - karmaLogger.debug(() => `Karma event '${name}' has runId: ${runId}`); + logger.debug(() => `Karma event '${name}' has runId: ${runId}`); } } @@ -190,8 +196,10 @@ function KarmaTestExplorerReporter( sendEvent({ name, runId, + runStatus, + exitCode: runResult.exitCode, browsers: browsers.map(getBrowserInfo), - runStatus + error: typeof runResult.error === 'string' ? runResult.error : undefined }); } ); @@ -223,6 +231,8 @@ function KarmaTestExplorerReporter( }); } +KarmaTestExplorerReporter.$inject = ['baseReporterDecorator', 'emitter', 'logger', 'injector']; + const interceptAllEmitterEvents = (emitter: EventEmitter, listener: (eventName: string, ...args: any[]) => void) => { const emit = emitter.emit.bind(emitter); @@ -252,8 +262,3 @@ const configureTimeouts = (injector: any) => { } }); }; - -KarmaTestExplorerReporter.$inject = ['baseReporterDecorator', 'config', 'logger', 'emitter', 'injector']; - -export const name = KarmaTestExplorerReporter.name; -export const instance = KarmaTestExplorerReporter; diff --git a/src/frameworks/karma/runner/spec-response-to-test-suite-info-mapper.ts b/src/frameworks/karma/runner/spec-response-to-test-suite-info-mapper.ts index c43f32f..0f1b9e6 100644 --- a/src/frameworks/karma/runner/spec-response-to-test-suite-info-mapper.ts +++ b/src/frameworks/karma/runner/spec-response-to-test-suite-info-mapper.ts @@ -15,7 +15,7 @@ export class SpecResponseToTestSuiteInfoMapper { specs.forEach(rawSpec => { const spec: SpecCompleteResponse = { ...rawSpec, suite: this.filterSuiteNoise(rawSpec.suite) }; - const matchingSpecLocations = this.specLocator.getSpecLocation(spec.suite, spec.description); + const matchingSpecLocations = this.specLocator.getSpecLocations(spec.suite, spec.description); let specFile: string | undefined = spec.filePath; if (matchingSpecLocations.length === 1) { @@ -86,7 +86,7 @@ export class SpecResponseToTestSuiteInfoMapper { } private createSuite(suitePath: string[], suiteFile: string): TestSuiteInfo { - const allMatchingSuiteLocations = this.specLocator.getSpecLocation(suitePath); + const allMatchingSuiteLocations = this.specLocator.getSpecLocations(suitePath); const suiteLocation = allMatchingSuiteLocations.find(loc => loc.file === suiteFile); const suiteName = suitePath[suitePath.length - 1]; const suiteFullName = suitePath.join(' '); @@ -107,7 +107,7 @@ export class SpecResponseToTestSuiteInfoMapper { } private createTest(spec: SpecCompleteResponse, specFile: string): TestInfo { - const allMatchingSpecLocations = this.specLocator.getSpecLocation(spec.suite, spec.description); + const allMatchingSpecLocations = this.specLocator.getSpecLocations(spec.suite, spec.description); const specLocation = allMatchingSpecLocations.find(loc => loc.file === specFile); const runFailureMessage = spec.failureMessages?.join('\n'); diff --git a/src/frameworks/karma/server/karma-command-line-test-server-executor.ts b/src/frameworks/karma/server/karma-command-line-test-server-executor.ts index 3eac103..e4cab8e 100644 --- a/src/frameworks/karma/server/karma-command-line-test-server-executor.ts +++ b/src/frameworks/karma/server/karma-command-line-test-server-executor.ts @@ -1,6 +1,4 @@ -import { existsSync } from 'fs'; import { join } from 'path'; -import { silent } from 'resolve-global'; import { ServerStopExecutor, TestServerExecutor } from '../../../api/test-server-executor'; import { Disposable } from '../../../util/disposable/disposable'; import { Disposer } from '../../../util/disposable/disposer'; @@ -12,6 +10,7 @@ import { CommandLineProcessHandlerOptions } from '../../../util/process/command-line-process-handler'; import { CommandLineProcessLog } from '../../../util/process/command-line-process-log'; +import { getPackageInstallPathForProjectRoot } from '../../../util/utils'; import { KarmaEnvironmentVariable } from '../karma-environment-variable'; export interface KarmaCommandLineTestServerExecutorOptions { @@ -61,26 +60,25 @@ export class KarmaCommandLineTestServerExecutor implements TestServerExecutor { failOnStandardError: this.options.failOnStandardError }; - const localKarmaPath = join(this.projectRootPath, 'node_modules', 'karma', 'bin', 'karma'); - const isKarmaInstalledLocally = existsSync(localKarmaPath); - const isKarmaInstalledGlobally = silent('karma') !== undefined; + const karmaInstallPath = getPackageInstallPathForProjectRoot('karma', this.projectRootPath); + const karmaBinaryPath = karmaInstallPath ? join(karmaInstallPath, 'bin', 'karma') : undefined; + + if (!karmaBinaryPath) { + throw new Error( + `Karma does not seem to be installed - ` + + `You may need to run 'npm install' in your project. ` + + `Please install it and try again.` + ); + } let command: string; let processArguments: string[] = []; if (this.options.karmaProcessCommand) { command = this.options.karmaProcessCommand; - } else if (isKarmaInstalledLocally) { - command = 'npx'; - processArguments = ['karma']; - } else if (isKarmaInstalledGlobally) { - command = 'karma'; } else { - throw new Error( - `Karma does not seem to be installed - ` + - `You may need to run 'npm install' in your project. ` + - `Please install it and try again.` - ); + command = process.execPath; + processArguments = [karmaBinaryPath]; } processArguments = [...processArguments, 'start', this.baseKarmaConfigFile, '--no-single-run']; diff --git a/src/main.ts b/src/main.ts index 194d3ac..a1ad70a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,33 +1,102 @@ -import { ExtensionContext, extensions, window } from 'vscode'; +import globby from 'globby'; +import { ExtensionContext, extensions, workspace, WorkspaceFolder } from 'vscode'; import { testExplorerExtensionId, TestHub } from 'vscode-test-adapter-api'; -import { TestAdapterRegistrar } from 'vscode-test-adapter-util'; import { Adapter } from './adapter'; -import { EXTENSION_OUTPUT_CHANNEL_NAME } from './constants'; -import { Disposable } from './util/disposable/disposable'; +import { + ALWAYS_EXCLUDED_TEST_FILE_GLOBS, + DEFAULT_KARMA_AND_ANGULAR_CONFIG_GLOBS, + EXTENSION_CONFIG_PREFIX, + EXTENSION_OUTPUT_CHANNEL_NAME +} from './constants'; +import { ConfigSetting } from './core/config/config-setting'; +import { OutputChannelLog } from './core/vscode/output-channel-log'; import { Disposer } from './util/disposable/disposer'; +import { LogLevel } from './util/logging/log-level'; +import { Logger } from './util/logging/logger'; +import { SimpleLogger } from './util/logging/simple-logger'; +import { normalizePath } from './util/utils'; -const disposables: Disposable[] = []; +const registeredAdapters = new Map(); -export async function activate(context: ExtensionContext) { +export const activate = async (context: ExtensionContext) => { + const outputChannelLog = new OutputChannelLog(EXTENSION_OUTPUT_CHANNEL_NAME); + const logger: Logger = new SimpleLogger(outputChannelLog, 'Main', LogLevel.INFO); const testExplorerExtension = extensions.getExtension(testExplorerExtensionId); if (!testExplorerExtension) { const errorMsg = 'ERROR: Could not find Test Explorer UI extension'; - window.createOutputChannel(EXTENSION_OUTPUT_CHANNEL_NAME).append(errorMsg); + logger.error(() => errorMsg); throw new Error(errorMsg); } - const testHub = testExplorerExtension.exports; + const workspaceFolders = workspace.workspaceFolders; + + workspaceFolders?.forEach(workspaceFolder => addAdapterForFolder(workspaceFolder, testHub, logger, outputChannelLog)); + + const workspaceFolderChangeSubscription = workspace.onDidChangeWorkspaceFolders(folderChangeEvent => { + folderChangeEvent.added.forEach(addedFolder => addAdapterForFolder(addedFolder, testHub, logger, outputChannelLog)); + folderChangeEvent.removed.forEach(removedFolder => removeAdapterForFolder(removedFolder, testHub, logger)); + }); - context.subscriptions.push( - new TestAdapterRegistrar(testHub, workspaceFolder => { - const testExplorerAdapter = new Adapter(workspaceFolder); - disposables.push(testExplorerAdapter); - return testExplorerAdapter; - }) - ); -} + context.subscriptions.push(workspaceFolderChangeSubscription, outputChannelLog); +}; -export async function deactivate() { +export const deactivate = async () => { + const disposables = Array.from(registeredAdapters.values()); await Disposer.dispose(disposables); -} +}; + +const addAdapterForFolder = ( + workspaceFolder: WorkspaceFolder, + testHub: TestHub, + logger: Logger, + outputLog: OutputChannelLog +): void => { + if (workspaceFolder.uri.scheme !== 'file' || !shouldActivateAdapterForWorkspaceFolder(workspaceFolder, logger)) { + return; + } + logger.info(() => `Activating new adapter for workspace folder: ${normalizePath(workspaceFolder.uri.fsPath)}`); + const adapter = new Adapter(workspaceFolder, outputLog); + registeredAdapters.set(workspaceFolder, adapter); + testHub.registerTestAdapter(adapter); + logger.info(() => `Done activating adapter for workspace folder: ${normalizePath(workspaceFolder.uri.fsPath)}`); +}; + +const removeAdapterForFolder = (workspaceFolder: WorkspaceFolder, testHub: TestHub, logger: Logger): void => { + const adapter = registeredAdapters.get(workspaceFolder); + + if (adapter) { + logger.info(() => `Deactivating adapter for workspace folder: ${normalizePath(workspaceFolder.uri.fsPath)}`); + testHub.unregisterTestAdapter(adapter); + registeredAdapters.delete(workspaceFolder); + adapter.dispose(); + logger.info(() => `Done deactivating adapter for workspace folder: ${normalizePath(workspaceFolder.uri.fsPath)}`); + } +}; + +const shouldActivateAdapterForWorkspaceFolder = (workspaceFolder: WorkspaceFolder, logger: Logger): boolean => { + const workspaceFolderPath = normalizePath(workspaceFolder.uri.fsPath); + + const workspaceKarmaOrAngularConfigFiles = globby.sync(DEFAULT_KARMA_AND_ANGULAR_CONFIG_GLOBS, { + ignore: ALWAYS_EXCLUDED_TEST_FILE_GLOBS, + cwd: workspaceFolderPath + }); + const config = workspace.getConfiguration(EXTENSION_CONFIG_PREFIX, workspaceFolder.uri); + const configuredExtensionSetting = Object.values(ConfigSetting).find(configSetting => config.has(configSetting)); + const hasKarmaOrAngularConfigFile = workspaceKarmaOrAngularConfigFiles.length > 0; + + if (hasKarmaOrAngularConfigFile) { + logger.debug( + () => + `Activating adapter for workspace folder '${workspaceFolderPath}' because ` + + `it has relevant project config file: ${workspaceKarmaOrAngularConfigFiles[0]}` + ); + } else if (configuredExtensionSetting !== undefined) { + logger.debug( + () => + `Activating adapter for workspace folder '${workspaceFolderPath}' because ` + + `it has the extension setting configured: ${configuredExtensionSetting}` + ); + } + return hasKarmaOrAngularConfigFile || !!configuredExtensionSetting; +}; diff --git a/src/util/logging/log-level.ts b/src/util/logging/log-level.ts index 47f639c..c68ec92 100644 --- a/src/util/logging/log-level.ts +++ b/src/util/logging/log-level.ts @@ -1,10 +1,17 @@ export enum LogLevel { - DISABLE = 1, - ERROR, - WARN, - INFO, - DEBUG, - TRACE + DISABLE = 'disable', + ERROR = 'error', + WARN = 'warn', + INFO = 'info', + DEBUG = 'debug', + TRACE = 'trace' } -export type LogLevelName = keyof typeof LogLevel; +export const LogLevels: Record = { + [LogLevel.DISABLE]: 0, + [LogLevel.ERROR]: 1, + [LogLevel.WARN]: 2, + [LogLevel.INFO]: 3, + [LogLevel.DEBUG]: 4, + [LogLevel.TRACE]: 5 +}; diff --git a/src/util/logging/logger-adapter.ts b/src/util/logging/logger-adapter.ts index 696e6a8..d9fd7e5 100644 --- a/src/util/logging/logger-adapter.ts +++ b/src/util/logging/logger-adapter.ts @@ -1,12 +1,24 @@ import { BasicLog } from './basic-log'; -import { LogLevel } from './log-level'; +import { LogLevel, LogLevels } from './log-level'; import { Logger } from './logger'; +export interface LoggerAdapterOptions { + bypassUnderlyingTraceMethod?: boolean; +} + export class LoggerAdapter implements Logger { - private constructor(private readonly logger: BasicLog, private readonly logLevel: LogLevel) {} + private options: Required; - public static fromBasicLog(log: BasicLog, logLevel: LogLevel): LoggerAdapter { - return new LoggerAdapter(log, logLevel); + private constructor( + private readonly logger: BasicLog, + private readonly logLevel: LogLevel, + options?: LoggerAdapterOptions + ) { + this.options = { bypassUnderlyingTraceMethod: false, ...options }; + } + + public static fromBasicLog(log: BasicLog, logLevel: LogLevel, options?: LoggerAdapterOptions): LoggerAdapter { + return new LoggerAdapter(log, logLevel, options); } public error(msgSource: () => string) { @@ -34,13 +46,18 @@ export class LoggerAdapter implements Logger { } public trace(msgSource: () => string) { - if (this.isLevelEnabled(LogLevel.TRACE)) { - (this.logger.trace ?? this.logger.debug).apply(this.logger, [msgSource()]); + if (!this.isLevelEnabled(LogLevel.TRACE)) { + return; + } + if (!this.options.bypassUnderlyingTraceMethod && typeof this.logger.trace === 'function') { + this.logger.trace(msgSource()); + } else { + this.logger.debug(`[TRACE]: ${msgSource()}`); } } private isLevelEnabled(logLevel: LogLevel): boolean { - return logLevel <= this.logLevel; + return LogLevels[this.logLevel] >= LogLevels[logLevel]; } public dispose(): void { diff --git a/src/util/logging/logger.ts b/src/util/logging/logger.ts index 808e909..c5e7d38 100644 --- a/src/util/logging/logger.ts +++ b/src/util/logging/logger.ts @@ -1,9 +1,9 @@ import { Disposable } from '../disposable/disposable'; export interface Logger extends Disposable { - error(msgSource: () => string): void; - warn(msgSource: () => string): void; - info(msgSource: () => string): void; - debug(msgSource: () => string): void; - trace(msgSource: () => string): void; + error(provideMessage: () => string): void; + warn(provideMessage: () => string): void; + info(provideMessage: () => string): void; + debug(provideMessage: () => string): void; + trace(provideMessage: () => string): void; } diff --git a/src/util/logging/simple-logger.ts b/src/util/logging/simple-logger.ts index a3d10a7..d5f119d 100644 --- a/src/util/logging/simple-logger.ts +++ b/src/util/logging/simple-logger.ts @@ -1,8 +1,9 @@ import { DEFAULT_LOG_LEVEL } from '../../constants'; import { Disposable } from '../disposable/disposable'; import { Disposer } from '../disposable/disposer'; +import { getPropertyWithValue } from '../utils'; import { LogAppender } from './log-appender'; -import { LogLevel } from './log-level'; +import { LogLevel, LogLevels } from './log-level'; import { Logger } from './logger'; export class SimpleLogger implements Logger { @@ -51,12 +52,12 @@ export class SimpleLogger implements Logger { } private isLevelEnabled(logLevel: LogLevel): boolean { - return logLevel <= this.logLevel; + return LogLevels[this.logLevel] >= LogLevels[logLevel]; } private log(logLevel: LogLevel, msg: string): void { const timeStamp = new Date().toISOString().replace('T', ' ').replace('Z', ''); - const logLevelLabel = LogLevel[logLevel]; + const logLevelLabel = getPropertyWithValue(LogLevel, logLevel) || 'LOG'; const loggerNameDecoration = this.loggerName ? ` [${this.loggerName}]` : ''; this.appender.append(`[${timeStamp}] [${logLevelLabel}]${loggerNameDecoration}: ${msg}`); } diff --git a/src/util/process/command-line-process-handler.ts b/src/util/process/command-line-process-handler.ts index b351981..fda38ae 100644 --- a/src/util/process/command-line-process-handler.ts +++ b/src/util/process/command-line-process-handler.ts @@ -1,5 +1,4 @@ -import { ChildProcess, SpawnOptions } from 'child_process'; -import spawn from 'cross-spawn'; +import { ChildProcess, spawn, SpawnOptions } from 'child_process'; import treeKill from 'tree-kill'; import { Disposable } from '../disposable/disposable'; import { Disposer } from '../disposable/disposer'; diff --git a/src/util/utils.ts b/src/util/utils.ts index c312ce4..2ca264c 100644 --- a/src/util/utils.ts +++ b/src/util/utils.ts @@ -1,4 +1,5 @@ import path = require('path'); +import { getInstalledPathSync } from 'get-installed-path'; export const generateRandomId = () => Math.random().toString(36).slice(2); @@ -73,3 +74,29 @@ export const getValueTypeReplacer = () => { }; return replacer; }; + +export const getPackageInstallPathForProjectRoot = ( + packageName: string, + projectRootPath?: string +): string | undefined => { + let packageInstallPath: string | undefined; + + if (projectRootPath) { + try { + packageInstallPath = getInstalledPathSync(packageName, { local: true, cwd: projectRootPath }); + } catch (error) { + console.warn(`Could not find '${packageName}' package local install at root path '${projectRootPath}': ${error}`); + } + } + + if (!packageInstallPath) { + try { + packageInstallPath = getInstalledPathSync('karma'); + } catch (error) { + console.warn(`Could not find '${packageName}' package global install: ${error}`); + return; + } + } + + return packageInstallPath; +}; diff --git a/test/core/spec-locator.test.ts b/test/core/spec-locator.test.ts index 17cf78b..0303942 100644 --- a/test/core/spec-locator.test.ts +++ b/test/core/spec-locator.test.ts @@ -60,7 +60,7 @@ describe('SpecLocator', () => { describe('the getSpecLocation method', () => { it('should return the spec locations with normalized file paths', () => { - const specLocations = specLocator.getSpecLocation(['SuiteName']); + const specLocations = specLocator.getSpecLocations(['SuiteName']); const expectedNormalizedTestFiles = [ withUnixStyleSeparator(mockTestFiles[0]).replace(/^d:/, 'D:'), diff --git a/test/util/process/command-line-process-handler.test.ts b/test/util/process/command-line-process-handler.test.ts index dc1e485..a7c2dde 100644 --- a/test/util/process/command-line-process-handler.test.ts +++ b/test/util/process/command-line-process-handler.test.ts @@ -1,12 +1,11 @@ -import { ChildProcess } from 'child_process'; -import spawn from 'cross-spawn'; +import { ChildProcess, spawn } from 'child_process'; import { mock } from 'jest-mock-extended'; import treeKill from 'tree-kill'; import { Logger } from '../../../src/util/logging/logger'; import { CommandLineProcessHandler } from '../../../src/util/process/command-line-process-handler'; import { Writeable } from '../../test-util'; -jest.mock('cross-spawn'); +jest.mock('child_process'); jest.mock('tree-kill'); const mockSpawn = spawn as jest.MockedFunction;