├── .eslintrc.json
├── .gitignore
├── .vscode
├── extensions.json
├── launch.json
├── settings.json
└── tasks.json
├── .vscodeignore
├── CHANGELOG.md
├── LICENCE
├── README.md
├── html_report
└── overview_template.html
├── images
├── code_highlight_example.png
└── template_example.png
├── package-lock.json
├── package.json
├── src
├── arrayUtils.ts
├── coverageCache.ts
├── extension.ts
├── fsScanning.ts
└── gcovInterface.ts
└── tsconfig.json
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "root": true,
3 | "parser": "@typescript-eslint/parser",
4 | "parserOptions": {
5 | "ecmaVersion": 6,
6 | "sourceType": "module"
7 | },
8 | "plugins": [
9 | "@typescript-eslint"
10 | ],
11 | "rules": {
12 | "@typescript-eslint/class-name-casing": "warn",
13 | "@typescript-eslint/semi": "warn",
14 | "curly": "warn",
15 | "eqeqeq": "warn",
16 | "no-throw-literal": "warn",
17 | "semi": "off"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | out
2 | node_modules
3 | .vscode-test/
4 | *.vsix
5 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | // See http://go.microsoft.com/fwlink/?LinkId=827846
3 | // for the documentation about the extensions.json format
4 | "recommendations": [
5 | "dbaeumer.vscode-eslint"
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | // A launch configuration that compiles the extension and then opens it inside a new window
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | {
6 | "version": "0.2.0",
7 | "configurations": [
8 | {
9 | "name": "Run Extension",
10 | "type": "extensionHost",
11 | "request": "launch",
12 | "runtimeExecutable": "${execPath}",
13 | "args": [
14 | "--extensionDevelopmentPath=${workspaceFolder}"
15 | ],
16 | "outFiles": [
17 | "${workspaceFolder}/out/**/*.js"
18 | ],
19 | "preLaunchTask": "${defaultBuildTask}"
20 | }
21 | ]
22 | }
23 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | // Place your settings in this file to overwrite default and user settings.
2 | {
3 | "files.exclude": {
4 | "out": false // set this to true to hide the "out" folder with the compiled JS files
5 | },
6 | "search.exclude": {
7 | "out": true // set this to false to include "out" folder in search results
8 | },
9 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts
10 | "typescript.tsc.autoDetect": "off",
11 | "editor.formatOnSave": true,
12 | "editor.defaultFormatter": "esbenp.prettier-vscode"
13 | }
14 |
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | // See https://go.microsoft.com/fwlink/?LinkId=733558
2 | // for the documentation about the tasks.json format
3 | {
4 | "version": "2.0.0",
5 | "tasks": [
6 | {
7 | "type": "npm",
8 | "script": "watch",
9 | "problemMatcher": "$tsc-watch",
10 | "isBackground": true,
11 | "presentation": {
12 | "reveal": "never"
13 | },
14 | "group": {
15 | "kind": "build",
16 | "isDefault": true
17 | }
18 | }
19 | ]
20 | }
21 |
--------------------------------------------------------------------------------
/.vscodeignore:
--------------------------------------------------------------------------------
1 | .vscode/**
2 | .vscode-test/**
3 | out/test/**
4 | src/**
5 | .gitignore
6 | vsc-extension-quickstart.md
7 | **/tsconfig.json
8 | **/.eslintrc.json
9 | **/*.map
10 | **/*.ts
11 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | ## Unreleased
2 |
3 | ## 0.6.0 - 2024-07-22
4 |
5 | ### Changed
6 |
7 | - The gcov binary can now be overridden per workspace or folder.
8 |
9 | ### Fixed
10 |
11 | - Slightly improved error reporting when invoking gcov.
12 |
13 | ## 0.5.0 - 2022-12-04
14 |
15 | ### Added
16 |
17 | - Show function coverage in percent.
18 | - Show file coverage in status bar.
19 | - New `Generate Summary as HTML` command.
20 |
21 | ### Changed
22 |
23 | - The `View Functions by Call Count` command now shortens templated function names.
24 |
25 | ## 0.4.0 - 2020-08-26
26 |
27 | ### Fixed
28 |
29 | - Better support for Windows paths when using MinGW-gcc.
30 |
31 | ## 0.3.0 - 2020-07-11
32 |
33 | ### Changed
34 |
35 | - Suggest using `--coverage` instead of `-fprofile-arcs -ftest-coverage` in readme.
36 | - Sort lines in tooltip by call count.
37 | - Improve error messages.
38 |
39 | ## 0.2.0 - 2020-06-21
40 |
41 | ### Changed
42 |
43 | - Renamed "include directories" to "build directories".
44 | - Improved error message when no .gcda files have been found.
45 | - Make gcc version requirement a bit more clear in readme.
46 |
47 | ## 0.1.0 - 2020-06-20
48 |
49 | ### Added
50 |
51 | - New `Gcov Viewer: Show` command.
52 | - New `Gcov Viewer: Hide` command.
53 | - New `Gcov Viewer: Toggle` command.
54 | - New `Gcov Viewer: Reload .gcda Files` command.
55 | - New `Gcov Viewer: Delete .gcda Files` command.
56 | - New `Gcov Viewer: Select Include Directory` command.
57 | - New `Gcov Viewer: Dump Paths with Coverage Data` command.
58 | - New `Gcov Viewer: View Functions by Call Count` command.
59 | - New `gcovViewer.includeDirectories` setting.
60 | - New `gcovViewer.gcovBinary` setting.
61 | - New `gcovViewer.highlightMissedLines` setting.
62 |
--------------------------------------------------------------------------------
/LICENCE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Jacques Lucke
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Gcov Viewer
2 |
3 | [Gcov](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html) is a tool you can use in conjunction with GCC to test code coverage in your programs. This extension visualizes the output of gcov in Visual Studio Code. It allows you to see which lines of the program have been executed and how often.
4 |
5 | ## Usage
6 |
7 | 1. Compile your code with `gcc`/`g++` (version >= 9) with `--coverage` and without optimizations.
8 | 2. Run your program or tests.
9 | 3. Open a source file in vscode and use `ctrl+shift+P` to run the `Gcov Viewer: Show` command.
10 |
11 | During compilation, `gcc` will generate a `.gcno` file next to every `.o` file. When you run the program, it will create `.gcda` files in the same location. Those contain information about how often functions and lines have been executed.
12 |
13 | This vscode extension uses the `gcov` program to parse these additional files and displays the information on top of your source files. For this to work, it has to find the generated `.gcda` for a given project. Those are usually in your build directory. If the extension does not find them on its own, you have to edit the `gcovViewer.buildDirectories` setting of your workspace folder. The most convenient way to do this is to use the `Gcov Viewer: Select Build Directory` command.
14 |
15 | ## Troubleshooting
16 |
17 | - Try passing `-fprofile-abs-path` to gcc. This helps the extension to match source files with their corresponding coverage data.
18 |
19 | ## Known Issues
20 |
21 | - Sometimes lines are counted more than once when they do more than one thing. That might be confusing in some cases. Usually it is quite easy to get the correct number by looking at neighboring lines.
22 | - When the `Highlight Missed Lines` setting is enabled, some missed lines might not be marked as such.
23 |
24 | ## Limitations
25 |
26 | - Only works with version 9 or higher of `gcc`, `g++` and `gcov`. If you have multiple versions of `gcov`, you might have to change the `Gcov Binary` setting.
27 |
28 | ## Screenshots
29 |
30 | 
31 | 
32 |
--------------------------------------------------------------------------------
/html_report/overview_template.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Coverage Results
5 |
6 |
46 |
47 |
54 |
60 |
61 |
62 |
89 |
90 |
225 |
226 |
227 |
--------------------------------------------------------------------------------
/images/code_highlight_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JacquesLucke/gcov-viewer/987b3d4e1beef940e7e04ec50eb7f1ef3db13e05/images/code_highlight_example.png
--------------------------------------------------------------------------------
/images/template_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JacquesLucke/gcov-viewer/987b3d4e1beef940e7e04ec50eb7f1ef3db13e05/images/template_example.png
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "gcov-viewer",
3 | "version": "0.6.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "gcov-viewer",
9 | "version": "0.6.0",
10 | "license": "MIT",
11 | "dependencies": {
12 | "tmp": "^0.2.3"
13 | },
14 | "devDependencies": {
15 | "@types/glob": "^8.1.0",
16 | "@types/mocha": "^10.0.7",
17 | "@types/node": "^13.11.0",
18 | "@types/tmp": "^0.2.6",
19 | "@types/vscode": "^1.64.0",
20 | "@typescript-eslint/eslint-plugin": "^2.30.0",
21 | "@typescript-eslint/parser": "^2.30.0",
22 | "@vscode/test-electron": "^1.6.1",
23 | "eslint": "^6.8.0",
24 | "glob": "^11.0.0",
25 | "mocha": "^10.7.0",
26 | "typescript": "^4.5.5"
27 | },
28 | "engines": {
29 | "vscode": "^1.64.0"
30 | }
31 | },
32 | "node_modules/@babel/code-frame": {
33 | "version": "7.24.7",
34 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
35 | "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
36 | "dev": true,
37 | "dependencies": {
38 | "@babel/highlight": "^7.24.7",
39 | "picocolors": "^1.0.0"
40 | },
41 | "engines": {
42 | "node": ">=6.9.0"
43 | }
44 | },
45 | "node_modules/@babel/helper-validator-identifier": {
46 | "version": "7.24.7",
47 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
48 | "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
49 | "dev": true,
50 | "engines": {
51 | "node": ">=6.9.0"
52 | }
53 | },
54 | "node_modules/@babel/highlight": {
55 | "version": "7.24.7",
56 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
57 | "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
58 | "dev": true,
59 | "dependencies": {
60 | "@babel/helper-validator-identifier": "^7.24.7",
61 | "chalk": "^2.4.2",
62 | "js-tokens": "^4.0.0",
63 | "picocolors": "^1.0.0"
64 | },
65 | "engines": {
66 | "node": ">=6.9.0"
67 | }
68 | },
69 | "node_modules/@isaacs/cliui": {
70 | "version": "8.0.2",
71 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
72 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
73 | "dev": true,
74 | "dependencies": {
75 | "string-width": "^5.1.2",
76 | "string-width-cjs": "npm:string-width@^4.2.0",
77 | "strip-ansi": "^7.0.1",
78 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
79 | "wrap-ansi": "^8.1.0",
80 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
81 | },
82 | "engines": {
83 | "node": ">=12"
84 | }
85 | },
86 | "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
87 | "version": "6.0.1",
88 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
89 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
90 | "dev": true,
91 | "engines": {
92 | "node": ">=12"
93 | },
94 | "funding": {
95 | "url": "https://github.com/chalk/ansi-regex?sponsor=1"
96 | }
97 | },
98 | "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
99 | "version": "9.2.2",
100 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
101 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
102 | "dev": true
103 | },
104 | "node_modules/@isaacs/cliui/node_modules/string-width": {
105 | "version": "5.1.2",
106 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
107 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
108 | "dev": true,
109 | "dependencies": {
110 | "eastasianwidth": "^0.2.0",
111 | "emoji-regex": "^9.2.2",
112 | "strip-ansi": "^7.0.1"
113 | },
114 | "engines": {
115 | "node": ">=12"
116 | },
117 | "funding": {
118 | "url": "https://github.com/sponsors/sindresorhus"
119 | }
120 | },
121 | "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
122 | "version": "7.1.0",
123 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
124 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
125 | "dev": true,
126 | "dependencies": {
127 | "ansi-regex": "^6.0.1"
128 | },
129 | "engines": {
130 | "node": ">=12"
131 | },
132 | "funding": {
133 | "url": "https://github.com/chalk/strip-ansi?sponsor=1"
134 | }
135 | },
136 | "node_modules/@pkgjs/parseargs": {
137 | "version": "0.11.0",
138 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
139 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
140 | "dev": true,
141 | "optional": true,
142 | "engines": {
143 | "node": ">=14"
144 | }
145 | },
146 | "node_modules/@tootallnate/once": {
147 | "version": "1.1.2",
148 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
149 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
150 | "dev": true,
151 | "engines": {
152 | "node": ">= 6"
153 | }
154 | },
155 | "node_modules/@types/eslint-visitor-keys": {
156 | "version": "1.0.0",
157 | "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
158 | "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==",
159 | "dev": true
160 | },
161 | "node_modules/@types/glob": {
162 | "version": "8.1.0",
163 | "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz",
164 | "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==",
165 | "dev": true,
166 | "dependencies": {
167 | "@types/minimatch": "^5.1.2",
168 | "@types/node": "*"
169 | }
170 | },
171 | "node_modules/@types/json-schema": {
172 | "version": "7.0.15",
173 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
174 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
175 | "dev": true
176 | },
177 | "node_modules/@types/minimatch": {
178 | "version": "5.1.2",
179 | "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
180 | "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
181 | "dev": true
182 | },
183 | "node_modules/@types/mocha": {
184 | "version": "10.0.7",
185 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz",
186 | "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==",
187 | "dev": true
188 | },
189 | "node_modules/@types/node": {
190 | "version": "13.13.52",
191 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz",
192 | "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==",
193 | "dev": true
194 | },
195 | "node_modules/@types/tmp": {
196 | "version": "0.2.6",
197 | "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz",
198 | "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==",
199 | "dev": true
200 | },
201 | "node_modules/@types/vscode": {
202 | "version": "1.91.0",
203 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.91.0.tgz",
204 | "integrity": "sha512-PgPr+bUODjG3y+ozWUCyzttqR9EHny9sPAfJagddQjDwdtf66y2sDKJMnFZRuzBA2YtBGASqJGPil8VDUPvO6A==",
205 | "dev": true
206 | },
207 | "node_modules/@typescript-eslint/eslint-plugin": {
208 | "version": "2.34.0",
209 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz",
210 | "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==",
211 | "dev": true,
212 | "dependencies": {
213 | "@typescript-eslint/experimental-utils": "2.34.0",
214 | "functional-red-black-tree": "^1.0.1",
215 | "regexpp": "^3.0.0",
216 | "tsutils": "^3.17.1"
217 | },
218 | "engines": {
219 | "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
220 | },
221 | "funding": {
222 | "type": "opencollective",
223 | "url": "https://opencollective.com/typescript-eslint"
224 | },
225 | "peerDependencies": {
226 | "@typescript-eslint/parser": "^2.0.0",
227 | "eslint": "^5.0.0 || ^6.0.0"
228 | },
229 | "peerDependenciesMeta": {
230 | "typescript": {
231 | "optional": true
232 | }
233 | }
234 | },
235 | "node_modules/@typescript-eslint/experimental-utils": {
236 | "version": "2.34.0",
237 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz",
238 | "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==",
239 | "dev": true,
240 | "dependencies": {
241 | "@types/json-schema": "^7.0.3",
242 | "@typescript-eslint/typescript-estree": "2.34.0",
243 | "eslint-scope": "^5.0.0",
244 | "eslint-utils": "^2.0.0"
245 | },
246 | "engines": {
247 | "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
248 | },
249 | "funding": {
250 | "type": "opencollective",
251 | "url": "https://opencollective.com/typescript-eslint"
252 | },
253 | "peerDependencies": {
254 | "eslint": "*"
255 | }
256 | },
257 | "node_modules/@typescript-eslint/parser": {
258 | "version": "2.34.0",
259 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz",
260 | "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==",
261 | "dev": true,
262 | "dependencies": {
263 | "@types/eslint-visitor-keys": "^1.0.0",
264 | "@typescript-eslint/experimental-utils": "2.34.0",
265 | "@typescript-eslint/typescript-estree": "2.34.0",
266 | "eslint-visitor-keys": "^1.1.0"
267 | },
268 | "engines": {
269 | "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
270 | },
271 | "funding": {
272 | "type": "opencollective",
273 | "url": "https://opencollective.com/typescript-eslint"
274 | },
275 | "peerDependencies": {
276 | "eslint": "^5.0.0 || ^6.0.0"
277 | },
278 | "peerDependenciesMeta": {
279 | "typescript": {
280 | "optional": true
281 | }
282 | }
283 | },
284 | "node_modules/@typescript-eslint/typescript-estree": {
285 | "version": "2.34.0",
286 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz",
287 | "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==",
288 | "dev": true,
289 | "dependencies": {
290 | "debug": "^4.1.1",
291 | "eslint-visitor-keys": "^1.1.0",
292 | "glob": "^7.1.6",
293 | "is-glob": "^4.0.1",
294 | "lodash": "^4.17.15",
295 | "semver": "^7.3.2",
296 | "tsutils": "^3.17.1"
297 | },
298 | "engines": {
299 | "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
300 | },
301 | "funding": {
302 | "type": "opencollective",
303 | "url": "https://opencollective.com/typescript-eslint"
304 | },
305 | "peerDependenciesMeta": {
306 | "typescript": {
307 | "optional": true
308 | }
309 | }
310 | },
311 | "node_modules/@typescript-eslint/typescript-estree/node_modules/glob": {
312 | "version": "7.2.3",
313 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
314 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
315 | "deprecated": "Glob versions prior to v9 are no longer supported",
316 | "dev": true,
317 | "dependencies": {
318 | "fs.realpath": "^1.0.0",
319 | "inflight": "^1.0.4",
320 | "inherits": "2",
321 | "minimatch": "^3.1.1",
322 | "once": "^1.3.0",
323 | "path-is-absolute": "^1.0.0"
324 | },
325 | "engines": {
326 | "node": "*"
327 | },
328 | "funding": {
329 | "url": "https://github.com/sponsors/isaacs"
330 | }
331 | },
332 | "node_modules/@vscode/test-electron": {
333 | "version": "1.6.2",
334 | "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-1.6.2.tgz",
335 | "integrity": "sha512-W01ajJEMx6223Y7J5yaajGjVs1QfW3YGkkOJHVKfAMEqNB1ZHN9wCcViehv5ZwVSSJnjhu6lYEYgwBdHtCxqhQ==",
336 | "dev": true,
337 | "dependencies": {
338 | "http-proxy-agent": "^4.0.1",
339 | "https-proxy-agent": "^5.0.0",
340 | "rimraf": "^3.0.2",
341 | "unzipper": "^0.10.11"
342 | },
343 | "engines": {
344 | "node": ">=8.9.3"
345 | }
346 | },
347 | "node_modules/acorn": {
348 | "version": "7.4.1",
349 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
350 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
351 | "dev": true,
352 | "bin": {
353 | "acorn": "bin/acorn"
354 | },
355 | "engines": {
356 | "node": ">=0.4.0"
357 | }
358 | },
359 | "node_modules/acorn-jsx": {
360 | "version": "5.3.2",
361 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
362 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
363 | "dev": true,
364 | "peerDependencies": {
365 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
366 | }
367 | },
368 | "node_modules/agent-base": {
369 | "version": "6.0.2",
370 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
371 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
372 | "dev": true,
373 | "dependencies": {
374 | "debug": "4"
375 | },
376 | "engines": {
377 | "node": ">= 6.0.0"
378 | }
379 | },
380 | "node_modules/ajv": {
381 | "version": "6.12.6",
382 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
383 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
384 | "dev": true,
385 | "dependencies": {
386 | "fast-deep-equal": "^3.1.1",
387 | "fast-json-stable-stringify": "^2.0.0",
388 | "json-schema-traverse": "^0.4.1",
389 | "uri-js": "^4.2.2"
390 | },
391 | "funding": {
392 | "type": "github",
393 | "url": "https://github.com/sponsors/epoberezkin"
394 | }
395 | },
396 | "node_modules/ansi-colors": {
397 | "version": "4.1.3",
398 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
399 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
400 | "dev": true,
401 | "engines": {
402 | "node": ">=6"
403 | }
404 | },
405 | "node_modules/ansi-escapes": {
406 | "version": "4.3.2",
407 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
408 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
409 | "dev": true,
410 | "dependencies": {
411 | "type-fest": "^0.21.3"
412 | },
413 | "engines": {
414 | "node": ">=8"
415 | },
416 | "funding": {
417 | "url": "https://github.com/sponsors/sindresorhus"
418 | }
419 | },
420 | "node_modules/ansi-escapes/node_modules/type-fest": {
421 | "version": "0.21.3",
422 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
423 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
424 | "dev": true,
425 | "engines": {
426 | "node": ">=10"
427 | },
428 | "funding": {
429 | "url": "https://github.com/sponsors/sindresorhus"
430 | }
431 | },
432 | "node_modules/ansi-regex": {
433 | "version": "4.1.1",
434 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
435 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
436 | "dev": true,
437 | "engines": {
438 | "node": ">=6"
439 | }
440 | },
441 | "node_modules/ansi-styles": {
442 | "version": "3.2.1",
443 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
444 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
445 | "dev": true,
446 | "dependencies": {
447 | "color-convert": "^1.9.0"
448 | },
449 | "engines": {
450 | "node": ">=4"
451 | }
452 | },
453 | "node_modules/anymatch": {
454 | "version": "3.1.3",
455 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
456 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
457 | "dev": true,
458 | "dependencies": {
459 | "normalize-path": "^3.0.0",
460 | "picomatch": "^2.0.4"
461 | },
462 | "engines": {
463 | "node": ">= 8"
464 | }
465 | },
466 | "node_modules/argparse": {
467 | "version": "1.0.10",
468 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
469 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
470 | "dev": true,
471 | "dependencies": {
472 | "sprintf-js": "~1.0.2"
473 | }
474 | },
475 | "node_modules/astral-regex": {
476 | "version": "1.0.0",
477 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
478 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
479 | "dev": true,
480 | "engines": {
481 | "node": ">=4"
482 | }
483 | },
484 | "node_modules/balanced-match": {
485 | "version": "1.0.2",
486 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
487 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
488 | "dev": true
489 | },
490 | "node_modules/big-integer": {
491 | "version": "1.6.52",
492 | "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
493 | "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
494 | "dev": true,
495 | "engines": {
496 | "node": ">=0.6"
497 | }
498 | },
499 | "node_modules/binary": {
500 | "version": "0.3.0",
501 | "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
502 | "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==",
503 | "dev": true,
504 | "dependencies": {
505 | "buffers": "~0.1.1",
506 | "chainsaw": "~0.1.0"
507 | },
508 | "engines": {
509 | "node": "*"
510 | }
511 | },
512 | "node_modules/binary-extensions": {
513 | "version": "2.3.0",
514 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
515 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
516 | "dev": true,
517 | "engines": {
518 | "node": ">=8"
519 | },
520 | "funding": {
521 | "url": "https://github.com/sponsors/sindresorhus"
522 | }
523 | },
524 | "node_modules/bluebird": {
525 | "version": "3.4.7",
526 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz",
527 | "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==",
528 | "dev": true
529 | },
530 | "node_modules/brace-expansion": {
531 | "version": "1.1.11",
532 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
533 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
534 | "dev": true,
535 | "dependencies": {
536 | "balanced-match": "^1.0.0",
537 | "concat-map": "0.0.1"
538 | }
539 | },
540 | "node_modules/braces": {
541 | "version": "3.0.3",
542 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
543 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
544 | "dev": true,
545 | "dependencies": {
546 | "fill-range": "^7.1.1"
547 | },
548 | "engines": {
549 | "node": ">=8"
550 | }
551 | },
552 | "node_modules/browser-stdout": {
553 | "version": "1.3.1",
554 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
555 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
556 | "dev": true
557 | },
558 | "node_modules/buffer-indexof-polyfill": {
559 | "version": "1.0.2",
560 | "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz",
561 | "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==",
562 | "dev": true,
563 | "engines": {
564 | "node": ">=0.10"
565 | }
566 | },
567 | "node_modules/buffers": {
568 | "version": "0.1.1",
569 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
570 | "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==",
571 | "dev": true,
572 | "engines": {
573 | "node": ">=0.2.0"
574 | }
575 | },
576 | "node_modules/callsites": {
577 | "version": "3.1.0",
578 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
579 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
580 | "dev": true,
581 | "engines": {
582 | "node": ">=6"
583 | }
584 | },
585 | "node_modules/camelcase": {
586 | "version": "6.3.0",
587 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
588 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
589 | "dev": true,
590 | "engines": {
591 | "node": ">=10"
592 | },
593 | "funding": {
594 | "url": "https://github.com/sponsors/sindresorhus"
595 | }
596 | },
597 | "node_modules/chainsaw": {
598 | "version": "0.1.0",
599 | "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
600 | "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==",
601 | "dev": true,
602 | "dependencies": {
603 | "traverse": ">=0.3.0 <0.4"
604 | },
605 | "engines": {
606 | "node": "*"
607 | }
608 | },
609 | "node_modules/chalk": {
610 | "version": "2.4.2",
611 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
612 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
613 | "dev": true,
614 | "dependencies": {
615 | "ansi-styles": "^3.2.1",
616 | "escape-string-regexp": "^1.0.5",
617 | "supports-color": "^5.3.0"
618 | },
619 | "engines": {
620 | "node": ">=4"
621 | }
622 | },
623 | "node_modules/chardet": {
624 | "version": "0.7.0",
625 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
626 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
627 | "dev": true
628 | },
629 | "node_modules/chokidar": {
630 | "version": "3.6.0",
631 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
632 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
633 | "dev": true,
634 | "dependencies": {
635 | "anymatch": "~3.1.2",
636 | "braces": "~3.0.2",
637 | "glob-parent": "~5.1.2",
638 | "is-binary-path": "~2.1.0",
639 | "is-glob": "~4.0.1",
640 | "normalize-path": "~3.0.0",
641 | "readdirp": "~3.6.0"
642 | },
643 | "engines": {
644 | "node": ">= 8.10.0"
645 | },
646 | "funding": {
647 | "url": "https://paulmillr.com/funding/"
648 | },
649 | "optionalDependencies": {
650 | "fsevents": "~2.3.2"
651 | }
652 | },
653 | "node_modules/cli-cursor": {
654 | "version": "3.1.0",
655 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
656 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
657 | "dev": true,
658 | "dependencies": {
659 | "restore-cursor": "^3.1.0"
660 | },
661 | "engines": {
662 | "node": ">=8"
663 | }
664 | },
665 | "node_modules/cli-width": {
666 | "version": "3.0.0",
667 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
668 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
669 | "dev": true,
670 | "engines": {
671 | "node": ">= 10"
672 | }
673 | },
674 | "node_modules/cliui": {
675 | "version": "7.0.4",
676 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
677 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
678 | "dev": true,
679 | "dependencies": {
680 | "string-width": "^4.2.0",
681 | "strip-ansi": "^6.0.0",
682 | "wrap-ansi": "^7.0.0"
683 | }
684 | },
685 | "node_modules/cliui/node_modules/ansi-regex": {
686 | "version": "5.0.1",
687 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
688 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
689 | "dev": true,
690 | "engines": {
691 | "node": ">=8"
692 | }
693 | },
694 | "node_modules/cliui/node_modules/ansi-styles": {
695 | "version": "4.3.0",
696 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
697 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
698 | "dev": true,
699 | "dependencies": {
700 | "color-convert": "^2.0.1"
701 | },
702 | "engines": {
703 | "node": ">=8"
704 | },
705 | "funding": {
706 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
707 | }
708 | },
709 | "node_modules/cliui/node_modules/color-convert": {
710 | "version": "2.0.1",
711 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
712 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
713 | "dev": true,
714 | "dependencies": {
715 | "color-name": "~1.1.4"
716 | },
717 | "engines": {
718 | "node": ">=7.0.0"
719 | }
720 | },
721 | "node_modules/cliui/node_modules/color-name": {
722 | "version": "1.1.4",
723 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
724 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
725 | "dev": true
726 | },
727 | "node_modules/cliui/node_modules/strip-ansi": {
728 | "version": "6.0.1",
729 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
730 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
731 | "dev": true,
732 | "dependencies": {
733 | "ansi-regex": "^5.0.1"
734 | },
735 | "engines": {
736 | "node": ">=8"
737 | }
738 | },
739 | "node_modules/cliui/node_modules/wrap-ansi": {
740 | "version": "7.0.0",
741 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
742 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
743 | "dev": true,
744 | "dependencies": {
745 | "ansi-styles": "^4.0.0",
746 | "string-width": "^4.1.0",
747 | "strip-ansi": "^6.0.0"
748 | },
749 | "engines": {
750 | "node": ">=10"
751 | },
752 | "funding": {
753 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
754 | }
755 | },
756 | "node_modules/color-convert": {
757 | "version": "1.9.3",
758 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
759 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
760 | "dev": true,
761 | "dependencies": {
762 | "color-name": "1.1.3"
763 | }
764 | },
765 | "node_modules/color-name": {
766 | "version": "1.1.3",
767 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
768 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
769 | "dev": true
770 | },
771 | "node_modules/concat-map": {
772 | "version": "0.0.1",
773 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
774 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
775 | "dev": true
776 | },
777 | "node_modules/core-util-is": {
778 | "version": "1.0.3",
779 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
780 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
781 | "dev": true
782 | },
783 | "node_modules/cross-spawn": {
784 | "version": "6.0.5",
785 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
786 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
787 | "dev": true,
788 | "dependencies": {
789 | "nice-try": "^1.0.4",
790 | "path-key": "^2.0.1",
791 | "semver": "^5.5.0",
792 | "shebang-command": "^1.2.0",
793 | "which": "^1.2.9"
794 | },
795 | "engines": {
796 | "node": ">=4.8"
797 | }
798 | },
799 | "node_modules/cross-spawn/node_modules/semver": {
800 | "version": "5.7.2",
801 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
802 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
803 | "dev": true,
804 | "bin": {
805 | "semver": "bin/semver"
806 | }
807 | },
808 | "node_modules/debug": {
809 | "version": "4.3.5",
810 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
811 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
812 | "dev": true,
813 | "dependencies": {
814 | "ms": "2.1.2"
815 | },
816 | "engines": {
817 | "node": ">=6.0"
818 | },
819 | "peerDependenciesMeta": {
820 | "supports-color": {
821 | "optional": true
822 | }
823 | }
824 | },
825 | "node_modules/decamelize": {
826 | "version": "4.0.0",
827 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
828 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
829 | "dev": true,
830 | "engines": {
831 | "node": ">=10"
832 | },
833 | "funding": {
834 | "url": "https://github.com/sponsors/sindresorhus"
835 | }
836 | },
837 | "node_modules/deep-is": {
838 | "version": "0.1.4",
839 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
840 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
841 | "dev": true
842 | },
843 | "node_modules/diff": {
844 | "version": "5.2.0",
845 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
846 | "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
847 | "dev": true,
848 | "engines": {
849 | "node": ">=0.3.1"
850 | }
851 | },
852 | "node_modules/doctrine": {
853 | "version": "3.0.0",
854 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
855 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
856 | "dev": true,
857 | "dependencies": {
858 | "esutils": "^2.0.2"
859 | },
860 | "engines": {
861 | "node": ">=6.0.0"
862 | }
863 | },
864 | "node_modules/duplexer2": {
865 | "version": "0.1.4",
866 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
867 | "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
868 | "dev": true,
869 | "dependencies": {
870 | "readable-stream": "^2.0.2"
871 | }
872 | },
873 | "node_modules/eastasianwidth": {
874 | "version": "0.2.0",
875 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
876 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
877 | "dev": true
878 | },
879 | "node_modules/emoji-regex": {
880 | "version": "8.0.0",
881 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
882 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
883 | "dev": true
884 | },
885 | "node_modules/escalade": {
886 | "version": "3.1.2",
887 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
888 | "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
889 | "dev": true,
890 | "engines": {
891 | "node": ">=6"
892 | }
893 | },
894 | "node_modules/escape-string-regexp": {
895 | "version": "1.0.5",
896 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
897 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
898 | "dev": true,
899 | "engines": {
900 | "node": ">=0.8.0"
901 | }
902 | },
903 | "node_modules/eslint": {
904 | "version": "6.8.0",
905 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
906 | "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
907 | "dev": true,
908 | "dependencies": {
909 | "@babel/code-frame": "^7.0.0",
910 | "ajv": "^6.10.0",
911 | "chalk": "^2.1.0",
912 | "cross-spawn": "^6.0.5",
913 | "debug": "^4.0.1",
914 | "doctrine": "^3.0.0",
915 | "eslint-scope": "^5.0.0",
916 | "eslint-utils": "^1.4.3",
917 | "eslint-visitor-keys": "^1.1.0",
918 | "espree": "^6.1.2",
919 | "esquery": "^1.0.1",
920 | "esutils": "^2.0.2",
921 | "file-entry-cache": "^5.0.1",
922 | "functional-red-black-tree": "^1.0.1",
923 | "glob-parent": "^5.0.0",
924 | "globals": "^12.1.0",
925 | "ignore": "^4.0.6",
926 | "import-fresh": "^3.0.0",
927 | "imurmurhash": "^0.1.4",
928 | "inquirer": "^7.0.0",
929 | "is-glob": "^4.0.0",
930 | "js-yaml": "^3.13.1",
931 | "json-stable-stringify-without-jsonify": "^1.0.1",
932 | "levn": "^0.3.0",
933 | "lodash": "^4.17.14",
934 | "minimatch": "^3.0.4",
935 | "mkdirp": "^0.5.1",
936 | "natural-compare": "^1.4.0",
937 | "optionator": "^0.8.3",
938 | "progress": "^2.0.0",
939 | "regexpp": "^2.0.1",
940 | "semver": "^6.1.2",
941 | "strip-ansi": "^5.2.0",
942 | "strip-json-comments": "^3.0.1",
943 | "table": "^5.2.3",
944 | "text-table": "^0.2.0",
945 | "v8-compile-cache": "^2.0.3"
946 | },
947 | "bin": {
948 | "eslint": "bin/eslint.js"
949 | },
950 | "engines": {
951 | "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
952 | },
953 | "funding": {
954 | "url": "https://opencollective.com/eslint"
955 | }
956 | },
957 | "node_modules/eslint-scope": {
958 | "version": "5.1.1",
959 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
960 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
961 | "dev": true,
962 | "dependencies": {
963 | "esrecurse": "^4.3.0",
964 | "estraverse": "^4.1.1"
965 | },
966 | "engines": {
967 | "node": ">=8.0.0"
968 | }
969 | },
970 | "node_modules/eslint-utils": {
971 | "version": "2.1.0",
972 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
973 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
974 | "dev": true,
975 | "dependencies": {
976 | "eslint-visitor-keys": "^1.1.0"
977 | },
978 | "engines": {
979 | "node": ">=6"
980 | },
981 | "funding": {
982 | "url": "https://github.com/sponsors/mysticatea"
983 | }
984 | },
985 | "node_modules/eslint-visitor-keys": {
986 | "version": "1.3.0",
987 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
988 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
989 | "dev": true,
990 | "engines": {
991 | "node": ">=4"
992 | }
993 | },
994 | "node_modules/eslint/node_modules/eslint-utils": {
995 | "version": "1.4.3",
996 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
997 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
998 | "dev": true,
999 | "dependencies": {
1000 | "eslint-visitor-keys": "^1.1.0"
1001 | },
1002 | "engines": {
1003 | "node": ">=6"
1004 | }
1005 | },
1006 | "node_modules/eslint/node_modules/regexpp": {
1007 | "version": "2.0.1",
1008 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
1009 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
1010 | "dev": true,
1011 | "engines": {
1012 | "node": ">=6.5.0"
1013 | }
1014 | },
1015 | "node_modules/eslint/node_modules/semver": {
1016 | "version": "6.3.1",
1017 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
1018 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
1019 | "dev": true,
1020 | "bin": {
1021 | "semver": "bin/semver.js"
1022 | }
1023 | },
1024 | "node_modules/espree": {
1025 | "version": "6.2.1",
1026 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
1027 | "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
1028 | "dev": true,
1029 | "dependencies": {
1030 | "acorn": "^7.1.1",
1031 | "acorn-jsx": "^5.2.0",
1032 | "eslint-visitor-keys": "^1.1.0"
1033 | },
1034 | "engines": {
1035 | "node": ">=6.0.0"
1036 | }
1037 | },
1038 | "node_modules/esprima": {
1039 | "version": "4.0.1",
1040 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
1041 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
1042 | "dev": true,
1043 | "bin": {
1044 | "esparse": "bin/esparse.js",
1045 | "esvalidate": "bin/esvalidate.js"
1046 | },
1047 | "engines": {
1048 | "node": ">=4"
1049 | }
1050 | },
1051 | "node_modules/esquery": {
1052 | "version": "1.6.0",
1053 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
1054 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
1055 | "dev": true,
1056 | "dependencies": {
1057 | "estraverse": "^5.1.0"
1058 | },
1059 | "engines": {
1060 | "node": ">=0.10"
1061 | }
1062 | },
1063 | "node_modules/esquery/node_modules/estraverse": {
1064 | "version": "5.3.0",
1065 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
1066 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
1067 | "dev": true,
1068 | "engines": {
1069 | "node": ">=4.0"
1070 | }
1071 | },
1072 | "node_modules/esrecurse": {
1073 | "version": "4.3.0",
1074 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
1075 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
1076 | "dev": true,
1077 | "dependencies": {
1078 | "estraverse": "^5.2.0"
1079 | },
1080 | "engines": {
1081 | "node": ">=4.0"
1082 | }
1083 | },
1084 | "node_modules/esrecurse/node_modules/estraverse": {
1085 | "version": "5.3.0",
1086 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
1087 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
1088 | "dev": true,
1089 | "engines": {
1090 | "node": ">=4.0"
1091 | }
1092 | },
1093 | "node_modules/estraverse": {
1094 | "version": "4.3.0",
1095 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
1096 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
1097 | "dev": true,
1098 | "engines": {
1099 | "node": ">=4.0"
1100 | }
1101 | },
1102 | "node_modules/esutils": {
1103 | "version": "2.0.3",
1104 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
1105 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
1106 | "dev": true,
1107 | "engines": {
1108 | "node": ">=0.10.0"
1109 | }
1110 | },
1111 | "node_modules/external-editor": {
1112 | "version": "3.1.0",
1113 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
1114 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
1115 | "dev": true,
1116 | "dependencies": {
1117 | "chardet": "^0.7.0",
1118 | "iconv-lite": "^0.4.24",
1119 | "tmp": "^0.0.33"
1120 | },
1121 | "engines": {
1122 | "node": ">=4"
1123 | }
1124 | },
1125 | "node_modules/external-editor/node_modules/tmp": {
1126 | "version": "0.0.33",
1127 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
1128 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
1129 | "dev": true,
1130 | "dependencies": {
1131 | "os-tmpdir": "~1.0.2"
1132 | },
1133 | "engines": {
1134 | "node": ">=0.6.0"
1135 | }
1136 | },
1137 | "node_modules/fast-deep-equal": {
1138 | "version": "3.1.3",
1139 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1140 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1141 | "dev": true
1142 | },
1143 | "node_modules/fast-json-stable-stringify": {
1144 | "version": "2.1.0",
1145 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1146 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
1147 | "dev": true
1148 | },
1149 | "node_modules/fast-levenshtein": {
1150 | "version": "2.0.6",
1151 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1152 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
1153 | "dev": true
1154 | },
1155 | "node_modules/figures": {
1156 | "version": "3.2.0",
1157 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
1158 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
1159 | "dev": true,
1160 | "dependencies": {
1161 | "escape-string-regexp": "^1.0.5"
1162 | },
1163 | "engines": {
1164 | "node": ">=8"
1165 | },
1166 | "funding": {
1167 | "url": "https://github.com/sponsors/sindresorhus"
1168 | }
1169 | },
1170 | "node_modules/file-entry-cache": {
1171 | "version": "5.0.1",
1172 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
1173 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
1174 | "dev": true,
1175 | "dependencies": {
1176 | "flat-cache": "^2.0.1"
1177 | },
1178 | "engines": {
1179 | "node": ">=4"
1180 | }
1181 | },
1182 | "node_modules/fill-range": {
1183 | "version": "7.1.1",
1184 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1185 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1186 | "dev": true,
1187 | "dependencies": {
1188 | "to-regex-range": "^5.0.1"
1189 | },
1190 | "engines": {
1191 | "node": ">=8"
1192 | }
1193 | },
1194 | "node_modules/find-up": {
1195 | "version": "5.0.0",
1196 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
1197 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
1198 | "dev": true,
1199 | "dependencies": {
1200 | "locate-path": "^6.0.0",
1201 | "path-exists": "^4.0.0"
1202 | },
1203 | "engines": {
1204 | "node": ">=10"
1205 | },
1206 | "funding": {
1207 | "url": "https://github.com/sponsors/sindresorhus"
1208 | }
1209 | },
1210 | "node_modules/flat": {
1211 | "version": "5.0.2",
1212 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
1213 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
1214 | "dev": true,
1215 | "bin": {
1216 | "flat": "cli.js"
1217 | }
1218 | },
1219 | "node_modules/flat-cache": {
1220 | "version": "2.0.1",
1221 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
1222 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
1223 | "dev": true,
1224 | "dependencies": {
1225 | "flatted": "^2.0.0",
1226 | "rimraf": "2.6.3",
1227 | "write": "1.0.3"
1228 | },
1229 | "engines": {
1230 | "node": ">=4"
1231 | }
1232 | },
1233 | "node_modules/flat-cache/node_modules/glob": {
1234 | "version": "7.2.3",
1235 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
1236 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
1237 | "deprecated": "Glob versions prior to v9 are no longer supported",
1238 | "dev": true,
1239 | "dependencies": {
1240 | "fs.realpath": "^1.0.0",
1241 | "inflight": "^1.0.4",
1242 | "inherits": "2",
1243 | "minimatch": "^3.1.1",
1244 | "once": "^1.3.0",
1245 | "path-is-absolute": "^1.0.0"
1246 | },
1247 | "engines": {
1248 | "node": "*"
1249 | },
1250 | "funding": {
1251 | "url": "https://github.com/sponsors/isaacs"
1252 | }
1253 | },
1254 | "node_modules/flat-cache/node_modules/rimraf": {
1255 | "version": "2.6.3",
1256 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
1257 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
1258 | "deprecated": "Rimraf versions prior to v4 are no longer supported",
1259 | "dev": true,
1260 | "dependencies": {
1261 | "glob": "^7.1.3"
1262 | },
1263 | "bin": {
1264 | "rimraf": "bin.js"
1265 | }
1266 | },
1267 | "node_modules/flatted": {
1268 | "version": "2.0.2",
1269 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
1270 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
1271 | "dev": true
1272 | },
1273 | "node_modules/foreground-child": {
1274 | "version": "3.2.1",
1275 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
1276 | "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
1277 | "dev": true,
1278 | "dependencies": {
1279 | "cross-spawn": "^7.0.0",
1280 | "signal-exit": "^4.0.1"
1281 | },
1282 | "engines": {
1283 | "node": ">=14"
1284 | },
1285 | "funding": {
1286 | "url": "https://github.com/sponsors/isaacs"
1287 | }
1288 | },
1289 | "node_modules/foreground-child/node_modules/cross-spawn": {
1290 | "version": "7.0.3",
1291 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
1292 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
1293 | "dev": true,
1294 | "dependencies": {
1295 | "path-key": "^3.1.0",
1296 | "shebang-command": "^2.0.0",
1297 | "which": "^2.0.1"
1298 | },
1299 | "engines": {
1300 | "node": ">= 8"
1301 | }
1302 | },
1303 | "node_modules/foreground-child/node_modules/path-key": {
1304 | "version": "3.1.1",
1305 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1306 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1307 | "dev": true,
1308 | "engines": {
1309 | "node": ">=8"
1310 | }
1311 | },
1312 | "node_modules/foreground-child/node_modules/shebang-command": {
1313 | "version": "2.0.0",
1314 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1315 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1316 | "dev": true,
1317 | "dependencies": {
1318 | "shebang-regex": "^3.0.0"
1319 | },
1320 | "engines": {
1321 | "node": ">=8"
1322 | }
1323 | },
1324 | "node_modules/foreground-child/node_modules/shebang-regex": {
1325 | "version": "3.0.0",
1326 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1327 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1328 | "dev": true,
1329 | "engines": {
1330 | "node": ">=8"
1331 | }
1332 | },
1333 | "node_modules/foreground-child/node_modules/which": {
1334 | "version": "2.0.2",
1335 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1336 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1337 | "dev": true,
1338 | "dependencies": {
1339 | "isexe": "^2.0.0"
1340 | },
1341 | "bin": {
1342 | "node-which": "bin/node-which"
1343 | },
1344 | "engines": {
1345 | "node": ">= 8"
1346 | }
1347 | },
1348 | "node_modules/fs.realpath": {
1349 | "version": "1.0.0",
1350 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1351 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
1352 | "dev": true
1353 | },
1354 | "node_modules/fsevents": {
1355 | "version": "2.3.3",
1356 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1357 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1358 | "dev": true,
1359 | "hasInstallScript": true,
1360 | "optional": true,
1361 | "os": [
1362 | "darwin"
1363 | ],
1364 | "engines": {
1365 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1366 | }
1367 | },
1368 | "node_modules/fstream": {
1369 | "version": "1.0.12",
1370 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
1371 | "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
1372 | "deprecated": "This package is no longer supported.",
1373 | "dev": true,
1374 | "dependencies": {
1375 | "graceful-fs": "^4.1.2",
1376 | "inherits": "~2.0.0",
1377 | "mkdirp": ">=0.5 0",
1378 | "rimraf": "2"
1379 | },
1380 | "engines": {
1381 | "node": ">=0.6"
1382 | }
1383 | },
1384 | "node_modules/fstream/node_modules/glob": {
1385 | "version": "7.2.3",
1386 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
1387 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
1388 | "deprecated": "Glob versions prior to v9 are no longer supported",
1389 | "dev": true,
1390 | "dependencies": {
1391 | "fs.realpath": "^1.0.0",
1392 | "inflight": "^1.0.4",
1393 | "inherits": "2",
1394 | "minimatch": "^3.1.1",
1395 | "once": "^1.3.0",
1396 | "path-is-absolute": "^1.0.0"
1397 | },
1398 | "engines": {
1399 | "node": "*"
1400 | },
1401 | "funding": {
1402 | "url": "https://github.com/sponsors/isaacs"
1403 | }
1404 | },
1405 | "node_modules/fstream/node_modules/rimraf": {
1406 | "version": "2.7.1",
1407 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
1408 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
1409 | "deprecated": "Rimraf versions prior to v4 are no longer supported",
1410 | "dev": true,
1411 | "dependencies": {
1412 | "glob": "^7.1.3"
1413 | },
1414 | "bin": {
1415 | "rimraf": "bin.js"
1416 | }
1417 | },
1418 | "node_modules/functional-red-black-tree": {
1419 | "version": "1.0.1",
1420 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
1421 | "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
1422 | "dev": true
1423 | },
1424 | "node_modules/get-caller-file": {
1425 | "version": "2.0.5",
1426 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
1427 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
1428 | "dev": true,
1429 | "engines": {
1430 | "node": "6.* || 8.* || >= 10.*"
1431 | }
1432 | },
1433 | "node_modules/glob": {
1434 | "version": "11.0.0",
1435 | "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz",
1436 | "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==",
1437 | "dev": true,
1438 | "dependencies": {
1439 | "foreground-child": "^3.1.0",
1440 | "jackspeak": "^4.0.1",
1441 | "minimatch": "^10.0.0",
1442 | "minipass": "^7.1.2",
1443 | "package-json-from-dist": "^1.0.0",
1444 | "path-scurry": "^2.0.0"
1445 | },
1446 | "bin": {
1447 | "glob": "dist/esm/bin.mjs"
1448 | },
1449 | "engines": {
1450 | "node": "20 || >=22"
1451 | },
1452 | "funding": {
1453 | "url": "https://github.com/sponsors/isaacs"
1454 | }
1455 | },
1456 | "node_modules/glob-parent": {
1457 | "version": "5.1.2",
1458 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1459 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1460 | "dev": true,
1461 | "dependencies": {
1462 | "is-glob": "^4.0.1"
1463 | },
1464 | "engines": {
1465 | "node": ">= 6"
1466 | }
1467 | },
1468 | "node_modules/glob/node_modules/brace-expansion": {
1469 | "version": "2.0.1",
1470 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
1471 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
1472 | "dev": true,
1473 | "dependencies": {
1474 | "balanced-match": "^1.0.0"
1475 | }
1476 | },
1477 | "node_modules/glob/node_modules/minimatch": {
1478 | "version": "10.0.1",
1479 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
1480 | "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
1481 | "dev": true,
1482 | "dependencies": {
1483 | "brace-expansion": "^2.0.1"
1484 | },
1485 | "engines": {
1486 | "node": "20 || >=22"
1487 | },
1488 | "funding": {
1489 | "url": "https://github.com/sponsors/isaacs"
1490 | }
1491 | },
1492 | "node_modules/globals": {
1493 | "version": "12.4.0",
1494 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
1495 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
1496 | "dev": true,
1497 | "dependencies": {
1498 | "type-fest": "^0.8.1"
1499 | },
1500 | "engines": {
1501 | "node": ">=8"
1502 | },
1503 | "funding": {
1504 | "url": "https://github.com/sponsors/sindresorhus"
1505 | }
1506 | },
1507 | "node_modules/graceful-fs": {
1508 | "version": "4.2.11",
1509 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
1510 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
1511 | "dev": true
1512 | },
1513 | "node_modules/has-flag": {
1514 | "version": "3.0.0",
1515 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1516 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
1517 | "dev": true,
1518 | "engines": {
1519 | "node": ">=4"
1520 | }
1521 | },
1522 | "node_modules/he": {
1523 | "version": "1.2.0",
1524 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
1525 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
1526 | "dev": true,
1527 | "bin": {
1528 | "he": "bin/he"
1529 | }
1530 | },
1531 | "node_modules/http-proxy-agent": {
1532 | "version": "4.0.1",
1533 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
1534 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
1535 | "dev": true,
1536 | "dependencies": {
1537 | "@tootallnate/once": "1",
1538 | "agent-base": "6",
1539 | "debug": "4"
1540 | },
1541 | "engines": {
1542 | "node": ">= 6"
1543 | }
1544 | },
1545 | "node_modules/https-proxy-agent": {
1546 | "version": "5.0.1",
1547 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
1548 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
1549 | "dev": true,
1550 | "dependencies": {
1551 | "agent-base": "6",
1552 | "debug": "4"
1553 | },
1554 | "engines": {
1555 | "node": ">= 6"
1556 | }
1557 | },
1558 | "node_modules/iconv-lite": {
1559 | "version": "0.4.24",
1560 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1561 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1562 | "dev": true,
1563 | "dependencies": {
1564 | "safer-buffer": ">= 2.1.2 < 3"
1565 | },
1566 | "engines": {
1567 | "node": ">=0.10.0"
1568 | }
1569 | },
1570 | "node_modules/ignore": {
1571 | "version": "4.0.6",
1572 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
1573 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
1574 | "dev": true,
1575 | "engines": {
1576 | "node": ">= 4"
1577 | }
1578 | },
1579 | "node_modules/import-fresh": {
1580 | "version": "3.3.0",
1581 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
1582 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
1583 | "dev": true,
1584 | "dependencies": {
1585 | "parent-module": "^1.0.0",
1586 | "resolve-from": "^4.0.0"
1587 | },
1588 | "engines": {
1589 | "node": ">=6"
1590 | },
1591 | "funding": {
1592 | "url": "https://github.com/sponsors/sindresorhus"
1593 | }
1594 | },
1595 | "node_modules/imurmurhash": {
1596 | "version": "0.1.4",
1597 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1598 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
1599 | "dev": true,
1600 | "engines": {
1601 | "node": ">=0.8.19"
1602 | }
1603 | },
1604 | "node_modules/inflight": {
1605 | "version": "1.0.6",
1606 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1607 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
1608 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
1609 | "dev": true,
1610 | "dependencies": {
1611 | "once": "^1.3.0",
1612 | "wrappy": "1"
1613 | }
1614 | },
1615 | "node_modules/inherits": {
1616 | "version": "2.0.4",
1617 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1618 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1619 | "dev": true
1620 | },
1621 | "node_modules/inquirer": {
1622 | "version": "7.3.3",
1623 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
1624 | "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
1625 | "dev": true,
1626 | "dependencies": {
1627 | "ansi-escapes": "^4.2.1",
1628 | "chalk": "^4.1.0",
1629 | "cli-cursor": "^3.1.0",
1630 | "cli-width": "^3.0.0",
1631 | "external-editor": "^3.0.3",
1632 | "figures": "^3.0.0",
1633 | "lodash": "^4.17.19",
1634 | "mute-stream": "0.0.8",
1635 | "run-async": "^2.4.0",
1636 | "rxjs": "^6.6.0",
1637 | "string-width": "^4.1.0",
1638 | "strip-ansi": "^6.0.0",
1639 | "through": "^2.3.6"
1640 | },
1641 | "engines": {
1642 | "node": ">=8.0.0"
1643 | }
1644 | },
1645 | "node_modules/inquirer/node_modules/ansi-regex": {
1646 | "version": "5.0.1",
1647 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1648 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1649 | "dev": true,
1650 | "engines": {
1651 | "node": ">=8"
1652 | }
1653 | },
1654 | "node_modules/inquirer/node_modules/ansi-styles": {
1655 | "version": "4.3.0",
1656 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1657 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1658 | "dev": true,
1659 | "dependencies": {
1660 | "color-convert": "^2.0.1"
1661 | },
1662 | "engines": {
1663 | "node": ">=8"
1664 | },
1665 | "funding": {
1666 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1667 | }
1668 | },
1669 | "node_modules/inquirer/node_modules/chalk": {
1670 | "version": "4.1.2",
1671 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
1672 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
1673 | "dev": true,
1674 | "dependencies": {
1675 | "ansi-styles": "^4.1.0",
1676 | "supports-color": "^7.1.0"
1677 | },
1678 | "engines": {
1679 | "node": ">=10"
1680 | },
1681 | "funding": {
1682 | "url": "https://github.com/chalk/chalk?sponsor=1"
1683 | }
1684 | },
1685 | "node_modules/inquirer/node_modules/color-convert": {
1686 | "version": "2.0.1",
1687 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1688 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1689 | "dev": true,
1690 | "dependencies": {
1691 | "color-name": "~1.1.4"
1692 | },
1693 | "engines": {
1694 | "node": ">=7.0.0"
1695 | }
1696 | },
1697 | "node_modules/inquirer/node_modules/color-name": {
1698 | "version": "1.1.4",
1699 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1700 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1701 | "dev": true
1702 | },
1703 | "node_modules/inquirer/node_modules/has-flag": {
1704 | "version": "4.0.0",
1705 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1706 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1707 | "dev": true,
1708 | "engines": {
1709 | "node": ">=8"
1710 | }
1711 | },
1712 | "node_modules/inquirer/node_modules/strip-ansi": {
1713 | "version": "6.0.1",
1714 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1715 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1716 | "dev": true,
1717 | "dependencies": {
1718 | "ansi-regex": "^5.0.1"
1719 | },
1720 | "engines": {
1721 | "node": ">=8"
1722 | }
1723 | },
1724 | "node_modules/inquirer/node_modules/supports-color": {
1725 | "version": "7.2.0",
1726 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
1727 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
1728 | "dev": true,
1729 | "dependencies": {
1730 | "has-flag": "^4.0.0"
1731 | },
1732 | "engines": {
1733 | "node": ">=8"
1734 | }
1735 | },
1736 | "node_modules/is-binary-path": {
1737 | "version": "2.1.0",
1738 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1739 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1740 | "dev": true,
1741 | "dependencies": {
1742 | "binary-extensions": "^2.0.0"
1743 | },
1744 | "engines": {
1745 | "node": ">=8"
1746 | }
1747 | },
1748 | "node_modules/is-extglob": {
1749 | "version": "2.1.1",
1750 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1751 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1752 | "dev": true,
1753 | "engines": {
1754 | "node": ">=0.10.0"
1755 | }
1756 | },
1757 | "node_modules/is-fullwidth-code-point": {
1758 | "version": "3.0.0",
1759 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1760 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1761 | "dev": true,
1762 | "engines": {
1763 | "node": ">=8"
1764 | }
1765 | },
1766 | "node_modules/is-glob": {
1767 | "version": "4.0.3",
1768 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1769 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1770 | "dev": true,
1771 | "dependencies": {
1772 | "is-extglob": "^2.1.1"
1773 | },
1774 | "engines": {
1775 | "node": ">=0.10.0"
1776 | }
1777 | },
1778 | "node_modules/is-number": {
1779 | "version": "7.0.0",
1780 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1781 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1782 | "dev": true,
1783 | "engines": {
1784 | "node": ">=0.12.0"
1785 | }
1786 | },
1787 | "node_modules/is-plain-obj": {
1788 | "version": "2.1.0",
1789 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
1790 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
1791 | "dev": true,
1792 | "engines": {
1793 | "node": ">=8"
1794 | }
1795 | },
1796 | "node_modules/is-unicode-supported": {
1797 | "version": "0.1.0",
1798 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
1799 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
1800 | "dev": true,
1801 | "engines": {
1802 | "node": ">=10"
1803 | },
1804 | "funding": {
1805 | "url": "https://github.com/sponsors/sindresorhus"
1806 | }
1807 | },
1808 | "node_modules/isarray": {
1809 | "version": "1.0.0",
1810 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1811 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
1812 | "dev": true
1813 | },
1814 | "node_modules/isexe": {
1815 | "version": "2.0.0",
1816 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1817 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1818 | "dev": true
1819 | },
1820 | "node_modules/jackspeak": {
1821 | "version": "4.0.1",
1822 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz",
1823 | "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==",
1824 | "dev": true,
1825 | "dependencies": {
1826 | "@isaacs/cliui": "^8.0.2"
1827 | },
1828 | "engines": {
1829 | "node": "20 || >=22"
1830 | },
1831 | "funding": {
1832 | "url": "https://github.com/sponsors/isaacs"
1833 | },
1834 | "optionalDependencies": {
1835 | "@pkgjs/parseargs": "^0.11.0"
1836 | }
1837 | },
1838 | "node_modules/js-tokens": {
1839 | "version": "4.0.0",
1840 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1841 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1842 | "dev": true
1843 | },
1844 | "node_modules/js-yaml": {
1845 | "version": "3.14.1",
1846 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
1847 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
1848 | "dev": true,
1849 | "dependencies": {
1850 | "argparse": "^1.0.7",
1851 | "esprima": "^4.0.0"
1852 | },
1853 | "bin": {
1854 | "js-yaml": "bin/js-yaml.js"
1855 | }
1856 | },
1857 | "node_modules/json-schema-traverse": {
1858 | "version": "0.4.1",
1859 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1860 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1861 | "dev": true
1862 | },
1863 | "node_modules/json-stable-stringify-without-jsonify": {
1864 | "version": "1.0.1",
1865 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1866 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
1867 | "dev": true
1868 | },
1869 | "node_modules/levn": {
1870 | "version": "0.3.0",
1871 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
1872 | "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
1873 | "dev": true,
1874 | "dependencies": {
1875 | "prelude-ls": "~1.1.2",
1876 | "type-check": "~0.3.2"
1877 | },
1878 | "engines": {
1879 | "node": ">= 0.8.0"
1880 | }
1881 | },
1882 | "node_modules/listenercount": {
1883 | "version": "1.0.1",
1884 | "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz",
1885 | "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==",
1886 | "dev": true
1887 | },
1888 | "node_modules/locate-path": {
1889 | "version": "6.0.0",
1890 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
1891 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
1892 | "dev": true,
1893 | "dependencies": {
1894 | "p-locate": "^5.0.0"
1895 | },
1896 | "engines": {
1897 | "node": ">=10"
1898 | },
1899 | "funding": {
1900 | "url": "https://github.com/sponsors/sindresorhus"
1901 | }
1902 | },
1903 | "node_modules/lodash": {
1904 | "version": "4.17.21",
1905 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
1906 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
1907 | "dev": true
1908 | },
1909 | "node_modules/log-symbols": {
1910 | "version": "4.1.0",
1911 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
1912 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
1913 | "dev": true,
1914 | "dependencies": {
1915 | "chalk": "^4.1.0",
1916 | "is-unicode-supported": "^0.1.0"
1917 | },
1918 | "engines": {
1919 | "node": ">=10"
1920 | },
1921 | "funding": {
1922 | "url": "https://github.com/sponsors/sindresorhus"
1923 | }
1924 | },
1925 | "node_modules/log-symbols/node_modules/ansi-styles": {
1926 | "version": "4.3.0",
1927 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1928 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1929 | "dev": true,
1930 | "dependencies": {
1931 | "color-convert": "^2.0.1"
1932 | },
1933 | "engines": {
1934 | "node": ">=8"
1935 | },
1936 | "funding": {
1937 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1938 | }
1939 | },
1940 | "node_modules/log-symbols/node_modules/chalk": {
1941 | "version": "4.1.2",
1942 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
1943 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
1944 | "dev": true,
1945 | "dependencies": {
1946 | "ansi-styles": "^4.1.0",
1947 | "supports-color": "^7.1.0"
1948 | },
1949 | "engines": {
1950 | "node": ">=10"
1951 | },
1952 | "funding": {
1953 | "url": "https://github.com/chalk/chalk?sponsor=1"
1954 | }
1955 | },
1956 | "node_modules/log-symbols/node_modules/color-convert": {
1957 | "version": "2.0.1",
1958 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1959 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1960 | "dev": true,
1961 | "dependencies": {
1962 | "color-name": "~1.1.4"
1963 | },
1964 | "engines": {
1965 | "node": ">=7.0.0"
1966 | }
1967 | },
1968 | "node_modules/log-symbols/node_modules/color-name": {
1969 | "version": "1.1.4",
1970 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1971 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1972 | "dev": true
1973 | },
1974 | "node_modules/log-symbols/node_modules/has-flag": {
1975 | "version": "4.0.0",
1976 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1977 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1978 | "dev": true,
1979 | "engines": {
1980 | "node": ">=8"
1981 | }
1982 | },
1983 | "node_modules/log-symbols/node_modules/supports-color": {
1984 | "version": "7.2.0",
1985 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
1986 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
1987 | "dev": true,
1988 | "dependencies": {
1989 | "has-flag": "^4.0.0"
1990 | },
1991 | "engines": {
1992 | "node": ">=8"
1993 | }
1994 | },
1995 | "node_modules/lru-cache": {
1996 | "version": "11.0.0",
1997 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz",
1998 | "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==",
1999 | "dev": true,
2000 | "engines": {
2001 | "node": "20 || >=22"
2002 | }
2003 | },
2004 | "node_modules/mimic-fn": {
2005 | "version": "2.1.0",
2006 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
2007 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
2008 | "dev": true,
2009 | "engines": {
2010 | "node": ">=6"
2011 | }
2012 | },
2013 | "node_modules/minimatch": {
2014 | "version": "3.1.2",
2015 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
2016 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
2017 | "dev": true,
2018 | "dependencies": {
2019 | "brace-expansion": "^1.1.7"
2020 | },
2021 | "engines": {
2022 | "node": "*"
2023 | }
2024 | },
2025 | "node_modules/minimist": {
2026 | "version": "1.2.8",
2027 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
2028 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
2029 | "dev": true,
2030 | "funding": {
2031 | "url": "https://github.com/sponsors/ljharb"
2032 | }
2033 | },
2034 | "node_modules/minipass": {
2035 | "version": "7.1.2",
2036 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
2037 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
2038 | "dev": true,
2039 | "engines": {
2040 | "node": ">=16 || 14 >=14.17"
2041 | }
2042 | },
2043 | "node_modules/mkdirp": {
2044 | "version": "0.5.6",
2045 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
2046 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
2047 | "dev": true,
2048 | "dependencies": {
2049 | "minimist": "^1.2.6"
2050 | },
2051 | "bin": {
2052 | "mkdirp": "bin/cmd.js"
2053 | }
2054 | },
2055 | "node_modules/mocha": {
2056 | "version": "10.7.0",
2057 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.0.tgz",
2058 | "integrity": "sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA==",
2059 | "dev": true,
2060 | "dependencies": {
2061 | "ansi-colors": "^4.1.3",
2062 | "browser-stdout": "^1.3.1",
2063 | "chokidar": "^3.5.3",
2064 | "debug": "^4.3.5",
2065 | "diff": "^5.2.0",
2066 | "escape-string-regexp": "^4.0.0",
2067 | "find-up": "^5.0.0",
2068 | "glob": "^8.1.0",
2069 | "he": "^1.2.0",
2070 | "js-yaml": "^4.1.0",
2071 | "log-symbols": "^4.1.0",
2072 | "minimatch": "^5.1.6",
2073 | "ms": "^2.1.3",
2074 | "serialize-javascript": "^6.0.2",
2075 | "strip-json-comments": "^3.1.1",
2076 | "supports-color": "^8.1.1",
2077 | "workerpool": "^6.5.1",
2078 | "yargs": "^16.2.0",
2079 | "yargs-parser": "^20.2.9",
2080 | "yargs-unparser": "^2.0.0"
2081 | },
2082 | "bin": {
2083 | "_mocha": "bin/_mocha",
2084 | "mocha": "bin/mocha.js"
2085 | },
2086 | "engines": {
2087 | "node": ">= 14.0.0"
2088 | }
2089 | },
2090 | "node_modules/mocha/node_modules/argparse": {
2091 | "version": "2.0.1",
2092 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
2093 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
2094 | "dev": true
2095 | },
2096 | "node_modules/mocha/node_modules/brace-expansion": {
2097 | "version": "2.0.1",
2098 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
2099 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
2100 | "dev": true,
2101 | "dependencies": {
2102 | "balanced-match": "^1.0.0"
2103 | }
2104 | },
2105 | "node_modules/mocha/node_modules/escape-string-regexp": {
2106 | "version": "4.0.0",
2107 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
2108 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
2109 | "dev": true,
2110 | "engines": {
2111 | "node": ">=10"
2112 | },
2113 | "funding": {
2114 | "url": "https://github.com/sponsors/sindresorhus"
2115 | }
2116 | },
2117 | "node_modules/mocha/node_modules/glob": {
2118 | "version": "8.1.0",
2119 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
2120 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
2121 | "deprecated": "Glob versions prior to v9 are no longer supported",
2122 | "dev": true,
2123 | "dependencies": {
2124 | "fs.realpath": "^1.0.0",
2125 | "inflight": "^1.0.4",
2126 | "inherits": "2",
2127 | "minimatch": "^5.0.1",
2128 | "once": "^1.3.0"
2129 | },
2130 | "engines": {
2131 | "node": ">=12"
2132 | },
2133 | "funding": {
2134 | "url": "https://github.com/sponsors/isaacs"
2135 | }
2136 | },
2137 | "node_modules/mocha/node_modules/has-flag": {
2138 | "version": "4.0.0",
2139 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
2140 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
2141 | "dev": true,
2142 | "engines": {
2143 | "node": ">=8"
2144 | }
2145 | },
2146 | "node_modules/mocha/node_modules/js-yaml": {
2147 | "version": "4.1.0",
2148 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
2149 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
2150 | "dev": true,
2151 | "dependencies": {
2152 | "argparse": "^2.0.1"
2153 | },
2154 | "bin": {
2155 | "js-yaml": "bin/js-yaml.js"
2156 | }
2157 | },
2158 | "node_modules/mocha/node_modules/minimatch": {
2159 | "version": "5.1.6",
2160 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
2161 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
2162 | "dev": true,
2163 | "dependencies": {
2164 | "brace-expansion": "^2.0.1"
2165 | },
2166 | "engines": {
2167 | "node": ">=10"
2168 | }
2169 | },
2170 | "node_modules/mocha/node_modules/ms": {
2171 | "version": "2.1.3",
2172 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2173 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
2174 | "dev": true
2175 | },
2176 | "node_modules/mocha/node_modules/supports-color": {
2177 | "version": "8.1.1",
2178 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
2179 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
2180 | "dev": true,
2181 | "dependencies": {
2182 | "has-flag": "^4.0.0"
2183 | },
2184 | "engines": {
2185 | "node": ">=10"
2186 | },
2187 | "funding": {
2188 | "url": "https://github.com/chalk/supports-color?sponsor=1"
2189 | }
2190 | },
2191 | "node_modules/ms": {
2192 | "version": "2.1.2",
2193 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
2194 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
2195 | "dev": true
2196 | },
2197 | "node_modules/mute-stream": {
2198 | "version": "0.0.8",
2199 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
2200 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
2201 | "dev": true
2202 | },
2203 | "node_modules/natural-compare": {
2204 | "version": "1.4.0",
2205 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
2206 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
2207 | "dev": true
2208 | },
2209 | "node_modules/nice-try": {
2210 | "version": "1.0.5",
2211 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
2212 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
2213 | "dev": true
2214 | },
2215 | "node_modules/normalize-path": {
2216 | "version": "3.0.0",
2217 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
2218 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
2219 | "dev": true,
2220 | "engines": {
2221 | "node": ">=0.10.0"
2222 | }
2223 | },
2224 | "node_modules/once": {
2225 | "version": "1.4.0",
2226 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2227 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
2228 | "dev": true,
2229 | "dependencies": {
2230 | "wrappy": "1"
2231 | }
2232 | },
2233 | "node_modules/onetime": {
2234 | "version": "5.1.2",
2235 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
2236 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
2237 | "dev": true,
2238 | "dependencies": {
2239 | "mimic-fn": "^2.1.0"
2240 | },
2241 | "engines": {
2242 | "node": ">=6"
2243 | },
2244 | "funding": {
2245 | "url": "https://github.com/sponsors/sindresorhus"
2246 | }
2247 | },
2248 | "node_modules/optionator": {
2249 | "version": "0.8.3",
2250 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
2251 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
2252 | "dev": true,
2253 | "dependencies": {
2254 | "deep-is": "~0.1.3",
2255 | "fast-levenshtein": "~2.0.6",
2256 | "levn": "~0.3.0",
2257 | "prelude-ls": "~1.1.2",
2258 | "type-check": "~0.3.2",
2259 | "word-wrap": "~1.2.3"
2260 | },
2261 | "engines": {
2262 | "node": ">= 0.8.0"
2263 | }
2264 | },
2265 | "node_modules/os-tmpdir": {
2266 | "version": "1.0.2",
2267 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
2268 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
2269 | "dev": true,
2270 | "engines": {
2271 | "node": ">=0.10.0"
2272 | }
2273 | },
2274 | "node_modules/p-limit": {
2275 | "version": "3.1.0",
2276 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
2277 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
2278 | "dev": true,
2279 | "dependencies": {
2280 | "yocto-queue": "^0.1.0"
2281 | },
2282 | "engines": {
2283 | "node": ">=10"
2284 | },
2285 | "funding": {
2286 | "url": "https://github.com/sponsors/sindresorhus"
2287 | }
2288 | },
2289 | "node_modules/p-locate": {
2290 | "version": "5.0.0",
2291 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
2292 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
2293 | "dev": true,
2294 | "dependencies": {
2295 | "p-limit": "^3.0.2"
2296 | },
2297 | "engines": {
2298 | "node": ">=10"
2299 | },
2300 | "funding": {
2301 | "url": "https://github.com/sponsors/sindresorhus"
2302 | }
2303 | },
2304 | "node_modules/package-json-from-dist": {
2305 | "version": "1.0.0",
2306 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
2307 | "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
2308 | "dev": true
2309 | },
2310 | "node_modules/parent-module": {
2311 | "version": "1.0.1",
2312 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
2313 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
2314 | "dev": true,
2315 | "dependencies": {
2316 | "callsites": "^3.0.0"
2317 | },
2318 | "engines": {
2319 | "node": ">=6"
2320 | }
2321 | },
2322 | "node_modules/path-exists": {
2323 | "version": "4.0.0",
2324 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
2325 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
2326 | "dev": true,
2327 | "engines": {
2328 | "node": ">=8"
2329 | }
2330 | },
2331 | "node_modules/path-is-absolute": {
2332 | "version": "1.0.1",
2333 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2334 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
2335 | "dev": true,
2336 | "engines": {
2337 | "node": ">=0.10.0"
2338 | }
2339 | },
2340 | "node_modules/path-key": {
2341 | "version": "2.0.1",
2342 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
2343 | "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
2344 | "dev": true,
2345 | "engines": {
2346 | "node": ">=4"
2347 | }
2348 | },
2349 | "node_modules/path-scurry": {
2350 | "version": "2.0.0",
2351 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
2352 | "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
2353 | "dev": true,
2354 | "dependencies": {
2355 | "lru-cache": "^11.0.0",
2356 | "minipass": "^7.1.2"
2357 | },
2358 | "engines": {
2359 | "node": "20 || >=22"
2360 | },
2361 | "funding": {
2362 | "url": "https://github.com/sponsors/isaacs"
2363 | }
2364 | },
2365 | "node_modules/picocolors": {
2366 | "version": "1.0.1",
2367 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
2368 | "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
2369 | "dev": true
2370 | },
2371 | "node_modules/picomatch": {
2372 | "version": "2.3.1",
2373 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2374 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2375 | "dev": true,
2376 | "engines": {
2377 | "node": ">=8.6"
2378 | },
2379 | "funding": {
2380 | "url": "https://github.com/sponsors/jonschlinkert"
2381 | }
2382 | },
2383 | "node_modules/prelude-ls": {
2384 | "version": "1.1.2",
2385 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
2386 | "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
2387 | "dev": true,
2388 | "engines": {
2389 | "node": ">= 0.8.0"
2390 | }
2391 | },
2392 | "node_modules/process-nextick-args": {
2393 | "version": "2.0.1",
2394 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
2395 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
2396 | "dev": true
2397 | },
2398 | "node_modules/progress": {
2399 | "version": "2.0.3",
2400 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
2401 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
2402 | "dev": true,
2403 | "engines": {
2404 | "node": ">=0.4.0"
2405 | }
2406 | },
2407 | "node_modules/punycode": {
2408 | "version": "2.3.1",
2409 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
2410 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
2411 | "dev": true,
2412 | "engines": {
2413 | "node": ">=6"
2414 | }
2415 | },
2416 | "node_modules/randombytes": {
2417 | "version": "2.1.0",
2418 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
2419 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
2420 | "dev": true,
2421 | "dependencies": {
2422 | "safe-buffer": "^5.1.0"
2423 | }
2424 | },
2425 | "node_modules/readable-stream": {
2426 | "version": "2.3.8",
2427 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
2428 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
2429 | "dev": true,
2430 | "dependencies": {
2431 | "core-util-is": "~1.0.0",
2432 | "inherits": "~2.0.3",
2433 | "isarray": "~1.0.0",
2434 | "process-nextick-args": "~2.0.0",
2435 | "safe-buffer": "~5.1.1",
2436 | "string_decoder": "~1.1.1",
2437 | "util-deprecate": "~1.0.1"
2438 | }
2439 | },
2440 | "node_modules/readable-stream/node_modules/safe-buffer": {
2441 | "version": "5.1.2",
2442 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2443 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
2444 | "dev": true
2445 | },
2446 | "node_modules/readdirp": {
2447 | "version": "3.6.0",
2448 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
2449 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
2450 | "dev": true,
2451 | "dependencies": {
2452 | "picomatch": "^2.2.1"
2453 | },
2454 | "engines": {
2455 | "node": ">=8.10.0"
2456 | }
2457 | },
2458 | "node_modules/regexpp": {
2459 | "version": "3.2.0",
2460 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
2461 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
2462 | "dev": true,
2463 | "engines": {
2464 | "node": ">=8"
2465 | },
2466 | "funding": {
2467 | "url": "https://github.com/sponsors/mysticatea"
2468 | }
2469 | },
2470 | "node_modules/require-directory": {
2471 | "version": "2.1.1",
2472 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
2473 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
2474 | "dev": true,
2475 | "engines": {
2476 | "node": ">=0.10.0"
2477 | }
2478 | },
2479 | "node_modules/resolve-from": {
2480 | "version": "4.0.0",
2481 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
2482 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2483 | "dev": true,
2484 | "engines": {
2485 | "node": ">=4"
2486 | }
2487 | },
2488 | "node_modules/restore-cursor": {
2489 | "version": "3.1.0",
2490 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
2491 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
2492 | "dev": true,
2493 | "dependencies": {
2494 | "onetime": "^5.1.0",
2495 | "signal-exit": "^3.0.2"
2496 | },
2497 | "engines": {
2498 | "node": ">=8"
2499 | }
2500 | },
2501 | "node_modules/restore-cursor/node_modules/signal-exit": {
2502 | "version": "3.0.7",
2503 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
2504 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
2505 | "dev": true
2506 | },
2507 | "node_modules/rimraf": {
2508 | "version": "3.0.2",
2509 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
2510 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
2511 | "deprecated": "Rimraf versions prior to v4 are no longer supported",
2512 | "dev": true,
2513 | "dependencies": {
2514 | "glob": "^7.1.3"
2515 | },
2516 | "bin": {
2517 | "rimraf": "bin.js"
2518 | },
2519 | "funding": {
2520 | "url": "https://github.com/sponsors/isaacs"
2521 | }
2522 | },
2523 | "node_modules/rimraf/node_modules/glob": {
2524 | "version": "7.2.3",
2525 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
2526 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
2527 | "deprecated": "Glob versions prior to v9 are no longer supported",
2528 | "dev": true,
2529 | "dependencies": {
2530 | "fs.realpath": "^1.0.0",
2531 | "inflight": "^1.0.4",
2532 | "inherits": "2",
2533 | "minimatch": "^3.1.1",
2534 | "once": "^1.3.0",
2535 | "path-is-absolute": "^1.0.0"
2536 | },
2537 | "engines": {
2538 | "node": "*"
2539 | },
2540 | "funding": {
2541 | "url": "https://github.com/sponsors/isaacs"
2542 | }
2543 | },
2544 | "node_modules/run-async": {
2545 | "version": "2.4.1",
2546 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
2547 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
2548 | "dev": true,
2549 | "engines": {
2550 | "node": ">=0.12.0"
2551 | }
2552 | },
2553 | "node_modules/rxjs": {
2554 | "version": "6.6.7",
2555 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
2556 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
2557 | "dev": true,
2558 | "dependencies": {
2559 | "tslib": "^1.9.0"
2560 | },
2561 | "engines": {
2562 | "npm": ">=2.0.0"
2563 | }
2564 | },
2565 | "node_modules/safe-buffer": {
2566 | "version": "5.2.1",
2567 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
2568 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
2569 | "dev": true,
2570 | "funding": [
2571 | {
2572 | "type": "github",
2573 | "url": "https://github.com/sponsors/feross"
2574 | },
2575 | {
2576 | "type": "patreon",
2577 | "url": "https://www.patreon.com/feross"
2578 | },
2579 | {
2580 | "type": "consulting",
2581 | "url": "https://feross.org/support"
2582 | }
2583 | ]
2584 | },
2585 | "node_modules/safer-buffer": {
2586 | "version": "2.1.2",
2587 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2588 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
2589 | "dev": true
2590 | },
2591 | "node_modules/semver": {
2592 | "version": "7.6.3",
2593 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
2594 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
2595 | "dev": true,
2596 | "bin": {
2597 | "semver": "bin/semver.js"
2598 | },
2599 | "engines": {
2600 | "node": ">=10"
2601 | }
2602 | },
2603 | "node_modules/serialize-javascript": {
2604 | "version": "6.0.2",
2605 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
2606 | "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
2607 | "dev": true,
2608 | "dependencies": {
2609 | "randombytes": "^2.1.0"
2610 | }
2611 | },
2612 | "node_modules/setimmediate": {
2613 | "version": "1.0.5",
2614 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
2615 | "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
2616 | "dev": true
2617 | },
2618 | "node_modules/shebang-command": {
2619 | "version": "1.2.0",
2620 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
2621 | "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
2622 | "dev": true,
2623 | "dependencies": {
2624 | "shebang-regex": "^1.0.0"
2625 | },
2626 | "engines": {
2627 | "node": ">=0.10.0"
2628 | }
2629 | },
2630 | "node_modules/shebang-regex": {
2631 | "version": "1.0.0",
2632 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
2633 | "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
2634 | "dev": true,
2635 | "engines": {
2636 | "node": ">=0.10.0"
2637 | }
2638 | },
2639 | "node_modules/signal-exit": {
2640 | "version": "4.1.0",
2641 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
2642 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
2643 | "dev": true,
2644 | "engines": {
2645 | "node": ">=14"
2646 | },
2647 | "funding": {
2648 | "url": "https://github.com/sponsors/isaacs"
2649 | }
2650 | },
2651 | "node_modules/slice-ansi": {
2652 | "version": "2.1.0",
2653 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
2654 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
2655 | "dev": true,
2656 | "dependencies": {
2657 | "ansi-styles": "^3.2.0",
2658 | "astral-regex": "^1.0.0",
2659 | "is-fullwidth-code-point": "^2.0.0"
2660 | },
2661 | "engines": {
2662 | "node": ">=6"
2663 | }
2664 | },
2665 | "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": {
2666 | "version": "2.0.0",
2667 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2668 | "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
2669 | "dev": true,
2670 | "engines": {
2671 | "node": ">=4"
2672 | }
2673 | },
2674 | "node_modules/sprintf-js": {
2675 | "version": "1.0.3",
2676 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
2677 | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
2678 | "dev": true
2679 | },
2680 | "node_modules/string_decoder": {
2681 | "version": "1.1.1",
2682 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2683 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2684 | "dev": true,
2685 | "dependencies": {
2686 | "safe-buffer": "~5.1.0"
2687 | }
2688 | },
2689 | "node_modules/string_decoder/node_modules/safe-buffer": {
2690 | "version": "5.1.2",
2691 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2692 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
2693 | "dev": true
2694 | },
2695 | "node_modules/string-width": {
2696 | "version": "4.2.3",
2697 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2698 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2699 | "dev": true,
2700 | "dependencies": {
2701 | "emoji-regex": "^8.0.0",
2702 | "is-fullwidth-code-point": "^3.0.0",
2703 | "strip-ansi": "^6.0.1"
2704 | },
2705 | "engines": {
2706 | "node": ">=8"
2707 | }
2708 | },
2709 | "node_modules/string-width-cjs": {
2710 | "name": "string-width",
2711 | "version": "4.2.3",
2712 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2713 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2714 | "dev": true,
2715 | "dependencies": {
2716 | "emoji-regex": "^8.0.0",
2717 | "is-fullwidth-code-point": "^3.0.0",
2718 | "strip-ansi": "^6.0.1"
2719 | },
2720 | "engines": {
2721 | "node": ">=8"
2722 | }
2723 | },
2724 | "node_modules/string-width-cjs/node_modules/ansi-regex": {
2725 | "version": "5.0.1",
2726 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2727 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2728 | "dev": true,
2729 | "engines": {
2730 | "node": ">=8"
2731 | }
2732 | },
2733 | "node_modules/string-width-cjs/node_modules/strip-ansi": {
2734 | "version": "6.0.1",
2735 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2736 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2737 | "dev": true,
2738 | "dependencies": {
2739 | "ansi-regex": "^5.0.1"
2740 | },
2741 | "engines": {
2742 | "node": ">=8"
2743 | }
2744 | },
2745 | "node_modules/string-width/node_modules/ansi-regex": {
2746 | "version": "5.0.1",
2747 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2748 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2749 | "dev": true,
2750 | "engines": {
2751 | "node": ">=8"
2752 | }
2753 | },
2754 | "node_modules/string-width/node_modules/strip-ansi": {
2755 | "version": "6.0.1",
2756 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2757 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2758 | "dev": true,
2759 | "dependencies": {
2760 | "ansi-regex": "^5.0.1"
2761 | },
2762 | "engines": {
2763 | "node": ">=8"
2764 | }
2765 | },
2766 | "node_modules/strip-ansi": {
2767 | "version": "5.2.0",
2768 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
2769 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
2770 | "dev": true,
2771 | "dependencies": {
2772 | "ansi-regex": "^4.1.0"
2773 | },
2774 | "engines": {
2775 | "node": ">=6"
2776 | }
2777 | },
2778 | "node_modules/strip-ansi-cjs": {
2779 | "name": "strip-ansi",
2780 | "version": "6.0.1",
2781 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2782 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2783 | "dev": true,
2784 | "dependencies": {
2785 | "ansi-regex": "^5.0.1"
2786 | },
2787 | "engines": {
2788 | "node": ">=8"
2789 | }
2790 | },
2791 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
2792 | "version": "5.0.1",
2793 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2794 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2795 | "dev": true,
2796 | "engines": {
2797 | "node": ">=8"
2798 | }
2799 | },
2800 | "node_modules/strip-json-comments": {
2801 | "version": "3.1.1",
2802 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
2803 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
2804 | "dev": true,
2805 | "engines": {
2806 | "node": ">=8"
2807 | },
2808 | "funding": {
2809 | "url": "https://github.com/sponsors/sindresorhus"
2810 | }
2811 | },
2812 | "node_modules/supports-color": {
2813 | "version": "5.5.0",
2814 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2815 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2816 | "dev": true,
2817 | "dependencies": {
2818 | "has-flag": "^3.0.0"
2819 | },
2820 | "engines": {
2821 | "node": ">=4"
2822 | }
2823 | },
2824 | "node_modules/table": {
2825 | "version": "5.4.6",
2826 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
2827 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
2828 | "dev": true,
2829 | "dependencies": {
2830 | "ajv": "^6.10.2",
2831 | "lodash": "^4.17.14",
2832 | "slice-ansi": "^2.1.0",
2833 | "string-width": "^3.0.0"
2834 | },
2835 | "engines": {
2836 | "node": ">=6.0.0"
2837 | }
2838 | },
2839 | "node_modules/table/node_modules/emoji-regex": {
2840 | "version": "7.0.3",
2841 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
2842 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
2843 | "dev": true
2844 | },
2845 | "node_modules/table/node_modules/is-fullwidth-code-point": {
2846 | "version": "2.0.0",
2847 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2848 | "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
2849 | "dev": true,
2850 | "engines": {
2851 | "node": ">=4"
2852 | }
2853 | },
2854 | "node_modules/table/node_modules/string-width": {
2855 | "version": "3.1.0",
2856 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2857 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2858 | "dev": true,
2859 | "dependencies": {
2860 | "emoji-regex": "^7.0.1",
2861 | "is-fullwidth-code-point": "^2.0.0",
2862 | "strip-ansi": "^5.1.0"
2863 | },
2864 | "engines": {
2865 | "node": ">=6"
2866 | }
2867 | },
2868 | "node_modules/text-table": {
2869 | "version": "0.2.0",
2870 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
2871 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
2872 | "dev": true
2873 | },
2874 | "node_modules/through": {
2875 | "version": "2.3.8",
2876 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
2877 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
2878 | "dev": true
2879 | },
2880 | "node_modules/tmp": {
2881 | "version": "0.2.3",
2882 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
2883 | "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
2884 | "engines": {
2885 | "node": ">=14.14"
2886 | }
2887 | },
2888 | "node_modules/to-regex-range": {
2889 | "version": "5.0.1",
2890 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2891 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2892 | "dev": true,
2893 | "dependencies": {
2894 | "is-number": "^7.0.0"
2895 | },
2896 | "engines": {
2897 | "node": ">=8.0"
2898 | }
2899 | },
2900 | "node_modules/traverse": {
2901 | "version": "0.3.9",
2902 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
2903 | "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==",
2904 | "dev": true,
2905 | "engines": {
2906 | "node": "*"
2907 | }
2908 | },
2909 | "node_modules/tslib": {
2910 | "version": "1.14.1",
2911 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
2912 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
2913 | "dev": true
2914 | },
2915 | "node_modules/tsutils": {
2916 | "version": "3.21.0",
2917 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
2918 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
2919 | "dev": true,
2920 | "dependencies": {
2921 | "tslib": "^1.8.1"
2922 | },
2923 | "engines": {
2924 | "node": ">= 6"
2925 | },
2926 | "peerDependencies": {
2927 | "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
2928 | }
2929 | },
2930 | "node_modules/type-check": {
2931 | "version": "0.3.2",
2932 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
2933 | "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
2934 | "dev": true,
2935 | "dependencies": {
2936 | "prelude-ls": "~1.1.2"
2937 | },
2938 | "engines": {
2939 | "node": ">= 0.8.0"
2940 | }
2941 | },
2942 | "node_modules/type-fest": {
2943 | "version": "0.8.1",
2944 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
2945 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
2946 | "dev": true,
2947 | "engines": {
2948 | "node": ">=8"
2949 | }
2950 | },
2951 | "node_modules/typescript": {
2952 | "version": "4.9.5",
2953 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
2954 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
2955 | "dev": true,
2956 | "bin": {
2957 | "tsc": "bin/tsc",
2958 | "tsserver": "bin/tsserver"
2959 | },
2960 | "engines": {
2961 | "node": ">=4.2.0"
2962 | }
2963 | },
2964 | "node_modules/unzipper": {
2965 | "version": "0.10.14",
2966 | "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz",
2967 | "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==",
2968 | "dev": true,
2969 | "dependencies": {
2970 | "big-integer": "^1.6.17",
2971 | "binary": "~0.3.0",
2972 | "bluebird": "~3.4.1",
2973 | "buffer-indexof-polyfill": "~1.0.0",
2974 | "duplexer2": "~0.1.4",
2975 | "fstream": "^1.0.12",
2976 | "graceful-fs": "^4.2.2",
2977 | "listenercount": "~1.0.1",
2978 | "readable-stream": "~2.3.6",
2979 | "setimmediate": "~1.0.4"
2980 | }
2981 | },
2982 | "node_modules/uri-js": {
2983 | "version": "4.4.1",
2984 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
2985 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
2986 | "dev": true,
2987 | "dependencies": {
2988 | "punycode": "^2.1.0"
2989 | }
2990 | },
2991 | "node_modules/util-deprecate": {
2992 | "version": "1.0.2",
2993 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2994 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
2995 | "dev": true
2996 | },
2997 | "node_modules/v8-compile-cache": {
2998 | "version": "2.4.0",
2999 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
3000 | "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==",
3001 | "dev": true
3002 | },
3003 | "node_modules/which": {
3004 | "version": "1.3.1",
3005 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
3006 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
3007 | "dev": true,
3008 | "dependencies": {
3009 | "isexe": "^2.0.0"
3010 | },
3011 | "bin": {
3012 | "which": "bin/which"
3013 | }
3014 | },
3015 | "node_modules/word-wrap": {
3016 | "version": "1.2.5",
3017 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
3018 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
3019 | "dev": true,
3020 | "engines": {
3021 | "node": ">=0.10.0"
3022 | }
3023 | },
3024 | "node_modules/workerpool": {
3025 | "version": "6.5.1",
3026 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz",
3027 | "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==",
3028 | "dev": true
3029 | },
3030 | "node_modules/wrap-ansi": {
3031 | "version": "8.1.0",
3032 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
3033 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
3034 | "dev": true,
3035 | "dependencies": {
3036 | "ansi-styles": "^6.1.0",
3037 | "string-width": "^5.0.1",
3038 | "strip-ansi": "^7.0.1"
3039 | },
3040 | "engines": {
3041 | "node": ">=12"
3042 | },
3043 | "funding": {
3044 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
3045 | }
3046 | },
3047 | "node_modules/wrap-ansi-cjs": {
3048 | "name": "wrap-ansi",
3049 | "version": "7.0.0",
3050 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
3051 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
3052 | "dev": true,
3053 | "dependencies": {
3054 | "ansi-styles": "^4.0.0",
3055 | "string-width": "^4.1.0",
3056 | "strip-ansi": "^6.0.0"
3057 | },
3058 | "engines": {
3059 | "node": ">=10"
3060 | },
3061 | "funding": {
3062 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
3063 | }
3064 | },
3065 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
3066 | "version": "5.0.1",
3067 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
3068 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
3069 | "dev": true,
3070 | "engines": {
3071 | "node": ">=8"
3072 | }
3073 | },
3074 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
3075 | "version": "4.3.0",
3076 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
3077 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
3078 | "dev": true,
3079 | "dependencies": {
3080 | "color-convert": "^2.0.1"
3081 | },
3082 | "engines": {
3083 | "node": ">=8"
3084 | },
3085 | "funding": {
3086 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
3087 | }
3088 | },
3089 | "node_modules/wrap-ansi-cjs/node_modules/color-convert": {
3090 | "version": "2.0.1",
3091 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
3092 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
3093 | "dev": true,
3094 | "dependencies": {
3095 | "color-name": "~1.1.4"
3096 | },
3097 | "engines": {
3098 | "node": ">=7.0.0"
3099 | }
3100 | },
3101 | "node_modules/wrap-ansi-cjs/node_modules/color-name": {
3102 | "version": "1.1.4",
3103 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
3104 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
3105 | "dev": true
3106 | },
3107 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
3108 | "version": "6.0.1",
3109 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
3110 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
3111 | "dev": true,
3112 | "dependencies": {
3113 | "ansi-regex": "^5.0.1"
3114 | },
3115 | "engines": {
3116 | "node": ">=8"
3117 | }
3118 | },
3119 | "node_modules/wrap-ansi/node_modules/ansi-regex": {
3120 | "version": "6.0.1",
3121 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
3122 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
3123 | "dev": true,
3124 | "engines": {
3125 | "node": ">=12"
3126 | },
3127 | "funding": {
3128 | "url": "https://github.com/chalk/ansi-regex?sponsor=1"
3129 | }
3130 | },
3131 | "node_modules/wrap-ansi/node_modules/ansi-styles": {
3132 | "version": "6.2.1",
3133 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
3134 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
3135 | "dev": true,
3136 | "engines": {
3137 | "node": ">=12"
3138 | },
3139 | "funding": {
3140 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
3141 | }
3142 | },
3143 | "node_modules/wrap-ansi/node_modules/emoji-regex": {
3144 | "version": "9.2.2",
3145 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
3146 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
3147 | "dev": true
3148 | },
3149 | "node_modules/wrap-ansi/node_modules/string-width": {
3150 | "version": "5.1.2",
3151 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
3152 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
3153 | "dev": true,
3154 | "dependencies": {
3155 | "eastasianwidth": "^0.2.0",
3156 | "emoji-regex": "^9.2.2",
3157 | "strip-ansi": "^7.0.1"
3158 | },
3159 | "engines": {
3160 | "node": ">=12"
3161 | },
3162 | "funding": {
3163 | "url": "https://github.com/sponsors/sindresorhus"
3164 | }
3165 | },
3166 | "node_modules/wrap-ansi/node_modules/strip-ansi": {
3167 | "version": "7.1.0",
3168 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
3169 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
3170 | "dev": true,
3171 | "dependencies": {
3172 | "ansi-regex": "^6.0.1"
3173 | },
3174 | "engines": {
3175 | "node": ">=12"
3176 | },
3177 | "funding": {
3178 | "url": "https://github.com/chalk/strip-ansi?sponsor=1"
3179 | }
3180 | },
3181 | "node_modules/wrappy": {
3182 | "version": "1.0.2",
3183 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
3184 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
3185 | "dev": true
3186 | },
3187 | "node_modules/write": {
3188 | "version": "1.0.3",
3189 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
3190 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
3191 | "dev": true,
3192 | "dependencies": {
3193 | "mkdirp": "^0.5.1"
3194 | },
3195 | "engines": {
3196 | "node": ">=4"
3197 | }
3198 | },
3199 | "node_modules/y18n": {
3200 | "version": "5.0.8",
3201 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
3202 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
3203 | "dev": true,
3204 | "engines": {
3205 | "node": ">=10"
3206 | }
3207 | },
3208 | "node_modules/yargs": {
3209 | "version": "16.2.0",
3210 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
3211 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
3212 | "dev": true,
3213 | "dependencies": {
3214 | "cliui": "^7.0.2",
3215 | "escalade": "^3.1.1",
3216 | "get-caller-file": "^2.0.5",
3217 | "require-directory": "^2.1.1",
3218 | "string-width": "^4.2.0",
3219 | "y18n": "^5.0.5",
3220 | "yargs-parser": "^20.2.2"
3221 | },
3222 | "engines": {
3223 | "node": ">=10"
3224 | }
3225 | },
3226 | "node_modules/yargs-parser": {
3227 | "version": "20.2.9",
3228 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
3229 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
3230 | "dev": true,
3231 | "engines": {
3232 | "node": ">=10"
3233 | }
3234 | },
3235 | "node_modules/yargs-unparser": {
3236 | "version": "2.0.0",
3237 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
3238 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
3239 | "dev": true,
3240 | "dependencies": {
3241 | "camelcase": "^6.0.0",
3242 | "decamelize": "^4.0.0",
3243 | "flat": "^5.0.2",
3244 | "is-plain-obj": "^2.1.0"
3245 | },
3246 | "engines": {
3247 | "node": ">=10"
3248 | }
3249 | },
3250 | "node_modules/yocto-queue": {
3251 | "version": "0.1.0",
3252 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
3253 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
3254 | "dev": true,
3255 | "engines": {
3256 | "node": ">=10"
3257 | },
3258 | "funding": {
3259 | "url": "https://github.com/sponsors/sindresorhus"
3260 | }
3261 | }
3262 | }
3263 | }
3264 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "gcov-viewer",
3 | "displayName": "Gcov Viewer",
4 | "description": "Decorate C/C++ source files with code coverage information generated by gcov.",
5 | "version": "0.6.0",
6 | "license": "MIT",
7 | "publisher": "JacquesLucke",
8 | "author": {
9 | "name": "Jacques Lucke",
10 | "email": "mail@jlucke.com"
11 | },
12 | "engines": {
13 | "vscode": "^1.64.0"
14 | },
15 | "repository": {
16 | "type": "git",
17 | "url": "https://github.com/JacquesLucke/gcov-viewer"
18 | },
19 | "bugs": {
20 | "url": "https://github.com/JacquesLucke/gcov-viewer/issues"
21 | },
22 | "categories": [
23 | "Other"
24 | ],
25 | "activationEvents": [
26 | "onCommand:gcov-viewer.show",
27 | "onCommand:gcov-viewer.hide",
28 | "onCommand:gcov-viewer.toggle",
29 | "onCommand:gcov-viewer.reloadGcdaFiles",
30 | "onCommand:gcov-viewer.deleteGcdaFiles",
31 | "onCommand:gcov-viewer.selectBuildDirectory",
32 | "onCommand:gcov-viewer.dumpPathsWithCoverageData",
33 | "onCommand:gcov-viewer.viewFunctionsByCallCount",
34 | "onCommand:gcov-viewer.generateSummaryHTML"
35 | ],
36 | "main": "./out/extension.js",
37 | "contributes": {
38 | "commands": [
39 | {
40 | "command": "gcov-viewer.show",
41 | "title": "Show",
42 | "category": "Gcov Viewer"
43 | },
44 | {
45 | "command": "gcov-viewer.hide",
46 | "title": "Hide",
47 | "category": "Gcov Viewer"
48 | },
49 | {
50 | "command": "gcov-viewer.toggle",
51 | "title": "Toggle",
52 | "category": "Gcov Viewer"
53 | },
54 | {
55 | "command": "gcov-viewer.reloadGcdaFiles",
56 | "title": "Reload (Import .gcda Files)",
57 | "category": "Gcov Viewer"
58 | },
59 | {
60 | "command": "gcov-viewer.deleteGcdaFiles",
61 | "title": "Reset (Delete .gcda Files)",
62 | "category": "Gcov Viewer"
63 | },
64 | {
65 | "command": "gcov-viewer.selectBuildDirectory",
66 | "title": "Select Build Directory",
67 | "category": "Gcov Viewer"
68 | },
69 | {
70 | "command": "gcov-viewer.dumpPathsWithCoverageData",
71 | "title": "Dump Paths with Coverage Data",
72 | "category": "Gcov Viewer"
73 | },
74 | {
75 | "command": "gcov-viewer.viewFunctionsByCallCount",
76 | "title": "View Functions by Call Count",
77 | "category": "Gcov Viewer"
78 | },
79 | {
80 | "command": "gcov-viewer.generateSummaryHTML",
81 | "title": "Generate Summary as HTML",
82 | "category": "Gcov Viewer"
83 | }
84 | ],
85 | "configuration": [
86 | {
87 | "title": "Gcov Viewer",
88 | "properties": {
89 | "gcovViewer.buildDirectories": {
90 | "type": "array",
91 | "title": "Build Directories",
92 | "scope": "window",
93 | "description": "Directories that will be included in the search for .gcda files."
94 | },
95 | "gcovViewer.gcovBinary": {
96 | "type": "string",
97 | "title": "Gcov Binary",
98 | "scope": "machine-overridable",
99 | "description": "Path to the gcov binary",
100 | "default": "gcov"
101 | },
102 | "gcovViewer.highlightMissedLines": {
103 | "type": "boolean",
104 | "title": "Highlight Missed Lines",
105 | "scope": "resource",
106 | "description": "Not only mark the called lines but also the lines that have not been executed. This might not work in some header files, because gcov is not providing the data.",
107 | "default": false
108 | }
109 | }
110 | }
111 | ]
112 | },
113 | "scripts": {
114 | "vscode:prepublish": "npm run compile",
115 | "compile": "tsc -p ./",
116 | "lint": "eslint src --ext ts",
117 | "watch": "tsc -watch -p ./",
118 | "pretest": "npm run compile && npm run lint"
119 | },
120 | "devDependencies": {
121 | "@types/glob": "^8.1.0",
122 | "@types/mocha": "^10.0.7",
123 | "@types/node": "^13.11.0",
124 | "@types/tmp": "^0.2.6",
125 | "@types/vscode": "^1.64.0",
126 | "@typescript-eslint/eslint-plugin": "^2.30.0",
127 | "@typescript-eslint/parser": "^2.30.0",
128 | "eslint": "^6.8.0",
129 | "glob": "^11.0.0",
130 | "mocha": "^10.7.0",
131 | "typescript": "^4.5.5",
132 | "@vscode/test-electron": "^1.6.1"
133 | },
134 | "dependencies": {
135 | "tmp": "^0.2.3"
136 | }
137 | }
138 |
--------------------------------------------------------------------------------
/src/arrayUtils.ts:
--------------------------------------------------------------------------------
1 | export function shuffleArray(a: any[]) {
2 | for (let i = a.length - 1; i > 0; i--) {
3 | const j = Math.floor(Math.random() * (i + 1));
4 | [a[i], a[j]] = [a[j], a[i]];
5 | }
6 | return a;
7 | }
8 |
9 | export function splitArrayInChunks(array: any[], chunkAmount: number) {
10 | const chunkSize = Math.ceil(array.length / chunkAmount);
11 | const chunks = [];
12 | for (let i = 0; i < chunkAmount; i++) {
13 | chunks.push(array.slice(i * chunkSize, (i + 1) * chunkSize));
14 | }
15 | return chunks;
16 | }
17 |
--------------------------------------------------------------------------------
/src/coverageCache.ts:
--------------------------------------------------------------------------------
1 | import {
2 | loadGcovData,
3 | GcovFileData,
4 | GcovLineData,
5 | GcovFunctionData,
6 | } from "./gcovInterface";
7 |
8 | /**
9 | * Cache for all data loaded using gcov. This way we don't have to reload
10 | * it everytime the user looks at a new file.
11 | */
12 | export class CoverageCache {
13 | dataByFile: Map = new Map();
14 | demangledNames: Map = new Map();
15 | loadedGcdaFiles: string[] = [];
16 |
17 | async loadGcdaFiles(gcdaPaths: string[]) {
18 | const gcovDataArray = await loadGcovData(gcdaPaths);
19 |
20 | for (const gcovData of gcovDataArray) {
21 | for (const fileData of gcovData.files) {
22 | let fileCoverage = this.dataByFile.get(fileData.file);
23 | if (fileCoverage === undefined) {
24 | fileCoverage = new FileCoverage(fileData.file);
25 | this.dataByFile.set(fileData.file, fileCoverage);
26 | }
27 |
28 | fileCoverage.rawLines.push(...fileData.lines);
29 | fileCoverage.rawFunctions.push(...fileData.functions);
30 |
31 | for (const functionData of fileData.functions) {
32 | this.demangledNames.set(
33 | functionData.name,
34 | functionData.demangled_name
35 | );
36 | }
37 | }
38 | }
39 | this.loadedGcdaFiles.push(...gcdaPaths);
40 | }
41 |
42 | hasData() {
43 | return this.loadedGcdaFiles.length > 0;
44 | }
45 | }
46 |
47 | export class FileCoverage {
48 | path: string;
49 | rawLines: GcovLineData[] = [];
50 | rawFunctions: GcovFunctionData[] = [];
51 |
52 | calledLines?: number;
53 | totalLines?: number;
54 | maxLine?: number;
55 | dataByLine?: Map;
56 | functionsByStart?: Map;
57 |
58 | constructor(path: string) {
59 | this.path = path;
60 | }
61 |
62 | ensureAnalysed() {
63 | this.ensureFileCoverate();
64 | this.ensureLineCoverage();
65 | this.ensureFunctionCoverage();
66 | }
67 |
68 | ensureFileCoverate() {
69 | if (this.calledLines !== undefined) {
70 | return;
71 | }
72 | this.ensureLineCoverage();
73 | this.totalLines = this.dataByLine?.size;
74 | this.calledLines = 0;
75 | for (const lineCoverage of this.dataByLine!.values()) {
76 | if (lineCoverage.executionCount > 0) {
77 | this.calledLines++;
78 | }
79 | }
80 | }
81 |
82 | ensureLineCoverage() {
83 | if (this.dataByLine !== undefined) {
84 | return;
85 | }
86 | this.maxLine = -1;
87 | this.dataByLine = new Map();
88 | for (const rawLine of this.rawLines) {
89 | const line = rawLineToIndex(rawLine.line_number);
90 | let lineCoverage = this.dataByLine.get(line);
91 | if (lineCoverage === undefined) {
92 | lineCoverage = {
93 | line,
94 | raw: [],
95 | executionCount: 0,
96 | };
97 | this.dataByLine.set(line, lineCoverage);
98 | }
99 | lineCoverage.raw.push(rawLine);
100 | lineCoverage.executionCount += rawLine.count;
101 | if (line > this.maxLine) {
102 | this.maxLine = line;
103 | }
104 | }
105 | }
106 |
107 | ensureFunctionCoverage() {
108 | if (this.functionsByStart !== undefined) {
109 | return;
110 | }
111 | this.ensureLineCoverage();
112 |
113 | this.functionsByStart = new Map();
114 | for (const rawFunction of this.rawFunctions) {
115 | const startLine = rawLineToIndex(rawFunction.start_line);
116 | const endLine = rawLineToIndex(rawFunction.end_line);
117 | let functionCoverage = this.functionsByStart.get(startLine);
118 | if (functionCoverage === undefined) {
119 | functionCoverage = {
120 | startLine: startLine,
121 | endLine: endLine,
122 | baseName: extractCoreFunctionName(rawFunction.demangled_name),
123 | executionCount: 0,
124 | raw: [],
125 | calledLines: 0,
126 | totalLines: 0,
127 | };
128 | this.functionsByStart.set(startLine, functionCoverage);
129 | }
130 | functionCoverage.executionCount += rawFunction.execution_count;
131 | functionCoverage.raw.push(rawFunction);
132 | }
133 | for (const functionCoverage of this.functionsByStart.values()) {
134 | for (
135 | let line = functionCoverage.startLine;
136 | line <= functionCoverage.endLine;
137 | line++
138 | ) {
139 | const lineCoverage = this.dataByLine?.get(line);
140 | if (lineCoverage === undefined) {
141 | continue;
142 | }
143 | functionCoverage.totalLines++;
144 | if (lineCoverage.executionCount > 0) {
145 | functionCoverage.calledLines++;
146 | }
147 | }
148 | }
149 | }
150 | }
151 |
152 | export interface LineCoverage {
153 | line: number;
154 | raw: GcovLineData[];
155 | executionCount: number;
156 | }
157 |
158 | export interface FunctionCoverage {
159 | startLine: number;
160 | endLine: number;
161 | raw: GcovFunctionData[];
162 | baseName: string;
163 | executionCount: number;
164 | calledLines: number;
165 | totalLines: number;
166 | }
167 |
168 | function extractCoreFunctionName(demangledName: string) {
169 | /* Remove parts in parenthesis and templates. */
170 | let name = "";
171 | let templateDepth = 0;
172 | let parenthesisDepth = 0;
173 | let lastClosingParenthesis = 0;
174 | for (const c of demangledName) {
175 | if (c === "(") {
176 | parenthesisDepth++;
177 | } else if (c === ")") {
178 | parenthesisDepth--;
179 | if (parenthesisDepth === 0) {
180 | lastClosingParenthesis = name.length;
181 | }
182 | } else if (c == "<") {
183 | templateDepth++;
184 | } else if (c == ">") {
185 | templateDepth--;
186 | if (parenthesisDepth === 0 && templateDepth === 0) {
187 | name += "<...>";
188 | }
189 | } else if (parenthesisDepth === 0 && templateDepth == 0) {
190 | name += c;
191 | }
192 | }
193 | /* Remove possible stuff after the parameter list. */
194 | name = name.slice(0, lastClosingParenthesis);
195 | /* Remove return value. */
196 | name = name.split(" ").pop()!;
197 | /* Fix case for call operator. */
198 | if (name.endsWith("::operator")) {
199 | name += "()";
200 | }
201 | return name;
202 | }
203 |
204 | /** Lines in gcov start counting at 1. */
205 | function rawLineToIndex(lineNumber: number) {
206 | return lineNumber - 1;
207 | }
208 |
--------------------------------------------------------------------------------
/src/extension.ts:
--------------------------------------------------------------------------------
1 | import * as vscode from "vscode";
2 | import * as fs from "fs";
3 | import * as util from "util";
4 | import * as os from "os";
5 | import * as tmp from "tmp";
6 | import * as fs_path from "path";
7 | import {
8 | GcovLineData,
9 | isGcovCompatible,
10 | GcovFunctionData,
11 | GcovFileData,
12 | } from "./gcovInterface";
13 | import { findAllFilesRecursively } from "./fsScanning";
14 | import { splitArrayInChunks, shuffleArray } from "./arrayUtils";
15 | import {
16 | CoverageCache,
17 | FileCoverage,
18 | LineCoverage,
19 | FunctionCoverage,
20 | } from "./coverageCache";
21 |
22 | let isShowingDecorations: boolean = false;
23 | let coverageStatusBarItem: vscode.StatusBarItem;
24 |
25 | export function activate(context: vscode.ExtensionContext) {
26 | const commands: [string, any][] = [
27 | ["gcov-viewer.show", COMMAND_showDecorations],
28 | ["gcov-viewer.hide", COMMAND_hideDecorations],
29 | ["gcov-viewer.toggle", COMMAND_toggleDecorations],
30 | ["gcov-viewer.reloadGcdaFiles", COMMAND_reloadGcdaFiles],
31 | ["gcov-viewer.deleteGcdaFiles", COMMAND_deleteGcdaFiles],
32 | ["gcov-viewer.selectBuildDirectory", COMMAND_selectBuildDirectory],
33 | [
34 | "gcov-viewer.dumpPathsWithCoverageData",
35 | COMMAND_dumpPathsWithCoverageData,
36 | ],
37 | ["gcov-viewer.viewFunctionsByCallCount", COMMAND_viewFunctionsByCallCount],
38 | ["gcov-viewer.generateSummaryHTML", COMMAND_generateSummaryHTML],
39 | ];
40 |
41 | for (const item of commands) {
42 | context.subscriptions.push(
43 | vscode.commands.registerCommand(item[0], item[1])
44 | );
45 | }
46 |
47 | coverageStatusBarItem = vscode.window.createStatusBarItem(
48 | vscode.StatusBarAlignment.Right,
49 | 100
50 | );
51 | context.subscriptions.push(coverageStatusBarItem);
52 |
53 | vscode.window.onDidChangeVisibleTextEditors(async (editors) => {
54 | if (isShowingDecorations) {
55 | await COMMAND_showDecorations();
56 | }
57 | });
58 | vscode.workspace.onDidChangeConfiguration(async () => {
59 | if (isShowingDecorations) {
60 | await COMMAND_showDecorations();
61 | }
62 | });
63 | vscode.window.onDidChangeActiveTextEditor(updateStatusBar);
64 | }
65 |
66 | export function deactivate() {}
67 |
68 | const calledLineColor = "rgba(50, 240, 50, 0.1)";
69 | const calledLinesDecorationType = vscode.window.createTextEditorDecorationType({
70 | isWholeLine: true,
71 | backgroundColor: calledLineColor,
72 | overviewRulerColor: calledLineColor,
73 | rangeBehavior: vscode.DecorationRangeBehavior.ClosedClosed,
74 | });
75 |
76 | const missedLineColor = "rgba(240, 50, 50, 0.1)";
77 | const missedLinesDecorationType = vscode.window.createTextEditorDecorationType({
78 | isWholeLine: true,
79 | backgroundColor: missedLineColor,
80 | overviewRulerColor: missedLineColor,
81 | rangeBehavior: vscode.DecorationRangeBehavior.ClosedClosed,
82 | });
83 |
84 | function getWorkspaceFolderConfig(workspaceFolder: vscode.WorkspaceFolder) {
85 | return vscode.workspace.getConfiguration("gcovViewer", workspaceFolder);
86 | }
87 |
88 | function getTextDocumentConfig(document: vscode.TextDocument) {
89 | return vscode.workspace.getConfiguration("gcovViewer", document);
90 | }
91 |
92 | function getBuildDirectories(): string[] {
93 | if (vscode.workspace.workspaceFolders === undefined) {
94 | return [];
95 | }
96 |
97 | const buildDirectories: string[] = [];
98 | const workspaceFolderPaths: string[] = [];
99 | for (const workspaceFolder of vscode.workspace.workspaceFolders) {
100 | workspaceFolderPaths.push(workspaceFolder.uri.fsPath);
101 | const config = getWorkspaceFolderConfig(workspaceFolder);
102 | const dirs = config.get("buildDirectories");
103 | if (dirs !== undefined) {
104 | for (let dir of dirs) {
105 | dir = dir.replace("${workspaceFolder}", workspaceFolder.uri.fsPath);
106 | buildDirectories.push(dir);
107 | }
108 | }
109 | }
110 | if (buildDirectories.length === 0) {
111 | buildDirectories.push(...workspaceFolderPaths);
112 | }
113 | return buildDirectories;
114 | }
115 |
116 | async function getGcdaPaths(
117 | progress?: MyProgress,
118 | token?: vscode.CancellationToken
119 | ) {
120 | progress?.report({ message: "Searching .gcda files" });
121 | const buildDirectories = getBuildDirectories();
122 |
123 | let counter = 0;
124 | const gcdaPaths: Set = new Set();
125 | for (const buildDirectory of buildDirectories) {
126 | await findAllFilesRecursively(
127 | buildDirectory,
128 | (path) => {
129 | if (path.endsWith(".gcda")) {
130 | gcdaPaths.add(path);
131 | }
132 | counter++;
133 | progress?.report({
134 | message: `[${counter}] Scanning (found ${gcdaPaths.size}): ${path}`,
135 | });
136 | },
137 | token
138 | );
139 | }
140 |
141 | return Array.from(gcdaPaths);
142 | }
143 |
144 | let coverageCache = new CoverageCache();
145 |
146 | type MyProgress = vscode.Progress<{ message?: string; increment?: number }>;
147 |
148 | async function reloadCoverageDataFromPaths(
149 | paths: string[],
150 | totalPaths: number,
151 | progress: MyProgress,
152 | token: vscode.CancellationToken
153 | ) {
154 | /* Process multiple paths per gcov invocation to avoid some overhead.
155 | * Don't process too many files at once so that the progress bar looks more active. */
156 | const chunks = splitArrayInChunks(paths, Math.ceil(paths.length / 30));
157 | for (const pathsChunk of chunks) {
158 | if (token.isCancellationRequested) {
159 | return;
160 | }
161 |
162 | await coverageCache.loadGcdaFiles(pathsChunk);
163 |
164 | progress.report({
165 | increment: (100 * pathsChunk.length) / totalPaths,
166 | message: `[${coverageCache.loadedGcdaFiles.length}/${totalPaths}] Parsing`,
167 | });
168 | }
169 | }
170 |
171 | function showNoFilesFoundMessage() {
172 | const message = `
173 | Cannot find any coverage data (.gcda files). Possible problems:
174 | 1) You have not built your program with --coverage.
175 | 2) The build directory is located somewhere else, you have to specify it using the button below.
176 | 3) You have not run the program yet.
177 | `;
178 |
179 | vscode.window
180 | .showErrorMessage(message, "Select Build Directory")
181 | .then((value) => {
182 | if (value === "Select Build Directory") {
183 | COMMAND_selectBuildDirectory();
184 | }
185 | });
186 | }
187 |
188 | async function reloadGcdaFiles() {
189 | if (!(await isGcovCompatible())) {
190 | return;
191 | }
192 | await vscode.window.withProgress(
193 | {
194 | location: vscode.ProgressLocation.Notification,
195 | cancellable: true,
196 | title: "Reload Coverage Data",
197 | },
198 | async (progress, token) => {
199 | coverageCache = new CoverageCache();
200 | progress.report({ increment: 0 });
201 |
202 | const gcdaPaths = await getGcdaPaths(progress, token);
203 | if (gcdaPaths.length === 0) {
204 | showNoFilesFoundMessage();
205 | return;
206 | }
207 |
208 | /* Shuffle paths make the processing time of the individual chunks more similar. */
209 | shuffleArray(gcdaPaths);
210 | const pathChunks = splitArrayInChunks(gcdaPaths, os.cpus().length);
211 |
212 | /* Process chunks asynchronously, so that gcov is invoked multiple times in parallel. */
213 | const promises = [];
214 | for (const pathChunk of pathChunks) {
215 | promises.push(
216 | reloadCoverageDataFromPaths(
217 | pathChunk,
218 | gcdaPaths.length,
219 | progress,
220 | token
221 | )
222 | );
223 | }
224 | await Promise.all(promises);
225 | }
226 | );
227 | }
228 |
229 | async function COMMAND_reloadGcdaFiles() {
230 | await reloadGcdaFiles();
231 | await showDecorations();
232 | updateStatusBar();
233 | }
234 |
235 | async function COMMAND_deleteGcdaFiles() {
236 | coverageCache = new CoverageCache();
237 |
238 | await vscode.window.withProgress(
239 | {
240 | location: vscode.ProgressLocation.Notification,
241 | cancellable: true,
242 | title: "Delete .gcda files",
243 | },
244 | async (progress, token) => {
245 | await COMMAND_hideDecorations();
246 | isShowingDecorations = false;
247 | progress.report({ increment: 0 });
248 | const paths = await getGcdaPaths(progress, token);
249 | const increment = 100 / paths.length;
250 | for (const [i, path] of paths.entries()) {
251 | if (token.isCancellationRequested) {
252 | return;
253 | }
254 | await util.promisify(fs.unlink)(path);
255 | progress.report({
256 | increment: increment,
257 | message: `[${i}/${paths.length}] Delete`,
258 | });
259 | }
260 | }
261 | );
262 | }
263 |
264 | async function COMMAND_toggleDecorations() {
265 | if (isShowingDecorations) {
266 | await COMMAND_hideDecorations();
267 | } else {
268 | await COMMAND_showDecorations();
269 | }
270 | }
271 |
272 | async function COMMAND_hideDecorations() {
273 | for (const editor of vscode.window.visibleTextEditors) {
274 | editor.setDecorations(calledLinesDecorationType, []);
275 | editor.setDecorations(missedLinesDecorationType, []);
276 | }
277 | isShowingDecorations = false;
278 | updateStatusBar();
279 | }
280 |
281 | async function showDecorations() {
282 | for (const editor of vscode.window.visibleTextEditors) {
283 | await decorateEditor(editor);
284 | }
285 | if (coverageCache.hasData()) {
286 | isShowingDecorations = true;
287 | }
288 | }
289 |
290 | async function COMMAND_showDecorations() {
291 | if (!isCoverageDataLoaded()) {
292 | await reloadGcdaFiles();
293 | }
294 | await showDecorations();
295 | updateStatusBar();
296 | }
297 |
298 | function findCachedDataForFile(absolutePath: string): FileCoverage | undefined {
299 | /* Check if there is cached data for the exact path. */
300 | const dataOfFile = coverageCache.dataByFile.get(absolutePath);
301 | if (dataOfFile !== undefined) {
302 | return dataOfFile;
303 | }
304 | /* Path of win32 is case insensitive and path separators may be different. */
305 | if (os.platform() === "win32") {
306 | const absolutePathWin = absolutePath.replace(/\\/g, "/").toLowerCase();
307 | for (const [storedPath, dataOfFile] of coverageCache.dataByFile.entries()) {
308 | if (
309 | storedPath.toLowerCase() === absolutePathWin &&
310 | dataOfFile !== undefined
311 | ) {
312 | return dataOfFile;
313 | }
314 | }
315 | }
316 | /* Try to guess which cached data belongs to the given path.
317 | * This might have to be improved in the future when we learn more about
318 | * the ways this can fail. */
319 | for (const [storedPath, dataOfFile] of coverageCache.dataByFile.entries()) {
320 | if (absolutePath.endsWith(storedPath)) {
321 | return dataOfFile;
322 | }
323 | }
324 | return undefined;
325 | }
326 |
327 | function isCoverageDataLoaded() {
328 | return coverageCache.dataByFile.size > 0;
329 | }
330 |
331 | function groupData(
332 | values: T[],
333 | getKey: (value: T) => Key
334 | ): Map {
335 | const map: Map = new Map();
336 | for (const value of values) {
337 | const key: Key = getKey(value);
338 | if (map.get(key)?.push(value) === undefined) {
339 | map.set(key, [value]);
340 | }
341 | }
342 | return map;
343 | }
344 |
345 | function computeSum(values: T[], getSummand: (value: T) => number) {
346 | return values.reduce((sum, value) => sum + getSummand(value), 0);
347 | }
348 |
349 | function sumTotalCalls(lines: GcovLineData[]): number {
350 | return computeSum(lines, (x) => x.count);
351 | }
352 |
353 | function createRangeForLine(lineIndex: number) {
354 | return new vscode.Range(
355 | new vscode.Position(lineIndex, 0),
356 | new vscode.Position(lineIndex, 100000)
357 | );
358 | }
359 |
360 | function createTooltipForCalledLine(
361 | lineDataByFunction: Map
362 | ) {
363 | const tooltipLinesWithCallCount: [string, number][] = [];
364 | for (const [functionName, dataArray] of lineDataByFunction.entries()) {
365 | let count = computeSum(dataArray, (x) => x.count);
366 | if (count > 0) {
367 | const demangledName = coverageCache.demangledNames.get(functionName)!;
368 | const tooltipLine = `${count.toLocaleString()}x in \`${demangledName}\`\n\n`;
369 | tooltipLinesWithCallCount.push([tooltipLine, count]);
370 | }
371 | }
372 | tooltipLinesWithCallCount.sort((a, b) => b[1] - a[1]);
373 | const tooltip = tooltipLinesWithCallCount.map((x) => x[0]).join("\n");
374 | return tooltip;
375 | }
376 |
377 | function createMissedLineDecoration(range: vscode.Range) {
378 | const decoration: vscode.DecorationOptions = {
379 | range: range,
380 | hoverMessage: "Line has not been executed",
381 | };
382 | return decoration;
383 | }
384 |
385 | function createCalledLineDecoration(
386 | range: vscode.Range,
387 | lineCoverage: LineCoverage,
388 | functionCoverage: FunctionCoverage | undefined
389 | ) {
390 | const calls = lineCoverage.executionCount;
391 | const isFunctionStart = functionCoverage !== undefined;
392 | const rawLineDataByFunction = groupData(
393 | lineCoverage.raw,
394 | (x) => x.function_name
395 | );
396 | const tooltip = createTooltipForCalledLine(rawLineDataByFunction);
397 | let text = ` ${calls.toLocaleString()}x`;
398 | if (isFunctionStart) {
399 | const coveratePercentage =
400 | (functionCoverage.calledLines / functionCoverage.totalLines) * 100;
401 | text += ` [${Number(coveratePercentage).toFixed(1)}%]`;
402 | }
403 | const decoration: vscode.DecorationOptions = {
404 | range: range,
405 | hoverMessage: tooltip,
406 | renderOptions: {
407 | after: {
408 | contentText: text,
409 | color: new vscode.ThemeColor("editorCodeLens.foreground"),
410 | fontStyle: "italic",
411 | },
412 | },
413 | };
414 | return decoration;
415 | }
416 |
417 | class LineDecorationsGroup {
418 | calledLineDecorations: vscode.DecorationOptions[] = [];
419 | missedLineDecorations: vscode.DecorationOptions[] = [];
420 | }
421 |
422 | function createDecorationsForFile(
423 | fileCoverage: FileCoverage
424 | ): LineDecorationsGroup {
425 | const decorations = new LineDecorationsGroup();
426 |
427 | fileCoverage.ensureAnalysed();
428 |
429 | for (let line = 0; line < fileCoverage.maxLine!; line++) {
430 | const lineCoverage = fileCoverage.dataByLine?.get(line);
431 | if (lineCoverage === undefined) {
432 | continue;
433 | }
434 | const functionCoverage = fileCoverage.functionsByStart?.get(line);
435 | const range = createRangeForLine(line);
436 |
437 | if (lineCoverage.executionCount === 0) {
438 | decorations.missedLineDecorations.push(createMissedLineDecoration(range));
439 | } else {
440 | decorations.calledLineDecorations.push(
441 | createCalledLineDecoration(range, lineCoverage, functionCoverage)
442 | );
443 | }
444 | }
445 |
446 | return decorations;
447 | }
448 |
449 | async function decorateEditor(editor: vscode.TextEditor) {
450 | const path = editor.document.uri.fsPath;
451 | const fileCoverage = findCachedDataForFile(path);
452 | if (fileCoverage === undefined) {
453 | return;
454 | }
455 |
456 | const config = getTextDocumentConfig(editor.document);
457 |
458 | const decorations = createDecorationsForFile(fileCoverage);
459 | editor.setDecorations(
460 | calledLinesDecorationType,
461 | decorations.calledLineDecorations
462 | );
463 | if (config.get("highlightMissedLines")) {
464 | editor.setDecorations(
465 | missedLinesDecorationType,
466 | decorations.missedLineDecorations
467 | );
468 | } else {
469 | editor.setDecorations(missedLinesDecorationType, []);
470 | }
471 | }
472 |
473 | async function COMMAND_selectBuildDirectory() {
474 | if (vscode.workspace.workspaceFolders === undefined) {
475 | return;
476 | }
477 |
478 | const value = await vscode.window.showOpenDialog({
479 | canSelectFiles: false,
480 | canSelectFolders: true,
481 | canSelectMany: true,
482 | openLabel: "Select Build Directory",
483 | });
484 | if (value === undefined) {
485 | return;
486 | }
487 |
488 | const paths: string[] = [];
489 | for (const uri of value) {
490 | paths.push(uri.fsPath);
491 | }
492 |
493 | for (const workspaceFolder of vscode.workspace.workspaceFolders) {
494 | const config = getWorkspaceFolderConfig(workspaceFolder);
495 | config.update("buildDirectories", paths);
496 | }
497 | }
498 |
499 | async function COMMAND_dumpPathsWithCoverageData() {
500 | if (vscode.workspace.workspaceFolders === undefined) {
501 | return;
502 | }
503 |
504 | if (!isCoverageDataLoaded()) {
505 | await reloadGcdaFiles();
506 | }
507 |
508 | const paths = Array.from(coverageCache.dataByFile.keys());
509 | paths.sort();
510 | const dumpedPaths = paths.join("\n");
511 | const document = await vscode.workspace.openTextDocument({
512 | content: dumpedPaths,
513 | });
514 | vscode.window.showTextDocument(document);
515 | }
516 |
517 | async function COMMAND_generateSummaryHTML() {
518 | if (!isCoverageDataLoaded()) {
519 | await reloadGcdaFiles();
520 | }
521 |
522 | const data = [];
523 | for (const [path, fileCoverage] of coverageCache.dataByFile.entries()) {
524 | fileCoverage.ensureAnalysed();
525 | const functionData = [];
526 | for (const functionCoverage of fileCoverage.functionsByStart!.values()) {
527 | functionData.push({
528 | name: functionCoverage.baseName,
529 | total: functionCoverage.totalLines,
530 | called: functionCoverage.calledLines,
531 | });
532 | }
533 | data.push({
534 | path,
535 | total: fileCoverage.totalLines,
536 | called: fileCoverage.calledLines,
537 | functions: functionData,
538 | });
539 | }
540 |
541 | const template = fs.readFileSync(
542 | fs_path.join(
543 | fs_path.dirname(__dirname),
544 | "html_report",
545 | "overview_template.html"
546 | ),
547 | "utf8"
548 | );
549 | const coverageDump = template.replace(
550 | "// analysisData = [{ dummy: 42 }];",
551 | `analysisData = ${JSON.stringify(data)}`
552 | );
553 |
554 | tmp.file({ postfix: ".html" }, (err, path) => {
555 | fs.writeFileSync(path, coverageDump);
556 | vscode.env.openExternal(vscode.Uri.file(path));
557 | });
558 | }
559 |
560 | async function COMMAND_viewFunctionsByCallCount() {
561 | const editor = vscode.window.activeTextEditor;
562 | if (editor === undefined) {
563 | return;
564 | }
565 |
566 | if (!isCoverageDataLoaded()) {
567 | await reloadGcdaFiles();
568 | }
569 |
570 | const fileCoverage = findCachedDataForFile(editor.document.uri.fsPath);
571 | if (fileCoverage === undefined) {
572 | return;
573 | }
574 |
575 | interface FunctionPickItem extends vscode.QuickPickItem {
576 | functionCoverage: FunctionCoverage;
577 | }
578 |
579 | fileCoverage.ensureAnalysed();
580 |
581 | let items: FunctionPickItem[] = [];
582 | for (const functionCoverage of fileCoverage.functionsByStart!.values()) {
583 | items.push({
584 | label: `${functionCoverage.executionCount.toLocaleString()}x ${
585 | functionCoverage.baseName
586 | }`,
587 | functionCoverage,
588 | });
589 | }
590 | items.sort(
591 | (a, b) =>
592 | b.functionCoverage.executionCount - a.functionCoverage.executionCount
593 | );
594 |
595 | const quickPick = vscode.window.createQuickPick();
596 | quickPick.items = items;
597 | quickPick.onDidHide(() => quickPick.dispose());
598 | quickPick.onDidChangeSelection(() => quickPick.hide());
599 | quickPick.onDidChangeActive((items) => {
600 | const functionCoverage = (items[0] as FunctionPickItem).functionCoverage;
601 | const startLine = functionCoverage.startLine;
602 | const endLine = functionCoverage.endLine;
603 | editor.selection = new vscode.Selection(
604 | new vscode.Position(startLine, 0),
605 | new vscode.Position(startLine, 0)
606 | );
607 | editor.revealRange(
608 | new vscode.Range(startLine, 0, endLine, 0),
609 | vscode.TextEditorRevealType.InCenter
610 | );
611 | });
612 | quickPick.show();
613 | }
614 |
615 | function updateStatusBar() {
616 | coverageStatusBarItem.hide();
617 | if (!isCoverageDataLoaded()) {
618 | return;
619 | }
620 | if (!isShowingDecorations) {
621 | return;
622 | }
623 | const path = vscode.window.activeTextEditor?.document.uri.fsPath;
624 | if (path === undefined) {
625 | return;
626 | }
627 | const fileCoverage = findCachedDataForFile(path);
628 | if (fileCoverage === undefined) {
629 | return;
630 | }
631 | fileCoverage.ensureAnalysed();
632 |
633 | const percentage =
634 | fileCoverage.totalLines! === 0
635 | ? 100
636 | : (fileCoverage.calledLines! / fileCoverage.totalLines!) * 100;
637 | coverageStatusBarItem.text = `Coverage: ${fileCoverage.calledLines!}/${fileCoverage.totalLines!} [${percentage.toFixed(
638 | 1
639 | )}%]`;
640 | coverageStatusBarItem.show();
641 | }
642 |
--------------------------------------------------------------------------------
/src/fsScanning.ts:
--------------------------------------------------------------------------------
1 | import * as vscode from "vscode";
2 | import * as fs from "fs";
3 | import { join } from "path";
4 |
5 | function readdirOrEmpty(path: string) {
6 | return new Promise((resolve) => {
7 | fs.readdir(path, (err, paths) => {
8 | if (err) {
9 | resolve([]);
10 | } else {
11 | resolve(paths);
12 | }
13 | });
14 | });
15 | }
16 |
17 | function statsOrUndefined(path: string) {
18 | return new Promise((resolve) => {
19 | fs.stat(path, (err, stats) => {
20 | if (err) {
21 | console.error(err);
22 | resolve(undefined);
23 | } else {
24 | resolve(stats);
25 | }
26 | });
27 | });
28 | }
29 |
30 | /**
31 | * Calls the given callback with every found file path in the given directory.
32 | * Other implementations return all paths at once, but the progress can't be
33 | * reported in the ui. Furthermore, this function can be cancelled by the user
34 | * if it takes too long.
35 | */
36 | export async function findAllFilesRecursively(
37 | directory: string,
38 | callback: (path: string) => void,
39 | token?: vscode.CancellationToken
40 | ) {
41 | let fileNames: string[] = await readdirOrEmpty(directory);
42 |
43 | for (const fileName of fileNames) {
44 | const path = join(directory, fileName);
45 | const stats = await statsOrUndefined(path);
46 | if (stats === undefined) {
47 | continue;
48 | }
49 | if (stats.isFile()) {
50 | if (token?.isCancellationRequested) {
51 | return;
52 | }
53 | callback(path);
54 | } else {
55 | await findAllFilesRecursively(path, callback, token);
56 | }
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/src/gcovInterface.ts:
--------------------------------------------------------------------------------
1 | import * as vscode from "vscode";
2 | import * as child_process from "child_process";
3 |
4 | export interface GcovLineData {
5 | count: number;
6 | function_name: string;
7 | line_number: number;
8 | unexecuted_block: boolean;
9 | }
10 |
11 | export interface GcovFunctionData {
12 | blocks: number;
13 | blocks_executed: number;
14 | demangled_name: string;
15 | start_column: number;
16 | start_line: number;
17 | end_column: number;
18 | end_line: number;
19 | execution_count: number;
20 | name: string;
21 | }
22 |
23 | export interface GcovFileData {
24 | file: string;
25 | lines: GcovLineData[];
26 | functions: GcovFunctionData[];
27 | }
28 |
29 | export interface GcovData {
30 | files: GcovFileData[];
31 | current_working_directory: string;
32 | data_file: string;
33 | }
34 |
35 | function getGcovBinary() {
36 | const config = vscode.workspace.getConfiguration("gcovViewer", null);
37 | const gcovBinary = config.get("gcovBinary");
38 | return gcovBinary;
39 | }
40 |
41 | export async function isGcovCompatible() {
42 | const gcovBinary = getGcovBinary();
43 | const command = `${gcovBinary} --help`;
44 | return new Promise((resolve, reject) => {
45 | child_process.exec(command, (err, stdout, stderr) => {
46 | if (err) {
47 | vscode.window.showErrorMessage(
48 | `Error while trying to run gcov, try to change the "Gcov Binary" setting. ${err}`
49 | );
50 | resolve(false);
51 | return;
52 | }
53 | const gcovOutput = stdout.toString();
54 | const supportsRequiredArgs =
55 | gcovOutput.includes("--json-format") && gcovOutput.includes("--stdout");
56 | if (!supportsRequiredArgs) {
57 | vscode.window.showErrorMessage(
58 | `The gcov version is not compatible. Please use at least version 9.`
59 | );
60 | }
61 | resolve(supportsRequiredArgs);
62 | });
63 | });
64 | }
65 |
66 | export async function loadGcovData(paths: string[]): Promise {
67 | if (paths.length === 0) {
68 | return [];
69 | }
70 |
71 | const gcovBinary = getGcovBinary();
72 |
73 | let command = `${gcovBinary} --stdout --json-format`;
74 | for (const path of paths) {
75 | command += ` "${path}"`;
76 | }
77 | return new Promise((resolve, reject) => {
78 | child_process.exec(
79 | command,
80 | { maxBuffer: 256 * 1024 * 1024 },
81 | (err, stdout, stderr) => {
82 | if (err) {
83 | vscode.window.showErrorMessage(
84 | `Error invoking gcov: ${stderr.toString()}`
85 | );
86 | console.log(err);
87 | reject();
88 | return;
89 | }
90 | const gcovOutput = stdout.toString();
91 | const output = [];
92 | const parts = gcovOutput.split("\n");
93 | for (const part of parts) {
94 | if (part.length === 0) {
95 | continue;
96 | }
97 | output.push(JSON.parse(part));
98 | }
99 | resolve(output);
100 | }
101 | );
102 | });
103 | }
104 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "target": "es6",
5 | "outDir": "out",
6 | "lib": [
7 | "es6"
8 | ],
9 | "sourceMap": true,
10 | "rootDir": "src",
11 | "strict": true /* enable all strict type-checking options */
12 | /* Additional Checks */
13 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
14 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
15 | // "noUnusedParameters": true, /* Report errors on unused parameters. */
16 | },
17 | "exclude": [
18 | "node_modules",
19 | ".vscode-test"
20 | ]
21 | }
22 |
--------------------------------------------------------------------------------