├── .eslintrc.json
├── .gitignore
├── .vscode
├── extensions.json
├── launch.json
├── settings.json
└── tasks.json
├── .vscodeignore
├── .yarnrc
├── CHANGELOG.md
├── LICENSE
├── README.md
├── assets
├── icon
│ ├── logo.png
│ └── nssctf.png
└── scripts
│ ├── paste.applescript
│ ├── paste.ps1
│ └── paste.sh
├── package.json
├── src
├── controller
│ ├── BaseController.ts
│ ├── MainController.ts
│ └── UserController.ts
├── event.ts
├── extension.ts
├── i18n
│ ├── index.ts
│ └── locale.ts
├── lib
│ └── balderich
│ │ ├── client.ts
│ │ ├── index.ts
│ │ ├── models
│ │ ├── contest.ts
│ │ ├── problem.ts
│ │ ├── resource.ts
│ │ ├── team.ts
│ │ └── user.ts
│ │ └── utils
│ │ ├── code.ts
│ │ └── exceptions.ts
├── model
│ ├── CodeModel.ts
│ └── ProblemNodeModel.ts
├── provider
│ └── ProblemProvider.ts
├── service
│ └── UserService.ts
├── store
│ ├── MainStore.ts
│ └── UserStore.ts
├── test
│ ├── runTest.ts
│ └── suite
│ │ ├── extension.test.ts
│ │ └── index.ts
└── util
│ ├── CacheUtil.ts
│ ├── CodeUtil.ts
│ ├── ConfigUtil.ts
│ ├── DecoratorUtil.ts
│ └── SystemUtil.ts
├── tsconfig.json
└── yarn.lock
/.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/naming-convention": "warn",
13 | "@typescript-eslint/semi": "warn",
14 | "curly": "warn",
15 | "eqeqeq": "warn",
16 | "no-throw-literal": "warn",
17 | "semi": "off"
18 | },
19 | "ignorePatterns": [
20 | "out",
21 | "dist",
22 | "**/*.d.ts"
23 | ]
24 | }
25 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | out
2 | dist
3 | node_modules
4 | .vscode-test/
5 | *.vsix
6 |
--------------------------------------------------------------------------------
/.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 | "args": [
13 | "--extensionDevelopmentPath=${workspaceFolder}"
14 | ],
15 | "outFiles": [
16 | "${workspaceFolder}/out/**/*.js"
17 | ],
18 | "preLaunchTask": "${defaultBuildTask}"
19 | },
20 | {
21 | "name": "Extension Tests",
22 | "type": "extensionHost",
23 | "request": "launch",
24 | "args": [
25 | "--extensionDevelopmentPath=${workspaceFolder}",
26 | "--extensionTestsPath=${workspaceFolder}/out/test/suite/index"
27 | ],
28 | "outFiles": [
29 | "${workspaceFolder}/out/test/**/*.js"
30 | ],
31 | "preLaunchTask": "${defaultBuildTask}"
32 | }
33 | ]
34 | }
35 |
--------------------------------------------------------------------------------
/.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 | }
--------------------------------------------------------------------------------
/.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 | src/**
4 | .gitignore
5 | .yarnrc
6 | vsc-extension-quickstart.md
7 | **/tsconfig.json
8 | **/.eslintrc.json
9 | **/*.map
10 | **/*.ts
11 |
--------------------------------------------------------------------------------
/.yarnrc:
--------------------------------------------------------------------------------
1 | --ignore-engines true
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Change Log
2 |
3 | All notable changes to the "nssctf" extension will be documented in this file.
4 |
5 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
6 |
7 | ## [Unreleased]
8 |
9 | - Initial release
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 |
2 | Apache License
3 | Version 2.0, January 2004
4 | http://www.apache.org/licenses/
5 |
6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7 |
8 | 1. Definitions.
9 |
10 | "License" shall mean the terms and conditions for use, reproduction,
11 | and distribution as defined by Sections 1 through 9 of this document.
12 |
13 | "Licensor" shall mean the copyright owner or entity authorized by
14 | the copyright owner that is granting the License.
15 |
16 | "Legal Entity" shall mean the union of the acting entity and all
17 | other entities that control, are controlled by, or are under common
18 | control with that entity. For the purposes of this definition,
19 | "control" means (i) the power, direct or indirect, to cause the
20 | direction or management of such entity, whether by contract or
21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
22 | outstanding shares, or (iii) beneficial ownership of such entity.
23 |
24 | "You" (or "Your") shall mean an individual or Legal Entity
25 | exercising permissions granted by this License.
26 |
27 | "Source" form shall mean the preferred form for making modifications,
28 | including but not limited to software source code, documentation
29 | source, and configuration files.
30 |
31 | "Object" form shall mean any form resulting from mechanical
32 | transformation or translation of a Source form, including but
33 | not limited to compiled object code, generated documentation,
34 | and conversions to other media types.
35 |
36 | "Work" shall mean the work of authorship, whether in Source or
37 | Object form, made available under the License, as indicated by a
38 | copyright notice that is included in or attached to the work
39 | (an example is provided in the Appendix below).
40 |
41 | "Derivative Works" shall mean any work, whether in Source or Object
42 | form, that is based on (or derived from) the Work and for which the
43 | editorial revisions, annotations, elaborations, or other modifications
44 | represent, as a whole, an original work of authorship. For the purposes
45 | of this License, Derivative Works shall not include works that remain
46 | separable from, or merely link (or bind by name) to the interfaces of,
47 | the Work and Derivative Works thereof.
48 |
49 | "Contribution" shall mean any work of authorship, including
50 | the original version of the Work and any modifications or additions
51 | to that Work or Derivative Works thereof, that is intentionally
52 | submitted to Licensor for inclusion in the Work by the copyright owner
53 | or by an individual or Legal Entity authorized to submit on behalf of
54 | the copyright owner. For the purposes of this definition, "submitted"
55 | means any form of electronic, verbal, or written communication sent
56 | to the Licensor or its representatives, including but not limited to
57 | communication on electronic mailing lists, source code control systems,
58 | and issue tracking systems that are managed by, or on behalf of, the
59 | Licensor for the purpose of discussing and improving the Work, but
60 | excluding communication that is conspicuously marked or otherwise
61 | designated in writing by the copyright owner as "Not a Contribution."
62 |
63 | "Contributor" shall mean Licensor and any individual or Legal Entity
64 | on behalf of whom a Contribution has been received by Licensor and
65 | subsequently incorporated within the Work.
66 |
67 | 2. Grant of Copyright License. Subject to the terms and conditions of
68 | this License, each Contributor hereby grants to You a perpetual,
69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70 | copyright license to reproduce, prepare Derivative Works of,
71 | publicly display, publicly perform, sublicense, and distribute the
72 | Work and such Derivative Works in Source or Object form.
73 |
74 | 3. Grant of Patent License. Subject to the terms and conditions of
75 | this License, each Contributor hereby grants to You a perpetual,
76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77 | (except as stated in this section) patent license to make, have made,
78 | use, offer to sell, sell, import, and otherwise transfer the Work,
79 | where such license applies only to those patent claims licensable
80 | by such Contributor that are necessarily infringed by their
81 | Contribution(s) alone or by combination of their Contribution(s)
82 | with the Work to which such Contribution(s) was submitted. If You
83 | institute patent litigation against any entity (including a
84 | cross-claim or counterclaim in a lawsuit) alleging that the Work
85 | or a Contribution incorporated within the Work constitutes direct
86 | or contributory patent infringement, then any patent licenses
87 | granted to You under this License for that Work shall terminate
88 | as of the date such litigation is filed.
89 |
90 | 4. Redistribution. You may reproduce and distribute copies of the
91 | Work or Derivative Works thereof in any medium, with or without
92 | modifications, and in Source or Object form, provided that You
93 | meet the following conditions:
94 |
95 | (a) You must give any other recipients of the Work or
96 | Derivative Works a copy of this License; and
97 |
98 | (b) You must cause any modified files to carry prominent notices
99 | stating that You changed the files; and
100 |
101 | (c) You must retain, in the Source form of any Derivative Works
102 | that You distribute, all copyright, patent, trademark, and
103 | attribution notices from the Source form of the Work,
104 | excluding those notices that do not pertain to any part of
105 | the Derivative Works; and
106 |
107 | (d) If the Work includes a "NOTICE" text file as part of its
108 | distribution, then any Derivative Works that You distribute must
109 | include a readable copy of the attribution notices contained
110 | within such NOTICE file, excluding those notices that do not
111 | pertain to any part of the Derivative Works, in at least one
112 | of the following places: within a NOTICE text file distributed
113 | as part of the Derivative Works; within the Source form or
114 | documentation, if provided along with the Derivative Works; or,
115 | within a display generated by the Derivative Works, if and
116 | wherever such third-party notices normally appear. The contents
117 | of the NOTICE file are for informational purposes only and
118 | do not modify the License. You may add Your own attribution
119 | notices within Derivative Works that You distribute, alongside
120 | or as an addendum to the NOTICE text from the Work, provided
121 | that such additional attribution notices cannot be construed
122 | as modifying the License.
123 |
124 | You may add Your own copyright statement to Your modifications and
125 | may provide additional or different license terms and conditions
126 | for use, reproduction, or distribution of Your modifications, or
127 | for any such Derivative Works as a whole, provided Your use,
128 | reproduction, and distribution of the Work otherwise complies with
129 | the conditions stated in this License.
130 |
131 | 5. Submission of Contributions. Unless You explicitly state otherwise,
132 | any Contribution intentionally submitted for inclusion in the Work
133 | by You to the Licensor shall be under the terms and conditions of
134 | this License, without any additional terms or conditions.
135 | Notwithstanding the above, nothing herein shall supersede or modify
136 | the terms of any separate license agreement you may have executed
137 | with Licensor regarding such Contributions.
138 |
139 | 6. Trademarks. This License does not grant permission to use the trade
140 | names, trademarks, service marks, or product names of the Licensor,
141 | except as required for reasonable and customary use in describing the
142 | origin of the Work and reproducing the content of the NOTICE file.
143 |
144 | 7. Disclaimer of Warranty. Unless required by applicable law or
145 | agreed to in writing, Licensor provides the Work (and each
146 | Contributor provides its Contributions) on an "AS IS" BASIS,
147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148 | implied, including, without limitation, any warranties or conditions
149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150 | PARTICULAR PURPOSE. You are solely responsible for determining the
151 | appropriateness of using or redistributing the Work and assume any
152 | risks associated with Your exercise of permissions under this License.
153 |
154 | 8. Limitation of Liability. In no event and under no legal theory,
155 | whether in tort (including negligence), contract, or otherwise,
156 | unless required by applicable law (such as deliberate and grossly
157 | negligent acts) or agreed to in writing, shall any Contributor be
158 | liable to You for damages, including any direct, indirect, special,
159 | incidental, or consequential damages of any character arising as a
160 | result of this License or out of the use or inability to use the
161 | Work (including but not limited to damages for loss of goodwill,
162 | work stoppage, computer failure or malfunction, or any and all
163 | other commercial damages or losses), even if such Contributor
164 | has been advised of the possibility of such damages.
165 |
166 | 9. Accepting Warranty or Additional Liability. While redistributing
167 | the Work or Derivative Works thereof, You may choose to offer,
168 | and charge a fee for, acceptance of support, warranty, indemnity,
169 | or other liability obligations and/or rights consistent with this
170 | License. However, in accepting such obligations, You may act only
171 | on Your own behalf and on Your sole responsibility, not on behalf
172 | of any other Contributor, and only if You agree to indemnify,
173 | defend, and hold each Contributor harmless for any liability
174 | incurred by, or claims asserted against, such Contributor by reason
175 | of your accepting any such warranty or additional liability.
176 |
177 | END OF TERMS AND CONDITIONS
178 |
179 | APPENDIX: How to apply the Apache License to your work.
180 |
181 | To apply the Apache License to your work, attach the following
182 | boilerplate notice, with the fields enclosed by brackets "[]"
183 | replaced with your own identifying information. (Don't include
184 | the brackets!) The text should be enclosed in the appropriate
185 | comment syntax for the file format. We also recommend that a
186 | file or class name and description of purpose be included on the
187 | same "printed page" as the copyright notice for easier
188 | identification within third-party archives.
189 |
190 | Copyright [yyyy] [name of copyright owner]
191 |
192 | Licensed under the Apache License, Version 2.0 (the "License");
193 | you may not use this file except in compliance with the License.
194 | You may obtain a copy of the License at
195 |
196 | http://www.apache.org/licenses/LICENSE-2.0
197 |
198 | Unless required by applicable law or agreed to in writing, software
199 | distributed under the License is distributed on an "AS IS" BASIS,
200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201 | See the License for the specific language governing permissions and
202 | limitations under the License.
203 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # NSSCTF官方VSCode扩展
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | * 地址:https://github.com/NSSCTF/nssctf-vscode-extension
11 |
12 | ## 功能
13 |
14 | |功能|完成情况|
15 | |-|-|
16 | |粘贴图片上传到图床|✅|
17 | |题目查看及分类|❌|
18 | |文章查看及分类|❌|
19 |
20 | * 欢迎提交Issues或者PR。
21 |
--------------------------------------------------------------------------------
/assets/icon/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/NSSCTF/nssctf-vscode-extension/9f0f935af87bb488036720b7af1b42a64f495911/assets/icon/logo.png
--------------------------------------------------------------------------------
/assets/icon/nssctf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/NSSCTF/nssctf-vscode-extension/9f0f935af87bb488036720b7af1b42a64f495911/assets/icon/nssctf.png
--------------------------------------------------------------------------------
/assets/scripts/paste.applescript:
--------------------------------------------------------------------------------
1 | property fileTypes : {{«class PNGf», ".png"}}
2 | property pathTypes : {{«class furl»}}
3 |
4 | on run argv
5 | if argv is {} then
6 | return ""
7 | end if
8 |
9 | try
10 | (item 1 of (clipboard info for «class furl»))
11 | return POSIX path of (the clipboard as «class furl»)
12 | on error
13 | set imagePath to (item 1 of argv)
14 | set theType to getType()
15 |
16 | if theType is not missing value then
17 | try
18 | set myFile to (open for access imagePath with write permission)
19 | set eof myFile to 0
20 | write (the clipboard as (first item of theType)) to myFile
21 | close access myFile
22 | return (POSIX path of imagePath)
23 | on error
24 | try
25 | close access myFile
26 | end try
27 | return ""
28 | end try
29 | else
30 | return "no image"
31 | end if
32 | end try
33 |
34 | end run
35 |
36 | on getType()
37 | repeat with aType in fileTypes
38 | repeat with theInfo in (clipboard info)
39 | if (first item of theInfo) is equal to (first item of aType) then return aType
40 | end repeat
41 | end repeat
42 | return missing value
43 | end getType
44 |
--------------------------------------------------------------------------------
/assets/scripts/paste.ps1:
--------------------------------------------------------------------------------
1 | param($imagePath)
2 |
3 | # Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1
4 | chcp 65001
5 |
6 | Add-Type -Assembly PresentationCore
7 | $img = [Windows.Clipboard]::GetImage()
8 |
9 | if ($null -eq $img) {
10 | $img = [Windows.Clipboard]::GetFileDropList()
11 | if ($null -eq $img) {
12 | "no image"
13 | Exit 1
14 | }
15 | $img
16 | Exit 0
17 | }
18 |
19 | if (-not $imagePath) {
20 | "no image"
21 | Exit 1
22 | }
23 |
24 | $fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)
25 | $stream = [IO.File]::Open($imagePath, "OpenOrCreate")
26 | $encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder
27 | $encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null
28 | $encoder.Save($stream) | out-null
29 | $stream.Dispose() | out-null
30 |
31 | $imagePath
--------------------------------------------------------------------------------
/assets/scripts/paste.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | # require xclip(see http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212)
4 | command -v xclip >/dev/null 2>&1 || {
5 | echo >&1 "no xclip"
6 | exit 1
7 | }
8 |
9 | # write image in clipboard to file (see http://unix.stackexchange.com/questions/145131/copy-image-from-clipboard-to-file)
10 | xclip -selection clipboard -target image/png -o >$1
11 | if [ $? -eq 0 ]; then
12 | echo $1
13 | else
14 | content=$(xclip -selection c -o)
15 | echo $content
16 | fi
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nssctf",
3 | "displayName": "NSSCTF(Beta)",
4 | "description": "NSSCTF VSCode插件",
5 | "version": "0.0.1",
6 | "icon": "assets/icon/logo.png",
7 | "publisher": "nssctf",
8 | "engines": {
9 | "vscode": "^1.78.0"
10 | },
11 | "keywords": [
12 | "nssctf",
13 | "ctf"
14 | ],
15 | "categories": [
16 | "Other"
17 | ],
18 | "repository": {
19 | "type": "git",
20 | "url": "https://github.com/NSSCTF/nssctf-vscode-extension"
21 | },
22 | "activationEvents": [
23 | ],
24 | "main": "./out/extension.js",
25 | "contributes": {
26 | "viewsContainers": {
27 | "activitybar": [
28 | {
29 | "id": "nssctf_bar",
30 | "title": "NSSCTF",
31 | "icon": "assets/icon/nssctf.png"
32 | }
33 | ]
34 | },
35 | "views": {
36 | "nssctf_bar": [
37 | {
38 | "id": "ProblemExplorer",
39 | "name": "题目"
40 | }
41 | ]
42 | },
43 | "commands": [
44 | {
45 | "command": "nssctf.pastePicture",
46 | "category": "NSSCTF",
47 | "title": "粘贴图片"
48 | },
49 | {
50 | "command": "nssctf.signIn",
51 | "category": "NSSCTF",
52 | "title": "signIn"
53 | }
54 | ],
55 | "keybindings": [
56 | {
57 | "command": "nssctf.pastePicture",
58 | "key": "alt+shift+v",
59 | "mac": "alt+shift+v",
60 | "when": "editorLangId == markdown || editorLangId == mdx || resourceExtname == .ipynb"
61 | }
62 | ],
63 | "menus": {
64 | "view/title": [
65 | {
66 | "command": "nssctf.signIn",
67 | "when": "view == ProblemExplorer",
68 | "group": "navigation@0"
69 | }
70 | ],
71 | "editor/context": [
72 | {
73 | "command": "nssctf.pastePicture",
74 | "when": "editorLangId == markdown || editorLangId == mdx || resourceExtname == .ipynb",
75 | "group": "NSSCTF@1"
76 | }
77 | ]
78 | },
79 | "configuration": [
80 | {
81 | "title": "NSSCTF",
82 | "properties": {
83 | "nssctf.api.key": {
84 | "type": "string",
85 | "default": "",
86 | "scope": "application",
87 | "description": "NSSCTF平台API Key"
88 | },
89 | "nssctf.api.secret": {
90 | "type": "string",
91 | "default": "",
92 | "description": "NSSCTF平台API Secret",
93 | "scope": "application"
94 | }
95 | }
96 | }
97 | ]
98 | },
99 | "scripts": {
100 | "vscode:prepublish": "yarn run compile",
101 | "compile": "tsc -p ./",
102 | "watch": "tsc -watch -p ./",
103 | "pretest": "yarn run compile && yarn run lint",
104 | "lint": "eslint src --ext ts",
105 | "test": "node ./out/test/runTest.js"
106 | },
107 | "devDependencies": {
108 | "@types/glob": "^8.1.0",
109 | "@types/mocha": "^10.0.1",
110 | "@types/node": "16.x",
111 | "@types/vscode": "^1.78.0",
112 | "@typescript-eslint/eslint-plugin": "^5.59.1",
113 | "@typescript-eslint/parser": "^5.59.1",
114 | "@vscode/test-electron": "^2.3.0",
115 | "eslint": "^8.39.0",
116 | "glob": "^8.1.0",
117 | "mocha": "^10.2.0",
118 | "typescript": "^5.0.4"
119 | },
120 | "dependencies": {
121 | "axios": "^1.4.0",
122 | "form-data": "^4.0.0"
123 | }
124 | }
125 |
--------------------------------------------------------------------------------
/src/controller/BaseController.ts:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/NSSCTF/nssctf-vscode-extension/9f0f935af87bb488036720b7af1b42a64f495911/src/controller/BaseController.ts
--------------------------------------------------------------------------------
/src/controller/MainController.ts:
--------------------------------------------------------------------------------
1 | import { ExtensionContext, window } from "vscode";
2 | import { mainStore } from "../store/MainStore";
3 | import { NSSClient } from "../lib/balderich";
4 | import { getBalderichAPI } from "../util/ConfigUtil";
5 | import { output } from "../util/CodeUtil";
6 | import locale from "../i18n/locale";
7 |
8 | class MainController {
9 | public async initialize(context: ExtensionContext) {
10 | mainStore.context = context;
11 | mainStore.cachePath = context.globalStorageUri;
12 | const api = getBalderichAPI();
13 | if (api.key.length !== 0) {
14 | mainStore.client = new NSSClient(null, api.key, api.secret);
15 | try {
16 | await mainStore.client.user.getSelfInfo()
17 | } catch (Error: any) {
18 | output.appendLine(Error.toString());
19 | mainStore.client = null;
20 | await window.showErrorMessage(locale['apiError']);
21 | }
22 |
23 | }
24 | }
25 | }
26 |
27 | export const mainController: MainController = new MainController();
--------------------------------------------------------------------------------
/src/controller/UserController.ts:
--------------------------------------------------------------------------------
1 | import * as vscode from 'vscode';
2 | import { mainStore } from "../store/MainStore";
3 | import * as cutils from '../util/CodeUtil' ;
4 | import * as sutils from '../util/SystemUtil' ;
5 | import * as path from 'path';
6 | import { userStore } from '../store/UserStore';
7 | import { locale } from '../i18n';
8 | import { exceptionCatch, requireLogin } from '../util/DecoratorUtil';
9 |
10 | class UserController {
11 | @exceptionCatch()
12 | @requireLogin()
13 | public async pastePicture(): Promise {
14 | let stop = cutils.showProgress();
15 |
16 | let editor = vscode.window.activeTextEditor;
17 | let selections = cutils.getSelections();
18 | let urls = [];
19 |
20 | let savePath = sutils.getTempDir();
21 | savePath = path.resolve(savePath, `pic_${new Date().getTime()}.png`);
22 | let images = await cutils.getPasteImage(savePath);
23 |
24 | images = images.filter(img => ['.jpg', '.jpeg', '.gif', '.bmp', '.png', '.webp', '.svg'].find(ext => img.endsWith(ext)));
25 | for (let i = 0; i < images.length; i++) {
26 | let name = path.basename(images[i]);
27 | let res = await mainStore.client?.user.postUserPicturebedUpload(name, images[i]);
28 | if (res) {
29 | urls.push(`https://www.nssctf.cn/${res.url}`);
30 | }
31 | }
32 |
33 | console.log(urls);
34 |
35 | let insertMsg = '';
36 | for (let i = 0; i < urls.length; i++) {
37 | let selection = locale['imageAlt'];
38 | if (selections?.length === 1 && editor?.document.getText(selections[0])) {
39 | selection = `${editor?.document.getText(selections[0])} ${i+1}`;
40 | } else if (selections?.[i] && editor?.document.getText(selections[i])) {
41 | selection = selections?.[i] && editor?.document.getText(selections[i]);
42 | }
43 |
44 |
45 | let text = ` \n`;
46 |
47 | insertMsg += text;
48 | }
49 | if (insertMsg) {
50 | let pos = editor?.selection.active;
51 | await cutils.editorEdit(pos, insertMsg);
52 | }
53 |
54 | stop();
55 | }
56 |
57 | public async signIn(): Promise {
58 | const key: string | undefined = await vscode.window.showInputBox({
59 | prompt: locale['siginInputKeyPropmt'],
60 | ignoreFocusOut: true,
61 | validateInput: (s: string): string | undefined => {
62 | return s && s.trim() ? undefined : locale['siginInputKeyInvalidMessage']
63 | }
64 | });
65 |
66 | if (!key) {
67 | return;
68 | }
69 | const secret: string | undefined = await vscode.window.showInputBox({
70 | prompt: locale['siginInputSecretPropmt'],
71 | password: true,
72 | ignoreFocusOut: true,
73 | validateInput: (s: string): string | undefined => {
74 | return s && s.trim() ? undefined : locale['siginInputSecretInvalidMessage']
75 | }
76 | })
77 |
78 | if (!secret) {
79 | return;
80 | }
81 |
82 | if (await userStore.signIn(key, secret)) {
83 | vscode.window.showInformationMessage(locale['signinSuccessMessage']);
84 | } else {
85 | await vscode.window.showErrorMessage(locale['signinFailedMessage']);
86 | }
87 | }
88 | }
89 |
90 | export const userController: UserController = new UserController();
--------------------------------------------------------------------------------
/src/event.ts:
--------------------------------------------------------------------------------
1 | import { EventEmitter } from "events";
2 | import { problemProvider } from "./provider/ProblemProvider";
3 |
4 | class Event extends EventEmitter {
5 | public initialize() {
6 | this.on("userInfoUpdate", () => {
7 | problemProvider.refresh();
8 | })
9 | }
10 | }
11 |
12 | export const event: Event = new Event();
--------------------------------------------------------------------------------
/src/extension.ts:
--------------------------------------------------------------------------------
1 | import { userController } from './controller/UserController';
2 | import * as vscode from 'vscode';
3 | import { mainController } from './controller/MainController';
4 | import { userStore } from './store/UserStore';
5 | import { output } from './util/CodeUtil';
6 | import { problemProvider } from './provider/ProblemProvider';
7 | import { event } from './event';
8 |
9 | export async function activate(context: vscode.ExtensionContext) {
10 | try {
11 | // 初始化
12 | await mainController.initialize(context);
13 | event.initialize();
14 |
15 | context.subscriptions.push(
16 | // vscode.window.createTreeView('ProblemExplorer', { treeDataProvider: problemProvider, showCollapseAll: true }),
17 | vscode.commands.registerCommand('nssctf.pastePicture', async () => userController.pastePicture()),
18 | vscode.commands.registerCommand('nssctf.signIn', () => userController.signIn()),
19 | );
20 |
21 | await userStore.updateLoginStatus();
22 | } catch (error: any) {
23 | output.appendLine(error.toString());
24 | await vscode.window.showErrorMessage('扩展初始化失败,请在输出中查看详情。');
25 | }
26 | }
27 |
28 | // This method is called when your extension is deactivated
29 | export function deactivate() {}
30 |
--------------------------------------------------------------------------------
/src/i18n/index.ts:
--------------------------------------------------------------------------------
1 | import * as vscode from 'vscode';
2 | import * as i18n from './locale';
3 |
4 |
5 | export const locale = (() => {
6 | let locale = i18n.default;
7 | let lang = vscode.env.language;
8 | let langLocale = null;
9 |
10 | try {
11 | langLocale = i18n.$[lang];
12 | } catch {
13 | try {
14 | langLocale = i18n.$[lang.split('-')[0]];
15 | } catch {}
16 | }
17 |
18 | if (langLocale) {
19 | locale = Object.assign(locale, langLocale);
20 | }
21 | return locale;
22 | })();
--------------------------------------------------------------------------------
/src/i18n/locale.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | NSSCTF_URL: 'https://www.nssctf.cn/',
3 | apiError: ' 登录失败,请检查API配置。',
4 | imageAlt: 'NSS图片',
5 | notLoginNodeName: '未登录',
6 | siginInputKeyPropmt: '请输入API Key。',
7 | siginInputSecretPropmt: '请输入API Secret。',
8 | siginInputKeyInvalidMessage: 'Key不能为空',
9 | siginInputSecretInvalidMessage: 'Secret不能为空',
10 | signinSuccessMessage: '登录成功。',
11 | signinFailedMessage: '登录失败,请查看控制台输出信息。',
12 | imagePasteUploadProgressTitle: '图片上传中...',
13 | problemNodeModelCommandTitle: '查看题目详情',
14 | no_api: '请先配置NSSCTF API参数。',
15 | install_xclip: '您需要先安装 xclip 命令。',
16 | powershell_not_found: '找不到Powershell。',
17 | };
18 |
19 | let $: any = { };
20 | export { $ };
--------------------------------------------------------------------------------
/src/lib/balderich/client.ts:
--------------------------------------------------------------------------------
1 | import { createHash } from 'crypto'
2 | import * as fs from 'fs'
3 | import Axios from 'axios'
4 | import { ContestCollection } from './models/contest'
5 | import { ProblemCollection } from './models/problem'
6 | import { UserCollection } from './models/user'
7 | import { TeamCollection } from './models/team'
8 |
9 | class AuthConfig {
10 | key: string
11 | secret: string
12 |
13 | constructor(key: string, secret: string) {
14 | this.key = key
15 | this.secret = secret
16 | }
17 |
18 | static load_config_file(filepath: string) {
19 | const content = fs.readFileSync(filepath).toString()
20 |
21 | const data = JSON.parse(content)
22 |
23 | const authConfig = new AuthConfig(data['key'], data['secret'])
24 | return authConfig
25 | }
26 |
27 | sign(path: string, timestamp: number | null = null, prefix: string = '/v2/api/'): [string, number] {
28 | if (timestamp === null) {
29 | timestamp = Math.floor(new Date().getTime() / 1000)
30 | }
31 | const sha256 = (t: string) => createHash('sha256').update(t).digest('hex')
32 | const res = sha256(`${prefix}${path}#${this.key}#${timestamp}#${this.secret}`)
33 |
34 | return [res, timestamp]
35 | }
36 | }
37 |
38 | class NSSClient {
39 | auth_config: AuthConfig
40 | url: string
41 |
42 | constructor(
43 | auth_config: AuthConfig | null = null,
44 | key: string | null = null,
45 | secret: string | null = null,
46 | url: string | null = null,
47 | ) {
48 | if (url === null) {
49 | url = 'https://www.nssctf.cn/v2/api/'
50 | }
51 | if (auth_config === null) {
52 | if (key && secret) {
53 | auth_config = new AuthConfig(key, secret)
54 | } else {
55 | throw Error('key or secret is null.')
56 | }
57 | }
58 |
59 | this.url = url
60 | this.auth_config = auth_config
61 | }
62 |
63 | get user() {
64 | return new UserCollection(this)
65 | }
66 |
67 | get problem() {
68 | return new ProblemCollection(this)
69 | }
70 |
71 | get contest() {
72 | return new ContestCollection(this)
73 | }
74 |
75 | get team() {
76 | return new TeamCollection(this)
77 | }
78 |
79 | get key() {
80 | return this.auth_config.key
81 | }
82 |
83 | async _get(path: string): Promise<[number, any]> {
84 | const [sign, timestamp] = this.auth_config.sign(path)
85 | const res = await Axios.get(`${this.url}${path}`, {
86 | params: {
87 | key: this.key,
88 | time: timestamp,
89 | sign: sign,
90 | },
91 | })
92 |
93 | const resJson = res.data
94 | const code = resJson['code']
95 | const data = resJson['data']
96 |
97 | return [code, data]
98 | }
99 |
100 | async _post(path: string, data: object | null = null, blob: boolean = false): Promise<[number, any]> {
101 | if (data === null) {
102 | data = {}
103 | }
104 | const [sign, timestamp] = this.auth_config.sign(path)
105 | let res
106 |
107 | if (!blob) {
108 | res = await Axios.post(`${this.url}${path}`, data, {
109 | params: {
110 | key: this.key,
111 | time: timestamp,
112 | sign: sign,
113 | },
114 | })
115 | } else {
116 | return await Axios.post(`${this.url}${path}`, data, {
117 | params: {
118 | key: this.key,
119 | time: timestamp,
120 | sign: sign,
121 | },
122 | responseType: 'blob',
123 | })
124 | }
125 | const resJson = res.data
126 |
127 | return [resJson['code'], resJson['data']]
128 | }
129 |
130 | async _put(path: string, data: object | null = null): Promise<[number, any]> {
131 | if (data === null) {
132 | data = {}
133 | }
134 |
135 | const [sign, timestamp] = this.auth_config.sign(path)
136 | const res = await Axios.put(`${this.url}${path}`, data, {
137 | params: {
138 | key: this.key,
139 | time: timestamp,
140 | sign: sign,
141 | },
142 | })
143 | const resJson = res.data
144 |
145 | return [resJson['code'], resJson['data']]
146 | }
147 | }
148 |
149 | export { NSSClient }
150 |
--------------------------------------------------------------------------------
/src/lib/balderich/index.ts:
--------------------------------------------------------------------------------
1 | const __version__ = '1.3'
2 |
3 | import { NSSClient } from './client'
4 |
5 | export { NSSClient }
6 |
--------------------------------------------------------------------------------
/src/lib/balderich/models/contest.ts:
--------------------------------------------------------------------------------
1 | import { SUCCESS } from '../utils/code'
2 | import { getException } from '../utils/exceptions'
3 | import { Collection } from './resource'
4 |
5 | export class ContestCollection extends Collection {
6 | async get_contest_list(type: number, page: number): Promise> {
7 | /**
8 | * 获取比赛列表。数据缓存10分钟。
9 | *
10 | * @param type - 比赛类型
11 | * 0 -> 公开赛事
12 | * 1 -> 私密赛事
13 | * @param page - 页面参数
14 | * @returns {
15 | * contests: [{
16 | * id: number,
17 | * cover: string,
18 | * title: string,
19 | * level: number,
20 | * mode: number,
21 | * start_date: number,
22 | * ends_date: number,
23 | * desc: number,
24 | * state: number,
25 | * count: number
26 | * }],
27 | * total: number
28 | * }
29 | */
30 | const [code, data] = await this.client._get(`contest/${type}/list/${page}/`)
31 | if (code !== SUCCESS) {
32 | throw getException(code)
33 | }
34 |
35 | return data
36 | }
37 |
38 | async get_contest_info(cid: number): Promise> {
39 | /**
40 | * 获取比赛详细信息。数据缓存10分钟。
41 | *
42 | * @param cid - 比赛ID
43 | * @returns {
44 | * id: number,
45 | * title: string,
46 | * level: number,
47 | * type: number,
48 | * mode: number,
49 | * desc: number,
50 | * cover: string,
51 | * top_score: number,
52 | * decrease_score: number,
53 | * start_date: number,
54 | * ends_date: number,
55 | * is_team: boolean
56 | * }
57 | */
58 | const [code, data] = await this.client._get(`contest/${cid}/info/`)
59 | if (code !== SUCCESS) {
60 | throw getException(code)
61 | }
62 |
63 | return data
64 | }
65 |
66 | async get_contest_rank_list(cid: number, page: number): Promise> {
67 | /**
68 | * 获取比赛榜单信息。相同路径数据缓存60秒。
69 | *
70 | * @param cid - 比赛ID
71 | * @param page - 页面参数
72 | * @returns {
73 | * category: string[],
74 | * point: Dictionary,
75 | * problems: [number, number, string][],
76 | * top3: Dictionary,
77 | * solves: {
78 | * uid: number,
79 | * username: string,
80 | * rating: number,
81 | * solved: string,
82 | * solved_time: string,
83 | * score: number,
84 | * }[],
85 | * team: boolean,
86 | * total: number
87 | * }
88 | */
89 | const [code, data] = await this.client._get(`contest/${cid}/rank/list/${page}/`)
90 | if (code !== SUCCESS) {
91 | throw getException(code)
92 | }
93 |
94 | return data
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/src/lib/balderich/models/problem.ts:
--------------------------------------------------------------------------------
1 | import { SUCCESS } from '../utils/code'
2 | import { getException } from '../utils/exceptions'
3 | import { Collection } from './resource'
4 |
5 | interface ProblemListData {
6 | problems: Problem[]
7 | total: number
8 | }
9 |
10 | interface Problem {
11 | id: number
12 | title: string
13 | point: number
14 | tags: string[]
15 | level: number
16 | author: {
17 | uid: number
18 | name: string
19 | rating: number
20 | }
21 | }
22 |
23 | interface ProblemInfo {
24 | id: number
25 | title: string
26 | desc: string
27 | point: number
28 | tags: string[]
29 | hint: boolean
30 | level: number
31 | annex: boolean
32 | docker: boolean
33 | price: number
34 | likes: number
35 | date: number
36 | info: {
37 | solved: number
38 | wa: number
39 | }
40 | author: {
41 | uid: number
42 | name: string
43 | rating: number
44 | }
45 | }
46 |
47 | interface ProblemSheetListData {
48 | sheets: ProblemSheet[]
49 | total: number
50 | }
51 |
52 | interface ProblemSheet {
53 | id: number
54 | title: string
55 | stars: number
56 | count: number
57 | author: {
58 | uid: number
59 | name: string
60 | rating: number
61 | }
62 | }
63 |
64 | interface ProblemSheetInfo {
65 | id: number
66 | title: string
67 | stars: number
68 | count: number
69 | type: number
70 | content: string
71 | author: {
72 | uid: number
73 | name: string
74 | rating: number
75 | }
76 | }
77 |
78 | interface ProblemSheetProblemListData {
79 | problems: ProblemSheetProblem[]
80 | total: number
81 | }
82 |
83 | interface ProblemSheetProblem {
84 | id: number
85 | title: string
86 | point: number
87 | solved: number
88 | level: number
89 | tags: string[]
90 | index: number
91 | }
92 |
93 | export class ProblemCollection extends Collection {
94 | async get_problem_list_by_page(page: number, size: number = 10): Promise {
95 | const endpoint = `problem/list/${page}/${size}/`
96 | const [code, data] = await this.client._get(endpoint)
97 |
98 | if (code !== SUCCESS) {
99 | throw getException(code)
100 | }
101 |
102 | return data as ProblemListData
103 | }
104 |
105 | async get_problem_info(pid: number): Promise {
106 | const endpoint = `problem/${pid}/info/`
107 | const [code, data] = await this.client._get(endpoint)
108 |
109 | if (code !== SUCCESS) {
110 | throw getException(code)
111 | }
112 |
113 | return data as ProblemInfo
114 | }
115 |
116 | async get_problem_sheet_list_by_page(page: number, size: number = 10): Promise {
117 | const endpoint = `problem/sheet/list/${page}/${size}/`
118 | const [code, data] = await this.client._get(endpoint)
119 |
120 | if (code !== SUCCESS) {
121 | throw getException(code)
122 | }
123 |
124 | return data as ProblemSheetListData
125 | }
126 |
127 | async get_problem_sheet_info(psid: number): Promise {
128 | const endpoint = `problem/sheet/${psid}/info/`
129 | const [code, data] = await this.client._get(endpoint)
130 |
131 | if (code !== SUCCESS) {
132 | throw getException(code)
133 | }
134 |
135 | return data as ProblemSheetInfo
136 | }
137 |
138 | async get_problem_sheet_problem_list_by_page(
139 | psid: number,
140 | page: number,
141 | size: number = 10,
142 | ): Promise {
143 | const endpoint = `problem/sheet/${psid}/list/${page}/${size}/`
144 | const [code, data] = await this.client._get(endpoint)
145 |
146 | if (code !== SUCCESS) {
147 | throw getException(code)
148 | }
149 |
150 | return data as ProblemSheetProblemListData
151 | }
152 | }
153 |
--------------------------------------------------------------------------------
/src/lib/balderich/models/resource.ts:
--------------------------------------------------------------------------------
1 | export class Collection {
2 | client: any
3 |
4 | constructor(client: any = null) {
5 | this.client = client
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/lib/balderich/models/team.ts:
--------------------------------------------------------------------------------
1 | import { SUCCESS } from '../utils/code'
2 | import { getException } from '../utils/exceptions'
3 | import { Collection } from './resource'
4 |
5 | interface User {
6 | uid: number
7 | rating: number
8 | username: string
9 | }
10 |
11 | interface Team {
12 | id: number
13 | name: string
14 | bio: number
15 | date: number
16 | user: User
17 | nums: number
18 | }
19 |
20 | interface TeamListResponse {
21 | teams: Team[]
22 | total: number
23 | }
24 |
25 | interface TeamInfo {
26 | id: number
27 | name: string
28 | bio: number
29 | date: number
30 | avatar: string
31 | user: User
32 | nums: number
33 | }
34 |
35 | interface TeamNotice {
36 | notice: string
37 | }
38 |
39 | interface TeamClockinResponse {
40 | state: boolean
41 | nums: number
42 | }
43 |
44 | interface Problem {
45 | id: number
46 | title: string
47 | point: number
48 | tags: string[]
49 | level: number
50 | solves: number
51 | }
52 |
53 | interface TeamProblemListResponse {
54 | problems: Problem[]
55 | total: number
56 | }
57 |
58 | interface TeamProblemInfo {
59 | id: number
60 | title: string
61 | desc: string
62 | point: number
63 | tags: string[]
64 | hint: boolean
65 | level: number
66 | annex: boolean
67 | docker: boolean
68 | price: number
69 | likes: number
70 | date: number
71 | info: {
72 | solved: number
73 | wa: number
74 | }
75 | author: {
76 | uid: number
77 | name: string
78 | rating: number
79 | }
80 | }
81 |
82 | interface Contest {
83 | id: number
84 | cover: string
85 | title: string
86 | start_date: number
87 | ends_date: number
88 | is_team: boolean
89 | desc: string
90 | state: number
91 | }
92 |
93 | interface TeamContestListResponse {
94 | contests: Contest[]
95 | total: number
96 | }
97 |
98 | interface TeamContestInfo {
99 | title: string
100 | level: number
101 | type: number
102 | mode: number
103 | desc: string
104 | cover: string
105 | top_score: number
106 | decrease_score: number
107 | start_date: number
108 | ends_date: number
109 | }
110 |
111 | interface TeamContestRankListResponse {
112 | category: string[]
113 | point: {
114 | [key: number]: number
115 | }
116 | problems: [number, number, string][]
117 | top3: {
118 | [key: number]: string[]
119 | }
120 | solves: {
121 | uid: number
122 | username: string
123 | rating: number
124 | solved: string
125 | solved_time: string
126 | score: number
127 | }[]
128 | team: boolean
129 | total: number
130 | }
131 |
132 | interface TeamUser {
133 | id: number
134 | uid: number
135 | username: string
136 | rating: number
137 | alias: string
138 | date: number
139 | role: number
140 | }
141 |
142 | interface TeamUserListResponse {
143 | users: TeamUser[]
144 | total: number
145 | }
146 |
147 | interface TeamApplyUser {
148 | id: number
149 | uid: number
150 | username: string
151 | rating: number
152 | msg: string
153 | date: number
154 | }
155 |
156 | interface TeamApplyListResponse {
157 | users: TeamApplyUser[]
158 | total: number
159 | }
160 |
161 | interface TeamAnalysisUse {
162 | problem: {
163 | now: number
164 | max: number
165 | }
166 | contest: {
167 | now: number
168 | max: number
169 | }
170 | memory: {
171 | now: number
172 | max: number
173 | }
174 | person: {
175 | now: number
176 | max: number
177 | }
178 | level: number
179 | state: boolean
180 | }
181 |
182 | export class TeamCollection extends Collection {
183 | async getTeamListByPage(page: number, size: number = 10): Promise {
184 | const endpoint = `team/list/${page}/${size}/`
185 | const [code, data] = await this.client._get(endpoint)
186 |
187 | if (code !== SUCCESS) {
188 | throw getException(code)
189 | }
190 |
191 | return data as TeamListResponse
192 | }
193 |
194 | async getTeamInfo(tid: number): Promise {
195 | const endpoint = `team/${tid}/info/`
196 | const [code, data] = await this.client._get(endpoint)
197 |
198 | if (code !== SUCCESS) {
199 | throw getException(code)
200 | }
201 |
202 | return data as TeamInfo
203 | }
204 |
205 | async getTeamNotice(): Promise {
206 | const endpoint = `team/notice/`
207 | const [code, data] = await this.client._get(endpoint)
208 |
209 | if (code !== SUCCESS) {
210 | throw getException(code)
211 | }
212 |
213 | return data as TeamNotice
214 | }
215 |
216 | async putTeamClockin(): Promise {
217 | const endpoint = `team/clockin/`
218 | const [code, data] = await this.client._put(endpoint)
219 |
220 | if (code !== SUCCESS) {
221 | throw getException(code)
222 | }
223 |
224 | return data as TeamClockinResponse
225 | }
226 |
227 | async getTeamProblemListByPage(page: number, size: number = 10): Promise {
228 | const endpoint = `team/problem/list/${page}/${size}/`
229 | const [code, data] = await this.client._get(endpoint)
230 |
231 | if (code !== SUCCESS) {
232 | throw getException(code)
233 | }
234 |
235 | return data as TeamProblemListResponse
236 | }
237 |
238 | async getTeamProblemInfo(pid: number): Promise {
239 | const endpoint = `team/problem/${pid}/info/`
240 | const [code, data] = await this.client._get(endpoint)
241 |
242 | if (code !== SUCCESS) {
243 | throw getException(code)
244 | }
245 |
246 | return data as TeamProblemInfo
247 | }
248 |
249 | async getTeamContestListByPage(page: number, size: number = 10): Promise {
250 | const endpoint = `team/contest/list/${page}/${size}/`
251 | const [code, data] = await this.client._get(endpoint)
252 |
253 | if (code !== SUCCESS) {
254 | throw getException(code)
255 | }
256 |
257 | return data as TeamContestListResponse
258 | }
259 |
260 | async getTeamContestInfo(cid: number): Promise {
261 | const endpoint = `team/contest/${cid}/info/`
262 | const [code, data] = await this.client._get(endpoint)
263 |
264 | if (code !== SUCCESS) {
265 | throw getException(code)
266 | }
267 |
268 | return data as TeamContestInfo
269 | }
270 |
271 | async getTeamContestRankListByPage(
272 | cid: number,
273 | page: number,
274 | size: number = 15,
275 | ): Promise {
276 | const endpoint = `team/contest/${cid}/rank/list/${page}/${size}/`
277 | const [code, data] = await this.client._get(endpoint)
278 |
279 | if (code !== SUCCESS) {
280 | throw getException(code)
281 | }
282 |
283 | return data as TeamContestRankListResponse
284 | }
285 |
286 | async getTeamUserListByPage(page: number, size: number = 10): Promise {
287 | const endpoint = `team/user/list/${page}/${size}/`
288 | const [code, data] = await this.client._get(endpoint)
289 |
290 | if (code !== SUCCESS) {
291 | throw getException(code)
292 | }
293 |
294 | return data as TeamUserListResponse
295 | }
296 |
297 | async getTeamApplyListByPage(page: number, size: number = 10): Promise {
298 | const endpoint = `team/user/apply/list/${page}/${size}/`
299 | const [code, data] = await this.client._get(endpoint)
300 |
301 | if (code !== SUCCESS) {
302 | throw getException(code)
303 | }
304 |
305 | return data as TeamApplyListResponse
306 | }
307 |
308 | async getTeamAnalysisUse(): Promise {
309 | const endpoint = `team/analysis/use/`
310 | const [code, data] = await this.client._get(endpoint)
311 |
312 | if (code !== SUCCESS) {
313 | throw getException(code)
314 | }
315 |
316 | return data as TeamAnalysisUse
317 | }
318 |
319 | async postTeamAnalysisSolvesCurve(uids: number[]): Promise {
320 | const endpoint = `team/analysis/solves/curve/`
321 | const [code, data] = await this.client._post(endpoint, {
322 | uids: uids,
323 | })
324 |
325 | if (code !== SUCCESS) {
326 | throw getException(code)
327 | }
328 |
329 | return data
330 | }
331 |
332 | async getTeamStatisticsDay(uids: number[]): Promise {
333 | const endpoint = `team/statistics/day/`
334 | const [code, data] = await this.client._get(endpoint, { uids: uids })
335 |
336 | if (code !== SUCCESS) {
337 | throw getException(code)
338 | }
339 |
340 | return data
341 | }
342 | }
343 |
--------------------------------------------------------------------------------
/src/lib/balderich/models/user.ts:
--------------------------------------------------------------------------------
1 | import { Blob } from 'buffer'
2 | import { SUCCESS } from '../utils/code'
3 | import { getException } from '../utils/exceptions'
4 | import { Collection } from './resource'
5 | import * as fs from 'fs'
6 | import FormData = require('form-data')
7 |
8 | interface UserInfo {
9 | uid: number
10 | bio: string
11 | intro: string
12 | username: string
13 | solves: number
14 | rating: number
15 | avatar: string
16 | cover: string
17 | register_date: number
18 | last_login_date: number
19 | email: string
20 | followers: number
21 | following: number
22 | tid: number
23 | team: string
24 | is_vip: boolean
25 | }
26 |
27 | interface UserActiveStatistics {
28 | start_date: number
29 | ends_date: number
30 | count: [string, number][]
31 | }
32 |
33 | interface UserSolvesStatistics {
34 | type: number
35 | name: string
36 | data: number[]
37 | }
38 |
39 | interface UserRatingStatistics {
40 | date: number
41 | rating: number
42 | title: string
43 | rank: number
44 | unrated: boolean
45 | nums: number
46 | }
47 |
48 | interface UserRadarStatistics {
49 | date: number
50 | rating: number
51 | title: string
52 | rank: number
53 | unrated: boolean
54 | nums: number
55 | }
56 |
57 | interface Article {
58 | id: number
59 | title: string
60 | date: number
61 | type: number
62 | }
63 |
64 | interface UserFollowing {
65 | uid: number
66 | username: string
67 | bio: string
68 | avatar: string
69 | }
70 |
71 | interface UserPicturebedUsed {
72 | used_mem: number
73 | max_mem: number
74 | total: number
75 | }
76 |
77 | interface UserPicture {
78 | id: number
79 | name: string
80 | date: number
81 | size: number
82 | url: string
83 | }
84 |
85 | export class UserCollection extends Collection {
86 | async getSelfInfo(): Promise {
87 | const endpoint = `user/info/`
88 | const [code, data] = await this.client._get(endpoint)
89 |
90 | if (code !== SUCCESS) {
91 | throw getException(code)
92 | }
93 |
94 | return data as UserInfo
95 | }
96 |
97 | async getUserInfo(name: string): Promise {
98 | const endpoint = `user/${name}/info/`
99 | const [code, data] = await this.client._get(endpoint)
100 |
101 | if (code !== SUCCESS) {
102 | throw getException(code)
103 | }
104 |
105 | return data as UserInfo
106 | }
107 |
108 | async getUserStatisticsActive(uid: number): Promise {
109 | const endpoint = `user/${uid}/statistics/active/`
110 | const [code, data] = await this.client._get(endpoint)
111 |
112 | if (code !== SUCCESS) {
113 | throw getException(code)
114 | }
115 |
116 | return data as UserActiveStatistics
117 | }
118 |
119 | async getUserStatisticsSolves(uid: number): Promise {
120 | const endpoint = `user/${uid}/statistics/solves/`
121 | const [code, data] = await this.client._get(endpoint)
122 |
123 | if (code !== SUCCESS) {
124 | throw getException(code)
125 | }
126 |
127 | return data as UserSolvesStatistics[]
128 | }
129 |
130 | async getUserStatisticsRating(uid: number): Promise {
131 | const endpoint = `user/${uid}/statistics/rating/`
132 | const [code, data] = await this.client._get(endpoint)
133 |
134 | if (code !== SUCCESS) {
135 | throw getException(code)
136 | }
137 |
138 | return data as UserRatingStatistics[]
139 | }
140 |
141 | async getUserStatisticsRadar(uid: number): Promise {
142 | const endpoint = `user/${uid}/statistics/radar/`
143 | const [code, data] = await this.client._get(endpoint)
144 |
145 | if (code !== SUCCESS) {
146 | throw getException(code)
147 | }
148 |
149 | return data as UserRadarStatistics[]
150 | }
151 |
152 | async getUserArticleList(uid: number, page: number, size: number): Promise<{ articles: Article[]; total: number }> {
153 | const endpoint = `user/${uid}/article/list/${page}/${size}/`
154 | const [code, data] = await this.client._get(endpoint)
155 |
156 | if (code !== SUCCESS) {
157 | throw getException(code)
158 | }
159 |
160 | return data as { articles: Article[]; total: number }
161 | }
162 |
163 | async getUserFollowingList(uid: number, page: number, size: number): Promise {
164 | const endpoint = `user/${uid}/following/list/${page}/${size}/`
165 | const [code, data] = await this.client._get(endpoint)
166 |
167 | if (code !== SUCCESS) {
168 | throw getException(code)
169 | }
170 |
171 | return data as UserFollowing[]
172 | }
173 |
174 | async getUserFollowerList(uid: number, page: number, size: number): Promise {
175 | const endpoint = `user/${uid}/follower/list/${page}/${size}/`
176 | const [code, data] = await this.client._get(endpoint)
177 |
178 | if (code !== SUCCESS) {
179 | throw getException(code)
180 | }
181 |
182 | return data as UserFollowing[]
183 | }
184 |
185 | async getUserPicturebedUsed(): Promise {
186 | const endpoint = `user/picturebed/used/`
187 | const [code, data] = await this.client._get(endpoint)
188 |
189 | if (code !== SUCCESS) {
190 | throw getException(code)
191 | }
192 |
193 | return data as UserPicturebedUsed
194 | }
195 |
196 | async getUserPicturebedList(page: number, size: number): Promise<{ pictures: UserPicture[]; total: number }> {
197 | const endpoint = `user/picturebed/list/${page}/${size}/`
198 | const [code, data] = await this.client._get(endpoint)
199 |
200 | if (code !== SUCCESS) {
201 | throw getException(code)
202 | }
203 |
204 | return data as { pictures: UserPicture[]; total: number }
205 | }
206 |
207 | async postUserPicturebedUpload(filename: string, filepath: string): Promise {
208 | const form = new FormData()
209 | form.append('image', fs.createReadStream(filepath) as any, filename)
210 |
211 | const [code, data] = await this.client._post('user/picturebed/upload/', form)
212 |
213 | if (code !== SUCCESS) {
214 | throw getException(code)
215 | }
216 |
217 | return data as UserPicture
218 | }
219 |
220 | async postUserPicturebedDownload(pid: number): Promise {
221 | const endpoint = `user/picturebed/${pid}/download/`
222 | const res = await this.client._post(endpoint, null, false)
223 |
224 | if (res.headers['Content-Type'] !== 'application/octet-stream') {
225 | throw getException(JSON.parse(res.data).code)
226 | }
227 | return new Blob([res.data])
228 | }
229 | }
230 |
--------------------------------------------------------------------------------
/src/lib/balderich/utils/code.ts:
--------------------------------------------------------------------------------
1 | export const SUCCESS = 10000
2 | export const AUTH_NONE = 10001
3 | export const AUTH_NOT_EXIST = 10002
4 | export const AUTH_ERROR_SIGN = 10003
5 | export const AUTH_TIMEOUT = 10004
6 | export const AUTH_CALC_ERROR = 10005
7 | export const AUTH_REQUEST_FAST = 10006
8 | export const REQUEST_PARAM_INVALID = 10007
9 |
10 | export const USER_NOT_EXIST = 11001
11 | export const USER_CLOSE_FOLLOW = 11002
12 | export const USER_IMAGE_NONE = 11003
13 | export const USER_IMAGE_FORMAT_ERROR = 11004
14 | export const USER_IMAGE_OPEN_ERROR = 11005
15 | export const USER_MEMORY_NOT_ENOUGH = 11006
16 | export const USER_IMAGE_NOT_EXIST = 11007
17 |
18 | export const PROBLEM_NOT_EXIST = 12001
19 | export const PROBLEM_PERMISSION_DENIED = 12002
20 | export const PROBLEM_SHEET_NOT_EXIST = 12101
21 | export const PROBLEM_SHEET_PERMISSION_DENIED = 12102
22 |
23 | export const CONTEST_NOT_EXIST = 13001
24 | export const CONTEST_PERMISSION_DENIED = 13002
25 |
26 | export const TEAM_NOT_EXIST = 14001
27 | export const TEAM_PERMISSION_DENIED = 14002
28 | export const TEAM_NO_MEMBER = 14003
29 | export const TEAM_METHOD_PERMISSION_DENIED = 14003
30 | export const TEAM_PROBLEM_NOT_EXIST = 14101
31 | export const TEAM_PROBLEM_PERMISSION_DENIED = 14102
32 | export const TEAM_CONTEST_NOT_EXIST = 14201
33 | export const TEAM_CONTEST_PERMISSION_DENIED = 14202
34 |
--------------------------------------------------------------------------------
/src/lib/balderich/utils/exceptions.ts:
--------------------------------------------------------------------------------
1 | import {
2 | AUTH_CALC_ERROR,
3 | AUTH_ERROR_SIGN,
4 | AUTH_NONE,
5 | AUTH_NOT_EXIST,
6 | AUTH_REQUEST_FAST,
7 | AUTH_TIMEOUT,
8 | CONTEST_NOT_EXIST,
9 | CONTEST_PERMISSION_DENIED,
10 | PROBLEM_NOT_EXIST,
11 | PROBLEM_PERMISSION_DENIED,
12 | PROBLEM_SHEET_NOT_EXIST,
13 | PROBLEM_SHEET_PERMISSION_DENIED,
14 | REQUEST_PARAM_INVALID,
15 | TEAM_CONTEST_NOT_EXIST,
16 | TEAM_CONTEST_PERMISSION_DENIED,
17 | TEAM_METHOD_PERMISSION_DENIED,
18 | TEAM_NOT_EXIST,
19 | TEAM_NO_MEMBER,
20 | TEAM_PERMISSION_DENIED,
21 | TEAM_PROBLEM_NOT_EXIST,
22 | TEAM_PROBLEM_PERMISSION_DENIED,
23 | USER_CLOSE_FOLLOW,
24 | USER_IMAGE_FORMAT_ERROR,
25 | USER_IMAGE_NONE,
26 | USER_IMAGE_NOT_EXIST,
27 | USER_IMAGE_OPEN_ERROR,
28 | USER_MEMORY_NOT_ENOUGH,
29 | USER_NOT_EXIST,
30 | } from './code'
31 |
32 | class AuthNoneException extends Error {}
33 | class AuthNotExistException extends Error {}
34 | class AuthErrorSignException extends Error {}
35 | class AuthTimeoutException extends Error {}
36 | class AuthCalcErrorException extends Error {}
37 | class AuthRequestFastException extends Error {}
38 | class RequestParamInvalidException extends Error {}
39 |
40 | class UserNotExistException extends Error {}
41 | class UserCloseFollowException extends Error {}
42 | class UserImageNoneException extends Error {}
43 | class UserImageFormatErrorException extends Error {}
44 | class UserImageOpenErrorException extends Error {}
45 | class UserMemoryNotEnoughException extends Error {}
46 | class UserImageNotExistException extends Error {}
47 |
48 | class ProblemNotExistException extends Error {}
49 | class ProblemPermissionDeniedException extends Error {}
50 | class ProblemSheetNotExistException extends Error {}
51 | class ProblemSheetPermissionDeniedException extends Error {}
52 |
53 | class ContestNotExistException extends Error {}
54 | class ContestPermissionDeniedException extends Error {}
55 |
56 | class TeamNotExistException extends Error {}
57 | class TeamPermissionDeniedException extends Error {}
58 | class TeamNoMemberException extends Error {}
59 | class TeamMethodPermissionDeniedException extends Error {}
60 | class TeamProblemNotExistException extends Error {}
61 | class TeamProblemPermissionDeniedException extends Error {}
62 | class TeamContestNotExistException extends Error {}
63 | class TeamContestPermissionDeniedException extends Error {}
64 |
65 | export const getException = (code: number, msg: string = '') => {
66 | if (code === AUTH_NONE) {
67 | return new AuthNoneException(msg)
68 | } else if (code === AUTH_NOT_EXIST) {
69 | return new AuthNotExistException(msg)
70 | } else if (code === AUTH_ERROR_SIGN) {
71 | return new AuthErrorSignException(msg)
72 | } else if (code === AUTH_TIMEOUT) {
73 | return new AuthTimeoutException(msg)
74 | } else if (code === AUTH_CALC_ERROR) {
75 | return new AuthCalcErrorException(msg)
76 | } else if (code === AUTH_REQUEST_FAST) {
77 | return new AuthRequestFastException(msg)
78 | } else if (code === REQUEST_PARAM_INVALID) {
79 | return new RequestParamInvalidException(msg)
80 | } else if (code === USER_NOT_EXIST) {
81 | return new UserNotExistException(msg)
82 | } else if (code === USER_CLOSE_FOLLOW) {
83 | return new UserCloseFollowException(msg)
84 | } else if (code === USER_IMAGE_NONE) {
85 | return new UserImageNoneException(msg)
86 | } else if (code === USER_IMAGE_FORMAT_ERROR) {
87 | return new UserImageFormatErrorException(msg)
88 | } else if (code === USER_IMAGE_OPEN_ERROR) {
89 | return new UserImageOpenErrorException(msg)
90 | } else if (code === USER_MEMORY_NOT_ENOUGH) {
91 | return new UserMemoryNotEnoughException(msg)
92 | } else if (code === USER_IMAGE_NOT_EXIST) {
93 | return new UserImageNotExistException(msg)
94 | } else if (code === PROBLEM_NOT_EXIST) {
95 | return new ProblemNotExistException(msg)
96 | } else if (code === PROBLEM_PERMISSION_DENIED) {
97 | return new ProblemPermissionDeniedException(msg)
98 | } else if (code === PROBLEM_SHEET_NOT_EXIST) {
99 | return new ProblemSheetNotExistException(msg)
100 | } else if (code === PROBLEM_SHEET_PERMISSION_DENIED) {
101 | return new ProblemSheetPermissionDeniedException(msg)
102 | } else if (code === CONTEST_NOT_EXIST) {
103 | return new ContestNotExistException(msg)
104 | } else if (code === CONTEST_PERMISSION_DENIED) {
105 | return new ContestPermissionDeniedException(msg)
106 | } else if (code === TEAM_NOT_EXIST) {
107 | return new TeamNotExistException(msg)
108 | } else if (code === TEAM_PERMISSION_DENIED) {
109 | return new TeamPermissionDeniedException(msg)
110 | } else if (code === TEAM_NO_MEMBER) {
111 | return new TeamNoMemberException(msg)
112 | } else if (code === TEAM_METHOD_PERMISSION_DENIED) {
113 | return new TeamMethodPermissionDeniedException(msg)
114 | } else if (code === TEAM_PROBLEM_NOT_EXIST) {
115 | return new TeamProblemNotExistException(msg)
116 | } else if (code === TEAM_PROBLEM_PERMISSION_DENIED) {
117 | return new TeamProblemPermissionDeniedException(msg)
118 | } else if (code === TEAM_CONTEST_NOT_EXIST) {
119 | return new TeamContestNotExistException(msg)
120 | } else if (code === TEAM_CONTEST_PERMISSION_DENIED) {
121 | return new TeamContestPermissionDeniedException(msg)
122 | }
123 | }
124 |
--------------------------------------------------------------------------------
/src/model/CodeModel.ts:
--------------------------------------------------------------------------------
1 | import { MessageItem } from "vscode";
2 |
3 | export const MessageItemObj: MessageItem = {
4 | title: "",
5 | isCloseAffordance: false,
6 | };
7 |
8 | export const DialogOptions = {
9 | open: Object.assign({}, MessageItemObj, { title: '打开' }),
10 | yes: Object.assign({}, MessageItemObj, { title: "是" }),
11 | cancel: Object.assign({}, MessageItemObj, { title: "取消", isCloseAffordance: true,}),
12 | never: Object.assign({}, MessageItemObj, { title: "从不" }),
13 | singUp: Object.assign({}, MessageItemObj, { title: "注册" }),
14 | }
--------------------------------------------------------------------------------
/src/model/ProblemNodeModel.ts:
--------------------------------------------------------------------------------
1 | import { Command } from "vscode";
2 | import locale from "../i18n/locale";
3 |
4 | export interface Problem {
5 | id: number|string,
6 | title: string,
7 | point: number,
8 | solved: number,
9 | level: number,
10 | tags: string[],
11 | isLike: boolean,
12 | isOpen: boolean
13 | }
14 |
15 | export enum ProblemCategory {
16 | ALL = '0',
17 | 类型 = '1',
18 | 难度 = '2',
19 | 比赛 = '3',
20 | 收藏 = '4',
21 | }
22 |
23 | export enum ProblemDifficulty {
24 | 入门 = '0',
25 | 简单 = '1',
26 | 中等 = '2',
27 | 困难 = '3',
28 | }
29 |
30 | export enum ProblemSource {
31 | ALL = '0',
32 | NSS = '1',
33 | PRIZE = '2',
34 | CISCN = '3',
35 | 公开赛 = '4',
36 | SWPU = '5',
37 | 线下赛 = '6'
38 | }
39 |
40 | export enum ProblemType {
41 | ALL = '0',
42 | WEB = '1',
43 | PWN = '2',
44 | REVERSE = '3',
45 | CRYPTO = '4',
46 | MISC = '5',
47 | MOBILE = '6',
48 | ETH = '7',
49 | IOT = '8',
50 | AI = '9',
51 | REAL = '10',
52 | }
53 |
54 | export class ProblemNodeModel {
55 | constructor(public data: Problem, public isLeafNode: boolean = true) {}
56 |
57 | public get id(): number|string { return this.data.id; }
58 | public get title(): string { return this.data.title; }
59 | public get point(): number { return this.data.point; }
60 | public get difficulty(): string {
61 | if (this.data.point == 1) {
62 | return 'E';
63 | }
64 | if (this.data.solved > 100 || this.data.level < 1.5) { return 'E'; }
65 | return ['E', 'M', 'H'][Math.round(this.data.level / 2)];
66 | }
67 | public get tags(): string[] { return this.data.tags;}
68 | public get isLeaf(): boolean { return this.isLeafNode; }
69 | public get isLike(): boolean { return this.data.isLike; }
70 |
71 | public get command(): Command {
72 | return {
73 | title: locale['problemNodeModelCommandTitle'],
74 | command: 'nssctf.previewProblem',
75 | arguments: [this]
76 | }
77 | }
78 | }
79 |
80 | export const defaultProblem: Problem = {
81 | id: 0,
82 | title: '',
83 | point: 0,
84 | solved: 0,
85 | level: .0,
86 | tags: [],
87 | isLike: false,
88 | isOpen: false
89 | }
--------------------------------------------------------------------------------
/src/provider/ProblemProvider.ts:
--------------------------------------------------------------------------------
1 | import { CancellationToken, Event, EventEmitter, ProviderResult, TreeDataProvider, TreeItem, TreeItemCollapsibleState } from "vscode";
2 | import { userStore } from "../store/UserStore";
3 | import { ProblemNodeModel, defaultProblem,Problem, ProblemCategory, ProblemSource, ProblemType, ProblemDifficulty } from "../model/ProblemNodeModel";
4 | import locale from "../i18n/locale";
5 |
6 | class ProblemProvider implements TreeDataProvider {
7 | private onDidChangeTreeDataEvent: EventEmitter = new EventEmitter();
8 | readonly onDidChangeTreeData = this.onDidChangeTreeDataEvent.event;
9 | // public initialize() {
10 |
11 | // }
12 |
13 | getTreeItem(element: any): TreeItem | Thenable {
14 | if (element.id === 'notLogin') {
15 | return {
16 | label: element.title,
17 | collapsibleState: TreeItemCollapsibleState.None,
18 | command: {
19 | command: 'nssctf.signIn',
20 | title: '未登录'
21 | }
22 | }
23 | }
24 | return {
25 | label: element.isLeaf
26 | ? `PID:${element.id}. ${element.title}`
27 | : element.title,
28 | collapsibleState: element.isLeaf
29 | ? TreeItemCollapsibleState.None
30 | : TreeItemCollapsibleState.Collapsed,
31 | // iconPath:
32 | command: element.command,
33 | resourceUri: element.uri,
34 | contextValue: element.isLeaf
35 | ? `problem${['', '-like'][element.isLike+0]}`
36 | : undefined
37 | }
38 | }
39 | getChildren(element?: ProblemNodeModel | undefined): ProviderResult {
40 | if (!userStore.isLogin()) {
41 | return [
42 | new ProblemNodeModel(
43 | Object.assign({}, defaultProblem, {
44 | id: 'notLogin',
45 | title: locale['notLoginNodeName']
46 | })
47 | )
48 | ]
49 | }
50 |
51 | let res = [];
52 |
53 | if (!element) { // 根节点
54 | for (let type in ProblemCategory) {
55 | res.push(new ProblemNodeModel(
56 | Object.assign({}, defaultProblem, {
57 | id: `${type}`,
58 | title: type
59 | }),
60 | false,
61 | ))
62 | }
63 | } else if (element.isLeaf) {
64 | return [];
65 | } else {
66 | switch (element.id) {
67 | case ProblemCategory.ALL:
68 | return this.getAllNodes();
69 | case ProblemCategory.类型:
70 | for (let type in ProblemType) {
71 | res.push(new ProblemNodeModel(
72 | Object.assign({}, defaultProblem, {
73 | id: `${element.id}.${type}`,
74 | title: type
75 | }),
76 | false,
77 | ))
78 | }
79 | break;
80 | case ProblemCategory.难度:
81 | for (let type in ProblemDifficulty) {
82 | res.push(new ProblemNodeModel(
83 | Object.assign({}, defaultProblem, {
84 | id: `${element.id}.${type}`,
85 | title: type
86 | }),
87 | false,
88 | ))
89 | }
90 | break;
91 | case ProblemCategory.比赛:
92 | return this.getContestNodes();
93 | case ProblemCategory.收藏:
94 | return this.getLikeNodes();
95 | default:
96 | return this.getChildrenNodes(element);
97 | }
98 | }
99 |
100 | return res;
101 | }
102 | getAllNodes(): ProviderResult {
103 | throw new Error("Method not implemented.");
104 | }
105 | getContestNodes(): ProviderResult {
106 | throw new Error("Method not implemented.");
107 | }
108 | getLikeNodes(): ProviderResult {
109 | throw new Error("Method not implemented.");
110 | }
111 |
112 | public async refresh(): Promise {
113 | this.onDidChangeTreeDataEvent.fire(null);
114 | }
115 |
116 | getRootNodes():Problem[] {
117 | throw new Error("Method not implemented.");
118 | }
119 |
120 | getChildrenNodes(element: ProblemNodeModel): ProviderResult {
121 | throw Error()
122 | }
123 | }
124 |
125 | export const problemProvider: ProblemProvider = new ProblemProvider();
--------------------------------------------------------------------------------
/src/service/UserService.ts:
--------------------------------------------------------------------------------
1 | import { ConfigurationTarget } from "vscode";
2 | import { NSSClient } from "../lib/balderich";
3 | import { mainStore } from "../store/MainStore";
4 | import { output } from "../util/CodeUtil";
5 | import { getVsCodeConfig } from "../util/ConfigUtil";
6 |
7 | class UserService {
8 | public async getUserInfo() {
9 | if (!mainStore.client) return null;
10 |
11 | return mainStore.client.user.getSelfInfo();
12 | }
13 |
14 | public async signIn(key: string, secret: string) {
15 | const _client = new NSSClient(null, key, secret);
16 | try {
17 | _client.user.getSelfInfo();
18 | } catch (error: any) {
19 | output.appendLine(error.toString());
20 | return false;
21 | }
22 |
23 | getVsCodeConfig().update('api.key', key, ConfigurationTarget.Global);
24 | getVsCodeConfig().update('api.secret', secret, ConfigurationTarget.Global);
25 | mainStore.client = _client;
26 | return true;
27 | }
28 | }
29 |
30 | export const userService: UserService = new UserService();
--------------------------------------------------------------------------------
/src/store/MainStore.ts:
--------------------------------------------------------------------------------
1 | import { ExtensionContext, Uri } from "vscode";
2 | import { NSSClient } from "../lib/balderich";
3 | import * as sutils from '../util/SystemUtil';
4 |
5 | class MainStore {
6 | context = null as null|ExtensionContext
7 | cachePath = null as null|Uri
8 | client = null as null|NSSClient
9 |
10 | constructor() {
11 | sutils.init();
12 | }
13 | }
14 |
15 | export const mainStore: MainStore = new MainStore();
--------------------------------------------------------------------------------
/src/store/UserStore.ts:
--------------------------------------------------------------------------------
1 | import { event } from "../event";
2 | import { userService } from "../service/UserService";
3 |
4 | class UserStore {
5 | private uid: number | undefined
6 | private username: string | undefined;
7 | private email: string | undefined;
8 | private status: boolean = false // 登录状态
9 |
10 | public async updateLoginStatus() {
11 | try {
12 | const res = await userService.getUserInfo();
13 |
14 | if (res) {
15 | this.parseUserInfo(res);
16 | }
17 | } finally {
18 | event.emit("userInfoUpdate");
19 | }
20 | }
21 |
22 | public parseUserInfo(info: Record) {
23 | this.uid = info.uid || this.uid;
24 | this.username = info.username || this.username;
25 | this.email = info.email || this.email;
26 |
27 | if (this.uid) {
28 | this.status = true;
29 | }
30 | }
31 |
32 | public isLogin() {
33 | return this.status;
34 | }
35 |
36 | public async signIn(key: string, secret: string) {
37 | const flag = await userService.signIn(key, secret);
38 | if (flag) {
39 | this.updateLoginStatus();
40 | }
41 | return flag;
42 | }
43 | }
44 |
45 | export const userStore: UserStore = new UserStore();
--------------------------------------------------------------------------------
/src/test/runTest.ts:
--------------------------------------------------------------------------------
1 | import * as path from 'path';
2 |
3 | import { runTests } from '@vscode/test-electron';
4 |
5 | async function main() {
6 | try {
7 | // The folder containing the Extension Manifest package.json
8 | // Passed to `--extensionDevelopmentPath`
9 | const extensionDevelopmentPath = path.resolve(__dirname, '../../');
10 |
11 | // The path to test runner
12 | // Passed to --extensionTestsPath
13 | const extensionTestsPath = path.resolve(__dirname, './suite/index');
14 |
15 | // Download VS Code, unzip it and run the integration test
16 | await runTests({ extensionDevelopmentPath, extensionTestsPath });
17 | } catch (err) {
18 | console.error('Failed to run tests', err);
19 | process.exit(1);
20 | }
21 | }
22 |
23 | main();
24 |
--------------------------------------------------------------------------------
/src/test/suite/extension.test.ts:
--------------------------------------------------------------------------------
1 | import * as assert from 'assert';
2 |
3 | // You can import and use all API from the 'vscode' module
4 | // as well as import your extension to test it
5 | import * as vscode from 'vscode';
6 | // import * as myExtension from '../../extension';
7 |
8 | suite('Extension Test Suite', () => {
9 | vscode.window.showInformationMessage('Start all tests.');
10 |
11 | test('Sample test', () => {
12 | assert.strictEqual(-1, [1, 2, 3].indexOf(5));
13 | assert.strictEqual(-1, [1, 2, 3].indexOf(0));
14 | });
15 | });
16 |
--------------------------------------------------------------------------------
/src/test/suite/index.ts:
--------------------------------------------------------------------------------
1 | import * as path from 'path';
2 | import * as Mocha from 'mocha';
3 | import * as glob from 'glob';
4 |
5 | export function run(): Promise {
6 | // Create the mocha test
7 | const mocha = new Mocha({
8 | ui: 'tdd',
9 | color: true
10 | });
11 |
12 | const testsRoot = path.resolve(__dirname, '..');
13 |
14 | return new Promise((c, e) => {
15 | glob('**/**.test.js', { cwd: testsRoot }, (err, files) => {
16 | if (err) {
17 | return e(err);
18 | }
19 |
20 | // Add files to the test suite
21 | files.forEach(f => mocha.addFile(path.resolve(testsRoot, f)));
22 |
23 | try {
24 | // Run the mocha test
25 | mocha.run(failures => {
26 | if (failures > 0) {
27 | e(new Error(`${failures} tests failed.`));
28 | } else {
29 | c();
30 | }
31 | });
32 | } catch (err) {
33 | console.error(err);
34 | e(err);
35 | }
36 | });
37 | });
38 | }
39 |
--------------------------------------------------------------------------------
/src/util/CacheUtil.ts:
--------------------------------------------------------------------------------
1 | import * as path from 'path';
2 | import * as fs from 'fs';
3 | import { getCacheDir } from "./SystemUtil";
4 |
5 | export const getCacheFilePath = (name: string) => {
6 | return path.join(getCacheDir(), `${name}.json`);
7 | }
8 |
9 | export const getCache = (name: string) => {
10 | const filepath = getCacheFilePath(name);
11 | if (!fs.existsSync(filepath)) return null;
12 |
13 | return JSON.parse(fs.readFileSync(filepath).toString());
14 | }
15 |
16 | export const setCache = (name: string, value: Object) => {
17 | const filepath = getCacheFilePath(name);
18 |
19 | fs.writeFileSync(filepath, JSON.stringify(value));
20 | }
21 |
22 | export const delCache = (name: string) => {
23 | const filepath = getCacheFilePath(name);
24 | if (fs.existsSync(filepath)) {
25 | fs.unlinkSync(filepath);
26 | }
27 | }
--------------------------------------------------------------------------------
/src/util/CodeUtil.ts:
--------------------------------------------------------------------------------
1 | import * as path from 'path';
2 | import * as vscode from 'vscode';
3 | import * as fs from 'fs';
4 | import { spawn } from 'child_process';
5 | import { locale } from '../i18n';
6 | import { DialogOptions } from '../model/CodeModel';
7 |
8 | // 获取目前选中
9 | export const getSelections = (): readonly vscode.Selection[] | null => {
10 | let editor = vscode.window.activeTextEditor;
11 | return editor ? editor.selections : null;
12 | }
13 |
14 | // from https://github.com/imlinhanchao/vsc-markdown-image/blob/master/src/lib/utils.ts#L249
15 | export const getPasteImage = (savePath: string): Promise => {
16 | return new Promise((resolve, reject) => {
17 | let platform = process.platform;
18 |
19 | if (platform === 'win32') { // Windows
20 | const scriptPath = path.join(__dirname, '..', '..', 'assets', 'scripts', 'paste.ps1');
21 |
22 | let command = "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe";
23 | let powershellExisted = fs.existsSync(command);
24 |
25 | if (!powershellExisted) {
26 | command = "powershell";
27 | };
28 |
29 | let output = '';
30 |
31 | const powershell = spawn(command, [
32 | '-noprofile',
33 | '-noninteractive',
34 | '-nologo',
35 | '-sta',
36 | '-executionpolicy', 'unrestricted',
37 | '-windowstyle', 'hidden',
38 | '-file', scriptPath,
39 | savePath
40 | ]);
41 |
42 | // the powershell can't auto exit in windows 7 .
43 | let timer = setTimeout(() => powershell.kill(), 2000);
44 |
45 | powershell.on('error', (e: any) => {
46 | if (e.code === 'ENOENT') {
47 | vscode.window.showErrorMessage(locale['powershell_not_found']);
48 | } else {
49 | vscode.window.showErrorMessage(e);
50 | }
51 | });
52 |
53 | powershell.stdout.on('data', (data) => {
54 | data.toString().split('\n').forEach((d: string | string[]) => output += (d.indexOf('Active code page:') < 0 ? d + '\n' : ''));
55 | clearTimeout(timer);
56 | console.log(data.toString())
57 | timer = setTimeout(() => powershell.kill(), 2000);
58 | });
59 | powershell.on('close', (code) => {
60 | resolve(output.trim().split('\n').map(i => i.trim()));
61 | });
62 | } else if (platform === 'darwin') { // Mac
63 | let scriptPath = path.join(__dirname, '..', '..', 'assets', 'script', 'paste.applescript');
64 |
65 | let ascript = spawn('osascript', [scriptPath, savePath]);
66 | ascript.on('error', (e: any) => {
67 | vscode.window.showErrorMessage(e);
68 | });
69 | ascript.stdout.on('data', (data) => {
70 | resolve(data.toString().trim().split('\n'));
71 | });
72 | } else {
73 | // Linux
74 |
75 | let scriptPath = path.join(__dirname, '..', '..', 'assets', 'script', 'paste.sh');
76 |
77 | let ascript = spawn('sh', [scriptPath, savePath]);
78 | ascript.on('error', (e: any) => {
79 | vscode.window.showErrorMessage(e);
80 | });
81 | ascript.stdout.on('data', (data) => {
82 | let result = data.toString().trim();
83 | if (result === "no xclip") {
84 | vscode.window.showInformationMessage(locale['install_xclip']);
85 | return;
86 | }
87 | let match = decodeURI(result).trim().match(/((\/[^\/]+)+\/[^\/]*?\.(jpg|jpeg|gif|bmp|png))/g);
88 | resolve(match || []);
89 | });
90 | }
91 | })
92 | }
93 |
94 | export const editorEdit = async (selection: vscode.Selection | vscode.Position | undefined | null, text: string): Promise => {
95 | return new Promise((resolve, reject) => {
96 | vscode.window.activeTextEditor?.edit(e => {
97 | if (selection) {
98 | e.replace(selection, text);
99 | }
100 | }).then(resolve);
101 | });
102 | }
103 |
104 | export const openUrl = async (url: string): Promise => {
105 | vscode.commands.executeCommand("vscode.open", vscode.Uri.parse(url));
106 | }
107 |
108 | export const showProgress = () => {
109 | let show = true;
110 | vscode.window.withProgress({
111 | location: vscode.ProgressLocation.Window,
112 | title: locale['imagePasteUploadProgressTitle'],
113 | cancellable: false,
114 | }, (progress, token) => {
115 | return new Promise(resolve => {
116 | let timer = setInterval(() => {
117 | if (show) { return; }
118 | clearInterval(timer);
119 | resolve(show);
120 | }, 200)
121 | });
122 | });
123 |
124 | return () => show = false;
125 | }
126 |
127 | export const signInNotify = async () => {
128 | const choice: vscode.MessageItem | undefined = await vscode.window.showInformationMessage(
129 | locale['no_api'],
130 | DialogOptions.yes,
131 | DialogOptions.cancel,
132 | DialogOptions.singUp
133 | );
134 |
135 | switch (choice) {
136 | case DialogOptions.yes:
137 | await vscode.commands.executeCommand('nssctf.signIn');break;
138 | case DialogOptions.singUp:
139 | openUrl(locale['NSSCTF_URL']);break;
140 | default:
141 | break
142 | }
143 | }
144 |
145 | class Output implements vscode.Disposable {
146 | private readonly channel: vscode.OutputChannel = vscode.window.createOutputChannel("NSSCTF");
147 |
148 | public appendLine(message: string) {
149 | this.channel.appendLine(message);
150 | }
151 |
152 | public append(message: string): void {
153 | this.channel.append(message);
154 | }
155 |
156 | public show(): void {
157 | this.channel.show();
158 | }
159 | public dispose(): void {
160 | this.channel.dispose();
161 | }
162 | }
163 |
164 | export const output: Output = new Output();
--------------------------------------------------------------------------------
/src/util/ConfigUtil.ts:
--------------------------------------------------------------------------------
1 | import { WorkspaceConfiguration, workspace } from "vscode";
2 |
3 | export const getVsCodeConfig = (): WorkspaceConfiguration => {
4 | return workspace.getConfiguration("nssctf");
5 | }
6 |
7 | export const getTempFolderName = (): string => {
8 | return getVsCodeConfig().get("tempFolderName", "tmp");
9 | }
10 |
11 | export const getBalderichAPI = (): Record<'key'|'secret',string> => {
12 | const key = getVsCodeConfig().get('api.key', '');
13 | const secret = getVsCodeConfig().get('api.secret', '');
14 |
15 | return {
16 | key: key,
17 | secret: secret
18 | };
19 | }
20 |
--------------------------------------------------------------------------------
/src/util/DecoratorUtil.ts:
--------------------------------------------------------------------------------
1 | import { userStore } from "../store/UserStore"
2 | import * as cutils from '../util/CodeUtil' ;
3 |
4 | export const requireLogin = () => {
5 | return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
6 | const org = descriptor.value;
7 |
8 | descriptor.value = function (...args: any[]) {
9 | if (!userStore.isLogin()) {
10 | cutils.signInNotify();
11 | } else {
12 | org.call(this, ...args);
13 | }
14 | }
15 | }
16 | }
17 |
18 | export const exceptionCatch = () => {
19 | return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
20 | const org = descriptor.value;
21 |
22 | descriptor.value = function (...args: any[]) {
23 | let results;
24 | try {
25 | results = org.call(this, ...args);
26 | } catch (error: any) {
27 | cutils.output.appendLine(error.toString());
28 | }
29 | return results;
30 | };
31 | return descriptor;
32 | }
33 | }
--------------------------------------------------------------------------------
/src/util/SystemUtil.ts:
--------------------------------------------------------------------------------
1 | import { homedir, tmpdir } from 'os';
2 | import * as fs from 'fs';
3 | import { getTempFolderName } from './ConfigUtil';
4 | import * as path from 'path';
5 |
6 |
7 | export const getUserHomeDir = () => {
8 | return homedir();
9 | }
10 |
11 | export const getHomeDir = () => {
12 | return path.join(getUserHomeDir(), '.nssctf');
13 | }
14 |
15 | export const init = () => {
16 | if (!fs.existsSync(getHomeDir())) { fs.mkdirSync(getHomeDir()); }
17 | }
18 |
19 | export const getTempDir = () => {
20 | let tmpPath = path.join(getHomeDir(), getTempFolderName());
21 | if (!fs.existsSync(tmpPath)) { fs.mkdirSync(tmpPath); }
22 | return tmpPath;
23 | }
24 |
25 | export const getCacheDir = () => {
26 | return path.join(getHomeDir(), "cache");
27 | }
28 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "target": "ES2020",
5 | "outDir": "out",
6 | "lib": [
7 | "ES2020",
8 | ],
9 | "sourceMap": true,
10 | "experimentalDecorators": true,
11 | "rootDir": "src",
12 | "strict": true /* enable all strict type-checking options */
13 | /* Additional Checks */
14 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
15 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
16 | // "noUnusedParameters": true, /* Report errors on unused parameters. */
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@eslint-community/eslint-utils@^4.2.0":
6 | version "4.4.0"
7 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
8 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
9 | dependencies:
10 | eslint-visitor-keys "^3.3.0"
11 |
12 | "@eslint-community/regexpp@^4.4.0":
13 | version "4.5.1"
14 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884"
15 | integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==
16 |
17 | "@eslint/eslintrc@^2.0.3":
18 | version "2.0.3"
19 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331"
20 | integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==
21 | dependencies:
22 | ajv "^6.12.4"
23 | debug "^4.3.2"
24 | espree "^9.5.2"
25 | globals "^13.19.0"
26 | ignore "^5.2.0"
27 | import-fresh "^3.2.1"
28 | js-yaml "^4.1.0"
29 | minimatch "^3.1.2"
30 | strip-json-comments "^3.1.1"
31 |
32 | "@eslint/js@8.40.0":
33 | version "8.40.0"
34 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.40.0.tgz#3ba73359e11f5a7bd3e407f70b3528abfae69cec"
35 | integrity sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==
36 |
37 | "@humanwhocodes/config-array@^0.11.8":
38 | version "0.11.8"
39 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9"
40 | integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==
41 | dependencies:
42 | "@humanwhocodes/object-schema" "^1.2.1"
43 | debug "^4.1.1"
44 | minimatch "^3.0.5"
45 |
46 | "@humanwhocodes/module-importer@^1.0.1":
47 | version "1.0.1"
48 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
49 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
50 |
51 | "@humanwhocodes/object-schema@^1.2.1":
52 | version "1.2.1"
53 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
54 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
55 |
56 | "@nodelib/fs.scandir@2.1.5":
57 | version "2.1.5"
58 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
59 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
60 | dependencies:
61 | "@nodelib/fs.stat" "2.0.5"
62 | run-parallel "^1.1.9"
63 |
64 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
65 | version "2.0.5"
66 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
67 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
68 |
69 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
70 | version "1.2.8"
71 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
72 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
73 | dependencies:
74 | "@nodelib/fs.scandir" "2.1.5"
75 | fastq "^1.6.0"
76 |
77 | "@tootallnate/once@1":
78 | version "1.1.2"
79 | resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
80 | integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
81 |
82 | "@types/glob@^8.1.0":
83 | version "8.1.0"
84 | resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc"
85 | integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==
86 | dependencies:
87 | "@types/minimatch" "^5.1.2"
88 | "@types/node" "*"
89 |
90 | "@types/json-schema@^7.0.9":
91 | version "7.0.11"
92 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
93 | integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
94 |
95 | "@types/minimatch@^5.1.2":
96 | version "5.1.2"
97 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
98 | integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
99 |
100 | "@types/mocha@^10.0.1":
101 | version "10.0.1"
102 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b"
103 | integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==
104 |
105 | "@types/node@*":
106 | version "20.1.5"
107 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.1.5.tgz#e94b604c67fc408f215fcbf3bd84d4743bf7f710"
108 | integrity sha512-IvGD1CD/nego63ySR7vrAKEX3AJTcmrAN2kn+/sDNLi1Ff5kBzDeEdqWDplK+0HAEoLYej137Sk0cUU8OLOlMg==
109 |
110 | "@types/node@16.x":
111 | version "16.18.30"
112 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.30.tgz#4a2c426370712a10c630a55ba086c55c17ca54e0"
113 | integrity sha512-Kmp/wBZk19Dn7uRiol8kF8agnf8m0+TU9qIwyfPmXglVxMlmiIz0VQSMw5oFgwhmD2aKTlfBIO5FtsVj3y7hKQ==
114 |
115 | "@types/semver@^7.3.12":
116 | version "7.5.0"
117 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a"
118 | integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==
119 |
120 | "@types/vscode@^1.78.0":
121 | version "1.78.0"
122 | resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.78.0.tgz#b5600abce8855cf21fb32d0857bcd084b1f83069"
123 | integrity sha512-LJZIJpPvKJ0HVQDqfOy6W4sNKUBBwyDu1Bs8chHBZOe9MNuKTJtidgZ2bqjhmmWpUb0TIIqv47BFUcVmAsgaVA==
124 |
125 | "@typescript-eslint/eslint-plugin@^5.59.1":
126 | version "5.59.6"
127 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz#a350faef1baa1e961698240f922d8de1761a9e2b"
128 | integrity sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==
129 | dependencies:
130 | "@eslint-community/regexpp" "^4.4.0"
131 | "@typescript-eslint/scope-manager" "5.59.6"
132 | "@typescript-eslint/type-utils" "5.59.6"
133 | "@typescript-eslint/utils" "5.59.6"
134 | debug "^4.3.4"
135 | grapheme-splitter "^1.0.4"
136 | ignore "^5.2.0"
137 | natural-compare-lite "^1.4.0"
138 | semver "^7.3.7"
139 | tsutils "^3.21.0"
140 |
141 | "@typescript-eslint/parser@^5.59.1":
142 | version "5.59.6"
143 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.6.tgz#bd36f71f5a529f828e20b627078d3ed6738dbb40"
144 | integrity sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==
145 | dependencies:
146 | "@typescript-eslint/scope-manager" "5.59.6"
147 | "@typescript-eslint/types" "5.59.6"
148 | "@typescript-eslint/typescript-estree" "5.59.6"
149 | debug "^4.3.4"
150 |
151 | "@typescript-eslint/scope-manager@5.59.6":
152 | version "5.59.6"
153 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz#d43a3687aa4433868527cfe797eb267c6be35f19"
154 | integrity sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==
155 | dependencies:
156 | "@typescript-eslint/types" "5.59.6"
157 | "@typescript-eslint/visitor-keys" "5.59.6"
158 |
159 | "@typescript-eslint/type-utils@5.59.6":
160 | version "5.59.6"
161 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz#37c51d2ae36127d8b81f32a0a4d2efae19277c48"
162 | integrity sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==
163 | dependencies:
164 | "@typescript-eslint/typescript-estree" "5.59.6"
165 | "@typescript-eslint/utils" "5.59.6"
166 | debug "^4.3.4"
167 | tsutils "^3.21.0"
168 |
169 | "@typescript-eslint/types@5.59.6":
170 | version "5.59.6"
171 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.6.tgz#5a6557a772af044afe890d77c6a07e8c23c2460b"
172 | integrity sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==
173 |
174 | "@typescript-eslint/typescript-estree@5.59.6":
175 | version "5.59.6"
176 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz#2fb80522687bd3825504925ea7e1b8de7bb6251b"
177 | integrity sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==
178 | dependencies:
179 | "@typescript-eslint/types" "5.59.6"
180 | "@typescript-eslint/visitor-keys" "5.59.6"
181 | debug "^4.3.4"
182 | globby "^11.1.0"
183 | is-glob "^4.0.3"
184 | semver "^7.3.7"
185 | tsutils "^3.21.0"
186 |
187 | "@typescript-eslint/utils@5.59.6":
188 | version "5.59.6"
189 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.6.tgz#82960fe23788113fc3b1f9d4663d6773b7907839"
190 | integrity sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==
191 | dependencies:
192 | "@eslint-community/eslint-utils" "^4.2.0"
193 | "@types/json-schema" "^7.0.9"
194 | "@types/semver" "^7.3.12"
195 | "@typescript-eslint/scope-manager" "5.59.6"
196 | "@typescript-eslint/types" "5.59.6"
197 | "@typescript-eslint/typescript-estree" "5.59.6"
198 | eslint-scope "^5.1.1"
199 | semver "^7.3.7"
200 |
201 | "@typescript-eslint/visitor-keys@5.59.6":
202 | version "5.59.6"
203 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz#673fccabf28943847d0c8e9e8d008e3ada7be6bb"
204 | integrity sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==
205 | dependencies:
206 | "@typescript-eslint/types" "5.59.6"
207 | eslint-visitor-keys "^3.3.0"
208 |
209 | "@vscode/test-electron@^2.3.0":
210 | version "2.3.2"
211 | resolved "https://registry.yarnpkg.com/@vscode/test-electron/-/test-electron-2.3.2.tgz#25db8d1a94e8274c27015cf806ae8b180c83545b"
212 | integrity sha512-CRfQIs5Wi5Ok5SUCC3PTvRRXa74LD43cSXHC8EuNlmHHEPaJa/AGrv76brcA1hVSxrdja9tiYwp95Lq8kwY0tw==
213 | dependencies:
214 | http-proxy-agent "^4.0.1"
215 | https-proxy-agent "^5.0.0"
216 | jszip "^3.10.1"
217 | semver "^7.3.8"
218 |
219 | acorn-jsx@^5.3.2:
220 | version "5.3.2"
221 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
222 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
223 |
224 | acorn@^8.8.0:
225 | version "8.8.2"
226 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a"
227 | integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==
228 |
229 | agent-base@6:
230 | version "6.0.2"
231 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
232 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
233 | dependencies:
234 | debug "4"
235 |
236 | ajv@^6.10.0, ajv@^6.12.4:
237 | version "6.12.6"
238 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
239 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
240 | dependencies:
241 | fast-deep-equal "^3.1.1"
242 | fast-json-stable-stringify "^2.0.0"
243 | json-schema-traverse "^0.4.1"
244 | uri-js "^4.2.2"
245 |
246 | ansi-colors@4.1.1:
247 | version "4.1.1"
248 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
249 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
250 |
251 | ansi-regex@^5.0.1:
252 | version "5.0.1"
253 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
254 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
255 |
256 | ansi-styles@^4.0.0, ansi-styles@^4.1.0:
257 | version "4.3.0"
258 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
259 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
260 | dependencies:
261 | color-convert "^2.0.1"
262 |
263 | anymatch@~3.1.2:
264 | version "3.1.3"
265 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
266 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
267 | dependencies:
268 | normalize-path "^3.0.0"
269 | picomatch "^2.0.4"
270 |
271 | argparse@^2.0.1:
272 | version "2.0.1"
273 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
274 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
275 |
276 | array-union@^2.1.0:
277 | version "2.1.0"
278 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
279 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
280 |
281 | asynckit@^0.4.0:
282 | version "0.4.0"
283 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
284 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
285 |
286 | axios@^1.4.0:
287 | version "1.4.0"
288 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f"
289 | integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==
290 | dependencies:
291 | follow-redirects "^1.15.0"
292 | form-data "^4.0.0"
293 | proxy-from-env "^1.1.0"
294 |
295 | balanced-match@^1.0.0:
296 | version "1.0.2"
297 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
298 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
299 |
300 | binary-extensions@^2.0.0:
301 | version "2.2.0"
302 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
303 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
304 |
305 | brace-expansion@^1.1.7:
306 | version "1.1.11"
307 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
308 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
309 | dependencies:
310 | balanced-match "^1.0.0"
311 | concat-map "0.0.1"
312 |
313 | brace-expansion@^2.0.1:
314 | version "2.0.1"
315 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
316 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
317 | dependencies:
318 | balanced-match "^1.0.0"
319 |
320 | braces@^3.0.2, braces@~3.0.2:
321 | version "3.0.2"
322 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
323 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
324 | dependencies:
325 | fill-range "^7.0.1"
326 |
327 | browser-stdout@1.3.1:
328 | version "1.3.1"
329 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
330 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
331 |
332 | callsites@^3.0.0:
333 | version "3.1.0"
334 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
335 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
336 |
337 | camelcase@^6.0.0:
338 | version "6.3.0"
339 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
340 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
341 |
342 | chalk@^4.0.0, chalk@^4.1.0:
343 | version "4.1.2"
344 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
345 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
346 | dependencies:
347 | ansi-styles "^4.1.0"
348 | supports-color "^7.1.0"
349 |
350 | chokidar@3.5.3:
351 | version "3.5.3"
352 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
353 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
354 | dependencies:
355 | anymatch "~3.1.2"
356 | braces "~3.0.2"
357 | glob-parent "~5.1.2"
358 | is-binary-path "~2.1.0"
359 | is-glob "~4.0.1"
360 | normalize-path "~3.0.0"
361 | readdirp "~3.6.0"
362 | optionalDependencies:
363 | fsevents "~2.3.2"
364 |
365 | cliui@^7.0.2:
366 | version "7.0.4"
367 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
368 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
369 | dependencies:
370 | string-width "^4.2.0"
371 | strip-ansi "^6.0.0"
372 | wrap-ansi "^7.0.0"
373 |
374 | color-convert@^2.0.1:
375 | version "2.0.1"
376 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
377 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
378 | dependencies:
379 | color-name "~1.1.4"
380 |
381 | color-name@~1.1.4:
382 | version "1.1.4"
383 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
384 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
385 |
386 | combined-stream@^1.0.8:
387 | version "1.0.8"
388 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
389 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
390 | dependencies:
391 | delayed-stream "~1.0.0"
392 |
393 | concat-map@0.0.1:
394 | version "0.0.1"
395 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
396 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
397 |
398 | core-util-is@~1.0.0:
399 | version "1.0.3"
400 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
401 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
402 |
403 | cross-spawn@^7.0.2:
404 | version "7.0.3"
405 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
406 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
407 | dependencies:
408 | path-key "^3.1.0"
409 | shebang-command "^2.0.0"
410 | which "^2.0.1"
411 |
412 | debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
413 | version "4.3.4"
414 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
415 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
416 | dependencies:
417 | ms "2.1.2"
418 |
419 | decamelize@^4.0.0:
420 | version "4.0.0"
421 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
422 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
423 |
424 | deep-is@^0.1.3:
425 | version "0.1.4"
426 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
427 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
428 |
429 | delayed-stream@~1.0.0:
430 | version "1.0.0"
431 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
432 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
433 |
434 | diff@5.0.0:
435 | version "5.0.0"
436 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
437 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
438 |
439 | dir-glob@^3.0.1:
440 | version "3.0.1"
441 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
442 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
443 | dependencies:
444 | path-type "^4.0.0"
445 |
446 | doctrine@^3.0.0:
447 | version "3.0.0"
448 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
449 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
450 | dependencies:
451 | esutils "^2.0.2"
452 |
453 | emoji-regex@^8.0.0:
454 | version "8.0.0"
455 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
456 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
457 |
458 | escalade@^3.1.1:
459 | version "3.1.1"
460 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
461 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
462 |
463 | escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0:
464 | version "4.0.0"
465 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
466 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
467 |
468 | eslint-scope@^5.1.1:
469 | version "5.1.1"
470 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
471 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
472 | dependencies:
473 | esrecurse "^4.3.0"
474 | estraverse "^4.1.1"
475 |
476 | eslint-scope@^7.2.0:
477 | version "7.2.0"
478 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b"
479 | integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==
480 | dependencies:
481 | esrecurse "^4.3.0"
482 | estraverse "^5.2.0"
483 |
484 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1:
485 | version "3.4.1"
486 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994"
487 | integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==
488 |
489 | eslint@^8.39.0:
490 | version "8.40.0"
491 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.40.0.tgz#a564cd0099f38542c4e9a2f630fa45bf33bc42a4"
492 | integrity sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==
493 | dependencies:
494 | "@eslint-community/eslint-utils" "^4.2.0"
495 | "@eslint-community/regexpp" "^4.4.0"
496 | "@eslint/eslintrc" "^2.0.3"
497 | "@eslint/js" "8.40.0"
498 | "@humanwhocodes/config-array" "^0.11.8"
499 | "@humanwhocodes/module-importer" "^1.0.1"
500 | "@nodelib/fs.walk" "^1.2.8"
501 | ajv "^6.10.0"
502 | chalk "^4.0.0"
503 | cross-spawn "^7.0.2"
504 | debug "^4.3.2"
505 | doctrine "^3.0.0"
506 | escape-string-regexp "^4.0.0"
507 | eslint-scope "^7.2.0"
508 | eslint-visitor-keys "^3.4.1"
509 | espree "^9.5.2"
510 | esquery "^1.4.2"
511 | esutils "^2.0.2"
512 | fast-deep-equal "^3.1.3"
513 | file-entry-cache "^6.0.1"
514 | find-up "^5.0.0"
515 | glob-parent "^6.0.2"
516 | globals "^13.19.0"
517 | grapheme-splitter "^1.0.4"
518 | ignore "^5.2.0"
519 | import-fresh "^3.0.0"
520 | imurmurhash "^0.1.4"
521 | is-glob "^4.0.0"
522 | is-path-inside "^3.0.3"
523 | js-sdsl "^4.1.4"
524 | js-yaml "^4.1.0"
525 | json-stable-stringify-without-jsonify "^1.0.1"
526 | levn "^0.4.1"
527 | lodash.merge "^4.6.2"
528 | minimatch "^3.1.2"
529 | natural-compare "^1.4.0"
530 | optionator "^0.9.1"
531 | strip-ansi "^6.0.1"
532 | strip-json-comments "^3.1.0"
533 | text-table "^0.2.0"
534 |
535 | espree@^9.5.2:
536 | version "9.5.2"
537 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b"
538 | integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==
539 | dependencies:
540 | acorn "^8.8.0"
541 | acorn-jsx "^5.3.2"
542 | eslint-visitor-keys "^3.4.1"
543 |
544 | esquery@^1.4.2:
545 | version "1.5.0"
546 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
547 | integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
548 | dependencies:
549 | estraverse "^5.1.0"
550 |
551 | esrecurse@^4.3.0:
552 | version "4.3.0"
553 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
554 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
555 | dependencies:
556 | estraverse "^5.2.0"
557 |
558 | estraverse@^4.1.1:
559 | version "4.3.0"
560 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
561 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
562 |
563 | estraverse@^5.1.0, estraverse@^5.2.0:
564 | version "5.3.0"
565 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
566 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
567 |
568 | esutils@^2.0.2:
569 | version "2.0.3"
570 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
571 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
572 |
573 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
574 | version "3.1.3"
575 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
576 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
577 |
578 | fast-glob@^3.2.9:
579 | version "3.2.12"
580 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
581 | integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
582 | dependencies:
583 | "@nodelib/fs.stat" "^2.0.2"
584 | "@nodelib/fs.walk" "^1.2.3"
585 | glob-parent "^5.1.2"
586 | merge2 "^1.3.0"
587 | micromatch "^4.0.4"
588 |
589 | fast-json-stable-stringify@^2.0.0:
590 | version "2.1.0"
591 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
592 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
593 |
594 | fast-levenshtein@^2.0.6:
595 | version "2.0.6"
596 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
597 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
598 |
599 | fastq@^1.6.0:
600 | version "1.15.0"
601 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
602 | integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==
603 | dependencies:
604 | reusify "^1.0.4"
605 |
606 | file-entry-cache@^6.0.1:
607 | version "6.0.1"
608 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
609 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
610 | dependencies:
611 | flat-cache "^3.0.4"
612 |
613 | fill-range@^7.0.1:
614 | version "7.0.1"
615 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
616 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
617 | dependencies:
618 | to-regex-range "^5.0.1"
619 |
620 | find-up@5.0.0, find-up@^5.0.0:
621 | version "5.0.0"
622 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
623 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
624 | dependencies:
625 | locate-path "^6.0.0"
626 | path-exists "^4.0.0"
627 |
628 | flat-cache@^3.0.4:
629 | version "3.0.4"
630 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
631 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
632 | dependencies:
633 | flatted "^3.1.0"
634 | rimraf "^3.0.2"
635 |
636 | flat@^5.0.2:
637 | version "5.0.2"
638 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
639 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
640 |
641 | flatted@^3.1.0:
642 | version "3.2.7"
643 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
644 | integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
645 |
646 | follow-redirects@^1.15.0:
647 | version "1.15.2"
648 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
649 | integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
650 |
651 | form-data@^4.0.0:
652 | version "4.0.0"
653 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
654 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
655 | dependencies:
656 | asynckit "^0.4.0"
657 | combined-stream "^1.0.8"
658 | mime-types "^2.1.12"
659 |
660 | fs.realpath@^1.0.0:
661 | version "1.0.0"
662 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
663 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
664 |
665 | fsevents@~2.3.2:
666 | version "2.3.2"
667 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
668 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
669 |
670 | get-caller-file@^2.0.5:
671 | version "2.0.5"
672 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
673 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
674 |
675 | glob-parent@^5.1.2, glob-parent@~5.1.2:
676 | version "5.1.2"
677 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
678 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
679 | dependencies:
680 | is-glob "^4.0.1"
681 |
682 | glob-parent@^6.0.2:
683 | version "6.0.2"
684 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
685 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
686 | dependencies:
687 | is-glob "^4.0.3"
688 |
689 | glob@7.2.0:
690 | version "7.2.0"
691 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
692 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
693 | dependencies:
694 | fs.realpath "^1.0.0"
695 | inflight "^1.0.4"
696 | inherits "2"
697 | minimatch "^3.0.4"
698 | once "^1.3.0"
699 | path-is-absolute "^1.0.0"
700 |
701 | glob@^7.1.3:
702 | version "7.2.3"
703 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
704 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
705 | dependencies:
706 | fs.realpath "^1.0.0"
707 | inflight "^1.0.4"
708 | inherits "2"
709 | minimatch "^3.1.1"
710 | once "^1.3.0"
711 | path-is-absolute "^1.0.0"
712 |
713 | glob@^8.1.0:
714 | version "8.1.0"
715 | resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e"
716 | integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
717 | dependencies:
718 | fs.realpath "^1.0.0"
719 | inflight "^1.0.4"
720 | inherits "2"
721 | minimatch "^5.0.1"
722 | once "^1.3.0"
723 |
724 | globals@^13.19.0:
725 | version "13.20.0"
726 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82"
727 | integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==
728 | dependencies:
729 | type-fest "^0.20.2"
730 |
731 | globby@^11.1.0:
732 | version "11.1.0"
733 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
734 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
735 | dependencies:
736 | array-union "^2.1.0"
737 | dir-glob "^3.0.1"
738 | fast-glob "^3.2.9"
739 | ignore "^5.2.0"
740 | merge2 "^1.4.1"
741 | slash "^3.0.0"
742 |
743 | grapheme-splitter@^1.0.4:
744 | version "1.0.4"
745 | resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
746 | integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
747 |
748 | has-flag@^4.0.0:
749 | version "4.0.0"
750 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
751 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
752 |
753 | he@1.2.0:
754 | version "1.2.0"
755 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
756 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
757 |
758 | http-proxy-agent@^4.0.1:
759 | version "4.0.1"
760 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
761 | integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
762 | dependencies:
763 | "@tootallnate/once" "1"
764 | agent-base "6"
765 | debug "4"
766 |
767 | https-proxy-agent@^5.0.0:
768 | version "5.0.1"
769 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
770 | integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
771 | dependencies:
772 | agent-base "6"
773 | debug "4"
774 |
775 | ignore@^5.2.0:
776 | version "5.2.4"
777 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
778 | integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
779 |
780 | immediate@~3.0.5:
781 | version "3.0.6"
782 | resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
783 | integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==
784 |
785 | import-fresh@^3.0.0, import-fresh@^3.2.1:
786 | version "3.3.0"
787 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
788 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
789 | dependencies:
790 | parent-module "^1.0.0"
791 | resolve-from "^4.0.0"
792 |
793 | imurmurhash@^0.1.4:
794 | version "0.1.4"
795 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
796 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
797 |
798 | inflight@^1.0.4:
799 | version "1.0.6"
800 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
801 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
802 | dependencies:
803 | once "^1.3.0"
804 | wrappy "1"
805 |
806 | inherits@2, inherits@~2.0.3:
807 | version "2.0.4"
808 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
809 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
810 |
811 | is-binary-path@~2.1.0:
812 | version "2.1.0"
813 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
814 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
815 | dependencies:
816 | binary-extensions "^2.0.0"
817 |
818 | is-extglob@^2.1.1:
819 | version "2.1.1"
820 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
821 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
822 |
823 | is-fullwidth-code-point@^3.0.0:
824 | version "3.0.0"
825 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
826 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
827 |
828 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
829 | version "4.0.3"
830 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
831 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
832 | dependencies:
833 | is-extglob "^2.1.1"
834 |
835 | is-number@^7.0.0:
836 | version "7.0.0"
837 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
838 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
839 |
840 | is-path-inside@^3.0.3:
841 | version "3.0.3"
842 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
843 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
844 |
845 | is-plain-obj@^2.1.0:
846 | version "2.1.0"
847 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
848 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
849 |
850 | is-unicode-supported@^0.1.0:
851 | version "0.1.0"
852 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
853 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
854 |
855 | isarray@~1.0.0:
856 | version "1.0.0"
857 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
858 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
859 |
860 | isexe@^2.0.0:
861 | version "2.0.0"
862 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
863 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
864 |
865 | js-sdsl@^4.1.4:
866 | version "4.4.0"
867 | resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430"
868 | integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==
869 |
870 | js-yaml@4.1.0, js-yaml@^4.1.0:
871 | version "4.1.0"
872 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
873 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
874 | dependencies:
875 | argparse "^2.0.1"
876 |
877 | json-schema-traverse@^0.4.1:
878 | version "0.4.1"
879 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
880 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
881 |
882 | json-stable-stringify-without-jsonify@^1.0.1:
883 | version "1.0.1"
884 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
885 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
886 |
887 | jszip@^3.10.1:
888 | version "3.10.1"
889 | resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2"
890 | integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==
891 | dependencies:
892 | lie "~3.3.0"
893 | pako "~1.0.2"
894 | readable-stream "~2.3.6"
895 | setimmediate "^1.0.5"
896 |
897 | levn@^0.4.1:
898 | version "0.4.1"
899 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
900 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
901 | dependencies:
902 | prelude-ls "^1.2.1"
903 | type-check "~0.4.0"
904 |
905 | lie@~3.3.0:
906 | version "3.3.0"
907 | resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
908 | integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==
909 | dependencies:
910 | immediate "~3.0.5"
911 |
912 | locate-path@^6.0.0:
913 | version "6.0.0"
914 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
915 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
916 | dependencies:
917 | p-locate "^5.0.0"
918 |
919 | lodash.merge@^4.6.2:
920 | version "4.6.2"
921 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
922 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
923 |
924 | log-symbols@4.1.0:
925 | version "4.1.0"
926 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
927 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
928 | dependencies:
929 | chalk "^4.1.0"
930 | is-unicode-supported "^0.1.0"
931 |
932 | lru-cache@^6.0.0:
933 | version "6.0.0"
934 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
935 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
936 | dependencies:
937 | yallist "^4.0.0"
938 |
939 | merge2@^1.3.0, merge2@^1.4.1:
940 | version "1.4.1"
941 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
942 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
943 |
944 | micromatch@^4.0.4:
945 | version "4.0.5"
946 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
947 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
948 | dependencies:
949 | braces "^3.0.2"
950 | picomatch "^2.3.1"
951 |
952 | mime-db@1.52.0:
953 | version "1.52.0"
954 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
955 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
956 |
957 | mime-types@^2.1.12:
958 | version "2.1.35"
959 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
960 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
961 | dependencies:
962 | mime-db "1.52.0"
963 |
964 | minimatch@5.0.1:
965 | version "5.0.1"
966 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b"
967 | integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==
968 | dependencies:
969 | brace-expansion "^2.0.1"
970 |
971 | minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
972 | version "3.1.2"
973 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
974 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
975 | dependencies:
976 | brace-expansion "^1.1.7"
977 |
978 | minimatch@^5.0.1:
979 | version "5.1.6"
980 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
981 | integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
982 | dependencies:
983 | brace-expansion "^2.0.1"
984 |
985 | mocha@^10.2.0:
986 | version "10.2.0"
987 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8"
988 | integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==
989 | dependencies:
990 | ansi-colors "4.1.1"
991 | browser-stdout "1.3.1"
992 | chokidar "3.5.3"
993 | debug "4.3.4"
994 | diff "5.0.0"
995 | escape-string-regexp "4.0.0"
996 | find-up "5.0.0"
997 | glob "7.2.0"
998 | he "1.2.0"
999 | js-yaml "4.1.0"
1000 | log-symbols "4.1.0"
1001 | minimatch "5.0.1"
1002 | ms "2.1.3"
1003 | nanoid "3.3.3"
1004 | serialize-javascript "6.0.0"
1005 | strip-json-comments "3.1.1"
1006 | supports-color "8.1.1"
1007 | workerpool "6.2.1"
1008 | yargs "16.2.0"
1009 | yargs-parser "20.2.4"
1010 | yargs-unparser "2.0.0"
1011 |
1012 | ms@2.1.2:
1013 | version "2.1.2"
1014 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
1015 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
1016 |
1017 | ms@2.1.3:
1018 | version "2.1.3"
1019 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
1020 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
1021 |
1022 | nanoid@3.3.3:
1023 | version "3.3.3"
1024 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25"
1025 | integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==
1026 |
1027 | natural-compare-lite@^1.4.0:
1028 | version "1.4.0"
1029 | resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4"
1030 | integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==
1031 |
1032 | natural-compare@^1.4.0:
1033 | version "1.4.0"
1034 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
1035 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
1036 |
1037 | normalize-path@^3.0.0, normalize-path@~3.0.0:
1038 | version "3.0.0"
1039 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
1040 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
1041 |
1042 | once@^1.3.0:
1043 | version "1.4.0"
1044 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
1045 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
1046 | dependencies:
1047 | wrappy "1"
1048 |
1049 | optionator@^0.9.1:
1050 | version "0.9.1"
1051 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
1052 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
1053 | dependencies:
1054 | deep-is "^0.1.3"
1055 | fast-levenshtein "^2.0.6"
1056 | levn "^0.4.1"
1057 | prelude-ls "^1.2.1"
1058 | type-check "^0.4.0"
1059 | word-wrap "^1.2.3"
1060 |
1061 | p-limit@^3.0.2:
1062 | version "3.1.0"
1063 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
1064 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
1065 | dependencies:
1066 | yocto-queue "^0.1.0"
1067 |
1068 | p-locate@^5.0.0:
1069 | version "5.0.0"
1070 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
1071 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
1072 | dependencies:
1073 | p-limit "^3.0.2"
1074 |
1075 | pako@~1.0.2:
1076 | version "1.0.11"
1077 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
1078 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
1079 |
1080 | parent-module@^1.0.0:
1081 | version "1.0.1"
1082 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
1083 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
1084 | dependencies:
1085 | callsites "^3.0.0"
1086 |
1087 | path-exists@^4.0.0:
1088 | version "4.0.0"
1089 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
1090 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
1091 |
1092 | path-is-absolute@^1.0.0:
1093 | version "1.0.1"
1094 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
1095 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
1096 |
1097 | path-key@^3.1.0:
1098 | version "3.1.1"
1099 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
1100 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
1101 |
1102 | path-type@^4.0.0:
1103 | version "4.0.0"
1104 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
1105 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
1106 |
1107 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
1108 | version "2.3.1"
1109 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
1110 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
1111 |
1112 | prelude-ls@^1.2.1:
1113 | version "1.2.1"
1114 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
1115 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
1116 |
1117 | process-nextick-args@~2.0.0:
1118 | version "2.0.1"
1119 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
1120 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
1121 |
1122 | proxy-from-env@^1.1.0:
1123 | version "1.1.0"
1124 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
1125 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
1126 |
1127 | punycode@^2.1.0:
1128 | version "2.3.0"
1129 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
1130 | integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
1131 |
1132 | queue-microtask@^1.2.2:
1133 | version "1.2.3"
1134 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
1135 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
1136 |
1137 | randombytes@^2.1.0:
1138 | version "2.1.0"
1139 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
1140 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
1141 | dependencies:
1142 | safe-buffer "^5.1.0"
1143 |
1144 | readable-stream@~2.3.6:
1145 | version "2.3.8"
1146 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
1147 | integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
1148 | dependencies:
1149 | core-util-is "~1.0.0"
1150 | inherits "~2.0.3"
1151 | isarray "~1.0.0"
1152 | process-nextick-args "~2.0.0"
1153 | safe-buffer "~5.1.1"
1154 | string_decoder "~1.1.1"
1155 | util-deprecate "~1.0.1"
1156 |
1157 | readdirp@~3.6.0:
1158 | version "3.6.0"
1159 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
1160 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
1161 | dependencies:
1162 | picomatch "^2.2.1"
1163 |
1164 | require-directory@^2.1.1:
1165 | version "2.1.1"
1166 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
1167 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
1168 |
1169 | resolve-from@^4.0.0:
1170 | version "4.0.0"
1171 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
1172 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
1173 |
1174 | reusify@^1.0.4:
1175 | version "1.0.4"
1176 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
1177 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
1178 |
1179 | rimraf@^3.0.2:
1180 | version "3.0.2"
1181 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
1182 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
1183 | dependencies:
1184 | glob "^7.1.3"
1185 |
1186 | run-parallel@^1.1.9:
1187 | version "1.2.0"
1188 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
1189 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
1190 | dependencies:
1191 | queue-microtask "^1.2.2"
1192 |
1193 | safe-buffer@^5.1.0:
1194 | version "5.2.1"
1195 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
1196 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
1197 |
1198 | safe-buffer@~5.1.0, safe-buffer@~5.1.1:
1199 | version "5.1.2"
1200 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
1201 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
1202 |
1203 | semver@^7.3.7, semver@^7.3.8:
1204 | version "7.5.1"
1205 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec"
1206 | integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==
1207 | dependencies:
1208 | lru-cache "^6.0.0"
1209 |
1210 | serialize-javascript@6.0.0:
1211 | version "6.0.0"
1212 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
1213 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
1214 | dependencies:
1215 | randombytes "^2.1.0"
1216 |
1217 | setimmediate@^1.0.5:
1218 | version "1.0.5"
1219 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
1220 | integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
1221 |
1222 | shebang-command@^2.0.0:
1223 | version "2.0.0"
1224 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
1225 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
1226 | dependencies:
1227 | shebang-regex "^3.0.0"
1228 |
1229 | shebang-regex@^3.0.0:
1230 | version "3.0.0"
1231 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
1232 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
1233 |
1234 | slash@^3.0.0:
1235 | version "3.0.0"
1236 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
1237 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
1238 |
1239 | string-width@^4.1.0, string-width@^4.2.0:
1240 | version "4.2.3"
1241 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
1242 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
1243 | dependencies:
1244 | emoji-regex "^8.0.0"
1245 | is-fullwidth-code-point "^3.0.0"
1246 | strip-ansi "^6.0.1"
1247 |
1248 | string_decoder@~1.1.1:
1249 | version "1.1.1"
1250 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
1251 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
1252 | dependencies:
1253 | safe-buffer "~5.1.0"
1254 |
1255 | strip-ansi@^6.0.0, strip-ansi@^6.0.1:
1256 | version "6.0.1"
1257 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
1258 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
1259 | dependencies:
1260 | ansi-regex "^5.0.1"
1261 |
1262 | strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
1263 | version "3.1.1"
1264 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
1265 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
1266 |
1267 | supports-color@8.1.1:
1268 | version "8.1.1"
1269 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
1270 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
1271 | dependencies:
1272 | has-flag "^4.0.0"
1273 |
1274 | supports-color@^7.1.0:
1275 | version "7.2.0"
1276 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
1277 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
1278 | dependencies:
1279 | has-flag "^4.0.0"
1280 |
1281 | text-table@^0.2.0:
1282 | version "0.2.0"
1283 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
1284 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
1285 |
1286 | to-regex-range@^5.0.1:
1287 | version "5.0.1"
1288 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
1289 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
1290 | dependencies:
1291 | is-number "^7.0.0"
1292 |
1293 | tslib@^1.8.1:
1294 | version "1.14.1"
1295 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
1296 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
1297 |
1298 | tsutils@^3.21.0:
1299 | version "3.21.0"
1300 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
1301 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
1302 | dependencies:
1303 | tslib "^1.8.1"
1304 |
1305 | type-check@^0.4.0, type-check@~0.4.0:
1306 | version "0.4.0"
1307 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
1308 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
1309 | dependencies:
1310 | prelude-ls "^1.2.1"
1311 |
1312 | type-fest@^0.20.2:
1313 | version "0.20.2"
1314 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
1315 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
1316 |
1317 | typescript@^5.0.4:
1318 | version "5.0.4"
1319 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b"
1320 | integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==
1321 |
1322 | uri-js@^4.2.2:
1323 | version "4.4.1"
1324 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
1325 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
1326 | dependencies:
1327 | punycode "^2.1.0"
1328 |
1329 | util-deprecate@~1.0.1:
1330 | version "1.0.2"
1331 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
1332 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
1333 |
1334 | which@^2.0.1:
1335 | version "2.0.2"
1336 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
1337 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
1338 | dependencies:
1339 | isexe "^2.0.0"
1340 |
1341 | word-wrap@^1.2.3:
1342 | version "1.2.3"
1343 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
1344 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
1345 |
1346 | workerpool@6.2.1:
1347 | version "6.2.1"
1348 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343"
1349 | integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==
1350 |
1351 | wrap-ansi@^7.0.0:
1352 | version "7.0.0"
1353 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
1354 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
1355 | dependencies:
1356 | ansi-styles "^4.0.0"
1357 | string-width "^4.1.0"
1358 | strip-ansi "^6.0.0"
1359 |
1360 | wrappy@1:
1361 | version "1.0.2"
1362 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
1363 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
1364 |
1365 | y18n@^5.0.5:
1366 | version "5.0.8"
1367 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
1368 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
1369 |
1370 | yallist@^4.0.0:
1371 | version "4.0.0"
1372 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
1373 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
1374 |
1375 | yargs-parser@20.2.4:
1376 | version "20.2.4"
1377 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
1378 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
1379 |
1380 | yargs-parser@^20.2.2:
1381 | version "20.2.9"
1382 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
1383 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
1384 |
1385 | yargs-unparser@2.0.0:
1386 | version "2.0.0"
1387 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
1388 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
1389 | dependencies:
1390 | camelcase "^6.0.0"
1391 | decamelize "^4.0.0"
1392 | flat "^5.0.2"
1393 | is-plain-obj "^2.1.0"
1394 |
1395 | yargs@16.2.0:
1396 | version "16.2.0"
1397 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
1398 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
1399 | dependencies:
1400 | cliui "^7.0.2"
1401 | escalade "^3.1.1"
1402 | get-caller-file "^2.0.5"
1403 | require-directory "^2.1.1"
1404 | string-width "^4.2.0"
1405 | y18n "^5.0.5"
1406 | yargs-parser "^20.2.2"
1407 |
1408 | yocto-queue@^0.1.0:
1409 | version "0.1.0"
1410 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
1411 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
1412 |
--------------------------------------------------------------------------------