From 4355ce663980eb8546d392c51aca90d3a082d989 Mon Sep 17 00:00:00 2001 From: zvigrinberg Date: Mon, 11 Sep 2023 15:44:56 +0000 Subject: [PATCH] feat: added support for golang and python ecosystems feat: support golang Signed-off-by: Ilona Shishov feat: support python (#650) Signed-off-by: Ilona Shishov chore: update documentation Signed-off-by: Ilona Shishov chore: pruned and updated dependencies (#651) Signed-off-by: Ilona Shishov feat: added MATCH_MANIFEST_VERSIONS to extension workspace settings and to Exhort JS API request (#653) Signed-off-by: Ilona Shishov chore: migrate from istanbul to nyc coverage package and from tslint to eslint lint package (#654) Signed-off-by: Ilona Shishov 11/1/23 - ritz303 : Doc updates (#655) Co-authored-by: Aron Gunn chore: upgrade Exhort Javascript API version Signed-off-by: Ilona Shishov --- .eslintrc.js | 56 + .gitignore | 30 +- .vscode/launch.json | 2 +- .vscodeignore | 2 - CHANGELOG.md | 3 + README.md | 82 +- coverconfig.json | 16 - .../extension-workspace-settings.png | Bin 66419 -> 73934 bytes package-lock.json | 3404 ++++++++++------- package.json | 116 +- src/DepOutputChannel.ts | 6 +- src/authextension.ts | 46 - src/caNotification.ts | 12 +- src/caStatusBarProvider.ts | 6 +- src/commands.ts | 30 +- src/config.ts | 70 +- src/constants.ts | 46 +- src/contextHandler.ts | 43 + src/dependencyReportPanel.ts | 92 +- src/extension.ts | 54 +- src/multimanifestmodule.ts | 200 +- src/redhatTelemetry.ts | 11 +- src/stackAnalysisService.ts | 85 +- src/stackanalysismodule.ts | 226 +- src/template.ts | 43 +- test/authextension.test.ts | 36 - test/config.test.ts | 156 +- test/contextHandler.test.ts | 39 + test/depOutputChannel.test.ts | 8 +- test/dependencyReportPanel.test.ts | 73 +- test/extension.test.ts | 2 +- test/index.ts | 291 +- test/multiManifestModule.test.ts | 66 +- test/resources/sampleMavenApp/pom.xml | 18 - test/resources/sampleMavenApp/response.html | 598 --- test/resources/sampleMavenApp/response.json | 234 -- test/resources/sampleMavenApp/sbom.json | 46 - test/resources/sampleNodeApp/package.json | 200 - test/runTest.ts | 7 +- test/stackAnalysisModule.test.ts | 37 +- test/stackAnalysisService.test.ts | 7 +- test/vscontext.mock.ts | 1 - tslint.json | 23 - webpack.config.ts | 11 - 44 files changed, 3015 insertions(+), 3519 deletions(-) create mode 100644 .eslintrc.js delete mode 100644 coverconfig.json delete mode 100644 src/authextension.ts create mode 100644 src/contextHandler.ts delete mode 100644 test/authextension.test.ts create mode 100644 test/contextHandler.test.ts delete mode 100644 test/resources/sampleMavenApp/pom.xml delete mode 100644 test/resources/sampleMavenApp/response.html delete mode 100644 test/resources/sampleMavenApp/response.json delete mode 100644 test/resources/sampleMavenApp/sbom.json delete mode 100644 test/resources/sampleNodeApp/package.json delete mode 100644 tslint.json diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..9cb163203 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,56 @@ +module.exports = { + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-require-imports": "error", + "@typescript-eslint/no-unused-expressions": "error", + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "default", + "format": ["camelCase"] + }, + { + "selector": ["class", "interface", "enum"], + "format": ["PascalCase"] + }, + { + "selector": ["enumMember", "variable", "property", "method"], + "format": ["UPPER_CASE", "camelCase"], + "leadingUnderscore": "allow" + } + ], + "@typescript-eslint/semi": ["error", "always"], + "@typescript-eslint/quotes": [ + "error", + "single", + { + "allowTemplateLiterals": true, + "avoidEscape": true + } + ], + "@typescript-eslint/no-shadow": "error", + "@typescript-eslint/no-redeclare": "error", + "no-async-promise-executor": "off", + "no-redeclare": "off", + "no-duplicate-case": "error", + "no-shadow": "off", + "curly": "error", + "semi": "off", + "eqeqeq": ["error", "always"], + "quotes": "off", + "no-debugger": "error", + "no-empty": "error", + "no-var": "error", + "no-unsafe-finally": "error", + "new-parens": "error", + "no-throw-literal": "error", + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8e51e7ca2..768bad935 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1,23 @@ +# Dependency directories +**/node_modules +**/package-lock.json + +# test data directories +test-workspace/ + +# nyc test coverage directories +coverage/ +.nyc_output/ +.vscode-test/ + +# npm config file +.npmrc + +#others dist out -node_modules ca-lsp-server.tar ca-lsp-server/ -*.vsix -.vscode-test/ .DS_Store *.tar.* -coverage/ -.history -target/ -coverage/ -.history -target/ -test/resources/**/package-lock.json -test/resources/**/node_modules -.npmrc -test-workspace/ \ No newline at end of file +.history \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 28269b98d..2010f1d3e 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,7 +18,7 @@ "outFiles": [ "${workspaceFolder}/dist/*.js" ], - "preLaunchTask": "npm: webpack-dev" + "preLaunchTask": "npm: webpack-dev", }, { "name": "Launch Tests", diff --git a/.vscodeignore b/.vscodeignore index c17d8746c..f8d6f25f3 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -11,8 +11,6 @@ node_modules/** **/target **/*.map .gitignore -tsconfig.json -tslint.json vsc-extension-quickstart.md **/**.tar **/**.tar.gz diff --git a/CHANGELOG.md b/CHANGELOG.md index d6cab784d..f3c66858a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ # Change Log +## 0.7.3 (Nov 7th 2023) +- enhancement - Support for Golang and Python ecosystems. See [#645](https://github.com/fabric8-analytics/fabric8-analytics-vscode-extension/pull/645) +- enhancement - A new setting for Python and Go environments to restrict package analysis when there is a package version mis-match between the environment and the manifest file. See the [Features section](https://github.com/fabric8-analytics/fabric8-analytics-vscode-extension/blob/master/README.md#features) of the README for more information. ## 0.7.0 (Sep 11th 2023) - fixes - Improved overall performance and stability with the analysis report. - informational - Alpha release of the new Red Hat Dependency Analytics (RHDA) extension. diff --git a/README.md b/README.md index 84b0ab8f6..b981f25ef 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,33 @@ # Red Hat Dependency Analytics [![Visual Studio Marketplace](https://vsmarketplacebadges.dev/version/redhat.fabric8-analytics.svg)](https://marketplace.visualstudio.com/items?itemName=redhat.fabric8-analytics) -![CI Build](https://github.com/fabric8-analytics/fabric8-analytics-vscode-extension/workflows/Tests/badge.svg?branch=master) -[![codecov](https://codecov.io/gh/fabric8-analytics/fabric8-analytics-vscode-extension/branch/master/graph/badge.svg?token=rHIO4KNlJ0)](https://codecov.io/gh/fabric8-analytics/fabric8-analytics-vscode-extension) +![CI](https://github.com/fabric8-analytics/fabric8-analytics-vscode-extension/workflows/CI/badge.svg?branch=master) +[![Codecov](https://codecov.io/gh/fabric8-analytics/fabric8-analytics-vscode-extension/branch/master/graph/badge.svg?token=rHIO4KNlJ0)](https://codecov.io/gh/fabric8-analytics/fabric8-analytics-vscode-extension) Red Hat's Dependency Analytics (RHDA) extension gives you awareness to security concerns within your software supply chain while you build your application. -The Dependency Analytics extension uses the Snyk REST API to query [Snyk's Vulnerability Database](https://snyk.io/product/vulnerability-database/) for the most up-to-date vulnerability information available. +The Red Hat Dependency Analytics extension uses the Snyk REST API to query [Snyk's Vulnerability Database](https://snyk.io/product/vulnerability-database/) for the most up-to-date vulnerability information available. Snyk uses industry-leading security intelligence by pulling from many data sources to give you exact vulnerability information. **NOTE:**
The Red Hat Dependency Analytics extension is an online service hosted and maintained by Red Hat. -Dependency Analytics only accesses your manifest files to analyze your application dependencies before displaying the vulnerability report. +Red Hat Dependency Analytics only accesses your manifest files to analyze your application dependencies before displaying the vulnerability report. **IMPORTANT:** -
Currently, Dependency Analytics only supports projects that use Maven (`mvn`), and Node ecosystems (`npm`). +
Currently, Red Hat Dependency Analytics only supports projects that use Maven (`mvn`), Node (`npm`), Golang (`go mod`) and Python (`pip`) ecosystems. In future releases, Red Hat plans to support other programming languages. ##### Table of Contents -- [Quick start](#quick-start) -- [Configuration](#configuration) -- [Features](#features) -- [Using Red Hat Dependency Analytics for CI builds](#using-red-hat-dependency-analytics-for-ci-builds) -- [Know more about the Red Hat Dependency Analytics platform](#know-more-about-the-red-hat-dependency-analytics-platform) -- [Data and telemetry](#data-and-telemetry) -- [Support, feedback \& questions](#support-feedback--questions) -- [License](#license) +- [Red Hat Dependency Analytics](#red-hat-dependency-analytics) + - [Table of Contents](#table-of-contents) + - [Quick start](#quick-start) + - [Configuration](#configuration) + - [Configurable parameters](#configurable-parameters) + - [Features](#features) + - [Using Red Hat Dependency Analytics for CI builds](#using-red-hat-dependency-analytics-for-ci-builds) + - [Know more about the Red Hat Dependency Analytics platform](#know-more-about-the-red-hat-dependency-analytics-platform) + - [Data and telemetry](#data-and-telemetry) + - [Support, feedback \& questions](#support-feedback--questions) + - [License](#license) ## Quick start @@ -32,12 +35,14 @@ In future releases, Red Hat plans to support other programming languages. - For Maven projects, analyzing a `pom.xml` file, you must have the `mvn` binary in your system’s `PATH` environment. - For Node projects, analyzing a `package.json` file, you must have the `npm` binary in your system’s `PATH` environment. +- For Golang projects, analyzing a `go.mod` file, you must have the `go` binary in your system’s `PATH` environment. +- For Python projects, analyzing a `requirements.txt` file, you must have the `python3/pip3` or `python/pip` binaries in your system’s `PATH` environment.
**IMPORTANT:**
Visual Studio Code by default executes binaries directly in a terminal found in your system's `PATH` environment. You can configure Visual Studio Code to look somewhere else to run the necessary binaries. You can configure this by accessing the [extension settings](https://code.visualstudio.com/docs/getstarted/settings). -Click the **Workspace** tab, search for the word _executable_, and specify the absolute path to the binary file you want to use for Maven or Node. +Click the **Workspace** tab, search for the word _executable_, and specify the absolute path to the binary file you want to use for Maven, Node or Golang. **Procedure** @@ -51,7 +56,7 @@ Click the **Workspace** tab, search for the word _executable_, and specify the a - Open a manifest file, and click the **pie chart** icon ![ Pie chart icon ](icon/report-icon.png). - Right click on a manifest file in the **Explorer** view, and click **Red Hat Dependency Analytics Report...**. - From the vulnerability pop-up alert message, click **Open detailed vulnerability report**. -7. (OPTIONAL) You can link your Snyk account to Dependency Analytics by doing the following: +7. (OPTIONAL) You can link your Snyk account to Red Hat Dependency Analytics by doing the following: 1. Log into your [Snyk account](https://app.snyk.io/login?utm_campaign=Code-Ready-Analytics-2020&utm_source=code_ready&code_ready=FF1B53D9-57BE-4613-96D7-1D06066C38C9). 2. On the account landing page, you can find your Snyk Token, copy the token. 3. Open the Red Hat Dependency Analytics extension settings. @@ -88,20 +93,20 @@ If you need a new Snyk token, you can generate a new token [here](https://app.sn **Red Hat Dependency Analytics Report File Path** : -Specify the local path to create the Dependency Analytics report file. +Specify the local path to create the Red Hat Dependency Analytics report file. The default path is `/tmp/redhatDependencyAnalyticsReport.html`. ## Features - **Component analysis** -
Upon opening a manifest file, such as a `pom.xml` or `package.json` file, a scan starts the analysis process. +
Upon opening a manifest file, such as a `pom.xml`, `package.json`, `go.mod` or `requirements.txt` file, a scan starts the analysis process. The scan provides immediate inline feedback on detected security vulnerabilities for your application's dependencies. Such dependencies are appropriately underlined in red, and hovering over it gives you a short summary of the security concern. The summary has the full package name, version number, the amount of known security vulnerabilities, and the highest severity status of said vulnerabilities. **NOTE:** Add the `target` folder to your `.gitignore` file to exclude it from Git monitoring. - ![ Animated screenshot showing the inline reporting feature of Dependency Analytics ](images/screencasts/component-analysis.gif) + ![ Animated screenshot showing the inline reporting feature of Red Hat Dependency Analytics ](images/screencasts/component-analysis.gif) - **Excluding dependencies with `exhortignore`**
You can exclude a package from analysis by marking the package for exclusion. @@ -141,8 +146,23 @@ The default path is `/tmp/redhatDependencyAnalyticsReport.html`. } ``` + If you wish to ignore vulnerabilities for a dependency in a `go.mod` file, you must add `exhortignore` as a comment against the dependency in the manifest file. + For example: + ``` + require ( + golang.org/x/sys v1.6.7 // exhortignore + ) + ``` + + If you wish to ignore vulnerabilities for a dependency in a `requirements.txt` file, you must add `exhortignore` as a comment against the dependency in the manifest file. + For example: + ``` + requests==2.28.1 # exhortignore + ``` + - **Excluding developmental or test dependencies**
Red Hat Dependency Analytics does not analyze dependencies marked as `dev` or `test`, these dependencies are ignored. + For example, setting `test` in the `scope` tag within a `pom.xml` file: ```xml @@ -177,11 +197,37 @@ The default path is `/tmp/redhatDependencyAnalyticsReport.html`. } ``` + For example, setting `exclude` attributte in the `go.mod` file: + + ``` + exclude golang.org/x/sys v1.6.7 + + exclude ( + golang.org/x/sys v1.6.7 + ) + ``` + + For example, creating an alternative file to `requirements.txt`, like `requirements-dev.txt` or `requirements-test.txt` and adding the dev or test dependencies there istead. + - **Red Hat Dependency Analytics report**
The Red Hat Dependency Analytics report is a temporary HTML file that exist if the **Red Hat Dependency Analytics Report** tab remains open. Closing the tab removes the temporary HTML file. You can specify the file name by [modifying the _Red Hat Dependency Analytics: Red Hat Dependency Analytics Report File Path_ field](#configuration) in the extension settings. +- **Python and Go package manager behavior** +
When a user requests a Python or a Go package analysis, Red Hat Dependency Analytics performs the analysis by looking at the version tags from those environments, and not from the manifest files of those environments. + This can result in the user receiving information that does not match their intended request. + Because of this behavior, Red Hat Dependency Analytics has a new configurable workspace setting. + By default, the `Match Manifest Versions` (MATCH_MANIFEST_VERSIONS) setting restricts Red Hat Dependency Analytics from doing an analysis on package versions that do not match the versions defined by the manifest files. + When Red Hat Dependency Analytics finds a package version mis-match, an alert message asks the user to switch this setting. + If the user decides to disable this restriction, Red Hat Dependency Analytics performs the analysis on versions given by the package manager only. + This setting applies to Python and Go environments. + +
An alternative workaround exists for Python environments only. + The user can start Visual Studio Code with the [`EXHORT_PYTHON_VIRTUAL_ENV`](https://github.com/RHEcosystemAppEng/exhort-javascript-api#:~:text=EXHORT_PYTHON_VIRTUAL_ENV) variable set to `true`. + Doing this allows Red Hat Dependency Analytics to install Python packages into a virtual environment to perform the analysis. + The benefit is having a clean Python environment not influenced by earlier installations, but the downside is a significantly slower analysis process. + ## Using Red Hat Dependency Analytics for CI builds You can automate the analysis of your application's vulnerabilities within the build and release pipeline. diff --git a/coverconfig.json b/coverconfig.json deleted file mode 100644 index 63c32e727..000000000 --- a/coverconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "enabled": true, - "relativeSourcePath": "../src", - "relativeCoverageDir": "../../coverage", - "ignorePatterns": [ - "**/node_modules/**" - ], - "includePid": false, - "reports": [ - "html", - "text", - "cobertura", - "json" - ], - "verbose": false -} \ No newline at end of file diff --git a/images/screenshots/extension-workspace-settings.png b/images/screenshots/extension-workspace-settings.png index 7c83839843c13c4ab6b4d52e5ceb0d538cc1c44a..f78f8009931bb0b5ccb7f105466044499f07a334 100644 GIT binary patch literal 73934 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 literal 66419 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.10.0" } }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -62,7 +102,6 @@ "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, "dependencies": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" @@ -71,94 +110,30 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", - "dev": true, + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", - "dev": true, + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", + "@babel/generator": "^7.23.0", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", - "convert-source-map": "^1.7.0", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", @@ -172,22 +147,12 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", - "dev": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dependencies": { - "@babel/types": "^7.22.15", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -200,7 +165,6 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.15", @@ -212,32 +176,21 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true, + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -247,7 +200,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -259,7 +211,6 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, "dependencies": { "@babel/types": "^7.22.15" }, @@ -268,16 +219,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", - "dev": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.15" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -290,7 +240,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -302,7 +251,6 @@ "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -314,16 +262,14 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "dev": true, + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } @@ -332,32 +278,29 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", - "dev": true, + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dev": true, + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -365,73 +308,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", - "dev": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -443,7 +323,6 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -454,19 +333,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", - "dev": true, + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dependencies": { "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -475,13 +353,12 @@ } }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", - "dev": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -548,89 +425,256 @@ "node": ">=10.0.0" } }, - "node_modules/@fabric8-analytics/fabric8-analytics-lsp-server": { - "version": "0.7.1-ea.4", - "resolved": "https://npm.pkg.github.com/download/@fabric8-analytics/fabric8-analytics-lsp-server/0.7.1-ea.4/c9b256300d889d81297ee3d33f4060310e03d494", - "integrity": "sha512-KVBH38bkZB7Ac9qJiWLECYEQWNsZ1/HblsV74nMtdZGsfT7moqLZ0zOia4aXchUlKAzOhT8xQcm6ewfSVW+XHw==", - "license": "Apache-2.0", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, "dependencies": { - "@RHEcosystemAppEng/exhort-javascript-api": "^0.0.2-alpha.4", - "@xml-tools/ast": "^5.0.5", - "@xml-tools/parser": "^1.0.11", - "compare-versions": "^6.0.0-rc.1", - "json-to-ast": "^2.1.0", - "mkdirp": "^3.0.1", - "vscode-languageserver": "^8.1.0", - "vscode-languageserver-textdocument": "^1.0.8" + "eslint-visitor-keys": "^3.3.0" }, - "bin": { - "fabric8-analytics-lsp-server": "dist/server.js" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, "engines": { - "node": ">=8" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", + "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fabric8-analytics/fabric8-analytics-lsp-server": { + "version": "0.7.1-ea.18", + "resolved": "https://npm.pkg.github.com/download/@fabric8-analytics/fabric8-analytics-lsp-server/0.7.1-ea.18/356799181c1ee1e0db382b6ae738fcd1c5c67e5e", + "integrity": "sha512-dJg3TpcNDkIiMNEZZusZ8cBhnMlhM4r4TmV2O52HL/7IFBKYpXheKqv6qio+2S5QNyrKJx6f/fei9qgpQDct7A==", + "license": "Apache-2.0", + "dependencies": { + "@RHEcosystemAppEng/exhort-javascript-api": "^0.0.2-ea.49", + "@xml-tools/ast": "^5.0.5", + "@xml-tools/parser": "^1.0.11", + "json-to-ast": "^2.1.0", + "vscode-languageserver": "^8.1.0", + "vscode-languageserver-textdocument": "1.0.8" + }, + "bin": { + "fabric8-analytics-lsp-server": "dist/server.js" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { "node": ">=8" } @@ -648,7 +692,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -662,7 +705,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -671,7 +713,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -689,14 +730,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -741,19 +780,72 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "optional": true, "dependencies": { - "abbrev": "1" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" }, "bin": { - "nopt": "bin/nopt.js" + "semver": "bin/semver.js" }, "engines": { - "node": ">=6" + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, "node_modules/@oozcitak/dom": { @@ -805,9 +897,9 @@ } }, "node_modules/@redhat-developer/vscode-redhat-telemetry": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@redhat-developer/vscode-redhat-telemetry/-/vscode-redhat-telemetry-0.6.1.tgz", - "integrity": "sha512-w9hDT7SRud9kZ3vBZXbiPT9gq7S19GHqWyLgLaMMgTNzzAt1HvJGAkMzezrC0i2012Kf1bJf1FL88BbBEhMLHg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@redhat-developer/vscode-redhat-telemetry/-/vscode-redhat-telemetry-0.7.0.tgz", + "integrity": "sha512-Nhlg2iuOVYAX7/GCty7wOJ8/E19XcGuRioRxoyg9+S+dhf9Sxnqu17kyHBrq3sbW3uNOPjHw7QMuKHvN0SXnFQ==", "dependencies": { "@segment/analytics-node": "0.0.1-beta.17", "axios": "^1.3.2", @@ -821,11 +913,12 @@ } }, "node_modules/@RHEcosystemAppEng/exhort-javascript-api": { - "version": "0.0.2-alpha.4", - "resolved": "https://npm.pkg.github.com/download/@RHEcosystemAppEng/exhort-javascript-api/0.0.2-alpha.4/cc81bf68bc231f6cb7cf81bf7c63ba144a8537e3", - "integrity": "sha512-Lc6QPoedTB7uai4II+ZgbknI50A3mWV6boHQFFqkL+HIDUz/Hfj4IyaUTdbM2MASIXu8jjGFUNtDdYhLV1l+Xw==", + "version": "0.0.2-ea.49", + "resolved": "https://npm.pkg.github.com/download/@RHEcosystemAppEng/exhort-javascript-api/0.0.2-ea.49/0380891b685a3eb30653010a6849669553ea4bb9", + "integrity": "sha512-APOe3QjMjE+Dx9ASZPN97Tpxq/fTvHic9IBTvfCeWhIK5M/WJ562B6U/YG7qjQmHfUur8jHXZOQpJ/bXfNBKDA==", "license": "Apache-2.0", "dependencies": { + "@babel/core": "^7.23.2", "@cyclonedx/cyclonedx-library": "^4.0.0", "fast-xml-parser": "^4.2.4", "packageurl-js": "^1.0.2", @@ -941,9 +1034,9 @@ "dev": true }, "node_modules/@types/eslint": { - "version": "8.44.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", - "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "version": "8.44.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", + "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -951,80 +1044,383 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", + "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", + "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "dev": true, + "dependencies": { + "@types/minimatch": "^5.1.2", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.3.tgz", + "integrity": "sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.8.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", + "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "dev": true + }, + "node_modules/@types/sinon": { + "version": "10.0.20", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.20.tgz", + "integrity": "sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==", + "dev": true, + "dependencies": { + "@types/sinonjs__fake-timers": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.4.tgz", + "integrity": "sha512-GDV68H0mBSN449sa5HEj51E0wfpVQb8xNSMzxf/PrypMFcLTMwJMOM/cgXiv71Mq5drkOQmUGvL1okOZcu6RrQ==", + "dev": true + }, + "node_modules/@types/vscode": { + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.1.tgz", + "integrity": "sha512-BHu51NaNKOtDf3BOonY3sKFFmZKEpRkzqkZVpSYxowLbs5JqjOQemYFob7Gs5rpxE5tiGhfpnMpcdF/oKrLg4w==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.0.tgz", + "integrity": "sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/type-utils": "6.9.0", + "@typescript-eslint/utils": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz", + "integrity": "sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz", + "integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.0.tgz", + "integrity": "sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/utils": "6.9.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", + "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz", + "integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.0.tgz", + "integrity": "sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true - }, - "node_modules/@types/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { - "@types/minimatch": "^5.1.2", - "@types/node": "*" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/@types/sinon": { - "version": "10.0.16", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.16.tgz", - "integrity": "sha512-j2Du5SYpXZjJVJtXBokASpPRj+e2z+VUhCPHmM6WMfe3dpHu6iVKJMU6AiBcMp/XTAYnEj6Wc1trJUWwZ0QaAQ==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", + "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", "dev": true, "dependencies": { - "@types/sinonjs__fake-timers": "*" + "@typescript-eslint/types": "6.9.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", - "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", - "dev": true - }, - "node_modules/@types/vscode": { - "version": "1.81.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.81.0.tgz", - "integrity": "sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w==", + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, "node_modules/@vscode/test-electron": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.4.tgz", - "integrity": "sha512-eWzIqXMhvlcoXfEFNWrVu/yYT5w6De+WZXR/bafUQhAp8+8GkQo95Oe14phwiRUPv8L+geAKl/QM2+PoT3YW3g==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.6.tgz", + "integrity": "sha512-M31xGH0RgqNU6CZ4/9g39oUMJ99nLzfjA+4UbtIQ6TcXQ6+2qkjOOxedmPBDDCg26/3Al5ubjY80hIoaMwKYSw==", "dev": true, "dependencies": { "http-proxy-agent": "^4.0.1", @@ -1036,6 +1432,39 @@ "node": ">=16" } }, + "node_modules/@vscode/test-electron/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vscode/test-electron/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vscode/test-electron/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", @@ -1271,15 +1700,15 @@ "dev": true }, "node_modules/abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "devOptional": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1297,10 +1726,19 @@ "acorn": "^8" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "dev": true, "engines": { "node": ">=0.4.0" @@ -1379,16 +1817,6 @@ "ajv": "*" } }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4.2" - } - }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -1407,26 +1835,14 @@ } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "color-convert": "^1.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", - "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/anymatch": { @@ -1500,30 +1916,18 @@ "dev": true }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "devOptional": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/assertion-error": { @@ -1535,15 +1939,6 @@ "node": "*" } }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -1555,9 +1950,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -1616,10 +2011,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", - "dev": true, + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "funding": [ { "type": "opencollective", @@ -1635,10 +2029,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -1653,15 +2047,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -1686,6 +2071,15 @@ "node": "*" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -1696,10 +2090,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001528", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001528.tgz", - "integrity": "sha512-0Db4yyjR9QMNlsxh+kKWzQtkyflkG/snYheSzkjmvdEtEXB1+jt7A2HmSEiO6XIJPIbo92lHNGNySvE5pZcs5Q==", - "dev": true, + "version": "1.0.30001558", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001558.tgz", + "integrity": "sha512-/Et7DwLqpjS47JPEcz6VnxU9PwcIdVi0ciLXRWBQdj1XFye68pSQYpV0QtPTfUKWuOaEig+/Vez2l74eDc1tPQ==", "funding": [ { "type": "opencollective", @@ -1716,65 +2109,55 @@ ] }, "node_modules/chai": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", - "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { "node": "*" } @@ -1814,6 +2197,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -1877,20 +2272,17 @@ } }, "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/color-support": { "version": "1.1.3", @@ -1930,11 +2322,6 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, - "node_modules/compare-versions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", - "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1948,10 +2335,9 @@ "optional": true }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/core-util-is": { "version": "1.0.3", @@ -1987,25 +2373,10 @@ "node": ">= 8" } }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "devOptional": true, "dependencies": { "ms": "2.1.2" }, @@ -2101,25 +2472,48 @@ "node": ">=0.3.1" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/discontinuous-range": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", "optional": true }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dset": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz", - "integrity": "sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", + "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", "engines": { "node": ">=4" } }, "node_modules/electron-to-chromium": { - "version": "1.4.510", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.510.tgz", - "integrity": "sha512-xPfLIPFcN/WLXBpQ/K4UgE98oUBO5Tia6BD4rkSR0wE7ep/PwBVlgvPJQrIBpmJGVAmUzwPKuDbVt9XV6+uC2g==", - "dev": true + "version": "1.4.569", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.569.tgz", + "integrity": "sha512-LsrJjZ0IbVy12ApW3gpYpcmHS3iRxH4bkKOW98y1/D+3cvDUWGcbzbsFinfUS8knpcZk/PG/2p/RnkMCYN7PVg==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -2160,9 +2554,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", "dev": true }, "node_modules/es6-error": { @@ -2180,6 +2574,162 @@ } }, "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", + "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.52.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", @@ -2191,61 +2741,100 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "node_modules/eslint/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=0.12.0" + "node": ">=8" }, - "optionalDependencies": { - "source-map": "~0.2.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "devOptional": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/esrecurse": { @@ -2260,7 +2849,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -2269,15 +2858,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2324,24 +2904,39 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "optional": true }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "devOptional": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.6.0" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "devOptional": true + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", @@ -2356,17 +2951,17 @@ "dev": true }, "node_modules/fast-xml-parser": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.7.tgz", - "integrity": "sha512-J8r6BriSLO1uj2miOk1NW0YVm8AGOOu3Si2HQp/cSmo6EA4m3fcwu2WKjJ4RK9wMLBtg69y1kS8baDiQBR41Ig==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz", + "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==", "funding": [ - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - }, { "type": "github", "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" } ], "dependencies": { @@ -2385,6 +2980,27 @@ "node": ">= 4.9.1" } }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -2445,10 +3061,30 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "funding": [ { "type": "individual", @@ -2566,10 +3202,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gauge": { "version": "3.0.2", @@ -2595,7 +3234,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -2609,9 +3247,9 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" @@ -2649,31 +3287,35 @@ } }, "node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "devOptional": true, "dependencies": { + "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "2 || 3", + "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/glob-to-regexp": { @@ -2686,11 +3328,30 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "engines": { "node": ">=4" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -2702,53 +3363,16 @@ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -2775,6 +3399,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -2837,12 +3473,37 @@ "node": ">=0.10.0" } }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "dev": true }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -2929,29 +3590,17 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2990,6 +3639,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -3069,32 +3727,6 @@ "node": ">=0.10.0" } }, - "node_modules/istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg==", - "deprecated": "This module is no longer maintained, try this instead:\n npm i nyc\nVisit https://istanbul.js.org/integrations for other alternatives.", - "dev": true, - "dependencies": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "istanbul": "lib/cli.js" - } - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -3131,15 +3763,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/istanbul-lib-processinfo": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", @@ -3189,6 +3812,18 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-report/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -3204,6 +3839,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3216,6 +3866,12 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-report/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -3230,15 +3886,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/istanbul-reports": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", @@ -3252,45 +3899,6 @@ "node": ">=8" } }, - "node_modules/istanbul/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true - }, - "node_modules/istanbul/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/istanbul/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -3332,40 +3940,24 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "devOptional": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, - "node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "devOptional": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -3373,6 +3965,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -3385,6 +3983,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "optional": true }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json-to-ast": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", @@ -3401,7 +4005,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -3427,6 +4030,15 @@ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3448,13 +4060,13 @@ } }, "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -3525,6 +4137,12 @@ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -3541,20 +4159,89 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -3574,15 +4261,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "devOptional": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -3618,6 +4296,15 @@ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -3670,15 +4357,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", @@ -3720,17 +4398,15 @@ "optional": true }, "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, "bin": { - "mkdirp": "dist/cjs/src/bin.js" + "mkdirp": "bin/cmd.js" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mocha": { @@ -3773,47 +4449,15 @@ "url": "https://opencollective.com/mochajs" } }, - "node_modules/mocha-jenkins-reporter": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/mocha-jenkins-reporter/-/mocha-jenkins-reporter-0.4.8.tgz", - "integrity": "sha512-1nz1Q+YgREUlh2kgFR+lrp+ufEFbdhCdtlEVEJR/5LhgqNLIg52+KG3X94hHpwWnf5SwYLS7udxgBbkWOUbyeQ==", + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "diff": "4.0.1", - "mkdirp": "^1.0.4", - "xml": "^1.0.1" - }, - "peerDependencies": { - "mocha": "^5.2.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0" - } - }, - "node_modules/mocha-jenkins-reporter/node_modules/diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/mocha-jenkins-reporter/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" + "balanced-match": "^1.0.0" } }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/mocha/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -3825,36 +4469,16 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { - "node": "*" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mocha/node_modules/has-flag": { @@ -3866,18 +4490,6 @@ "node": ">=8" } }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/mocha/node_modules/minimatch": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", @@ -3890,15 +4502,6 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3947,8 +4550,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "devOptional": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nan": { "version": "2.17.0", @@ -3968,6 +4570,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/nearley": { "version": "2.20.1", "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", @@ -3997,9 +4605,9 @@ "dev": true }, "node_modules/nise": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", - "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", + "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", "dev": true, "dependencies": { "@sinonjs/commons": "^2.0.0", @@ -4052,19 +4660,21 @@ "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, "dependencies": { "abbrev": "1" }, "bin": { "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/normalize-path": { @@ -4140,6 +4750,21 @@ "node": ">=8.9" } }, + "node_modules/nyc/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/nyc/node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -4151,6 +4776,30 @@ "wrap-ansi": "^6.2.0" } }, + "node_modules/nyc/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/nyc/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/nyc/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, "node_modules/nyc/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -4164,26 +4813,6 @@ "node": ">=8" } }, - "node_modules/nyc/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/nyc/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -4223,6 +4852,15 @@ "node": ">=8" } }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/nyc/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -4318,17 +4956,17 @@ } }, "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -4433,9 +5071,9 @@ } }, "node_modules/packageurl-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/packageurl-js/-/packageurl-js-1.0.2.tgz", - "integrity": "sha512-fWC4ZPxo80qlh3xN5FxfIoQD3phVY4+EyzTIqyksjhKNDmaicdpxSvkWwIrYTtv9C1/RcUN6pxaTwGmj2NzS6A==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/packageurl-js/-/packageurl-js-1.2.0.tgz", + "integrity": "sha512-JFoZnz1maKB0hTjn0YrmqRLgiU825SkbA370oe9ERcsKsj1EcBpe+CDo1EK9mrHc+18Hi5NmZbmXFQtP7YZEbw==" }, "node_modules/pako": { "version": "1.0.11", @@ -4443,6 +5081,18 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/path": { "version": "0.12.7", "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", @@ -4499,6 +5149,15 @@ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -4511,8 +5170,7 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -4589,37 +5247,10 @@ "node": ">=8" } }, - "node_modules/plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "dependencies": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/plugin-error/node_modules/ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "dependencies": { - "ansi-wrap": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -4674,6 +5305,26 @@ "node": ">=6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", @@ -4741,23 +5392,6 @@ "node": ">= 10.13.0" } }, - "node_modules/rechoir/node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regexp-to-ast": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", @@ -4772,32 +5406,7 @@ "es6-error": "^4.0.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/remap-istanbul": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.13.0.tgz", - "integrity": "sha512-rS5ZpVAx3fGtKZkiBe1esXg5mKYbgW9iz8kkADFt3p6lo3NsBBUX1q6SwdhwUtYCGnr7nK6gRlbYK3i8R0jbRA==", - "dev": true, - "dependencies": { - "istanbul": "0.4.5", - "minimatch": "^3.0.4", - "plugin-error": "^1.0.1", - "source-map": "0.6.1", - "through2": "3.0.0" - }, - "bin": { - "remap-istanbul": "bin/remap-istanbul.js" - } - }, - "node_modules/remap-istanbul/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/require-directory": { @@ -4824,10 +5433,21 @@ "dev": true }, "node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/resolve-cwd": { "version": "3.0.0", @@ -4841,7 +5461,7 @@ "node": ">=8" } }, - "node_modules/resolve-from": { + "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", @@ -4850,6 +5470,15 @@ "node": ">=8" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -4859,6 +5488,16 @@ "node": ">=0.12" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -4874,24 +5513,27 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "devOptional": true, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "queue-microtask": "^1.2.2" } }, "node_modules/safe-buffer": { @@ -4965,35 +5607,13 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -5052,9 +5672,9 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sinon": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", - "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-16.1.3.tgz", + "integrity": "sha512-mjnWWeyxcAf9nC0bXcPmiDut+oE8HYridTNzBbF98AYVLmWwGRp2ISEpyhYflG1ifILT+eNn3BmKUJPxjXUPlA==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0", @@ -5109,6 +5729,15 @@ "node": ">=8" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/smtp-address-parser": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/smtp-address-parser/-/smtp-address-parser-1.0.10.tgz", @@ -5122,16 +5751,12 @@ } }, "node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "optional": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, "node_modules/source-map-js": { @@ -5174,15 +5799,6 @@ "source-map": "^0.6.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", @@ -5200,21 +5816,6 @@ "node": ">=8" } }, - "node_modules/spawn-wrap/node_modules/which": { - "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" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", @@ -5230,9 +5831,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" }, "node_modules/sprintf-js": { "version": "1.0.3", @@ -5357,18 +5958,6 @@ "node": ">=10" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -5376,9 +5965,9 @@ "optional": true }, "node_modules/terser": { - "version": "5.19.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", - "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", + "version": "5.23.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.23.0.tgz", + "integrity": "sha512-Iyy83LN0uX9ZZLCX4Qbu5JiHiWjOCTwrmM9InWOzVeM++KNWEsqV4YgN9U9E8AlohQ6Gs42ztczlWOG/lwDAMA==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -5450,41 +6039,16 @@ "node": ">=8" } }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/through2": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.0.tgz", - "integrity": "sha512-8B+sevlqP4OiCjonI1Zw03Sf8PuV1eRsYQgLad5eonILOdyeRsY27A/2Ze8IlvlMvq31OH+3fz/styI7Ya62yQ==", - "dev": true, - "dependencies": { - "readable-stream": "2 || 3", - "xtend": "~4.0.1" - } + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } @@ -5506,16 +6070,29 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-loader": { - "version": "9.4.4", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", - "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.0.tgz", + "integrity": "sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==", "dev": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" @@ -5525,6 +6102,118 @@ "webpack": "^5.0.0" } }, + "node_modules/ts-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ts-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ts-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -5582,196 +6271,13 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tslint": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", - "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" - } - }, - "node_modules/tslint/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/tslint/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/tslint/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslint/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/tslint/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tslint/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/tslint/node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/tslint/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" @@ -5835,24 +6341,16 @@ "node": "*" } }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "funding": [ { "type": "opencollective", @@ -5907,9 +6405,13 @@ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -5949,6 +6451,17 @@ "balanced-match": "^1.0.0" } }, + "node_modules/vscode-languageclient/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/vscode-languageclient/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -5960,6 +6473,25 @@ "node": ">=10" } }, + "node_modules/vscode-languageclient/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vscode-languageclient/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/vscode-languageserver": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.1.0.tgz", @@ -6009,9 +6541,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -6110,12 +6642,13 @@ } }, "node_modules/webpack-merge": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", - "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", + "flat": "^5.0.2", "wildcard": "^2.0.0" }, "engines": { @@ -6131,6 +6664,28 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -6141,15 +6696,17 @@ } }, "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-module": { @@ -6173,21 +6730,6 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, "node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -6210,6 +6752,36 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -6227,12 +6799,6 @@ "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true - }, "node_modules/xmlbuilder2": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.1.1.tgz", @@ -6248,13 +6814,26 @@ "node": ">=12.0" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" + "node_modules/xmlbuilder2/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "optional": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/xmlbuilder2/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "optional": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/y18n": { @@ -6268,8 +6847,7 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yargs": { "version": "17.7.2", diff --git a/package.json b/package.json index eed26a05c..ace8e60c3 100644 --- a/package.json +++ b/package.json @@ -36,11 +36,13 @@ ], "icon": "icon/trusted_content_icon.png", "engines": { - "vscode": "^1.50.0" + "vscode": "^1.76.0" }, "activationEvents": [ "workspaceContains:**/package.json", - "workspaceContains:**/pom.xml" + "workspaceContains:**/pom.xml", + "workspaceContains:**/go.mod", + "workspaceContains:**/requirements.txt" ], "main": "./dist/extension", "contributes": { @@ -83,6 +85,16 @@ "command": "fabric8.stackAnalysisFromPieBtn", "when": "resourceFilename == package.json", "group": "navigation" + }, + { + "command": "fabric8.stackAnalysisFromPieBtn", + "when": "resourceFilename == go.mod", + "group": "navigation" + }, + { + "command": "fabric8.stackAnalysisFromPieBtn", + "when": "resourceFilename == requirements.txt", + "group": "navigation" } ], "explorer/context": [ @@ -93,6 +105,14 @@ { "command": "fabric8.stackAnalysisFromExplorer", "when": "resourceFilename == pom.xml" + }, + { + "command": "fabric8.stackAnalysisFromExplorer", + "when": "resourceFilename == go.mod" + }, + { + "command": "fabric8.stackAnalysisFromExplorer", + "when": "resourceFilename == requirements.txt" } ], "editor/context": [ @@ -103,6 +123,14 @@ { "command": "fabric8.stackAnalysisFromEditor", "when": "resourceFilename == pom.xml" + }, + { + "command": "fabric8.stackAnalysisFromEditor", + "when": "resourceFilename == go.mod" + }, + { + "command": "fabric8.stackAnalysisFromEditor", + "when": "resourceFilename == requirements.txt" } ], "commandPalette": [ @@ -162,13 +190,19 @@ "description": "Red Hat Dependency Analytics server authentication token for Snyk.", "scope": "window" }, + "redHatDependencyAnalytics.matchManifestVersions": { + "type": "boolean", + "default": true, + "description": "Restricts RHDA from performing analysis on dependency tags that do not match the tags requested within the manifest files.", + "scope": "window" + }, "redHatDependencyAnalytics.redHatDependencyAnalyticsReportFilePath": { "type": "string", "default": "/tmp/redhatDependencyAnalyticsReport.html", "description": "Path to a local file where the Red Hat Dependency Analytics report will be saved.", "scope": "window" }, - "maven.executable.path": { + "mvn.executable.path": { "type": "string", "default": "", "description": "Specifies absolute path of mvn executable.", @@ -179,6 +213,36 @@ "default": "", "description": "Specifies absolute path of npm executable.", "scope": "window" + }, + "go.executable.path": { + "type": "string", + "default": "", + "description": "Specifies absolute path of go executable.", + "scope": "window" + }, + "python3.executable.path": { + "type": "string", + "default": "", + "description": "Specifies absolute path of python3 executable, python3 takes precedence over python.", + "scope": "window" + }, + "pip3.executable.path": { + "type": "string", + "default": "", + "description": "Specifies absolute path of pip3 executable, pip3 takes precedence over pip.", + "scope": "window" + }, + "python.executable.path": { + "type": "string", + "default": "", + "description": "Specifies absolute path of python executable, python3 takes precedence over python.", + "scope": "window" + }, + "pip.executable.path": { + "type": "string", + "default": "", + "description": "Specifies absolute path of pip executable, pip3 takes precedence over pip.", + "scope": "window" } } } @@ -187,42 +251,42 @@ "vscode:prepublish": "webpack --mode production", "webpack": "webpack --mode development", "webpack-dev": "webpack --mode development --watch", - "compile": "tsc -b", - "posttest-compile": "./transformToDynamicImport.sh", "test-compile": "tsc -p ./", + "posttest-compile": "./transformToDynamicImport.sh", + "pretest": "npm run test-compile", "test": "node ./out/test/runTest.js", + "coverage": "nyc npm run test", "reinstall": "npm cache verify && npm install", - "lint": "tslint -c tslint.json src/*.ts" + "lint": "eslint -c .eslintrc.js --ext .ts src/" }, "devDependencies": { "@types/glob": "^8.1.0", - "@types/mocha": "^10.0.1", - "@types/node": "^20.2.5", - "@types/sinon": "^10.0.15", - "@types/vscode": "^1.50.0", - "@vscode/test-electron": "^2.3.2", - "chai": "^4.3.7", - "decache": "^4.6.1", - "istanbul": "^0.4.5", + "@types/mocha": "^10.0.2", + "@types/node": "^20.8.4", + "@types/sinon": "^10.0.19", + "@types/vscode": "^1.76.0", + "@typescript-eslint/eslint-plugin": "^6.8.0", + "@typescript-eslint/parser": "^6.8.0", + "@vscode/test-electron": "^2.3.5", + "chai": "^4.3.10", + "decache": "^4.6.2", + "eslint": "^8.51.0", "mocha": "^10.2.0", - "mocha-jenkins-reporter": "^0.4.8", "nyc": "^15.1.0", - "remap-istanbul": "^0.13.0", - "sinon": "^15.1.0", + "sinon": "^16.1.0", "sinon-chai": "^3.7.0", "source-map-loader": "^4.0.1", - "supports-color": "^9.3.1", - "ts-loader": "^9.4.3", + "supports-color": "^9.4.0", + "ts-loader": "^9.5.0", "ts-node": "^10.9.1", - "tslint": "^5.19.0", - "typescript": "^5.1.3", - "webpack": "^5.85.0", - "webpack-cli": "^5.1.1" + "typescript": "^5.2.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" }, "dependencies": { - "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.7.1-ea.4", - "@redhat-developer/vscode-redhat-telemetry": "^0.6.1", - "@RHEcosystemAppEng/exhort-javascript-api": "^0.0.2-alpha.4", + "@fabric8-analytics/fabric8-analytics-lsp-server": "^0.7.1-ea.18", + "@redhat-developer/vscode-redhat-telemetry": "^0.7.0", + "@RHEcosystemAppEng/exhort-javascript-api": "^0.0.2-ea.49", "fs": "^0.0.1-security", "path": "^0.12.7", "vscode-languageclient": "^8.1.0" diff --git a/src/DepOutputChannel.ts b/src/DepOutputChannel.ts index 8be590422..c91fa0602 100644 --- a/src/DepOutputChannel.ts +++ b/src/DepOutputChannel.ts @@ -5,10 +5,8 @@ import { Titles } from './constants'; export class DepOutputChannel { outputChannel: vscode.OutputChannel; - constructor(channelName = Titles.EXT_TITLE) { - if (!this.outputChannel) { - this.outputChannel = vscode.window.createOutputChannel(channelName); - } + constructor(channelName: string = Titles.EXT_TITLE) { + this.outputChannel = vscode.window.createOutputChannel(channelName); } getOutputChannel(): vscode.OutputChannel { diff --git a/src/authextension.ts b/src/authextension.ts deleted file mode 100644 index 1c254519b..000000000 --- a/src/authextension.ts +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -import { GlobalState } from './constants'; -import { Config } from './config'; -// import { getRedHatService } from '@redhat-developer/vscode-redhat-telemetry/lib'; - -export module authextension { - const apiConfig = Config.getApiConfig(); - export let setContextData: any; - - setContextData = (apiConfig) => { - process.env['PROVIDE_FULLSTACK_ACTION'] = 'true'; - process.env['UTM_SOURCE'] = 'vscode'; - process.env['SNYK_TOKEN'] = apiConfig.exhortSnykToken; - process.env['MVN_EXECUTABLE'] = Config.getMavenExecutable(); - process.env['NPM_EXECUTABLE'] = Config.getNodeExecutable(); - process.env['EXHORT_DEV_MODE'] = GlobalState.ExhortDevMode; - }; - - // export async function setTelemetryid(context) { - // const redhatService = await getRedHatService(context); - // const redhatIdProvider = await redhatService.getIdProvider(); - // const REDHAT_UUID = await redhatIdProvider.getRedHatUUID(); - // process.env['TELEMETRY_ID'] = REDHAT_UUID; - // } - - export const authorize_f8_analytics = async context => { - try { - // await setTelemetryid(context); - - setContextData(apiConfig); - - // let uuid = context.globalState.get(GlobalState.UUID); - - // if (uuid && uuid !== '') { - // process.env['UUID'] = uuid; - // } - - return true; - } catch (error) { - console.log(error); - return false; - } - }; - -} diff --git a/src/caNotification.ts b/src/caNotification.ts index 6e4e13d49..1a9eacee5 100644 --- a/src/caNotification.ts +++ b/src/caNotification.ts @@ -1,13 +1,21 @@ 'use strict'; -class CANotification { +interface CANotificationData { + data: string; + done: boolean; + uri: string; + diagCount: number; + vulnCount: number; +} +class CANotification { private data: string; private done: boolean; private uri: string; private diagCount: number; private vulnCount: number; - constructor(respData: any) { + + constructor(respData: CANotificationData) { this.data = respData.data; this.done = respData.done === true; this.uri = respData.uri; diff --git a/src/caStatusBarProvider.ts b/src/caStatusBarProvider.ts index 06d4338d7..44c78ced4 100644 --- a/src/caStatusBarProvider.ts +++ b/src/caStatusBarProvider.ts @@ -3,7 +3,7 @@ import { StatusBarItem, window, StatusBarAlignment, Uri } from 'vscode'; import { Disposable } from 'vscode-languageclient'; import { PromptText } from './constants'; -import { Commands } from './commands'; +import * as commands from './commands'; class CAStatusBarProvider implements Disposable { private statusBarItem: StatusBarItem; @@ -16,7 +16,7 @@ class CAStatusBarProvider implements Disposable { this.statusBarItem.text = text; this.statusBarItem.command = { title: PromptText.FULL_STACK_PROMPT_TEXT, - command: Commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_STATUS_BAR, + command: commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_STATUS_BAR, arguments: [Uri.parse(uri)] }; this.statusBarItem.tooltip = PromptText.FULL_STACK_PROMPT_TEXT; @@ -27,7 +27,7 @@ class CAStatusBarProvider implements Disposable { this.statusBarItem.text = `$(error) Dependency analysis has failed`; this.statusBarItem.command = { title: PromptText.LSP_FAILURE_TEXT, - command: Commands.TRIGGER_STACK_LOGS, + command: commands.TRIGGER_STACK_LOGS, }; } diff --git a/src/commands.ts b/src/commands.ts index d721d7bed..7f5062c9b 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -1,22 +1,16 @@ 'use strict'; /** - * Commonly used commands + * Commonly used commands to trigger Stack Analysis and supporting actions */ -export namespace Commands { - /** - * Triggers Stack Analysis - */ - export const TRIGGER_FULL_STACK_ANALYSIS = 'fabric8.stackAnalysis'; - export const TRIGGER_FULL_STACK_ANALYSIS_FROM_STATUS_BAR = - 'fabric8.stackAnalysisFromStatusBar'; - export const TRIGGER_FULL_STACK_ANALYSIS_FROM_EXPLORER = - 'fabric8.stackAnalysisFromExplorer'; - export const TRIGGER_FULL_STACK_ANALYSIS_FROM_PIE_BTN = - 'fabric8.stackAnalysisFromPieBtn'; - export const TRIGGER_FULL_STACK_ANALYSIS_FROM_EDITOR = - 'fabric8.stackAnalysisFromEditor'; - export const TRIGGER_LSP_EDIT = 'lsp.applyTextEdit'; - export const TRIGGER_STACK_LOGS = 'fabric8.fabric8AnalyticsStackLogs'; - export const TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION = 'fabric8.RHRepositoryRecommendationNotification'; -} +export const TRIGGER_FULL_STACK_ANALYSIS = 'fabric8.stackAnalysis'; +export const TRIGGER_FULL_STACK_ANALYSIS_FROM_STATUS_BAR = + 'fabric8.stackAnalysisFromStatusBar'; +export const TRIGGER_FULL_STACK_ANALYSIS_FROM_EXPLORER = + 'fabric8.stackAnalysisFromExplorer'; +export const TRIGGER_FULL_STACK_ANALYSIS_FROM_PIE_BTN = + 'fabric8.stackAnalysisFromPieBtn'; +export const TRIGGER_FULL_STACK_ANALYSIS_FROM_EDITOR = + 'fabric8.stackAnalysisFromEditor'; +export const TRIGGER_STACK_LOGS = 'fabric8.fabric8AnalyticsStackLogs'; +export const TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION = 'fabric8.RHRepositoryRecommendationNotification'; diff --git a/src/config.ts b/src/config.ts index c64fd0103..ed067b87d 100644 --- a/src/config.ts +++ b/src/config.ts @@ -2,23 +2,55 @@ import * as vscode from 'vscode'; -export namespace Config { - - export function getApiConfig(): any { - return vscode.workspace.getConfiguration('redHatDependencyAnalytics'); - } - - export function getMavenExecutable(): string { - const mavenPath: string = vscode.workspace - .getConfiguration('maven.executable') - .get('path'); - return mavenPath ? `"${mavenPath}"` : 'mvn'; - } - - export function getNodeExecutable(): string { - const npmPath: string = vscode.workspace - .getConfiguration('npm.executable') - .get('path'); - return npmPath ? `"${npmPath}"` : 'npm'; - } +export function getApiConfig(): any { + return vscode.workspace.getConfiguration('redHatDependencyAnalytics'); +} + +export function getMvnExecutable(): string { + const mvnPath: string = vscode.workspace + .getConfiguration('mvn.executable') + .get('path'); + return mvnPath ? mvnPath : 'mvn'; +} + +export function getNpmExecutable(): string { + const npmPath: string = vscode.workspace + .getConfiguration('npm.executable') + .get('path'); + return npmPath ? npmPath : 'npm'; +} + +export function getGoExecutable(): string { + const goPath: string = vscode.workspace + .getConfiguration('go.executable') + .get('path'); + return goPath ? goPath : 'go'; +} + +export function getPython3Executable(): string { + const python3Path: string = vscode.workspace + .getConfiguration('python3.executable') + .get('path'); + return python3Path ? python3Path : 'python3'; +} + +export function getPip3Executable(): string { + const pip3Path: string = vscode.workspace + .getConfiguration('pip3.executable') + .get('path'); + return pip3Path ? pip3Path : 'pip3'; +} + +export function getPythonExecutable(): string { + const pythonPath: string = vscode.workspace + .getConfiguration('python.executable') + .get('path'); + return pythonPath ? pythonPath : 'python'; +} + +export function getPipExecutable(): string { + const pipPath: string = vscode.workspace + .getConfiguration('pip.executable') + .get('path'); + return pipPath ? pipPath : 'pip'; } diff --git a/src/constants.ts b/src/constants.ts index 5b41ca601..3c3decaa8 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -4,11 +4,30 @@ */ export enum GlobalState { // to store the current version string to localStorage - Version = 'fabric8Version', - // to store the UUID string to localStorage - // UUID = 'uuid' + VERSION = 'fabric8Version', + // to store the UTM source for tracking purposes + UTM_SOURCE = 'vscode', // to store the current exhort environment mode - ExhortDevMode = 'false' + EXHORT_DEV_MODE = 'false' +} + +export enum StatusMessages { + WIN_ANALYZING_DEPENDENCIES = 'Analyzing application dependencies...', + WIN_GENERATING_DEPENDENCIES = 'Generating Red Hat Dependency Analytics report...', + WIN_SUCCESS_DEPENDENCY_ANALYSIS = 'Successfully generated Red Hat Dependency Analytics report...', + WIN_FAILURE_DEPENDENCY_ANALYSIS = 'Unable to generate Red Hat Dependency Analytics report', + WIN_SHOW_LOGS = 'No output channel has been created for Red Hat Dependency Analytics', + NO_SUPPORTED_MANIFEST = 'No supported manifest file found to be analyzed.', +} + +export enum PromptText { + FULL_STACK_PROMPT_TEXT = `Open detailed vulnerability report`, + LSP_FAILURE_TEXT = `Open the output window`, +} + +export enum Titles { + EXT_TITLE = `Red Hat Dependency Analytics`, + REPORT_TITLE = `Red Hat Dependency Analytics Report`, } // Refer `name` from package.json @@ -25,22 +44,3 @@ export const defaultRedhatDependencyAnalyticsReportFilePath = '/tmp/redhatDepend export const redhatMavenRepository = 'https://maven.repository.redhat.com/ga/'; // Red Hat GA Repository documentation export const redhatMavenRepositoryDocumentationURL = 'https://access.redhat.com/maven-repository'; - -export namespace StatusMessages { - export const WIN_ANALYZING_DEPENDENCIES = 'Analyzing application dependencies...'; - export const WIN_GENERATING_DEPENDENCIES = 'Generating Red Hat Dependency Analytics report...'; - export const WIN_SUCCESS_DEPENDENCY_ANALYSIS = 'Successfully generated Red Hat Dependency Analytics report...'; - export const WIN_FAILURE_DEPENDENCY_ANALYSIS = 'Unable to generate Red Hat Dependency Analytics report'; - export const WIN_SHOW_LOGS = 'No output channel has been created for Red Hat Dependency Analytics'; - export const NO_SUPPORTED_MANIFEST = 'No supported manifest file found to be analyzed.'; -} - -export namespace PromptText { - export const FULL_STACK_PROMPT_TEXT = `Open detailed vulnerability report`; - export const LSP_FAILURE_TEXT = `Open the output window`; -} - -export namespace Titles { - export const EXT_TITLE = `Red Hat Dependency Analytics`; - export const REPORT_TITLE = `Red Hat Dependency Analytics Report`; -} \ No newline at end of file diff --git a/src/contextHandler.ts b/src/contextHandler.ts new file mode 100644 index 000000000..60f54342d --- /dev/null +++ b/src/contextHandler.ts @@ -0,0 +1,43 @@ +'use strict'; + +import { GlobalState } from './constants'; +import * as config from './config'; +import { getRedHatService } from '@redhat-developer/vscode-redhat-telemetry/lib'; + +export const loadEnvironmentData = () => { + + const apiConfig = config.getApiConfig(); + + process.env['VSCEXT_PROVIDE_FULLSTACK_ACTION'] = 'true'; + process.env['VSCEXT_UTM_SOURCE'] = GlobalState.UTM_SOURCE; + process.env['VSCEXT_EXHORT_DEV_MODE'] = GlobalState.EXHORT_DEV_MODE; + process.env['VSCEXT_EXHORT_SNYK_TOKEN'] = apiConfig.exhortSnykToken; + process.env['VSCEXT_MATCH_MANIFEST_VERSIONS'] = apiConfig.matchManifestVersions ? 'true' : 'false'; + process.env['VSCEXT_EXHORT_MVN_PATH'] = config.getMvnExecutable(); + process.env['VSCEXT_EXHORT_NPM_PATH'] = config.getNpmExecutable(); + process.env['VSCEXT_EXHORT_GO_PATH'] = config.getGoExecutable(); + process.env['VSCEXT_EXHORT_PYTHON3_PATH'] = config.getPython3Executable(); + process.env['VSCEXT_EXHORT_PIP3_PATH'] = config.getPip3Executable(); + process.env['VSCEXT_EXHORT_PYTHON_PATH'] = config.getPythonExecutable(); + process.env['VSCEXT_EXHORT_PIP_PATH'] = config.getPipExecutable(); +}; + +async function setTelemetryid(context) { + const redhatService = await getRedHatService(context); + const redhatIdProvider = await redhatService.getIdProvider(); + const redhatUuid = await redhatIdProvider.getRedHatUUID(); + process.env['VSCEXT_TELEMETRY_ID'] = redhatUuid; +} + +export const loadContextData = async context => { + try { + await setTelemetryid(context); + + loadEnvironmentData(); + + return true; + } catch (error) { + console.log(error); + return false; + } +}; diff --git a/src/dependencyReportPanel.ts b/src/dependencyReportPanel.ts index 41f69acb1..abab9c6ed 100644 --- a/src/dependencyReportPanel.ts +++ b/src/dependencyReportPanel.ts @@ -1,12 +1,12 @@ import * as vscode from 'vscode'; -import { Templates } from './template'; +import * as templates from './template'; import { Titles, defaultRedhatDependencyAnalyticsReportFilePath } from './constants'; -import { Config } from './config'; +import * as config from './config'; import * as fs from 'fs'; -const loaderTmpl = Templates.LOADER_TEMPLATE; -const errorTmpl = Templates.ERROR_TEMPLATE; +const loaderTmpl = templates.LOADER_TEMPLATE; +const errorTmpl = templates.ERROR_TEMPLATE; /** * Manages cat coding webview panels @@ -23,14 +23,20 @@ export class DependencyReportPanel { private readonly _panel: vscode.WebviewPanel; private _disposables: vscode.Disposable[] = []; - public static createOrShow(extensionPath: string, data: any) { + public static createOrShowWebviewPanel() { const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined; - DependencyReportPanel.data = data; + DependencyReportPanel.data = null; + // If we already have a panel, show it. if (DependencyReportPanel.currentPanel) { - DependencyReportPanel.currentPanel._panel.reveal(column); + if (DependencyReportPanel.currentPanel.getPanelVisibility()) { + DependencyReportPanel.currentPanel._updateWebViewPanel(); + } else { + DependencyReportPanel.currentPanel._revealWebviewPanel(column); + } + DependencyReportPanel.currentPanel._disposeReport(); return; } @@ -57,35 +63,21 @@ export class DependencyReportPanel { // Set the webview's initial html content // this._update(); - this._updateWebView(); + this._updateWebViewPanel(); // Listen for when the panel is disposed // This happens when the user closes the panel or when the panel is closed programatically - this._panel.onDidDispose(() => this.dispose(), null, this._disposables); - - // Update the content based on view changes - this._panel.onDidChangeViewState( - e => { - if (this._panel.visible) { - // this._update(); - this._updateWebView(); - } - }, + this._panel.onDidDispose( + () => this.dispose(), null, this._disposables ); - // Handle messages from the webview - this._panel.webview.onDidReceiveMessage( - message => { - switch (message.command) { - case 'alert': - vscode.window.showErrorMessage(message.text); - return; - - case 'launch-link-in-external-browser': - vscode.env.openExternal(message.url); - return; + // Update the content based on view changes + this._panel.onDidChangeViewState( + () => { + if (this.getPanelVisibility()) { + this._updateWebViewPanel(); } }, null, @@ -98,6 +90,7 @@ export class DependencyReportPanel { DependencyReportPanel.data = data; this._panel.webview.html = data; } else { + DependencyReportPanel.data = errorTmpl; this._panel.webview.html = errorTmpl; } } @@ -107,12 +100,7 @@ export class DependencyReportPanel { // Clean up our resources this._panel.dispose(); - const apiConfig = Config.getApiConfig(); - if (fs.existsSync(apiConfig.redHatDependencyAnalyticsReportFilePath || defaultRedhatDependencyAnalyticsReportFilePath)) { - // Delete temp stackAnalysisReport file - fs.unlinkSync(apiConfig.redHatDependencyAnalyticsReportFilePath || defaultRedhatDependencyAnalyticsReportFilePath); - console.log(`File ${apiConfig.redHatDependencyAnalyticsReportFilePath || defaultRedhatDependencyAnalyticsReportFilePath} has been deleted.`); - } + this._disposeReport(); DependencyReportPanel.data = null; while (this._disposables.length) { const x = this._disposables.pop(); @@ -122,11 +110,33 @@ export class DependencyReportPanel { } } - private _updateWebView() { - this._panel.title = Titles.REPORT_TITLE; - let output = DependencyReportPanel.data; - this._panel.webview.html = output && /<\s*html[^>]*>/i.test(output) ? - output : - loaderTmpl; + public getPanelVisibility(): boolean { + return this._panel.visible; + } + + public getWebviewPanelHtml(): string { + return this._panel.webview.html; + } + + private _revealWebviewPanel(column: vscode.ViewColumn) { + this._panel.reveal(column); + } + + private _updateWebViewPanel() { + const output = DependencyReportPanel.data; + if (output && /<\s*html[^>]*>/i.test(output)) { + this._panel.webview.html = output; + } else { + this._panel.webview.html = loaderTmpl; + } + } + + private _disposeReport() { + const apiConfig = config.getApiConfig(); + if (fs.existsSync(apiConfig.redHatDependencyAnalyticsReportFilePath || defaultRedhatDependencyAnalyticsReportFilePath)) { + // Delete temp stackAnalysisReport file + fs.unlinkSync(apiConfig.redHatDependencyAnalyticsReportFilePath || defaultRedhatDependencyAnalyticsReportFilePath); + console.log(`File ${apiConfig.redHatDependencyAnalyticsReportFilePath || defaultRedhatDependencyAnalyticsReportFilePath} has been deleted.`); + } } } \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index d48d36ab4..60e21948b 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -10,10 +10,10 @@ import { import * as path from 'path'; -import { Commands } from './commands'; +import * as commands from './commands'; import { GlobalState, extensionQualifiedId, registrationURL, redhatMavenRepository, redhatMavenRepositoryDocumentationURL } from './constants'; -import { multimanifestmodule } from './multimanifestmodule'; -import { authextension } from './authextension'; +import * as multimanifestmodule from './multimanifestmodule'; +import { loadContextData } from './contextHandler'; import { StatusMessages, PromptText } from './constants'; import { caStatusBarProvider } from './caStatusBarProvider'; import { CANotification } from './caNotification'; @@ -22,12 +22,12 @@ import { record, startUp, TelemetryActions } from './redhatTelemetry'; let lspClient: LanguageClient; -export let outputChannelDep: any; +export let outputChannelDep: DepOutputChannel; export function activate(context: vscode.ExtensionContext) { startUp(context); - let disposableFullStack = vscode.commands.registerCommand( - Commands.TRIGGER_FULL_STACK_ANALYSIS, + const disposableFullStack = vscode.commands.registerCommand( + commands.TRIGGER_FULL_STACK_ANALYSIS, (uri: vscode.Uri) => { try { // uri will be null in case the user has used the context menu/file explorer @@ -35,13 +35,13 @@ export function activate(context: vscode.ExtensionContext) { multimanifestmodule.redhatDependencyAnalyticsReportFlow(context, fileUri); } catch (error) { // Throw a custom error message when the command execution fails - throw new Error(`Running the contributed command: '${Commands.TRIGGER_FULL_STACK_ANALYSIS}' failed.`); + throw new Error(`Running the contributed command: '${commands.TRIGGER_FULL_STACK_ANALYSIS}' failed.`); } } ); - let rhRepositoryRecommendationNotification = vscode.commands.registerCommand( - Commands.TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION, + const rhRepositoryRecommendationNotification = vscode.commands.registerCommand( + commands.TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION, () => { const msg = `Important: If you apply Red Hat Dependency Analytics recommendations, make sure the Red Hat GA Repository (${redhatMavenRepository}) has been added to your project configuration. @@ -51,8 +51,8 @@ export function activate(context: vscode.ExtensionContext) { } ); - let disposableStackLogs = vscode.commands.registerCommand( - Commands.TRIGGER_STACK_LOGS, + const disposableStackLogs = vscode.commands.registerCommand( + commands.TRIGGER_STACK_LOGS, () => { if (outputChannelDep) { outputChannelDep.showOutputChannel(); @@ -67,21 +67,21 @@ export function activate(context: vscode.ExtensionContext) { // show welcome message after first install or upgrade showUpdateNotification(context); - authextension.authorize_f8_analytics(context).then(data => { - if (data) { + loadContextData(context).then(status => { + if (status) { // Create output channel outputChannelDep = initOutputChannel(); // The server is implemented in node - let serverModule = context.asAbsolutePath( + const serverModule = context.asAbsolutePath( path.join('dist', 'server.js') ); // The debug options for the server // --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging - let debugOptions = { execArgv: ['--nolazy', '--inspect=6009'] }; + const debugOptions = { execArgv: ['--nolazy', '--inspect=6009'] }; // If the extension is launched in debug mode then the debug server options are used // Otherwise the run options are used - let serverOptions: ServerOptions = { + const serverOptions: ServerOptions = { run: { module: serverModule, transport: TransportKind.ipc }, debug: { module: serverModule, @@ -91,7 +91,7 @@ export function activate(context: vscode.ExtensionContext) { }; // Options to control the language client - let clientOptions: LanguageClientOptions = { + const clientOptions: LanguageClientOptions = { // Register the server for xml, json documents documentSelector: [ { scheme: 'file', language: 'json' }, @@ -108,8 +108,8 @@ export function activate(context: vscode.ExtensionContext) { fileEvents: vscode.workspace.createFileSystemWatcher('**/.clientrc'), }, initializationOptions: { - triggerFullStackAnalysis: Commands.TRIGGER_FULL_STACK_ANALYSIS, - triggerRHRepositoryRecommendationNotification: Commands.TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION + triggerFullStackAnalysis: commands.TRIGGER_FULL_STACK_ANALYSIS, + triggerRHRepositoryRecommendationNotification: commands.TRIGGER_REDHAT_REPOSITORY_RECOMMENDATION_NOTIFICATION }, }; @@ -130,7 +130,7 @@ export function activate(context: vscode.ExtensionContext) { const showVulnerabilityFoundPrompt = async (msg: string, fileName: string) => { const selection = await vscode.window.showWarningMessage(`${msg}. Powered by [Snyk](${registrationURL})`, PromptText.FULL_STACK_PROMPT_TEXT); if (selection === PromptText.FULL_STACK_PROMPT_TEXT) { - vscode.commands.executeCommand(Commands.TRIGGER_FULL_STACK_ANALYSIS); + vscode.commands.executeCommand(commands.TRIGGER_FULL_STACK_ANALYSIS); record(context, TelemetryActions.vulnerabilityReportPopupOpened, { manifest: fileName, fileName: fileName }); } else { @@ -177,7 +177,7 @@ export function activate(context: vscode.ExtensionContext) { }); } -export function initOutputChannel(): any { +export function initOutputChannel(): DepOutputChannel { const outputChannelDepInit = new DepOutputChannel(); return outputChannelDepInit; } @@ -193,14 +193,14 @@ async function showUpdateNotification(context: vscode.ExtensionContext) { // Retrive current and previous version string to show welcome message const packageJSON = vscode.extensions.getExtension(extensionQualifiedId).packageJSON; const version = packageJSON.version; - const previousVersion = context.globalState.get(GlobalState.Version); + const previousVersion = context.globalState.get(GlobalState.VERSION); // Nothing to display if (version === previousVersion) { return; } // store current version into localStorage - context.globalState.update(GlobalState.Version, version); + context.globalState.update(GlobalState.VERSION, version); const actions: vscode.MessageItem[] = [{ title: 'README' }, { title: 'Release Notes' }]; @@ -235,10 +235,10 @@ function registerStackAnalysisCommands(context: vscode.ExtensionContext) { }; const stackAnalysisCommands = [ - registerCommand(Commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_EDITOR, TelemetryActions.vulnerabilityReportEditor), - registerCommand(Commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_EXPLORER, TelemetryActions.vulnerabilityReportExplorer), - registerCommand(Commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_PIE_BTN, TelemetryActions.vulnerabilityReportPieBtn), - registerCommand(Commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_STATUS_BAR, TelemetryActions.vulnerabilityReportStatusBar), + registerCommand(commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_EDITOR, TelemetryActions.vulnerabilityReportEditor), + registerCommand(commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_EXPLORER, TelemetryActions.vulnerabilityReportExplorer), + registerCommand(commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_PIE_BTN, TelemetryActions.vulnerabilityReportPieBtn), + registerCommand(commands.TRIGGER_FULL_STACK_ANALYSIS_FROM_STATUS_BAR, TelemetryActions.vulnerabilityReportStatusBar), ]; context.subscriptions.push(...stackAnalysisCommands); diff --git a/src/multimanifestmodule.ts b/src/multimanifestmodule.ts index 2ce1a611e..110131217 100644 --- a/src/multimanifestmodule.ts +++ b/src/multimanifestmodule.ts @@ -1,165 +1,51 @@ 'use strict'; import * as vscode from 'vscode'; +import * as path from 'path'; -import { stackanalysismodule } from './stackanalysismodule'; -import { authextension } from './authextension'; -import { StatusMessages } from './constants'; +import * as stackanalysismodule from './stackanalysismodule'; +import { loadContextData } from './contextHandler'; import { DependencyReportPanel } from './dependencyReportPanel'; -export module multimanifestmodule { - /* - * Needed async function in order to wait for user selection in case of - * multi root projects - */ - export const redhatDependencyAnalyticsReportFlow = async (context, uri) => { - let workspaceFolder: vscode.WorkspaceFolder; - if (uri && uri.scheme && uri.scheme === 'file') { - if ( - uri.fsPath && - uri.fsPath.toLowerCase().indexOf('pom.xml') !== -1 - ) { - workspaceFolder = vscode.workspace.getWorkspaceFolder(uri); - stackanalysismodule.processStackAnalysis( - context, - workspaceFolder, - 'maven', - uri - ); - } else if ( - uri.fsPath && - uri.fsPath.toLowerCase().indexOf('package.json') !== -1 - ) { - workspaceFolder = vscode.workspace.getWorkspaceFolder(uri); - stackanalysismodule.processStackAnalysis( - context, - workspaceFolder, - 'npm', - uri - ); - // } else if ( - // uri.fsPath && - // uri.fsPath.toLowerCase().indexOf('requirements.txt') !== -1 - // ) { - // workspaceFolder = vscode.workspace.getWorkspaceFolder(uri); - // stackanalysismodule.processStackAnalysis( - // context, - // workspaceFolder, - // 'pypi', - // uri - // ); - // } else if ( - // uri.fsPath && - // uri.fsPath.toLowerCase().indexOf('go.mod') !== -1 - // ) { - // workspaceFolder = vscode.workspace.getWorkspaceFolder(uri); - // stackanalysismodule.processStackAnalysis( - // context, - // workspaceFolder, - // 'golang', - // uri - // ); - } else { - vscode.window.showInformationMessage( - `File ${uri.fsPath} is not supported!!` - ); - } - } else if ( - vscode.workspace.hasOwnProperty('workspaceFolders') && - vscode.workspace['workspaceFolders'].length > 1 - ) { - let workspaceFolder = await vscode.window.showWorkspaceFolderPick({ - placeHolder: 'Pick Workspace Folder...' - }); - if (workspaceFolder) { - triggerFullStackAnalysis(context, workspaceFolder); - } else { - vscode.window.showInformationMessage(`No Workspace selected.`); - } - } else { - let workspaceFolder = vscode.workspace.workspaceFolders[0]; - triggerFullStackAnalysis(context, workspaceFolder); - } - }; - - export const triggerFullStackAnalysis = ( - context: vscode.ExtensionContext, - workspaceFolder: vscode.WorkspaceFolder - ) => { - const relativePattern = new vscode.RelativePattern( - workspaceFolder, - '{pom.xml,**/package.json}' +export const redhatDependencyAnalyticsReportFlow = async (context, uri) => { + const supportedFiles = ['pom.xml', 'package.json', 'go.mod', 'requirements.txt']; + if ( + uri.fsPath && supportedFiles.includes(path.basename(uri.fsPath)) + ) { + stackanalysismodule.stackAnalysisLifeCycle( + context, + uri.fsPath ); - vscode.workspace.findFiles(relativePattern, '**/node_modules').then( - (result: vscode.Uri[]) => { - if (result && result.length) { - // Do not create an effective pom if no pom.xml is present - let effective_pom_skip = true; - let ecosystem = 'npm'; - let pom_count = 0; - result.forEach(item => { - if (item.fsPath.indexOf('pom.xml') >= 0) { - effective_pom_skip = false; - pom_count += 1; - ecosystem = 'maven'; - } - }); - - if (!effective_pom_skip && pom_count === 0) { - vscode.window.showInformationMessage( - 'Multi ecosystem support is not yet available.' - ); - return; - } else { - stackanalysismodule.processStackAnalysis( - context, - workspaceFolder, - ecosystem - ); - } - } else { - vscode.window.showInformationMessage( - StatusMessages.NO_SUPPORTED_MANIFEST - ); - } - }, - // Other ecosystem flow - (reason: any) => { - vscode.window.showInformationMessage( - StatusMessages.NO_SUPPORTED_MANIFEST - ); - } + } else { + vscode.window.showInformationMessage( + `File ${uri.fsPath || ''} is not supported!!` ); - }; - - export const triggerManifestWs = context => { - return new Promise((resolve, reject) => { - authextension - .authorize_f8_analytics(context) - .then(data => { - if (data) { - DependencyReportPanel.createOrShow(context.extensionPath, null); - resolve(true); - } - }) - .catch(err => { - reject(`Unable to authenticate.`); - }); - }); - }; - - export const triggerTokenValidation = async (provider) => { - switch (provider) { - case 'snyk': - stackanalysismodule.validateSnykToken(); - break; - case 'tidelift': - // add Tidelift token validation here... - break; - case 'sonatype': - // add Sonatype token validation here... - break; - } - }; - -} + } +}; + +export const triggerManifestWs = context => { + return new Promise((resolve, reject) => { + loadContextData(context) + .then(status => { + if (status) { + DependencyReportPanel.createOrShowWebviewPanel(); + resolve(); + } + reject(`Unable to authenticate.`); + }); + }); +}; + +export const triggerTokenValidation = async (provider) => { + switch (provider) { + case 'snyk': + stackanalysismodule.validateSnykToken(); + break; + // case 'tidelift': + // add Tidelift token validation here... + // break; + // case 'sonatype': + // add Sonatype token validation here... + // break; + } +}; \ No newline at end of file diff --git a/src/redhatTelemetry.ts b/src/redhatTelemetry.ts index 874f3b1d1..6cc93f020 100644 --- a/src/redhatTelemetry.ts +++ b/src/redhatTelemetry.ts @@ -13,17 +13,18 @@ export enum TelemetryActions { } let telemetryServiceObj: TelemetryService = null; + async function telemetryService(context: vscode.ExtensionContext): Promise { - if(!telemetryServiceObj) { - const redhatService = await getRedHatService(context); + if (!telemetryServiceObj) { + const redhatService = await getRedHatService(context); telemetryServiceObj = await redhatService.getTelemetryService(); } return telemetryServiceObj; } export async function record(context: vscode.ExtensionContext, eventName: string, properties?: object) { - const telemetryServiceObj: TelemetryService = await telemetryService(context); - let event:TelemetryEvent={ + telemetryServiceObj = await telemetryService(context); + const event: TelemetryEvent = { type: 'track', name: eventName, properties: properties @@ -32,6 +33,6 @@ export async function record(context: vscode.ExtensionContext, eventName: string } export async function startUp(context: vscode.ExtensionContext) { - const telemetryServiceObj: TelemetryService = await telemetryService(context); + telemetryServiceObj = await telemetryService(context); await telemetryServiceObj?.sendStartupEvent(); } \ No newline at end of file diff --git a/src/stackAnalysisService.ts b/src/stackAnalysisService.ts index 4b43bae8c..b96db7078 100644 --- a/src/stackAnalysisService.ts +++ b/src/stackAnalysisService.ts @@ -3,51 +3,48 @@ import * as vscode from 'vscode'; import exhort from '@RHEcosystemAppEng/exhort-javascript-api'; -export module stackAnalysisServices { - - export const exhortApiStackAnalysis = (pathToManifest, options, context) => { - return new Promise(async (resolve, reject) => { - try { - // Get stack analysis in HTML format - let stackAnalysisReportHtml = await exhort.stackAnalysis(pathToManifest, true, options); - resolve(stackAnalysisReportHtml); - } catch (error) { - reject(error); - } - }); - }; - - export const getSnykTokenValidationService = async (options) => { +export const exhortApiStackAnalysis = (pathToManifest, options) => { + return new Promise(async (resolve, reject) => { try { + // Get stack analysis in HTML format + const stackAnalysisReportHtml = await exhort.stackAnalysis(pathToManifest, true, options); + resolve(stackAnalysisReportHtml); + } catch (error) { + reject(error); + } + }); +}; - // Get token validation status code - let tokenValidationStatus = await exhort.validateToken(options); +export const getSnykTokenValidationService = async (options) => { + try { - if ( - tokenValidationStatus === 200 - ) { - vscode.window.showInformationMessage('Snyk Token Validated Successfully'); - } else if ( - tokenValidationStatus === 400 - ) { - vscode.window.showWarningMessage(`Missing token. Please provide a valid Snyk Token in the extension workspace settings. Status: ${tokenValidationStatus}`); - } else if ( - tokenValidationStatus === 401 - ) { - vscode.window.showWarningMessage(`Invalid token. Please provide a valid Snyk Token in the extension workspace settings. Status: ${tokenValidationStatus}`); - } else if ( - tokenValidationStatus === 403 - ) { - vscode.window.showWarningMessage(`Forbidden. The token does not have permissions. Please provide a valid Snyk Token in the extension workspace settings. Status: ${tokenValidationStatus}`); - } else if ( - tokenValidationStatus === 429 - ) { - vscode.window.showWarningMessage(`Too many requests. Rate limit exceeded. Please try again in a little while. Status: ${tokenValidationStatus}`); - } else { - vscode.window.showWarningMessage(`Failed to validate token. Status: ${tokenValidationStatus}`); - } - } catch (error) { - vscode.window.showErrorMessage(`Failed to validate token, Error: ${error}`); + // Get token validation status code + const tokenValidationStatus = await exhort.validateToken(options); + + if ( + tokenValidationStatus === 200 + ) { + vscode.window.showInformationMessage('Snyk Token Validated Successfully'); + } else if ( + tokenValidationStatus === 400 + ) { + vscode.window.showWarningMessage(`Missing token. Please provide a valid Snyk Token in the extension workspace settings. Status: ${tokenValidationStatus}`); + } else if ( + tokenValidationStatus === 401 + ) { + vscode.window.showWarningMessage(`Invalid token. Please provide a valid Snyk Token in the extension workspace settings. Status: ${tokenValidationStatus}`); + } else if ( + tokenValidationStatus === 403 + ) { + vscode.window.showWarningMessage(`Forbidden. The token does not have permissions. Please provide a valid Snyk Token in the extension workspace settings. Status: ${tokenValidationStatus}`); + } else if ( + tokenValidationStatus === 429 + ) { + vscode.window.showWarningMessage(`Too many requests. Rate limit exceeded. Please try again in a little while. Status: ${tokenValidationStatus}`); + } else { + vscode.window.showWarningMessage(`Failed to validate token. Status: ${tokenValidationStatus}`); } - }; -} + } catch (error) { + vscode.window.showErrorMessage(`Failed to validate token, Error: ${error}`); + } +}; \ No newline at end of file diff --git a/src/stackanalysismodule.ts b/src/stackanalysismodule.ts index 7ac7a7bbf..f12559f46 100644 --- a/src/stackanalysismodule.ts +++ b/src/stackanalysismodule.ts @@ -4,134 +4,116 @@ import * as vscode from 'vscode'; import * as path from 'path'; import * as fs from 'fs'; -import { Config } from './config'; -import { snykURL, defaultRedhatDependencyAnalyticsReportFilePath, StatusMessages, Titles, GlobalState } from './constants'; -import { multimanifestmodule } from './multimanifestmodule'; -import { stackAnalysisServices } from './stackAnalysisService'; +import * as config from './config'; +import { snykURL, defaultRedhatDependencyAnalyticsReportFilePath, StatusMessages, Titles } from './constants'; +import * as multimanifestmodule from './multimanifestmodule'; +import * as stackAnalysisServices from './stackAnalysisService'; import { DependencyReportPanel } from './dependencyReportPanel'; +export const stackAnalysisLifeCycle = ( + context, + manifestFilePath, +) => { + vscode.window.withProgress( + { + location: vscode.ProgressLocation.Window, + title: Titles.EXT_TITLE + }, + p => { + return new Promise(async (resolve, reject) => { + + // get config data from extension workspace setting + const apiConfig = config.getApiConfig(); + + // create webview panel + await multimanifestmodule.triggerManifestWs(context); + p.report({ + message: StatusMessages.WIN_ANALYZING_DEPENDENCIES + }); -export module stackanalysismodule { - export const stackAnalysisLifeCycle = ( - context, - manifestFilePath, - ) => { - vscode.window.withProgress( - { - location: vscode.ProgressLocation.Window, - title: Titles.EXT_TITLE - }, - p => { - return new Promise(async (resolve, reject) => { - - // get config data from extension workspace setting - const apiConfig = Config.getApiConfig(); - - // create webview panel - await multimanifestmodule.triggerManifestWs(context); - p.report({ - message: StatusMessages.WIN_ANALYZING_DEPENDENCIES - }); - - // set up configuration options for the stack analysis request - const options = {}; - options['EXHORT_MVN_PATH'] = Config.getMavenExecutable(); - options['EXHORT_NPM_PATH'] = Config.getNodeExecutable(); - options['EXHORT_DEV_MODE'] = GlobalState.ExhortDevMode; - if (apiConfig.exhortSnykToken !== '') { - options['EXHORT_SNYK_TOKEN'] = apiConfig.exhortSnykToken; - } - - // execute stack analysis - stackAnalysisServices.exhortApiStackAnalysis(manifestFilePath, options, context) - .then(resp => { - p.report({ - message: StatusMessages.WIN_GENERATING_DEPENDENCIES - }); - let reportFilePath = apiConfig.redHatDependencyAnalyticsReportFilePath || defaultRedhatDependencyAnalyticsReportFilePath; - let reportDirectoryPath = path.dirname(reportFilePath); - if (!fs.existsSync(reportDirectoryPath)) { - fs.mkdirSync(reportDirectoryPath, { recursive: true }); - } - fs.writeFile(reportFilePath, resp, (err) => { - if (err) { - reject(err); - } else { - if (DependencyReportPanel.currentPanel) { - DependencyReportPanel.currentPanel.doUpdatePanel(resp); - } - p.report({ - message: StatusMessages.WIN_SUCCESS_DEPENDENCY_ANALYSIS - }); - resolve(null); + // set up configuration options for the stack analysis request + const options = { + 'RHDA_TOKEN': process.env.VSCEXT_TELEMETRY_ID, + 'RHDA_SOURCE': process.env.VSCEXT_UTM_SOURCE, + 'EXHORT_DEV_MODE': process.env.VSCEXT_EXHORT_DEV_MODE, + 'MATCH_MANIFEST_VERSIONS': apiConfig.matchManifestVersions ? 'true' : 'false', + 'EXHORT_MVN_PATH': config.getMvnExecutable(), + 'EXHORT_NPM_PATH': config.getNpmExecutable(), + 'EXHORT_GO_PATH': config.getGoExecutable(), + 'EXHORT_PYTHON3_PATH': config.getPython3Executable(), + 'EXHORT_PIP3_PATH': config.getPip3Executable(), + 'EXHORT_PYTHON_PATH': config.getPythonExecutable(), + 'EXHORT_PIP_PATH': config.getPipExecutable() + }; + + if (apiConfig.exhortSnykToken !== '') { + options['EXHORT_SNYK_TOKEN'] = apiConfig.exhortSnykToken; + } + + // execute stack analysis + stackAnalysisServices.exhortApiStackAnalysis(manifestFilePath, options) + .then(resp => { + p.report({ + message: StatusMessages.WIN_GENERATING_DEPENDENCIES + }); + const reportFilePath = apiConfig.redHatDependencyAnalyticsReportFilePath || defaultRedhatDependencyAnalyticsReportFilePath; + const reportDirectoryPath = path.dirname(reportFilePath); + if (!fs.existsSync(reportDirectoryPath)) { + fs.mkdirSync(reportDirectoryPath, { recursive: true }); + } + fs.writeFile(reportFilePath, resp, (err) => { + if (err) { + reject(err); + } else { + if (DependencyReportPanel.currentPanel) { + DependencyReportPanel.currentPanel.doUpdatePanel(resp); } - }); - }) - .catch(err => { - p.report({ - message: StatusMessages.WIN_FAILURE_DEPENDENCY_ANALYSIS - }); - handleError(err); - reject(); + p.report({ + message: StatusMessages.WIN_SUCCESS_DEPENDENCY_ANALYSIS + }); + resolve(null); + } }); - }); - } - ); - }; - - export const processStackAnalysis = ( - context, - workspaceFolder, - ecosystem, - uri = null - ) => { - let manifestFilePath: string; - if (ecosystem === 'maven') { - manifestFilePath = uri - ? uri.fsPath - : path.join(workspaceFolder.uri.fsPath, 'pom.xml'); - } else if (ecosystem === 'npm') { - manifestFilePath = uri - ? uri.fsPath - : path.join(workspaceFolder.uri.fsPath, 'package.json'); - // } else if (ecosystem === 'pypi') { - // manifestFilePath = uri - // ? uri.fsPath.split('requirements.txt')[0] - // : workspaceFolder.uri.fsPath; - // } else if (ecosystem === 'golang') { - // manifestFilePath = uri - // ? uri.fsPath - // : workspaceFolder.uri.fsPath; - } - stackAnalysisLifeCycle(context, manifestFilePath); - }; - - export const handleError = err => { - if (DependencyReportPanel.currentPanel) { - DependencyReportPanel.currentPanel.doUpdatePanel('error'); + }) + .catch(err => { + p.report({ + message: StatusMessages.WIN_FAILURE_DEPENDENCY_ANALYSIS + }); + handleError(err); + reject(); + }); + }); } - vscode.window.showErrorMessage(err); - }; - - export const validateSnykToken = async () => { - const apiConfig = Config.getApiConfig(); - if (apiConfig.exhortSnykToken !== '') { - - // set up configuration options for the token validation request - let options = { - 'EXHORT_SNYK_TOKEN': apiConfig.exhortSnykToken, - 'EXHORT_DEV_MODE': GlobalState.ExhortDevMode, - }; - - // execute stack analysis - stackAnalysisServices.getSnykTokenValidationService(options); - - } else { - - vscode.window.showInformationMessage(`Please note that if you fail to provide a valid Snyk Token in the extension workspace settings, + ); +}; + +export const handleError = err => { + if (DependencyReportPanel.currentPanel) { + DependencyReportPanel.currentPanel.doUpdatePanel('error'); + } + vscode.window.showErrorMessage(err.message); +}; + +export const validateSnykToken = async () => { + const apiConfig = config.getApiConfig(); + if (apiConfig.exhortSnykToken !== '') { + + // set up configuration options for the token validation request + const options = { + 'RHDA_TOKEN': process.env.VSCEXT_TELEMETRY_ID, + 'RHDA_SOURCE': process.env.VSCEXT_UTM_SOURCE, + 'EXHORT_DEV_MODE': process.env.VSCEXT_EXHORT_DEV_MODE, + 'EXHORT_SNYK_TOKEN': apiConfig.exhortSnykToken + }; + + // execute stack analysis + stackAnalysisServices.getSnykTokenValidationService(options); + + } else { + + vscode.window.showInformationMessage(`Please note that if you fail to provide a valid Snyk Token in the extension workspace settings, Snyk vulnerabilities will not be displayed. To resolve this issue, please obtain a valid token from the following link: [here](${snykURL}).`); - } - }; -} + } +}; diff --git a/src/template.ts b/src/template.ts index 8e39a9b12..bd0deefcf 100644 --- a/src/template.ts +++ b/src/template.ts @@ -3,21 +3,15 @@ import { Titles } from './constants'; /** - * Commonly used commands + * Commonly used templates */ -export namespace Templates { - /** - * Template for loaders - */ - export const LOADER_TEMPLATE = ` +export const LOADER_TEMPLATE = ` - - - - - Dependency Analysis - - - -
-
- - - - - - - - -   Security Issues - -
-
-
-
-

Below is a list of dependencies affected with CVE, as well as vulnerability only found using Snyk's vulnerability database.

-
-
-

Dependencies with security issues in your stack.

-

Dependencies with high common vulnerabilities and exposures (CVE) score.

-

- - - - - - - - - Total Vulnerabilities: 7 -

-

- - - - - - - - - Vulnerable Dependencies: 1 -

-
-
-
-
- -
-
Commonly Known Vulnerabilities
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#Dependencies# Direct# TransitiveHighest CVSSHighest SeverityRed Hat remediation available
-
-

Details of the dependency: - log4j:log4j -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SeverityExploit MaturityDescriptionCVSSCVERemediation
- - CRITICAL - - - Proof of concept codeDeserialization of Untrusted Data -
-
9.8/10
-
-
-
-
- -
- CVE-2019-17571 - - - SNYK-JAVA-LOG4J-572732 - -
- - HIGH - - - No known exploitSQL Injection -
-
8.1/10
-
-
-
-
- -
- CVE-2022-23305 - - - SNYK-JAVA-LOG4J-2342645 - -
- - HIGH - - - No known exploitDeserialization of Untrusted Data -
-
8.1/10
-
-
-
-
- -
- CVE-2022-23307 - - - SNYK-JAVA-LOG4J-2342646 - -
- - HIGH - - - No known exploitDeserialization of Untrusted Data -
-
8.1/10
-
-
-
-
- -
- CVE-2022-23302 - - - SNYK-JAVA-LOG4J-2342647 - -
- - MEDIUM - - - Proof of concept codeArbitrary Code Execution -
-
6.6/10
-
-
-
-
- -
- CVE-2021-4104 - - - SNYK-JAVA-LOG4J-2316893 - -
- - MEDIUM - - - No known exploitDenial of Service (DoS) -
-
5.9/10
-
-
-
-
- -
- CVE-2023-26464 - - - SNYK-JAVA-LOG4J-3358774 - -
- - LOW - - - No known exploitMan-in-the-Middle (MitM) -
-
3.7/10
-
-
-
-
- -
- CVE-2020-9488 - - - SNYK-JAVA-LOG4J-1300176 - -
-
- -
- - - - - - - - - - - - - - -
DependenciesSeverityExploit MaturityDescriptionCVSSCVERemediation
-
-
-
-
- - -
- - - - - - - \ No newline at end of file diff --git a/test/resources/sampleMavenApp/response.json b/test/resources/sampleMavenApp/response.json deleted file mode 100644 index 36486d1e6..000000000 --- a/test/resources/sampleMavenApp/response.json +++ /dev/null @@ -1,234 +0,0 @@ -{ - "summary": { - "dependencies": { - "scanned": 1, - "transitive": 0 - }, - "vulnerabilities": { - "direct": 1, - "total": 7, - "critical": 1, - "high": 3, - "medium": 2, - "low": 1 - }, - "providerStatuses": [ - { - "ok": true, - "provider": "snyk", - "status": 200, - "message": "OK" - } - ] - }, - "dependencies": [ - { - "ref": "pkg:maven/log4j/log4j@1.2.17", - "issues": [ - { - "id": "SNYK-JAVA-LOG4J-572732", - "title": "Deserialization of Untrusted Data", - "source": "snyk", - "cvss": { - "attackVector": "Network", - "attackComplexity": "Low", - "privilegesRequired": "None", - "userInteraction": "None", - "scope": "Unchanged", - "confidentialityImpact": "High", - "integrityImpact": "High", - "availabilityImpact": "High", - "exploitCodeMaturity": "Proof of concept code", - "remediationLevel": null, - "reportConfidence": null, - "cvss": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H/E:P" - }, - "cvssScore": 9.8, - "severity": "CRITICAL", - "cves": [ - "CVE-2019-17571" - ], - "unique": false - }, - { - "id": "SNYK-JAVA-LOG4J-2342645", - "title": "SQL Injection", - "source": "snyk", - "cvss": { - "attackVector": "Network", - "attackComplexity": "High", - "privilegesRequired": "None", - "userInteraction": "None", - "scope": "Unchanged", - "confidentialityImpact": "High", - "integrityImpact": "High", - "availabilityImpact": "High", - "exploitCodeMaturity": null, - "remediationLevel": null, - "reportConfidence": null, - "cvss": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H" - }, - "cvssScore": 8.1, - "severity": "HIGH", - "cves": [ - "CVE-2022-23305" - ], - "unique": false - }, - { - "id": "SNYK-JAVA-LOG4J-2342646", - "title": "Deserialization of Untrusted Data", - "source": "snyk", - "cvss": { - "attackVector": "Network", - "attackComplexity": "High", - "privilegesRequired": "None", - "userInteraction": "None", - "scope": "Unchanged", - "confidentialityImpact": "High", - "integrityImpact": "High", - "availabilityImpact": "High", - "exploitCodeMaturity": null, - "remediationLevel": null, - "reportConfidence": null, - "cvss": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H" - }, - "cvssScore": 8.1, - "severity": "HIGH", - "cves": [ - "CVE-2022-23307" - ], - "unique": false - }, - { - "id": "SNYK-JAVA-LOG4J-2342647", - "title": "Deserialization of Untrusted Data", - "source": "snyk", - "cvss": { - "attackVector": "Network", - "attackComplexity": "High", - "privilegesRequired": "None", - "userInteraction": "None", - "scope": "Unchanged", - "confidentialityImpact": "High", - "integrityImpact": "High", - "availabilityImpact": "High", - "exploitCodeMaturity": null, - "remediationLevel": null, - "reportConfidence": null, - "cvss": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H" - }, - "cvssScore": 8.1, - "severity": "HIGH", - "cves": [ - "CVE-2022-23302" - ], - "unique": false - }, - { - "id": "SNYK-JAVA-LOG4J-2316893", - "title": "Arbitrary Code Execution", - "source": "snyk", - "cvss": { - "attackVector": "Network", - "attackComplexity": "High", - "privilegesRequired": "High", - "userInteraction": "None", - "scope": "Unchanged", - "confidentialityImpact": "High", - "integrityImpact": "High", - "availabilityImpact": "High", - "exploitCodeMaturity": "Proof of concept code", - "remediationLevel": null, - "reportConfidence": null, - "cvss": "CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H/E:P" - }, - "cvssScore": 6.6, - "severity": "MEDIUM", - "cves": [ - "CVE-2021-4104" - ], - "unique": false - }, - { - "id": "SNYK-JAVA-LOG4J-3358774", - "title": "Denial of Service (DoS)", - "source": "snyk", - "cvss": { - "attackVector": "Network", - "attackComplexity": "High", - "privilegesRequired": "None", - "userInteraction": "None", - "scope": "Unchanged", - "confidentialityImpact": "None", - "integrityImpact": "None", - "availabilityImpact": "High", - "exploitCodeMaturity": null, - "remediationLevel": null, - "reportConfidence": null, - "cvss": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H" - }, - "cvssScore": 5.9, - "severity": "MEDIUM", - "cves": [ - "CVE-2023-26464" - ], - "unique": false - }, - { - "id": "SNYK-JAVA-LOG4J-1300176", - "title": "Man-in-the-Middle (MitM)", - "source": "snyk", - "cvss": { - "attackVector": "Network", - "attackComplexity": "High", - "privilegesRequired": "None", - "userInteraction": "None", - "scope": "Unchanged", - "confidentialityImpact": "Low", - "integrityImpact": "None", - "availabilityImpact": "None", - "exploitCodeMaturity": null, - "remediationLevel": null, - "reportConfidence": null, - "cvss": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N" - }, - "cvssScore": 3.7, - "severity": "LOW", - "cves": [ - "CVE-2020-9488" - ], - "unique": false - } - ], - "transitive": [], - "recommendation": null, - "remediations": {}, - "highestVulnerability": { - "id": "SNYK-JAVA-LOG4J-1300176", - "title": "Man-in-the-Middle (MitM)", - "source": "snyk", - "cvss": { - "attackVector": "Network", - "attackComplexity": "High", - "privilegesRequired": "None", - "userInteraction": "None", - "scope": "Unchanged", - "confidentialityImpact": "Low", - "integrityImpact": "None", - "availabilityImpact": "None", - "exploitCodeMaturity": null, - "remediationLevel": null, - "reportConfidence": null, - "cvss": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N" - }, - "cvssScore": 3.7, - "severity": "LOW", - "cves": [ - "CVE-2020-9488" - ], - "unique": false - } - } - ] -} \ No newline at end of file diff --git a/test/resources/sampleMavenApp/sbom.json b/test/resources/sampleMavenApp/sbom.json deleted file mode 100644 index d7efcde62..000000000 --- a/test/resources/sampleMavenApp/sbom.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "bomFormat": "CycloneDX", - "specVersion": "1.4", - "version": 1, - "metadata": { - "timestamp": "2023-07-25T10:27:47Z", - "component": { - "group": "pom-with-deps-no-ignore", - "name": "pom-with-dependency-not-ignored-for-tests", - "version": "0.0.1", - "purl": "pkg:maven/pom-with-deps-no-ignore/pom-with-dependency-not-ignored-for-tests@0.0.1", - "type": "application", - "bom-ref": "pkg:maven/pom-with-deps-no-ignore/pom-with-dependency-not-ignored-for-tests@0.0.1" - } - }, - "components": [ - { - "group": "pom-with-deps-no-ignore", - "name": "pom-with-dependency-not-ignored-for-tests", - "version": "0.0.1", - "purl": "pkg:maven/pom-with-deps-no-ignore/pom-with-dependency-not-ignored-for-tests@0.0.1", - "type": "application", - "bom-ref": "pkg:maven/pom-with-deps-no-ignore/pom-with-dependency-not-ignored-for-tests@0.0.1" - }, - { - "group": "log4j", - "name": "log4j", - "version": "1.2.17", - "purl": "pkg:maven/log4j/log4j@1.2.17", - "type": "library", - "bom-ref": "pkg:maven/log4j/log4j@1.2.17" - } - ], - "dependencies": [ - { - "ref": "pkg:maven/pom-with-deps-no-ignore/pom-with-dependency-not-ignored-for-tests@0.0.1", - "dependsOn": [ - "pkg:maven/log4j/log4j@1.2.17" - ] - }, - { - "ref": "pkg:maven/log4j/log4j@1.2.17", - "dependsOn": [] - } - ] -} \ No newline at end of file diff --git a/test/resources/sampleNodeApp/package.json b/test/resources/sampleNodeApp/package.json deleted file mode 100644 index 26439868e..000000000 --- a/test/resources/sampleNodeApp/package.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "name": "fabric8-analytics", - "displayName": "Dependency Analytics", - "description": "Insights about your application dependencies: Security, License compatibility and AI based guidance to choose appropriate dependencies for your application.", - "version": "0.1.0", - "author": "Red Hat", - "publisher": "redhat", - "preview": true, - "extensionDependencies": [ - "redhat.vscode-commons" - ], - "contributors": [ - { - "name": "Jaivardhan Kumar", - "email": "jakumar@redhat.com" - }, - { - "name": "Arunprasad Rajkumar", - "email": "arajkuma@redhat.com" - } - ], - "license": "Apache-2.0", - "galleryBanner": { - "color": "#000000", - "theme": "dark" - }, - "bugs": { - "url": "https://github.com/fabric8-analytics/fabric8-analytics-vscode-extension/issues", - "email": "arajkuma@redhat.com" - }, - "repository": { - "type": "git", - "url": "https://github.com/fabric8-analytics/fabric8-analytics-vscode-extension" - }, - "homepage": "https://github.com/fabric8-analytics/fabric8-analytics-vscode-extension/blob/master/README.md", - "categories": [ - "Programming Languages", - "Other" - ], - "keywords": [ - "Dependencies", - "Vulnerabilities", - "License", - "Node", - "Maven" - ], - "icon": "icon/trusted_content_icon.png", - "engines": { - "vscode": "^1.12.0" - }, - "activationEvents": [ - "onCommand:fabric8.fabric8AnalyticsWidget", - "onCommand:fabric8.stackAnalysis", - "onLanguage:xml", - "onLanguage:json" - ], - "main": "./out/src/extension", - "contributes": { - "languages": [ - { - "id": "Security", - "aliases": [ - "CVE" - ] - }, - { - "id": "application-license", - "aliases": [ - "license-conflict" - ] - }, - { - "id": "Insights", - "aliases": [ - "Artificial-Intelligence", - "Deep-Learning", - "Machine-Learning", - "Analytics", - "suggest-dependencies" - ] - }, - { - "id": "Opensource", - "aliases": [ - "maven", - "java", - "npm", - "pom.xml", - "package.json" - ] - } - ], - "commands": [ - { - "key": "ctrl+j", - "command": "fabric8.fabric8AnalyticsWidget", - "title": "Generate application stack report on manifest file" - }, - { - "key": "ctrl+k", - "command": "fabric8.stackAnalysis", - "title": "Generate application stack report on Workspace" - } - ], - "menus": { - "editor/title": [ - { - "command": "fabric8.fabric8AnalyticsWidget", - "when": "resourceLangId == xml" - }, - { - "command": "fabric8.stackAnalysis" - } - ], - "explorer/context": [ - { - "command": "fabric8.stackAnalysis" - } - ], - "editor/context": [ - { - "command": "fabric8.fabric8AnalyticsWidget", - "when": "resourceLangId == xml" - }, - { - "command": "fabric8.stackAnalysis" - }, - { - "command": "fabric8.fabric8AnalyticsWidget", - "when": "resourceFilename == package.json" - } - ] - }, - "configuration": { - "type": "object", - "title": "Openshift.io configuration", - "properties": { - "componentAnalysisServer.maxNumberOfProblems": { - "type": "number", - "default": 100, - "description": "Controls the maximum number of problems produced by the server." - }, - "componentAnalysisServer.trace.server": { - "type": "string", - "enum": [ - "off", - "messages", - "verbose" - ], - "default": "off", - "description": "Traces the communication between VSCode and the componentAnalysisServer service." - }, - "maven.executable.path": { - "type": "string", - "default": "", - "description": "Specifies absolute path of mvn executable.", - "scope": "window" - }, - "npm.executable.path": { - "type": "string", - "default": "", - "description": "Specifies absolute path of npm executable.", - "scope": "window" - } - } - } - }, - "scripts": { - "vscode:prepublish": "tsc -p ./", - "compile": "tsc -watch -p ./", - "postinstall": "node ./node_modules/vscode/bin/install", - "test": "node ./node_modules/vscode/bin/test", - "reinstall": "npm cache verify && npm install" - }, - "devDependencies": { - "@types/glob": "^7.1.1", - "@types/mocha": "^5.2.0", - "@types/node": "^6.0.52", - "@types/sinon": "^5.0.2", - "decache": "^4.4.0", - "mocha": "^5.2.0", - "tslint": "^4.3.1", - "chai": "^4.1.2", - "sinon": "^7.0.0", - "sinon-chai": "^3.2.0", - "typescript": "^2.6.1", - "vscode": "^1.1.21", - "glob": "^7.1.3", - "istanbul": "^0.4.5", - "mocha-jenkins-reporter": "^0.4.0", - "remap-istanbul": "^0.12.0" - }, - "dependencies": { - "fabric8-analytics-lsp-server": "0.1.37", - "request": "2.88.0", - "fs": "0.0.1-security", - "path": "^0.12.7", - "vscode-languageclient": "3.1.0" - } -} \ No newline at end of file diff --git a/test/runTest.ts b/test/runTest.ts index 80292b11c..f4cb60a2b 100644 --- a/test/runTest.ts +++ b/test/runTest.ts @@ -22,12 +22,7 @@ async function main() { stdio: 'inherit' }); // Download VS Code, unzip it and run the integration test - await runTests({ - vscodeExecutablePath, - extensionDevelopmentPath, - extensionTestsPath, - launchArgs: [path.resolve(__dirname, '../../test/resources/')] - }); + await runTests({ vscodeExecutablePath, extensionDevelopmentPath, extensionTestsPath }); } catch (err) { console.error(`Failed to run tests. ${err}`); process.exit(1); diff --git a/test/stackAnalysisModule.test.ts b/test/stackAnalysisModule.test.ts index 464055c65..3dd36e3ce 100644 --- a/test/stackAnalysisModule.test.ts +++ b/test/stackAnalysisModule.test.ts @@ -4,11 +4,10 @@ import * as sinonChai from 'sinon-chai'; import * as vscode from 'vscode'; import { context } from './vscontext.mock'; -import { stackanalysismodule } from '../src/stackanalysismodule'; -import { multimanifestmodule } from '../src/multimanifestmodule'; -import { stackAnalysisServices } from '../src/stackAnalysisService'; -import { Config } from '../src/config'; -import { GlobalState } from '../src/constants'; +import * as stackanalysismodule from '../src/stackanalysismodule'; +import * as multimanifestmodule from '../src/multimanifestmodule'; +import * as stackAnalysisServices from '../src/stackAnalysisService'; +import * as Config from '../src/config'; const expect = chai.expect; chai.use(sinonChai); @@ -24,32 +23,6 @@ suite('stackanalysis module', () => { sandbox.restore(); }); - test('processStackAnalysis should call stackAnalysisLifeCycle for maven', async () => { - const workspaceFolder = { uri: vscode.Uri.file('/path/to/mockFolder') } as vscode.WorkspaceFolder; - let stackAnalysisLifeCycleStub = sandbox.stub(stackanalysismodule, 'stackAnalysisLifeCycle'); - - await stackanalysismodule.processStackAnalysis( - context, - workspaceFolder, - 'maven' - ); - - expect(stackAnalysisLifeCycleStub.calledOnceWithExactly(context, '/path/to/mockFolder/pom.xml')).to.be.true; - }); - - test('processStackAnalysis should call stackAnalysisLifeCycle for npm', async () => { - const workspaceFolder = { uri: vscode.Uri.file('/path/to/mockFolder') } as vscode.WorkspaceFolder; - let stackAnalysisLifeCycleStub = sandbox.stub(stackanalysismodule, 'stackAnalysisLifeCycle'); - - await stackanalysismodule.processStackAnalysis( - context, - workspaceFolder, - 'npm' - ); - - expect(stackAnalysisLifeCycleStub.calledOnceWithExactly(context, '/path/to/mockFolder/package.json')).to.be.true; - }); - test('stackAnalysisLifeCycle should call chain of promises', async () => { const withProgressSpy = sandbox.spy(vscode.window, 'withProgress'); const triggerManifestWsStub = sandbox.stub(multimanifestmodule, 'triggerManifestWs'); @@ -71,7 +44,7 @@ suite('stackanalysis module', () => { await stackanalysismodule.validateSnykToken(); expect(getApiConfigStub).to.be.calledOnce; - expect(getSnykTokenValidationServiceStub.calledOnceWithExactly({ EXHORT_SNYK_TOKEN: 'mockToken', 'EXHORT_DEV_MODE': GlobalState.ExhortDevMode })).to.be.true; + expect(getSnykTokenValidationServiceStub.calledOnceWithExactly({ EXHORT_SNYK_TOKEN: 'mockToken', 'EXHORT_DEV_MODE': process.env.VSCEXT_EXHORT_DEV_MODE, 'RHDA_TOKEN': process.env.VSCEXT_TELEMETRY_ID, 'RHDA_SOURCE': process.env.VSCEXT_UTM_SOURCE })).to.be.true; }); test('validateSnykToken should show information message if no token is provided', async () => { diff --git a/test/stackAnalysisService.test.ts b/test/stackAnalysisService.test.ts index afe4fd118..08e398969 100644 --- a/test/stackAnalysisService.test.ts +++ b/test/stackAnalysisService.test.ts @@ -4,8 +4,7 @@ import * as sinonChai from 'sinon-chai'; import * as fs from 'fs'; import * as vscode from 'vscode'; -import { context } from './vscontext.mock'; -import { stackAnalysisServices } from '../src/stackAnalysisService'; +import * as stackAnalysisServices from '../src/stackAnalysisService'; import exhort from '@RHEcosystemAppEng/exhort-javascript-api'; @@ -27,7 +26,7 @@ suite('stacknalysis Services', () => { test('exhortApiStackAnalysis should return HTML', async () => { const pathToManifest = 'sampleMavenApp/pom.xml'; - const result = await stackAnalysisServices.exhortApiStackAnalysis(pathToManifest, options, context); + const result = await stackAnalysisServices.exhortApiStackAnalysis(pathToManifest, options); // Compare the result with the mocked response const mockHtmlResponse = fs.readFileSync('sampleMavenApp/response.html', 'utf8'); @@ -37,7 +36,7 @@ suite('stacknalysis Services', () => { test('exhortApiStackAnalysis should return error', async () => { const pathToManifest = '/path/to/mock/pom.xml'; sandbox.stub(exhort, 'stackAnalysis').rejects(new Error('Mock error message')); - expect(await stackAnalysisServices.exhortApiStackAnalysis(pathToManifest, options, context)).to.throw(new Error('Mock error message')); + expect(await stackAnalysisServices.exhortApiStackAnalysis(pathToManifest, options)).to.throw(new Error('Mock error message')); }); diff --git a/test/vscontext.mock.ts b/test/vscontext.mock.ts index 3d8eaa71c..40d5aedc6 100644 --- a/test/vscontext.mock.ts +++ b/test/vscontext.mock.ts @@ -22,7 +22,6 @@ export const context: vscode.ExtensionContext = { extensionPath: 'path', storagePath: 'string', logPath: 'string', - // tslint:disable-next-line:no-empty subscriptions: { dispose(): any { } }[0], workspaceState: new DummyMemento(), globalState: new DummyMemento(), diff --git a/tslint.json b/tslint.json deleted file mode 100644 index ba71bbf8a..000000000 --- a/tslint.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "defaultSeverity": "error", - "rules": { - "no-unused-expression": true, - "no-duplicate-variable": true, - "curly": true, - "class-name": true, - "semicolon": true, - "triple-equals": true, - "quotemark": [ - true, - "single", - "avoid-escape" - ], - "no-debugger": true, - "no-empty": true, - "no-var-keyword": true, - "no-unsafe-finally": true, - "new-parens": true, - "no-string-throw": true, - "no-require-imports": true - } -} \ No newline at end of file diff --git a/webpack.config.ts b/webpack.config.ts index 2d36a3fd1..a865ab04c 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -9,21 +9,10 @@ const glob = require('glob'); module.exports = (env, argv) => { - plugins: [ - new webpack.ProvidePlugin({ - WebSocket: 'ws', - fetch: ['node-fetch', 'default'], - }), - ]; - let entry = { 'extension': './src/extension.ts', 'server': './node_modules/@fabric8-analytics/fabric8-analytics-lsp-server/dist/server.js', }; - // debug - if (argv.mode !== 'production') { - /* entry['test/all.test'] = glob.sync('./test/*.test.ts'); */ - } /**@type {import('webpack').Configuration}*/ const config = { target: 'node', // vscode extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/