From 182a36dc348f5ef1cdd2855cfc2a4834be3ded6e Mon Sep 17 00:00:00 2001 From: "eryn L. K" Date: Tue, 21 Dec 2021 05:31:09 -0500 Subject: [PATCH] Initial commit --- .editorconfig | 15 + .eslintrc.json | 25 + .gitignore | 6 + .prettierrc | 3 + .vscode/launch.json | 35 + .vscode/settings.json | 13 + .vscode/tasks.json | 43 + .vscodeignore | 13 + CHANGELOG.md | 9 + LICENSE | 373 +++++++ README.md | 13 + assets/extension-icon.png | Bin 0 -> 11853 bytes assets/rojo-logo.png | Bin 0 -> 22026 bytes package-lock.json | 1933 +++++++++++++++++++++++++++++++++++++ package.json | 54 ++ src/buildProject.ts | 35 + src/commands/index.ts | 1 + src/commands/openMenu.ts | 240 +++++ src/extension.ts | 44 + src/findProjectFiles.ts | 38 + src/getRojoVersion.ts | 36 + src/result.ts | 15 + src/serveProject.ts | 86 ++ src/updateButton.ts | 13 + tsconfig.json | 20 + webpack.config.js | 48 + 26 files changed, 3111 insertions(+) create mode 100644 .editorconfig create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 .vscodeignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/extension-icon.png create mode 100644 assets/rojo-logo.png create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/buildProject.ts create mode 100644 src/commands/index.ts create mode 100644 src/commands/openMenu.ts create mode 100644 src/extension.ts create mode 100644 src/findProjectFiles.ts create mode 100644 src/getRojoVersion.ts create mode 100644 src/result.ts create mode 100644 src/serveProject.ts create mode 100644 src/updateButton.ts create mode 100644 tsconfig.json create mode 100644 webpack.config.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..79f8430 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +charset = utf-8 + +[{*.js,*.ts}] +indent_style = space +indent_size = 2 + +[{package.json,*.yml,*.cjson}] +indent_style = space +indent_size = 2 diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..fd906af --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,25 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "@typescript-eslint/naming-convention": "warn", + "@typescript-eslint/semi": "off", + "curly": "warn", + "eqeqeq": "warn", + "no-throw-literal": "warn", + "semi": "off", + "prefer-const": "warn" + }, + "ignorePatterns": [ + "out", + "dist", + "**/*.d.ts" + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..10acf93 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +out +node_modules +.vscode-test/ +*.vsix +bin/ +dist diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..cce9d3c --- /dev/null +++ b/.prettierrc @@ -0,0 +1,3 @@ +{ + "semi": false +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d4df9e9 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,35 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/dist/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + }, + { + "name": "Extension Tests", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" + ], + "outFiles": [ + "${workspaceFolder}/out/**/*.js", + "${workspaceFolder}/dist/**/*.js" + ], + "preLaunchTask": "tasks: watch-tests" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5c5ac48 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,13 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.exclude": { + "out": false, // set this to true to hide the "out" folder with the compiled JS files + "dist": false // set this to true to hide the "dist" folder with the compiled JS files + }, + "search.exclude": { + "out": true, // set this to false to include "out" folder in search results + "dist": true // set this to false to include "dist" folder in search results + }, + // Turn off tsc task auto detection since we have the necessary tasks as npm scripts + "typescript.tsc.autoDetect": "off" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..2acd96d --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,43 @@ +// See https://go.microsoft.com/fwlink/?LinkId=733558 +// for the documentation about the tasks.json format +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "watch", + "problemMatcher": [ + "$ts-webpack-watch", + "$tslint-webpack-watch" + ], + "isBackground": true, + "presentation": { + "reveal": "never", + "group": "watchers" + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "type": "npm", + "script": "watch-tests", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never", + "group": "watchers" + }, + "group": "build" + }, + { + "label": "tasks: watch-tests", + "dependsOn": [ + "npm: watch", + "npm: watch-tests" + ], + "problemMatcher": [] + } + ] +} \ No newline at end of file diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..c613679 --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,13 @@ +.vscode/** +.vscode-test/** +out/** +node_modules/** +src/** +.gitignore +.yarnrc +webpack.config.js +vsc-extension-quickstart.md +**/tsconfig.json +**/.eslintrc.json +**/*.map +**/*.ts diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..44d7dbf --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log + +All notable changes to the "vscode-rojo" extension will be documented in this file. + +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. + +## [Unreleased] + +- Initial release \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a612ad9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a0c45a4 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# Rojo for VS Code + +This is a VS Code extension that gives you [Rojo](https://github.com/rojo-rbx/rojo) automatic installation and integration. + +## Supported platforms + +- Windows +- macOS +- Linux + +## License + +Rojo for VS Code is available under the terms of The Mozilla Public License Version 2. See [LICENSE](LICENSE) for details. diff --git a/assets/extension-icon.png b/assets/extension-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0fed827c9a23dca730b34a384c7103ccc59a3403 GIT binary patch literal 11853 zcmbW7<8LJlu*Q38yWQHh?Vj4UZQHipZclC7-mSgW*4*0meQ$FAf;-7Gzhu5mG9R8N znHXh7DI|D2crY+9BpGR->VFLWU%^8E*GGg*rv3x8shkw>KmJ#*;ypqC0nS-k#|;b& z#pHhls1&ZS`ELm0E~6j;a|Dh8g$%ykd3gl}M%d)5uI;XB;zi=@>SSqSZ$aYj<7`1< z;ca6H24)>{nWy7Q$?Gcd-2~4FxNjtgw_Fd&Y;Z%n%@%KIk=uGp&gs^cPffZd1M7Sz zBq;p*{a7&e0rQ=aTN_igwCURZ@k7tP|6ZYOE@)26>frOaBI{~ypx3cKaL2b@kKm`bc+BJ z$c9QmL{A%YO^rD8E(5y>J3~-Y1BOa)Z|+4q4f)sTKTgGW#@@T%123mnI|dlHSG@-6 z@-MH?_g2eTxCVY4?yQ^yY?WQFUe(Xfk-G|mKBky;ou|G&c9iVAW~+}ctULuRHR(p-Ew&k%y(q_b<)A? z{}_l4(WfbXJEO$N7dIEh-ye>h377FAUySYjHz?uv)^YoL?dak9Ku9Sz3zhh!Tq5u2=w zI&daF$LpLA2s)YmT7ybE>T92&8PMhw5l5lOjM+~wn_GUr?-QJB$0%7H3ITRrxsfQ6T3>ao_fulODp(v?@8gf zl%`1GdbBQ3pRymwv(K@e+qWSZB8UC*AUO(G#P_-G$_uRHv-SQMZT!*6ux!=)N zfIQ!{mbNRu@Hn6K4!;OEpCuL0;-0(j$ZdP|Cy%ieol`N{$^Mm)?@OSO6!n=}*2FE) zyT;}?fQqF-m0hK~3>DF6L!J3bV*$Ufqz=DuxYPE(X&k?dzwuMp;kWR+1`;;7 zRrL1ze8`{Fi&mB*AsStV>bF*z6yGWaa)TbBzxx-y%kUExrX0bnt}EKoWKO%J8MtSe zV&Y4+J(J3M`n6)BbmOY(RorjstPXo+HZFa&%`zG{tuaJw(pB!reYwXyX__+pk4D|Q z>e{k+O~aebTu$v^kBAXX;@|7n@2uaL?AhKqvW9sxaDNeU@J~a<(h_Uwun|1S5Vu2Gowfm8Idx zN(O?26pzZga+;rbe6I-1ezluiw^tbtQqO9x63k!+SMf4U0+8uP>e_tWj}Gf2EP^+R zNbeQX5K>?>%J8tjVCZH&G4D6yz056}=(RvRZBz^+C#ZzVtp1Rgsv(IV@qK8qN9&5b zhy{KSZIV(%puwB#WRx0{kd-EVc_v09+f^@CnWVdA|Nd94{&K9isvKjU8#>e&f9-)I z*hBPs@0bPcOQb3FD4k za9ljKNrUl1b-BkTUO6dp!}^i#S>@+cK#OS-$VdJQnYoRnLQubpp>gXUoecVIc^n6v z6HC}`>tM1lE<^_w@ow1ueq{59HDYl-58YCVzc3Jqjnra~UbVi^_MXk}g73*NMZ*NO zlyeH_PqVyn54-81AiW>-x@6@Vv{5?NCF%&9pWVmdO0kojFTS2+9(Th0ZG z2~_hG1H2vg>kK6OMf8%~Mx&VwjH#jWQ+ytceUvc|!i>c4TbVCaln8FZ92`qNW`;WN zNHbiK+$HidvQpa3t;T;f$_A5k)x7nI)lskOlZ%z{eEEMX|A6qa{&vHhD3eWK%}<*L zs!S)5(qreW+*e7%+)R$e_dXZ#W|s9F(Jr;9sDaV}g`*ThVzg=9bi8XZJjPh^6n)00 z%a*z&&x32GQiYwVZ|ZI9@;ZW8qt}Y~nh`2@Cn_@2uG4??I$?E2f5unW!Ui<}38rEe z(cmDmWZmf1LuGs`c*YHb7NKVbgK6Va*<#Yi$AcCA38{PgV*hAGMEFz=A^OLrvwOnT z0a-W;M{bU;D5Fsye!u8@#= zD+(ML-S7)*R*aY}t*cca2_ydXM4CyPIA*`X24|;lP$2mkj2e87 zJ)(5CmJat6=kp65cN-AZBDuvak~5zA*B3-7mGou`m6Ol2boJKtyTp8x=lKy&5siwPP*=hsjD^llRBN(yB-}m9`djX zilyftt3W!uYlIrK8Fe~Xa{=5Y45?4XVk!q(Wj<5|U&rJ}x)s=^{OXQA}7V%{j9whBTI2&PyI%$|Y| z{oC!n6fXZpoLi?$hYK<7;YO1@e3bYdPejwxA4XVc} zn87H#{Hq~4pe)pR1g@}c^aouLyc3fYeRKAkCL4-`s{GiO# z;vfTi!3e)ViX||#nV-UatIaz3lcK@mBetwqIebZW%e+hyT%vm{qWy(7L=WuWGkjrv zH;{}=K<2dzti<$Gre$0zOAxP-cx`u?DWc~lehRlRtr;>E50RrG9>5?Pjq;O7m7pi* zy_>3$z{hHo6@0NR=3Oa^ca$7K6QNf+pm>Op{!+?8=&W*eO_${0Pa5b=Qd{k|s22+MK_s8EHtFbOO1A_frIvsCgy%k^ZJc|onC%%# zNhj8HG}!5|9(-@`DP$6RgJcZpw-NJ@aN<9iUtu)jWyvs@DXC3JLeP%IH(?~juS%AG z)+R5yah4{dF-Dq(qe=OKP$&cLKX|`ci*Q21V~O|@hbe{?1^HlbLXevP$L0b*RP5JG z7Q4p(S^cCT5bnq|oYV`GD=JQ|1DQ&>9`lox$_#(0+*b1Ch;5HOh)>8S;4b_gpKh9dCqYwJ=Q_%^tGFo&Jn7F}HG|OrPx4?;k6p1! zc4c56B@hgLkV4_~uW#*o7 znVX&4;_?an4&d{StN|;tR5$8EtEV=&yuvpUQ}ybRv%-1?hrEAJTU_NKNZP72iEE6*E;D!=@E& zT4LOlCYw8r#=xPU+owv(`8w08NAF8gwrx?^p^vWzY5YQ)c%?DT-1{MFPb7gz##YRD z%$It%py7UK%>oy8G^3Ibi;$F+-2KLiLYh$94&=T}x$TcjX4%dls5yADe48dhiNqiD zO5+4kcS3nK+M1D$m?JPz&*mcK`Wo2u0b|Tn@(zzobABAjwoTai=w#UiItF6UjpNyL zjHEkcGO`PzzFghZG*aD_MO)>olSg~oTC5FS*`0}sfd=3+)%T%anNy*!bbwCH0=I#+ zWheTdE$TjHKX54(1f>I{$+IxS}0rBMH5hJzx(wg>rjI%^f- z0~KyCO9!NWXN*{?{S{QTH2-LxEFwu(vG+I_2^+xyQ^V*@#X-s3Q)_Ptq1|;RR5^jF9QD^df4s+cEpswGm&llfu z2Ekhs!d2;s1bg-w+#Td4`-M?Z=jhXlXb#xPEGYFxobjK%3;MybP)#Nj6+yh@Q>d@;LSJ(WFv)Hv|(5DZbA_;Kh7-0zV6@ZFg5`c z?^_s+XX5FyjVi{TI>7f;!>Mv(L)&Im^Ym@l8jkLvW(d(_yCXLl{qh>JO-%^%5|X zMf1KYa^>c#Fe6%750jff+$=%|D;qfBV$31j+laGYVe5yisEBnO%%7+-ke1sp*^sc> zH`8#bU{r=&5{XdJd!p5f%3d~V{xFVFYJ&sRkesUU4xALRTH>CGf0kvu?v62S3e`h(cv5d|UNAUwXWR z<)h;vRXY3mhlFY(3f9k4wixcvMMG!s@4CZv$v=^(x0s{NozcY)qUm4MQ$lU4L+0A# z=_>H4W0+*KVm|cl(`zz+BjeoZ@dC4gE>yuhu9+k{ys|=bN556^L?lKNLm8#1RJ+>p zI+~f?jEfQH*<_3sIW`EPSMY|fE0j?10khJ(Js7c=a_Ii)$qgMY}fpUQBef>nD9U>CQS#uoAq=;GcQYN%)tX&3FU+vZ&4RmRPNE}5Hd3s zplv=tsXEXh+@?Sr$>;=^JeI`}TAogK%LNW-TLRZSRl;STGUR*F5L~1kgY>}yF(i_P zvVM<#fHMf*J&0xSD*L4GfQ+(#9x2fm+H&g_6w5#GoQ2;b*0lwmRk2KNe?k+H?wn^{ z$43Ts5Ytg`$@i53W=h2xJsnti6xwN{$iLG;Yo2A3{SERKAumTEp`YJk7lyKoue7fx2+S%!y10X?;8gaC_^GA6|sq*KyNlP$T? z7+2>CKN9N1Pfc%VnhAdxZ^{<%;QZl!k)y`POJ=TKX^Ewi(qRW^)>)ZU<@QpH3x3Qo zmPayMYx!^@f`jFxXWNbmYA-f4fwT3`A)pKSyFEG})7cd7%-X8Ks5)QrWjU`4-@ZfmrV(n?jI z2raR{>4t45lKLST_0T$bQcq1962Awn(qfCcRo|MZc1PPeJiMl> z?YIz~pOEd07cAwP!SM zsxdDO$M-~`6}kgHP0rw%W=wn72N~$7^nMr?SFToIn{e6*|OG)Zx^)@cQjZ!rEFZg zzTb8Sl!8s#{T)h@iA;YPvRwVjVSMzYiiU0cQGw)H%c(eb-$H>$`b%L}-y=D=`XHb0 zYp_#=vJ{mohvKmuE`i<65>zQ{UiFq{0&zHA2U#?z$g0p`4km~1_x$&jcsd>`(#HAwaQ60lR zkM4DD)<`Aebm@~*Y)0L8e6sMwuDA zm-9C{DjrUMNB4WZI)fBp8yFc7DX$?Qs?sv+C6i?GNJMTCRAB~c!yTwKVMLccZXF2F z<66=V(&HkFziYL3&HaIgTx@}G=y^v2&Y9H6;G&J%%n5n<$yIK!z0ARE4bS+)we+#GAD!^b}MSoYY7ab?-xkU>fvK&>`4z-?}rOD{xyqWg2kT*!c|E z`n6N(OJM9miDQ97jY@Jizy|%I`u)YRhT?XP#%SCBOs4XE*V`C3eX5nSv6X zS%+PfoR5wP=;qV=kwdoY+zG*FbaE7k071#zk;~-+6c16dSXZu>Z|H>2wP=^dOS05% zSDAq9T@MgvCGpdrFFp;n_l*4}AuFm`^3gUGjzf021(nESfi1Mg)n@_1c|*{>yXJAp zl@DJl#JCu;P$N zS5Da4A@AA-iOG!aR$vHZ@R{wm>q_W_qR;n<_Dj%N2LzENnbwSH<$054Z|Yp7P-}u& zP0__6f_`1+cCx;9)v%_6&N}xmeA`k#CS6uC-FWbLOuv~xm$1U@L9ET7Ac4Kq1}9qP zZoFp3%17C`hk5$;k{8(JZpk2~Fs*4(r3U^c9!Vj7xx5uRP#UejZOc=bf_=f&))0rc z@CqIGIuz>oQdr&uNAu#CKkGqR#xd1>D4N8E`t6lOcou&3<|4M*d98S2iQ>;sW9CiB za>**Vm0GLG&PQg=FZN#VR`pm{f)4EvMNnSO`v{K|-z=~#=cD;-U2`>nDyq4++ykv5oRCNXFBUV=(TZkmYdWzHB}biZ_(dpB z&GWcFX%p2O5|w!T7QeAW-vE8}I9Gp%)IkZb&uwUEkwM&K?yf`nNb3wQZ2qHb_Umy%9?TOjY%>+&gUt~ z>rDQf6e902Xq!r@?XGH%ukVO$FRP(!BbVP8?JhUfN_A~3wu=*aV`WO0-~v=z52Umo zo$mQvsd8Co=E&@>$F&EYhwQ^Yzg+;mkyVC{O+-ARl5)3KlXy@%f*!3)-vqi#)4^d8 zSgoWD1 z|6WDfy?zQB631;2t|7j^h^el)w9Tn>m%##1{A#WTqe2+v4+8fhK zAb_7AUll~p<6nS1I~p!&Topv+8CN?@on}q5jB&`fHN5Z7^;pEe<;zmEmPPni72qbi z7m@e_Zn+Z^ozJ4or?9cvRtD*a+zl}xzvsTNpNop?dp`cjk+!IY6erl;y2Ue@8!T^5 z*(NYPOi(k3Kb)bmc;cO!2h>!DsxWG7Mbelr+MOt>cF4%CMJ5)-z}X!cG-xbX4RaowBtw zu;W!sK-pj2QMe4^MJK$qnEd9{Lk+`wDw;NY>OY<2EzziGiU~gU|^_( zGC)yv@AXT4xOB|lxR!q-pbk^zfC0Gx|Bv_*7<_14aN}VEsA09Z5_Ec%v$ysfbp7e%Y1RE* zUp-L$)zWP!2pu+L%z}gX|H6_7g@c*(Bui|X=Y{f{AJ>9^@m$Q8_ygm@Gw?h*kU|!1 zh6FFWHC|J|w`bsHjzm{nU80qfLIY##a!nGSXkts|B=c`Pq!-ZwL2)i@sFn@o0;NE6 z&zG%m>IpGW_(=4GFITo_2qduB1KQQY5EOZE3xQ<*qgw1KaMqJ}6C~a$P>MPb*3=Pd ztv2o#vEYr8^r0v@%!QXsaz(k0t{SXFwJ%BjM$s@xBct1-`nDNW`D1~k*ed!b!_%Pd z7}v8g?F9v_puCv38act<o*oVKLRx^W_>tggij!JGTV zRoTAN>+6(4%hyxf9Ft5&)(@zxtiL}&JA{$1sKu;66buFQ9$J+ORP6pH;;kFz1U>G! z6B73i7ypWNNG(a!L0%yYW9JaaK$Zm!ATuf@dnFB8kG3R7!iiXM(#}(8Uv4J<#@7oGDiB+W zsH9iH*xJ32pJHwm@2$cnbBwlBd%(I9T-GWnewv1yYlirOuSGTAa8A@Zfr zs*~G`5Cfw0O|lk*q=Q_e&AGCItJ@rX@PWK2jA(Rdzlx-wS~4cfTk@+h7tk!lr(u=j z!|0;}7pUq~0siK<=A-!c|-o^Jbbs<*8QW*DC!GW8X53u*9lh(wRWUCop20OU4Q!#f`C&($80V z<9O3jdC~Yi^{ccyyOM3Hokk!-tC6!nkz#mFA#FqH<$ci30y4~7tLVBga(kHK$KKl? z_u&&t`(Os>G)GQ{V#YFyUvM|1-o13UdIT|AnyLW3ma^IYhWrh-B&e}z+|y2B zDe-MXv6T}>oK6#QMA;#|QREqp_C-APbeY3wL`goHiPXDI%DY>#hrR6a0}2Q=Bd}Q5 zA>OVQ_*DRbH-gmI$@K#Jh2V{2y1&xU!44KCz1m4FcE=05@>CHRQi|HE7%HT;oZ5Ip zjJ_g#i7dfy?SG}duAI|oh6Dk*`4q)i%+3+f^LHZzroBac*vT4?Msuq{{Kgt4ZpkT* zoO{Y1!+1VC;+q@x6)=PB`ie}L*SP@Cr{y@N0~kF3UMR0xgPW?26WKM^971%zX%D)E z-Lq_v45rg+yBLEBiFx#fV?8I1cH-}*XJJ8I{HTI%Q6m~X&b*{@-MndIMYph!U=gV> z2Cv~?yI1_ksx-~Cieq`VhyZ~-zrtSr41V^Cq|cb>JjDoB(t~vP`tO|Be8S`0Y{vs1 zsk&*Y$ypp*gC7~6kDtGKvd+sBC9*wx*`SM2N>p1%B3Q(Jo97ygmnypfQ`CzXmDV*! z7{b)h2l;-y`I--=x1zokL~mzYeIwG}WJjBvWsbZlBono^GCpXZk$o|LS!uQDboDb5DLXVW%gcmx=OQ{Y6w9lCQlXDS)a#*USMQ- z6Ci3JttXOr;R?SoIsA>rolAm8_k6yBIM<6?^T8$aGKFT)7rQy4j2$@47V+#%`Qkp_ zb5r9>NNIT?P{8OHG~-AL>464mlvalAY)rS(m+gK8%3+VvWbKXok)9!(e_~yXAqKbY z9&m^)tuQxj0V5(Wx;683-=%qo(;qsU6+w(Ktfajc;NHz_n3o+lmWyrrxFH1oQ^ilA zOCvN=eyJ9kFh-O`47xx_ii=GrFS30Ta*h}6ZRrQmFS9jY;usDt%UVEn)?t6&-u*Ni z@VHzCL6!kL>;!&{OIG}857OT-24`qe%;8(<1@_kcG`9(0b|_py9rIV<*L_lCG67Ct zp2?|~+y-`2aq=hY(6L3hz68U5ceL3br9WdW9G>$;<78hy^uA5?`7s67!~N?|{DeOO znBVRkNyB&aG5)$H5Rjp{31ig+0`P8GhU)@TYPU%f=2SO3@I0fflmwDA{*V<5-VEupa?T65ahTpQn;zfB3+;tG#LvStoz4B;`I9o;U4e?Rt4eHA zA419wuKCagYia*LdyOY1X?OrT_f78&TXHSg@K3}Ybkbq+%GhCm@L@?Iz9IssMCL1YpcHXmKQ?Z|K;epg%-#FyuplN}E;JY{KN%7&lcLg zp(lEq>DL+YRZDZw;u=(5p`46GI6d5-o&d*EdpP^p$3-{bu=zf>U^kY;#UIEU++aM& zIV=pvzr#mIo-QInb9?>ahv>w$U5*U;tsbhl>wIgF@4yRjC+3yleC<{X5yOaq+F>L{ zrb%V#CQPW*Ig%Kc>`v;Wv<7PAjOw;fvETr=-5#)N8@$DJ&`fG5x3lG7z6-{>mS3(+ zACm?V{m|Kf+-VpK2a_?gIMuNK`7)ZHgi#X}vIfwMt@G?@w`J zU+dx;!MnVdDrbYZ1_+{aA^x3VuSv6n-T$m^CCCvC<_cAzYz9_lYkX%;CfhOvrGT{4 zve^C8M`%?stmdU@F)AhH&A1Coynx2xbE%=OtG53@9FqdxfQO~vZAa#P=2|-RR==V_ zwViPLv1L=^3qUnUol5#oawk)>)5oWcp>FQ!(sg7@qmj_?A%2if&8QK8U(Fc{JeHw+ z=p&!}%|5x4w(b*1+P*U;mWdz7Xwz#J5oclL{S_1akdGoN7^KSxj-${xGe> zD56%Y-1Vqq9Lhc`3eK5nI4=w>`firGA2&oRNP(e5S0Rtjv$m?d@IXvqw?darSnu)$ z(x`g685;E?bc~ zuh;s}iu6?$GsVP~F|@(jJlrSa^W;)ADwGLFoO{@$`)ah(c{6 zw&vgudZ$+~*lv5dRFMa}hSh5`%kg`aI^V<*K~kTh12PMOJ|PlESR1)V>4sREO7eet z?eVw2&la4?`+OViKRC9{MKdr5X8(*I)0IL5cMu&qW}y5h#5&dIM^3L30~UYGHWT%| zLqGL7XR8Q9oaj=OZc9i7c@l;CaS0l0nmKDj+8Iuu<6l9Y0C6f4)=+E>(AmQBjt@TH zqa9k{Uh&e#8IYu69{-7j?Zuy8Y5#E*KwxuRHF-e{)U*F|*w|b7g*5nRm_Cir7ntb% zjRk-(=FGJ(&w{x1EKUS?_fZoT1u5_G=D&5#P)Pr+=XPyvJ?NuS=xj(4$ptlzc-wG4)H zrNRDJ;0?qS8m%%_NjwuWS>=yno5n3ldc3`m?_J<0K`H6QgHL z5!}=OEJT?e=j6E!m-N{9cRlUo%~EEzzuz$nkprg~x&!OTEh|60zfi`*oBxAJwG!@D zFU^tZp4qo%ZJQG9YH_K>@|+1OKOL4t_kJo0TRuJT%q`Abd3M5e+X&Ip2Za4Q!M2c| ztiY^ncO807T-Z{X^?nOyG?5PjmfW_cSc&_Hd@5a@c(<2`(5SXo2dH?zof3cU@w3w7 zPrBh$)#-CeDKAOG0lF80sg^j+fm=*3S_6|ZjGq6)hbm;>zG9b(zLOLYU4>7(vb+6s%sESlsNRCxFL=yMKN~CdyoIrDjT`xnd64 zTk#o@IWl=w^o$NIAQ-SVJfr4_@ci@)J%OzQw~O@ zAu><5jzF-7)Mo4@{kLra#3x{MQ}*8o_#nmBRbG2t|cs{Q)ReBliMpitqjj! z392`_QhGpcV6y!;YxBV(<=Vd{0aFhb^wK$aM5#q{!O4~mUX+g3O&U-816ZQE?mm2X qk?JRJBBcLU$o{`@zU1;j42eghJ~aHz^55e(n2dxXuwKkK^nU;yABDaE literal 0 HcmV?d00001 diff --git a/assets/rojo-logo.png b/assets/rojo-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ecd73730b3193c5bc31f3111507fb9bea0782693 GIT binary patch literal 22026 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 jsq&WX-#yc%_LlVeHRO4t%W@; literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..192c015 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1933 @@ +{ + "name": "vscode-rojo", + "version": "2.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@discoveryjs/json-ext": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@types/eslint": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.1.tgz", + "integrity": "sha512-UP9rzNn/XyGwb5RQ2fok+DzcIRIYwc16qTXse5+Smsy8MOIccCChT15KAwnsgQx4PzJkaMq4myFyZ4CL5TjhIQ==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.2.tgz", + "integrity": "sha512-TzgYCWoPiTeRg6RQYgtuW7iODtVoKu3RVL72k3WohqhjfaOLK5Mg2T4Tg1o2bSfu0vPkoI48wdQFv5b/Xe04wQ==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "@types/node": { + "version": "14.18.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.2.tgz", + "integrity": "sha512-fqtSN5xn/bBzDxMT77C1rJg6CsH/R49E7qsGuvdPJa20HtV5zSTuLJPNfnlyVH3wauKnkHdLggTVkOW/xP9oQg==", + "dev": true + }, + "@types/vscode": { + "version": "1.63.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.63.1.tgz", + "integrity": "sha512-Z+ZqjRcnGfHP86dvx/BtSwWyZPKQ/LBdmAVImY82TphyjOw2KgTKcp7Nx92oNwCTsHzlshwexAG/WiY2JuUm3g==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.8.0.tgz", + "integrity": "sha512-spu1UW7QuBn0nJ6+psnfCc3iVoQAifjKORgBngKOmC8U/1tbe2YJMzYQqDGYB4JCss7L8+RM2kKLb1B1Aw9BNA==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.8.0", + "@typescript-eslint/scope-manager": "5.8.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.8.0.tgz", + "integrity": "sha512-KN5FvNH71bhZ8fKtL+lhW7bjm7cxs1nt+hrDZWIqb6ViCffQcWyLunGrgvISgkRojIDcXIsH+xlFfI4RCDA0xA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.8.0", + "@typescript-eslint/types": "5.8.0", + "@typescript-eslint/typescript-estree": "5.8.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.8.0.tgz", + "integrity": "sha512-Gleacp/ZhRtJRYs5/T8KQR3pAQjQI89Dn/k+OzyCKOsLiZH2/Vh60cFBTnFsHNI6WAD+lNUo/xGZ4NeA5u0Ipw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.8.0", + "@typescript-eslint/types": "5.8.0", + "@typescript-eslint/typescript-estree": "5.8.0", + "debug": "^4.3.2" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.8.0.tgz", + "integrity": "sha512-x82CYJsLOjPCDuFFEbS6e7K1QEWj7u5Wk1alw8A+gnJiYwNnDJk0ib6PCegbaPMjrfBvFKa7SxE3EOnnIQz2Gg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.8.0", + "@typescript-eslint/visitor-keys": "5.8.0" + } + }, + "@typescript-eslint/types": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.8.0.tgz", + "integrity": "sha512-LdCYOqeqZWqCMOmwFnum6YfW9F3nKuxJiR84CdIRN5nfHJ7gyvGpXWqL/AaW0k3Po0+wm93ARAsOdzlZDPCcXg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.8.0.tgz", + "integrity": "sha512-srfeZ3URdEcUsSLbkOFqS7WoxOqn8JNil2NSLO9O+I2/Uyc85+UlfpEvQHIpj5dVts7KKOZnftoJD/Fdv0L7nQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.8.0", + "@typescript-eslint/visitor-keys": "5.8.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.8.0.tgz", + "integrity": "sha512-+HDIGOEMnqbxdAHegxvnOqESUH6RWFRR2b8qxP1W9CZnnYh4Usz6MBL+2KMAgPk/P0o9c1HqnYtwzVH6GTIqug==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.8.0", + "eslint-visitor-keys": "^3.0.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", + "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", + "dev": true + }, + "@webpack-cli/info": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz", + "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", + "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", + "dev": true + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001291", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001291.tgz", + "integrity": "sha512-roMV5V0HNGgJ88s42eE70sstqGW/gwFndosYrikHthw98N5tLnOTxFqMLQjZVRxTWFlJ4rn+MsgXrR7MDPY4jA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "electron-to-chromium": { + "version": "1.4.24", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.24.tgz", + "integrity": "sha512-erwx5r69B/WFfFuF2jcNN0817BfDBdC4765kQ6WltOMuwsimlQo3JTEq0Cle+wpHralwdeX3OfAtw/mHxPK0Wg==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz", + "integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.2.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "dev": true + }, + "espree": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz", + "integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==", + "dev": true, + "requires": { + "acorn": "^8.6.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" + } + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", + "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-worker": { + "version": "27.4.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.5.tgz", + "integrity": "sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "terser": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", + "dev": true, + "requires": { + "jest-worker": "^27.4.1", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-loader": { + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz", + "integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.65.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz", + "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.2" + } + }, + "webpack-cli": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz", + "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.0", + "@webpack-cli/info": "^1.4.0", + "@webpack-cli/serve": "^1.6.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..0a677d4 --- /dev/null +++ b/package.json @@ -0,0 +1,54 @@ +{ + "name": "vscode-rojo", + "displayName": "Rojo - Roblox Studio Sync", + "description": "Rojo for VS Code", + "version": "2.0.0", + "repository": "https://github.com/rojo-rbx/vscode-rojo", + "publisher": "evaera", + "engines": { + "vscode": "^1.63.0" + }, + "icon": "assets/extension-icon.png", + "categories": [ + "Other" + ], + "activationEvents": [ + "onCommand:vscode-rojo.openMenu", + "workspaceContains:*.project.json" + ], + "main": "./dist/extension.js", + "contributes": { + "commands": [ + { + "command": "vscode-rojo.openMenu", + "title": "Open Menu", + "category": "Rojo" + } + ] + }, + "scripts": { + "vscode:prepublish": "npm run package", + "compile": "webpack", + "watch": "webpack --watch", + "package": "webpack --mode production --devtool hidden-source-map", + "compile-tests": "tsc -p . --outDir out", + "watch-tests": "tsc -p . -w --outDir out", + "pretest": "npm run compile-tests && npm run compile && npm run lint", + "lint": "eslint src --ext ts", + "test": "node ./out/test/runTest.js" + }, + "devDependencies": { + "@types/glob": "^7.1.4", + "@types/node": "14.x", + "@types/vscode": "^1.63.0", + "@typescript-eslint/eslint-plugin": "^5.1.0", + "@typescript-eslint/parser": "^5.1.0", + "eslint": "^8.1.0", + "glob": "^7.1.7", + "ts-loader": "^9.2.5", + "typescript": "^4.4.4", + "webpack": "^5.52.1", + "webpack-cli": "^4.8.0" + }, + "dependencies": {} +} diff --git a/src/buildProject.ts b/src/buildProject.ts new file mode 100644 index 0000000..ed509e1 --- /dev/null +++ b/src/buildProject.ts @@ -0,0 +1,35 @@ +import * as childProcess from "child_process" +import * as fs from "fs/promises" +import { promisify } from "util" +import * as vscode from "vscode" +import { ProjectFile } from "./findProjectFiles" +import path = require("path") + +const exec = promisify(childProcess.exec) + +export async function buildProject(projectFile: ProjectFile) { + const projectFilePath = projectFile.path.fsPath + const projectFileFolder = path.dirname(projectFilePath) + + const config = JSON.parse( + await fs.readFile(projectFilePath, { encoding: "utf-8" }) + ) + + const name = config.name || "build" + const isPlace = + (config && config.tree && config.tree.$className === "DataModel") || false + const artifactName = `${name}.${isPlace ? "rbxl" : "rbxm"}` + + const output = await exec( + `rojo build "${path.basename(projectFilePath)}" --output "${artifactName}"`, + { + cwd: projectFileFolder, + } + ) + + if (output.stderr.length > 0) { + vscode.window.showErrorMessage("Rojo build failed: " + output) + } else { + vscode.window.showInformationMessage("Rojo: " + output.stdout) + } +} diff --git a/src/commands/index.ts b/src/commands/index.ts new file mode 100644 index 0000000..d3cccd5 --- /dev/null +++ b/src/commands/index.ts @@ -0,0 +1 @@ +export * from "./openMenu" diff --git a/src/commands/openMenu.ts b/src/commands/openMenu.ts new file mode 100644 index 0000000..bd906fa --- /dev/null +++ b/src/commands/openMenu.ts @@ -0,0 +1,240 @@ +import * as vscode from "vscode" +import { buildProject } from "../buildProject" +import { State } from "../extension" +import { findProjectFiles, ProjectFile } from "../findProjectFiles" +import { getRojoVersion } from "../getRojoVersion" +import { result } from "../result" +import { serveProject } from "../serveProject" + +const stopAndServeButton = { + iconPath: new vscode.ThemeIcon("debug-continue"), + tooltip: "Stop others and serve this project", + action: "stopAndServe", +} + +const openFileButton = { + iconPath: new vscode.ThemeIcon("go-to-file"), + tooltip: "Open project file in editor", + action: "open", +} + +const buildButton = { + iconPath: new vscode.ThemeIcon("package"), + tooltip: "Build project", + action: "build", +} + +type PickItem = { + label: string + description: string + detail: string | undefined + action: string | undefined + projectFile: ProjectFile + buttons: { + iconPath: vscode.ThemeIcon + tooltip: string + }[] +} + +export const openMenuCommand = (state: State) => + vscode.commands.registerCommand("vscode-rojo.openMenu", async () => { + const projectFilesResult = await result(findProjectFiles()) + + if (!projectFilesResult.ok) { + vscode.window.showErrorMessage(projectFilesResult.error.toString()) + return + } + + const projectFiles = projectFilesResult.result + + const projectFileRojoVersions: Map = + new Map() + const rojoVersions: { [index: string]: true } = {} + + for (const projectFile of projectFiles) { + const version = await getRojoVersion(projectFile) + if (version) { + rojoVersions[version] = true + } + + projectFileRojoVersions.set(projectFile, version) + } + + const allRojoVersions = Object.keys(rojoVersions) + + const runningItems = Object.values(state.running).map( + ({ projectFile }) => ({ + label: `$(debug-stop) ${projectFile.name}`, + description: projectFile.workspaceFolderName, + projectFile, + action: "stop", + buttons: [openFileButton, buildButton], + }) + ) + + const isAnyRunning = Object.values(state.running).length > 0 + + const projectFileItems: PickItem[] = [] + for (const projectFile of projectFiles) { + const isInstalled = projectFileRojoVersions.get(projectFile) !== null + const isRunning = projectFile.path.fsPath in state.running + + if (isRunning) { + continue + } + + projectFileItems.push({ + label: `$(${isInstalled ? "debug-start" : "warning"}) ${ + projectFile.name + }`, + description: projectFile.workspaceFolderName, + detail: !isInstalled + ? ` Rojo not detected in ${projectFile.workspaceFolderName}` + : allRojoVersions.length > 1 + ? `v${projectFileRojoVersions.get(projectFile)}` + : undefined, + action: isInstalled ? "start" : undefined, + projectFile, + buttons: [ + ...(isInstalled && isAnyRunning ? [stopAndServeButton] : []), + openFileButton, + ...(isInstalled ? [buildButton] : []), + ], + }) + } + + const input = vscode.window.createQuickPick() + + input.title = "Rojo" + + const pickItems: { + label: string + description?: string + detail?: string + action?: string + info?: boolean + }[] = [ + { + label: "$(rocket) Rojo", + description: + allRojoVersions.length === 1 + ? `v${allRojoVersions[0]}` + : `${allRojoVersions.length} versions of Rojo installed`, + detail: "Using Rojo detected from aftman.toml", + info: true, + }, + { + label: "$(link-external) Open Rojo Docs", + info: true, + action: "openDocs", + }, + { + label: + "―――――――――――― $(versions) Projects in this workspace ―――――――――――", + detail: + "Click to start live syncing, or build with the build button on the right.", + info: true, + }, + ...runningItems, + ...projectFileItems, + ] + + input.items = pickItems + + input.onDidTriggerItemButton(async (event) => { + const item = event.item as typeof projectFileItems[0] + if (!item.projectFile) { + return + } + + switch ((event.button as any).action) { + case "open": { + vscode.workspace + .openTextDocument(item.projectFile.path) + .then((doc) => vscode.window.showTextDocument(doc)) + break + } + case "build": { + try { + await buildProject(item.projectFile) + } catch (e) { + vscode.window.showErrorMessage( + "Rojo build errored: " + (e as any).toString() + ) + } + break + } + case "stopAndServe": { + for (const runningProject of Object.values(state.running)) { + runningProject.stop() + } + + try { + serveProject(state, item.projectFile) + } catch (e) { + vscode.window.showErrorMessage( + "Rojo: Something went wrong when starting rojo. Error: " + + (e as any).toString() + ) + } + + input.hide() + + break + } + } + }) + + input.onDidChangeValue((value) => { + if (value.length > 0) { + input.items = pickItems.filter((item) => !item.info) + } else { + input.items = pickItems + } + }) + + input.onDidAccept(() => { + const selectedItem = input.activeItems[0] as typeof projectFileItems[0] + + switch (selectedItem.action) { + case "start": { + try { + serveProject(state, selectedItem.projectFile) + } catch (e) { + vscode.window.showErrorMessage( + "Rojo: Something went wrong when starting rojo. Error: " + + (e as any).toString() + ) + } + + input.hide() + break + } + case "stop": { + const running = state.running[selectedItem.projectFile.path.fsPath] + + if (running) { + try { + running.stop() + } catch (e) { + vscode.window.showErrorMessage( + "Rojo: Couldn't stop Rojo process. Error: " + + (e as any).toString() + ) + } + } + + input.hide() + break + } + case "openDocs": { + vscode.env.openExternal( + vscode.Uri.parse("https://rojo.space/docs/v7/") + ) + break + } + } + }) + + input.show() + }) diff --git a/src/extension.ts b/src/extension.ts new file mode 100644 index 0000000..9551e2b --- /dev/null +++ b/src/extension.ts @@ -0,0 +1,44 @@ +import * as vscode from "vscode" +import * as commands from "./commands" +import { RunningProject } from "./serveProject" +import { updateButton } from "./updateButton" + +export type State = { + button: vscode.StatusBarItem + running: { [index: string]: RunningProject } +} + +let cleanup: undefined | (() => void) + +export function activate(context: vscode.ExtensionContext) { + console.log("vscode-rojo activated") + + const state: State = { + button: vscode.window.createStatusBarItem( + vscode.StatusBarAlignment.Right, + 200 + ), + running: {}, + } + + updateButton(state) + state.button.command = "vscode-rojo.openMenu" + state.button.show() + + context.subscriptions.push( + ...Object.values(commands).map((command) => command(state)) + ) + + cleanup = () => { + for (const runningProject of Object.values(state.running)) { + runningProject.stop() + } + } +} + +export function deactivate() { + if (cleanup) { + cleanup() + cleanup = undefined + } +} diff --git a/src/findProjectFiles.ts b/src/findProjectFiles.ts new file mode 100644 index 0000000..fa75a23 --- /dev/null +++ b/src/findProjectFiles.ts @@ -0,0 +1,38 @@ +import * as vscode from "vscode" + +export type ProjectFile = { + name: string + workspaceFolderName: string + path: vscode.Uri +} + +export async function findProjectFiles(): Promise { + const folders = vscode.workspace.workspaceFolders + + if (!folders) { + return Promise.reject( + "You must open VS Code on a workspace folder to do this." + ) + } + + const projectFiles: ProjectFile[] = [] + + for (const workspaceFolder of folders) { + const fileNames = ( + await vscode.workspace.fs.readDirectory(workspaceFolder.uri) + ) + .filter(([, fileType]) => fileType === vscode.FileType.File) + .map(([fileName]) => fileName) + .filter((fileName) => fileName.endsWith(".project.json")) + + for (const fileName of fileNames) { + projectFiles.push({ + name: fileName, + workspaceFolderName: workspaceFolder.name, + path: vscode.Uri.joinPath(workspaceFolder.uri, fileName), + }) + } + } + + return projectFiles +} diff --git a/src/getRojoVersion.ts b/src/getRojoVersion.ts new file mode 100644 index 0000000..513678e --- /dev/null +++ b/src/getRojoVersion.ts @@ -0,0 +1,36 @@ +import * as childProcess from "child_process" +import { promisify } from "util" +import { ProjectFile } from "./findProjectFiles" +import path = require("path") + +const exec = promisify(childProcess.exec) + +export async function getRojoVersion( + projectFile: ProjectFile +): Promise { + const projectFilePath = projectFile.path.fsPath + const projectFileFolder = path.dirname(projectFilePath) + + const output = await exec("rojo --version", { + cwd: projectFileFolder, + }).catch(() => null) + + if (output) { + if (output.stderr.length > 0) { + console.error("Rojo version resulted in stderr output") + return null + } + + const split = output.stdout.split(" ") + + const version = split[1] + + if (!version) { + return null + } + + return version + } else { + return null + } +} diff --git a/src/result.ts b/src/result.ts new file mode 100644 index 0000000..0384099 --- /dev/null +++ b/src/result.ts @@ -0,0 +1,15 @@ +export function result( + promise: Promise +): Promise<{ ok: true; result: T } | { ok: false; error: E }> { + return promise + .then((data: T): { ok: true; result: T } => ({ + ok: true, + result: data, + })) + .catch((err: E) => { + return { + ok: false, + error: err, + } + }) +} diff --git a/src/serveProject.ts b/src/serveProject.ts new file mode 100644 index 0000000..12756ba --- /dev/null +++ b/src/serveProject.ts @@ -0,0 +1,86 @@ +import * as childProcess from "child_process" +import * as vscode from "vscode" +import { State } from "./extension" +import { ProjectFile } from "./findProjectFiles" +import { updateButton } from "./updateButton" +import path = require("path") + +export type RunningProject = { + stop: () => void + projectFile: ProjectFile +} + +export function serveProject(state: State, projectFile: ProjectFile) { + const projectFilePath = projectFile.path.fsPath + + if (state.running[projectFilePath]) { + throw new Error("This project is already running") + } + + const projectFileFolder = path.dirname(projectFilePath) + + const outputChannel = vscode.window.createOutputChannel( + `Rojo: ${projectFile.workspaceFolderName}/${projectFile.name}` + ) + + const child = childProcess.spawn( + "rojo", + ["serve", path.basename(projectFilePath), "--color", "never"], + { + cwd: projectFileFolder, + } + ) + + { + let count = 0 + child.stdout.on("data", (data) => { + count++ + + if (count === 1) { + vscode.window.showInformationMessage(data.toString()) + } else if (count === 2) { + outputChannel.show() + } + + outputChannel.append(data.toString()) + }) + } + + { + let count = 0 + + child.stderr.on("data", (data) => { + count++ + outputChannel.append(data.toString()) + + if (count === 1) { + outputChannel.show() + } + }) + } + + child.on("exit", (code) => { + if (code && code !== 0) { + outputChannel.show() + } + + delete state.running[projectFilePath] + updateButton(state) + }) + + console.log("Child process pid is", child.pid) + + state.running[projectFilePath] = { + projectFile, + stop() { + const killSuccessful = child.kill() + if (!killSuccessful) { + console.error("Could not kill process") + } + + console.log(`Stopped ${projectFilePath}`) + }, + } + + updateButton(state) +} diff --git a/src/updateButton.ts b/src/updateButton.ts new file mode 100644 index 0000000..ac5e87c --- /dev/null +++ b/src/updateButton.ts @@ -0,0 +1,13 @@ +import { State } from "./extension" + +export function updateButton(state: State) { + const numRunning = Object.keys(state.running).length + + if (numRunning === 0) { + state.button.text = "$(rocket) Rojo" + } else if (numRunning === 1) { + state.button.text = `$(testing-run-all-icon) Rojo: serving` + } else { + state.button.text = `$(testing-run-all-icon) Rojo: ${numRunning} serving` + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f4cdb90 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "ES2020", + "lib": [ + "ES2020" + ], + "sourceMap": true, + "rootDir": "src", + "strict": true /* enable all strict type-checking options */ + /* Additional Checks */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + }, + "exclude": [ + "node_modules", + ".vscode-test" + ] +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..dc26e99 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,48 @@ +//@ts-check + +'use strict'; + +const path = require('path'); + +//@ts-check +/** @typedef {import('webpack').Configuration} WebpackConfig **/ + +/** @type WebpackConfig */ +const extensionConfig = { + target: 'node', // vscode extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/ + mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production') + + entry: './src/extension.ts', // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/ + output: { + // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/ + path: path.resolve(__dirname, 'dist'), + filename: 'extension.js', + libraryTarget: 'commonjs2' + }, + externals: { + vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ + // modules added here also need to be added in the .vscodeignore file + }, + resolve: { + // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader + extensions: ['.ts', '.js'] + }, + module: { + rules: [ + { + test: /\.ts$/, + exclude: /node_modules/, + use: [ + { + loader: 'ts-loader' + } + ] + } + ] + }, + devtool: 'nosources-source-map', + infrastructureLogging: { + level: "log", // enables logging required for problem matchers + }, +}; +module.exports = [ extensionConfig ]; \ No newline at end of file