From b25fcf98f1965a61cb1e00bd96be65e48e5978ba Mon Sep 17 00:00:00 2001 From: Yunus-NJU Date: Mon, 6 Feb 2023 13:43:28 +0800 Subject: [PATCH] v0.1 --- LICENSE | 375 ++ README.md | 149 + autoload/vim_snippets.vim | 27 + docs/images/screenshot.png | Bin 0 -> 264748 bytes ftplugin/matlab/vim-matlab.vim | 48 + indent/matlab.vim | 147 + pytest.ini | 2 + rplugin/python3/vim_matlab.py | 0 rplugin/python3/vim_matlab/__init__.py | 274 + rplugin/python3/vim_matlab/command.py | 37 + .../python3/vim_matlab/input_controller.py | 77 + rplugin/python3/vim_matlab/io_helper.py | 7 + rplugin/python3/vim_matlab/logger.py | 11 + .../python3/vim_matlab/matlab/evalAndClean.m | 10 + .../vim_matlab/matlab/openDocumentInEditor.m | 19 + .../vim_matlab/matlab/printBackspace.m | 3 + .../python3/vim_matlab/matlab/printVarInfo.m | 13 + rplugin/python3/vim_matlab/matlab/sendTcp.m | 11 + .../vim_matlab/matlab/setEditorCursor.m | 4 + .../python3/vim_matlab/matlab/testVimMatlab.m | 19 + .../vim_matlab/matlab_cli_controller.py | 55 + .../vim_matlab/matlab_gui_controller.py | 181 + .../python3/vim_matlab/python_vim_utils.py | 186 + rplugin/python3/vim_matlab/requirements.txt | 3 + rplugin/python3/vim_matlab/xdotool.py | 81 + scripts/kill-process.sh | 2 + scripts/reload-vim.sh | 9 + scripts/run-tests.sh | 10 + scripts/vim-matlab-server.py | 200 + snippets/matlab.snippets | 27 + syntax/matlab.vim | 367 ++ tests/test_patterns.py | 30 + .../.eslintrc.js | 44 + .../.gitattributes | 3 + .../.gitignore | 7 + .../.vscode/extensions.json | 7 + .../.vscode/launch.json | 36 + .../.vscode/settings.json | 12 + .../.vscode/tasks.json | 20 + .../.vscodeignore | 13 + .../CHANGELOG.md | 111 + .../LICENSE | 21 + .../README.md | 27 + .../images/icon.png | Bin 0 -> 22583 bytes .../interfaces/standard/check_dependencies.py | 9 + .../interfaces/standard/matlab_interface.py | 144 + .../interfaces/standard/ml_script.py | 9 + .../interfaces/standard/ml_selection.py | 9 + .../interfaces/standard/ml_terminal.py | 6 + .../interfaces/unicode/check_dependencies.py | 9 + .../interfaces/unicode/matlab_interface.py | 150 + .../interfaces/unicode/ml_script.py | 9 + .../interfaces/unicode/ml_selection.py | 9 + .../interfaces/unicode/ml_terminal.py | 6 + .../package-lock.json | 5598 +++++++++++++++++ .../package.json | 94 + .../src/extension.ts | 225 + .../src/test/runTest.ts | 23 + .../src/test/suite/extension.test.ts | 15 + .../src/test/suite/index.ts | 37 + .../tsconfig.json | 21 + .../vsc-extension-quickstart.md | 42 + 62 files changed, 9100 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 autoload/vim_snippets.vim create mode 100644 docs/images/screenshot.png create mode 100644 ftplugin/matlab/vim-matlab.vim create mode 100644 indent/matlab.vim create mode 100644 pytest.ini create mode 100644 rplugin/python3/vim_matlab.py create mode 100644 rplugin/python3/vim_matlab/__init__.py create mode 100644 rplugin/python3/vim_matlab/command.py create mode 100644 rplugin/python3/vim_matlab/input_controller.py create mode 100644 rplugin/python3/vim_matlab/io_helper.py create mode 100644 rplugin/python3/vim_matlab/logger.py create mode 100644 rplugin/python3/vim_matlab/matlab/evalAndClean.m create mode 100644 rplugin/python3/vim_matlab/matlab/openDocumentInEditor.m create mode 100644 rplugin/python3/vim_matlab/matlab/printBackspace.m create mode 100644 rplugin/python3/vim_matlab/matlab/printVarInfo.m create mode 100644 rplugin/python3/vim_matlab/matlab/sendTcp.m create mode 100644 rplugin/python3/vim_matlab/matlab/setEditorCursor.m create mode 100644 rplugin/python3/vim_matlab/matlab/testVimMatlab.m create mode 100644 rplugin/python3/vim_matlab/matlab_cli_controller.py create mode 100644 rplugin/python3/vim_matlab/matlab_gui_controller.py create mode 100644 rplugin/python3/vim_matlab/python_vim_utils.py create mode 100644 rplugin/python3/vim_matlab/requirements.txt create mode 100644 rplugin/python3/vim_matlab/xdotool.py create mode 100644 scripts/kill-process.sh create mode 100644 scripts/reload-vim.sh create mode 100644 scripts/run-tests.sh create mode 100644 scripts/vim-matlab-server.py create mode 100644 snippets/matlab.snippets create mode 100644 syntax/matlab.vim create mode 100644 tests/test_patterns.py create mode 100644 vscode-matlab-interactive-terminal-master/.eslintrc.js create mode 100644 vscode-matlab-interactive-terminal-master/.gitattributes create mode 100644 vscode-matlab-interactive-terminal-master/.gitignore create mode 100644 vscode-matlab-interactive-terminal-master/.vscode/extensions.json create mode 100644 vscode-matlab-interactive-terminal-master/.vscode/launch.json create mode 100644 vscode-matlab-interactive-terminal-master/.vscode/settings.json create mode 100644 vscode-matlab-interactive-terminal-master/.vscode/tasks.json create mode 100644 vscode-matlab-interactive-terminal-master/.vscodeignore create mode 100644 vscode-matlab-interactive-terminal-master/CHANGELOG.md create mode 100644 vscode-matlab-interactive-terminal-master/LICENSE create mode 100644 vscode-matlab-interactive-terminal-master/README.md create mode 100644 vscode-matlab-interactive-terminal-master/images/icon.png create mode 100644 vscode-matlab-interactive-terminal-master/interfaces/standard/check_dependencies.py create mode 100644 vscode-matlab-interactive-terminal-master/interfaces/standard/matlab_interface.py create mode 100644 vscode-matlab-interactive-terminal-master/interfaces/standard/ml_script.py create mode 100644 vscode-matlab-interactive-terminal-master/interfaces/standard/ml_selection.py create mode 100644 vscode-matlab-interactive-terminal-master/interfaces/standard/ml_terminal.py create mode 100644 vscode-matlab-interactive-terminal-master/interfaces/unicode/check_dependencies.py create mode 100644 vscode-matlab-interactive-terminal-master/interfaces/unicode/matlab_interface.py create mode 100644 vscode-matlab-interactive-terminal-master/interfaces/unicode/ml_script.py create mode 100644 vscode-matlab-interactive-terminal-master/interfaces/unicode/ml_selection.py create mode 100644 vscode-matlab-interactive-terminal-master/interfaces/unicode/ml_terminal.py create mode 100644 vscode-matlab-interactive-terminal-master/package-lock.json create mode 100644 vscode-matlab-interactive-terminal-master/package.json create mode 100644 vscode-matlab-interactive-terminal-master/src/extension.ts create mode 100644 vscode-matlab-interactive-terminal-master/src/test/runTest.ts create mode 100644 vscode-matlab-interactive-terminal-master/src/test/suite/extension.test.ts create mode 100644 vscode-matlab-interactive-terminal-master/src/test/suite/index.ts create mode 100644 vscode-matlab-interactive-terminal-master/tsconfig.json create mode 100644 vscode-matlab-interactive-terminal-master/vsc-extension-quickstart.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..46150fb --- /dev/null +++ b/LICENSE @@ -0,0 +1,375 @@ +Copyright (c) 2015 Daeyun Shin + +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..e57b456 --- /dev/null +++ b/README.md @@ -0,0 +1,149 @@ +vim-matlab +=========== + +An alternative to Matlab's default editor for Vim users. + +## FAQ + +#### How do I run code cells (`%%` blocks)? + +In Normal mode, press `` or ``. The editor will parse the code in the current cell and send to MATLAB for evaluation. + +#### What if I need MATLAB's GUI features? + +Most MATLAB windows can be launched through commands; even in `-nodisplay` mode. For example, [workspace](https://www.mathworks.com/help/matlab/ref/workspace.html) command opens the Workspace browser. + +screenshot 2016-08-18 20 57 56 + +If you need to access the debugger, use [edit](https://www.mathworks.com/help/matlab/ref/edit.html) to open the default GUI editor. + +#### Error: `E492: Not an editor command` + +If this the first time you're installing a Python plugin written for Neovim, you should install [python-client](https://github.com/neovim/python-client) and run `:UpdateRemotePlugins`. + +The recommended way to install this plugin is to use the plugin manager [vim-plug](https://github.com/junegunn/vim-plug) and add this to your `.vimrc` or `init.vim`: + +```vim +function! DoRemote(arg) + UpdateRemotePlugins +endfunction + +Plug 'daeyun/vim-matlab', { 'do': function('DoRemote') } +``` + + + +## Usage + +`vim-matlab` works by remotely controlling a CLI Matlab instance (launched by `vim-matlab-server.py`). + +Run + +``` +./scripts/vim-matlab-server.py +``` + +This will start a Matlab REPL and redirect commands received from Vim to Matlab. When Matlab crashes (e.g. segfault during MEX development), it will launch another process. + +Then open Vim in another terminal and start editing .m files. + +Alternatively, launch a server instance from Vim using `:MatlabLaunchServer`. The server will be launched either in a Neovim terminal buffer or a tmux split (see [g:matlab_server_launcher](#configuration)). + +- `:MatlabCliCancel` (\c) tells the server to send SIGINT to Matlab, canceling current operation. + +- `:MatlabCliRunSelection` executes the highlighted Matlab code. + +- `:MatlabCliRunCell` executes code in the current cell — i.e. `%%` blocks. Similar to Ctrl-Enter in the Matlab editor. + +- `:MatlabCliOpenInEditor` (,e) opens current buffer in a Matlab editor window. e.g. to access the debugger. + +- `:MatlabCliHelp` (,h) prints help message for the word under the cursor. + +- `:MatlabNormalModeCreateCell` (C-l) inserts a cell marker above the current line. + +- `:MatlabVisualModeCreateCell` (C-l) inserts cell markers above and below the visual selection. + +- `:MatlabInsertModeCreateCell` (C-l) inserts a cell marker at the beginning of the current line. + +- `:MatlabLaunchServer` launches a server instance in a Vim or tmux split. + +See [this file](rplugin/python/vim_matlab/__init__.py) for a list of available commands, and [vim-matlab.vim](ftplugin/matlab/vim-matlab.vim) for default key bindings. + +![Screenshot](/docs/images/screenshot.png) + + + +## Installation + +1. Install the python3 client for Neovim: + +``` +pip3 install neovim +``` + +2. Add to `.vimrc` (or `~/.config/nvim/init.vim`). e.g. using [vim-plug](https://github.com/junegunn/vim-plug): + +``` +Plug 'daeyun/vim-matlab' +``` + +3. Register the plugin inside Neovim: + +``` +:UpdateRemotePlugins +``` + +### Optional steps (recommended) + +4. Install a snippet engine such as [SirVer/ultisnips](https://github.com/SirVer/ultisnips) or [vim-snipmate](https://github.com/garbas/vim-snipmate) to use the [included snippets](https://github.com/daeyun/vim-matlab/blob/master/snippets/matlab.snippets). We also recommend installing [vim-snippets](https://github.com/honza/vim-snippets). We welcome any contributions to extend the `matlab.snippets` file. + +5. Install pexpect for improved interactivity with the MATLAB console (e.g. tab completion): + +``` +pip3 install pexpect +``` + + +## Configuration + +Use `g:matlab_auto_mappings` to control whether the plugin automatically generates key mappings (default = 1). + +```vim +let g:matlab_auto_mappings = 0 "automatic mappings disabled +let g:matlab_auto_mappings = 1 "automatic mappings enabled +``` + +Use `g:matlab_server_launcher` to control whether `:MatlabLaunchServer` uses a Vim or tmux split (default = `'vim'`). + +```vim +let g:matlab_server_launcher = 'vim' "launch the server in a Neovim terminal buffer +let g:matlab_server_launcher = 'tmux' "launch the server in a tmux split +``` + +Use `g:matlab_server_split` to control whether `:MatlabLaunchServer` uses a vertical or horizontal split (default = `'vertical'`). + +```vim +let g:matlab_server_split = 'vertical' "launch the server in a vertical split +let g:matlab_server_split = 'horizontal' "launch the server in a horizontal split +``` + + +## Development + +Set up a symlink so that the plugin directory points to your repository. + +``` +git clone git@github.com:daeyun/vim-matlab.git +rm -r ~/.vim/plugged/vim-matlab +ln -nsf $(pwd)/vim-matlab ~/.vim/plugged/ +``` + +After changing the code, run `scripts/reload-vim.sh` (optionally pass in a file to open) to reload. + +For testing, install [pytest](https://github.com/pytest-dev/pytest/) and run `scripts/run-tests.sh`. + + +## Recommended Plugins + +- [MatlabFilesEdition](http://www.vim.org/scripts/script.php?script_id=2407) +- [matchit.zip](http://www.vim.org/scripts/script.php?script_id=39) diff --git a/autoload/vim_snippets.vim b/autoload/vim_snippets.vim new file mode 100644 index 0000000..061f171 --- /dev/null +++ b/autoload/vim_snippets.vim @@ -0,0 +1,27 @@ +" this is well known Filename found in snipmate (and the other engines), but +" rewritten and documented :) +" +" optional arg1: string in which to replace '$1' by filename with extension +" and path dropped. Defaults to $1 +" optional arg2: return this value if buffer has no filename +" But why not use the template in this case, too? +" Doesn't make sense to me +fun! vim_snippets#Filename(...) + let template = get(a:000, 0, "$1") + let arg2 = get(a:000, 1, "") + + let basename = expand('%:t:r') + + if basename == '' + return arg2 + else + return substitute(template, '$1', basename, 'g') + endif +endf + +" original code: +" fun! Filename(...) +" let filename = expand('%:t:r') +" if filename == '' | return a:0 == 2 ? a:2 : '' | endif +" return !a:0 || a:1 == '' ? filename : substitute(a:1, '$1', filename, 'g') +" endf diff --git a/docs/images/screenshot.png b/docs/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..62a7157289d11745e6f198adf71303424071e52c GIT binary patch literal 264748 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
3I)}7sQ$oJ8da%= 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%0D=n2L4M)Y0bG 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 literal 0 HcmV?d00001 diff --git a/ftplugin/matlab/vim-matlab.vim b/ftplugin/matlab/vim-matlab.vim new file mode 100644 index 0000000..1872c99 --- /dev/null +++ b/ftplugin/matlab/vim-matlab.vim @@ -0,0 +1,48 @@ +setlocal shortmess+=A +setlocal formatoptions-=cro + +if !exists('g:matlab_server_launcher') + let g:matlab_server_launcher = 'vim' +endif + +if !exists('g:matlab_server_split') + let g:matlab_server_split = 'vertical' +endif + +if g:matlab_server_launcher ==? 'tmux' && g:matlab_server_split ==? 'horizontal' + let s:split_command = ':!tmux split-window ' +elseif g:matlab_server_launcher ==? 'tmux' && g:matlab_server_split ==? 'vertical' + let s:split_command = ':!tmux split-window -h ' +elseif g:matlab_server_launcher ==? 'vim' && g:matlab_server_split ==? 'horizontal' + let s:split_command = ':split term://' +else + let s:split_command = ':vsplit term://' +endif +" let s:server_command = expand(':p:h') . '/../../scripts/vim-matlab-server.py' +let s:server_command = expand(':p:h') . '/../../vscode-matlab-interactive-terminal-master/interfaces/standard/ml_terminal.py' + +command! MatlabLaunchServer :execute 'normal! ' . s:split_command . s:server_command . '' + +command! MatlabNormalModeCreateCell :execute 'normal! :set pastem`O%%``:set nopaste' +command! MatlabVisualModeCreateCell :execute 'normal! gvD:set pasteO%%%%P:set nopaste' +command! MatlabInsertModeCreateCell :execute 'normal! I%% ' + +if !exists('g:matlab_auto_mappings') + let g:matlab_auto_mappings = 1 +endif + +if g:matlab_auto_mappings + nnoremap rn :MatlabRename + nnoremap fn :MatlabFixName + vnoremap :MatlabCliRunSelection + nnoremap :MatlabCliRunCell + nnoremap :MatlabCliRunLine + nnoremap ,i :MatlabCliViewVarUnderCursor + vnoremap ,i :MatlabCliViewSelectedVar + nnoremap ,h :MatlabCliHelp + nnoremap ,e :MatlabCliOpenInMatlabEditor + nnoremap c :MatlabCliCancel + nnoremap :MatlabNormalModeCreateCell + vnoremap :MatlabVisualModeCreateCell + inoremap :MatlabInsertModeCreateCell +endif diff --git a/indent/matlab.vim b/indent/matlab.vim new file mode 100644 index 0000000..9dfd85d --- /dev/null +++ b/indent/matlab.vim @@ -0,0 +1,147 @@ +" Matlab indent file +" Language: Matlab +" Maintainer: Original author: Fabrice Guy +" Last Change: 2009 Nov 23 - Added support for if/end block on the same line +" 2015 Oct 29 - Fixed function indentation (daeyun) + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 +let s:functionWithoutEndStatement = 0 + +setlocal indentexpr=GetMatlabIndent() +setlocal indentkeys=!,o,O=end,=case,=else,=elseif,=otherwise,=catch + +" Only define the function once. +if exists("*GetMatlabIndent") + finish +endif + +function! s:IsMatlabContinuationLine(lnum) + let continuationLine = 0 + if a:lnum > 0 + let pnbline = getline(prevnonblank(a:lnum)) + " if we have the line continuation operator (... at the end of a line or + " ... followed by a comment) it may be a line continuation + if pnbline =~ '\.\.\.\s*$' || pnbline =~ '\.\.\.\s*%.*$' + let continuationLine = 1 + " but if the ... are part of a string or a comment, it is not a + " continuation line + let col = match(pnbline, '\.\.\.\s*$') + if col == -1 + let col = match(pnbline, '\.\.\.\s*%.*$') + endif + if has('syntax_items') + if synIDattr(synID(prevnonblank(a:lnum), col + 1, 1), "name") =~ "matlabString" || + \ synIDattr(synID(prevnonblank(a:lnum), col + 1, 1), "name") =~ "matlabComment" + let continuationLine = 0 + endif + endif + endif + endif + return continuationLine +endfunction + +function GetMatlabIndent() + " Find a non-blank line above the current line. + let plnum = prevnonblank(v:lnum - 1) + + " If the previous line is a continuation line, get the beginning of the block to + " use the indent of that line + if s:IsMatlabContinuationLine(plnum - 1) + while s:IsMatlabContinuationLine(plnum - 1) + let plnum = plnum - 1 + endwhile + endif + + " At the start of the file use zero indent. + if plnum == 0 + return 0 + endif + + let curind = indent(plnum) + if s:IsMatlabContinuationLine(v:lnum - 1) + let curind = curind + &sw + endif + " Add a 'shiftwidth' after classdef, properties, switch, methods, events, + " function, if, while, for, otherwise, case, try, catch, else, elseif + if getline(plnum) =~ '^\s*\(classdef\|properties\|switch\|methods\|events\|function\|if\|while\|for\|otherwise\|case\|try\|catch\|else\|elseif\)\>' + let curind = curind + &sw + " In Matlab we have different kind of functions + " - the main function (the function with the same name than the filename) + " - the nested functions + " - the functions defined in methods (for classes) + " - subfunctions + " Principles for the indentation : + " - all the function keywords are indented (corresponding to the + " 'indent all functions' in the Matlab Editor) + " - if we have only subfonctions (ie if the main function doesn't have + " any mayching end), then each function is dedented + if getline(plnum) =~ '^\s*\function\>' + let pplnum = plnum - 1 + while pplnum > 1 && (getline(pplnum) =~ '^\s*%') + let pplnum = pplnum - 1 + endwhile + " If it is the main function, determine if function has a matching end + " or not + if pplnum <= 1 + " look for a matching end : + " - if we find a matching end everything is fine : end of functions + " will be dedented when 'end' is reached + " - if not, then all other functions are subfunctions : 'function' + " keyword has to be dedended + let old_lnum = v:lnum + let motion = plnum . "gg" + execute "normal" . motion + normal % + if getline(line('.')) =~ '^\s*end' + let s:functionWithoutEndStatement = 0 + else + let s:functionWithoutEndStatement = 1 + endif + normal % + let motion = old_lnum . "gg" + execute "normal" . motion + endif + endif + " if the for-end block (or while-end) is on the same line : dedent + if getline(plnum) =~ '[,;]\?\s*end' + let curind = curind - &sw + endif + endif + + " Subtract a 'shiftwidth' on a else, elseif, end, catch, otherwise, case + if getline(v:lnum) =~ '^\s*\(else\|elseif\|end\|catch\|otherwise\|case\)\>' + let curind = curind - &sw + endif + " No indentation in a subfunction + if getline(plnum) =~ '^\s*\function\>' && s:functionWithoutEndStatement + let curind = curind - &sw + endif + " First case after a switch : indent + if getline(v:lnum) =~ '^\s*case' + while plnum > 0 && (getline(plnum) =~ '^\s*%' || getline(plnum) =~ '^\s*$') + let plnum = plnum - 1 + endwhile + if getline(plnum) =~ '^\s*switch' + let curind = indent(plnum) + &sw + endif + endif + + " end in a switch / end block : dedent twice + " we use the matchit script to know if this end is the end of a switch block + if exists("b:match_words") + if getline(v:lnum) =~ '^\s*end' + normal % + if getline(line('.')) =~ '^\s*switch' + let curind = curind - &sw + endif + normal % + end + end + return curind +endfunction + +" vim:sw=2 diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..5ee6477 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +testpaths = tests diff --git a/rplugin/python3/vim_matlab.py b/rplugin/python3/vim_matlab.py new file mode 100644 index 0000000..e69de29 diff --git a/rplugin/python3/vim_matlab/__init__.py b/rplugin/python3/vim_matlab/__init__.py new file mode 100644 index 0000000..ff32ba3 --- /dev/null +++ b/rplugin/python3/vim_matlab/__init__.py @@ -0,0 +1,274 @@ +import hashlib +import os +import datetime +import errno +import re +import time +import collections + +import neovim + +from vim_matlab.matlab_cli_controller import MatlabCliController +from vim_matlab.python_vim_utils import PythonVimUtils as vim_helper +import vim_matlab.python_vim_utils as python_vim_utils + + +__created__ = 'Mar 01, 2015' +__license__ = 'MPL 2.0' +__author__ = 'Daeyun Shin' +__email__ = "daeyun@daeyunshin.com" + +# 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/. + +@neovim.plugin +class VimMatlab(object): + def __init__(self, vim): + self.vim = vim + python_vim_utils.vim = vim + self.gui_controller = None + self.cli_controller = None + self.buffer_state = collections.defaultdict(dict) + + self.function_name_pattern = \ + re.compile(r'((?:^|\n[ \t]*)(?!%)[ \t]*(?:function(?:[ \t]|\.\.\.' + r'[ \t]*\n)(?:[^\(\n]|\.\.\.[ \t]*\n)*?|classdef(?:[ \t]' + r'|\.\.\.[ \t]*\n)(?:[^\<\n]|\.\.\.[ \t]*\n)*?))(' + r'[a-zA-Z]\w*)((?:[ \t]|\.\.\.[ \t]*\n)*(?:\(|\<|\n|$))') + + @neovim.command('MatlabPrintCellLines', sync=True) + def run_print_cell_lines(self): + lines = vim_helper.get_current_matlab_cell_lines( + ignore_matlab_comments=True) + vim_helper.echo_text("\n".join(lines)) + + @neovim.command('MatlabCliRunSelection', sync=True) + def run_selection_in_matlab_cli(self): + if self.cli_controller is None: + self.activate_cli() + + self.matlab_write_function_files() + + lines = vim_helper.get_selection(ignore_matlab_comments=True) + self.cli_controller.run_code(lines) + + @neovim.command('MatlabCliRunLine', sync=True) + def run_current_line(self): + if self.cli_controller is None: + self.activate_cli() + + self.matlab_write_function_files() + + line = [vim_helper.get_current_matlab_line()] + self.cli_controller.run_code(line) + + @neovim.command('MatlabCliRunCell', sync=True) + def run_cell_in_matlab_cli(self): + if self.cli_controller is None: + self.activate_cli() + + self.matlab_write_function_files() + + lines = vim_helper.get_current_matlab_cell_lines( + ignore_matlab_comments=True) + self.cli_controller.run_code(lines) + + @neovim.command('MatlabCliActivateControls', sync=True) + def activate_cli(self): + if self.cli_controller is not None: + return + self.cli_controller = MatlabCliController() + + @neovim.command('MatlabCliViewVarUnderCursor', sync=True) + def view_var_under_cursor(self): + if self.cli_controller is None: + self.activate_cli() + var = vim_helper.get_variable_under_cursor() + if var: + self.cli_controller.run_code(['printVarInfo({});'.format(var)]) + + @neovim.command('MatlabCliViewSelectedVar', sync=True) + def view_selected_var(self): + if self.cli_controller is None: + self.activate_cli() + var = vim_helper.get_selection() + if var: + self.cli_controller.run_code(['printVarInfo({});'.format(var)]) + + @neovim.command('MatlabCliCancel', sync=True) + def matlab_cli_cancel(self): + if self.cli_controller is None: + self.activate_cli() + self.cli_controller.send_ctrl_c() + + @neovim.command('MatlabCliOpenInMatlabEditor', sync=True) + def matlab_cli_open_in_matlab_editor(self): + if self.cli_controller is None: + self.activate_cli() + path = vim_helper.get_current_file_path() + self.cli_controller.open_in_matlab_editor(path) + + @neovim.command('MatlabCliOpenWorkspace', sync=True) + def matlab_cli_open_workspace(self): + if self.cli_controller is None: + self.activate_cli() + self.cli_controller.open_workspace() + + @neovim.command('MatlabCliHelp', sync=True) + def matlab_cli_help(self): + if self.cli_controller is None: + self.activate_cli() + var = vim_helper.get_variable_under_cursor() + self.cli_controller.help_command(var) + + @neovim.command('MatlabCliOpenVar', sync=True) + def matlab_cli_open_var(self): + if self.cli_controller is None: + self.activate_cli() + var = vim_helper.get_variable_under_cursor() + self.cli_controller.openvar(var) + + @neovim.command('MatlabWriteFunctionFiles', sync=True) + def matlab_write_function_files(self): + options = vim_helper.get_options() + if 'split' in options: + group_name = options['split'][0] + else: + return + + dir_path = os.path.join( + os.path.dirname(vim_helper.get_current_file_path()), group_name) + if not os.path.exists(dir_path): + os.mkdir(dir_path) + + existing_filenames = [name for name in os.listdir(dir_path) if + name.endswith('.m')] + + function_blocks = vim_helper.get_function_blocks() + new_filenames = [name + '.m' for name in function_blocks.keys()] + + unused_filenames = list(set(existing_filenames) - set(new_filenames)) + for name in unused_filenames: + try: + os.remove(os.path.join(dir_path, name)) + except: + pass + + added_filenames = list(set(new_filenames) - set(existing_filenames)) + for name in added_filenames: + content = function_blocks[os.path.splitext(name)[0]].strip() + with open(os.path.join(dir_path, name), 'w') as f: + f.write(content) + + common_filenames = set.intersection( + *[set(existing_filenames), set(new_filenames)]) + for name in common_filenames: + content = function_blocks[os.path.splitext(name)[0]].strip() + code_hash = hashlib.md5(content).hexdigest() + with open(os.path.join(dir_path, name), 'r+') as f: + file_hash = hashlib.md5(f.read().strip()).hexdigest() + f.seek(0) + if code_hash != file_hash: + f.write(content) + f.truncate() + + + @neovim.command('MatlabOpenTempScript', sync=True, nargs='*') + def open_temp_matlab_script(self, args): + dirname = os.path.join(os.path.expanduser('~'), '.vim-matlab/scratch/') + if not os.path.exists(dirname): + try: + os.makedirs(dirname) + except OSError as ex: + # In case of a race condition + if ex.errno != errno.EEXIST: + raise + timestamp = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S") + if len(args) > 0: + filename = "{}_{}.m".format(timestamp, args[0]) + else: + filename = "{}.m".format(timestamp) + self.vim.command('edit {}'.format(os.path.join(dirname, filename))) + + @neovim.command('MatlabRename', sync=True, nargs='1') + def rename(self, args): + self.fix_name(args) + + @neovim.command('MatlabFixName', sync=True, nargs='*') + def fix_name(self, args): + curr_file = vim_helper.get_current_file_path() + modified = os.path.getmtime(curr_file) + changed = os.path.getctime(curr_file) + head_lines = self.vim.current.buffer[:100] + head_string = '\n'.join(head_lines) + + def get_basename_ext(path): + filename = os.path.basename(path) + return os.path.splitext(filename) + + def rename_function(name): + new_head = self.function_name_pattern.sub( + r"\1{}\3".format(name), head_string).split('\n') + for i, line in enumerate(new_head): + if line != head_lines[i]: + self.vim.current.buffer[i] = line + + basename, ext = get_basename_ext(curr_file) + + if len(args) > 0: + new_name, new_ext = get_basename_ext(args[0]) + new_ext = new_ext if len(new_ext) > 0 else ext + rename_function(new_name) + self.vim.command("Rename {}{}".format(new_name, new_ext)) + return + + if vim_helper.is_current_buffer_modified() or changed != modified: + match = self.function_name_pattern.search(head_string) + if match is None: + return + function_name = match.group(2) + self.vim.command("Rename {}{}".format(function_name, ext)) + else: + rename_function(basename) + + @neovim.autocmd('VimLeave', pattern='*', sync=True) + def vim_leave(self): + if self.gui_controller is not None: + self.gui_controller.close() + + @neovim.autocmd('InsertEnter', pattern='*.m') + def insert_enter(self): + self.refresh_buffer() + + @neovim.autocmd('BufEnter', pattern='*.m') + def buf_enter(self): + self.set_last_written() + + @neovim.autocmd('BufDelete', pattern='*.m') + def buf_delete(self): + path = vim_helper.get_current_file_path() + self.buffer_state.pop(path, None) + + @neovim.autocmd('BufWrite', pattern='*.m', sync=True) + def buf_write(self): + self.set_last_written() + self.matlab_write_function_files() + + def set_last_written(self): + path = vim_helper.get_current_file_path() + self.buffer_state[path]['last_written'] = time.time() + + def refresh_buffer(self): + path = vim_helper.get_current_file_path() + last_written = self.buffer_state[path]['last_written'] + if time.time() - last_written < 1 or not os.path.isfile(path): + return + + modified = os.stat(path).st_mtime + + if modified > last_written + 8: + row_col = vim_helper.get_cursor() + vim_helper.edit_file(path) + vim_helper.set_cursor(row_col) + diff --git a/rplugin/python3/vim_matlab/command.py b/rplugin/python3/vim_matlab/command.py new file mode 100644 index 0000000..3d5b709 --- /dev/null +++ b/rplugin/python3/vim_matlab/command.py @@ -0,0 +1,37 @@ +import subprocess +import threading + +import vim_matlab.logger as logger + +__author__ = 'daeyun' + + +class TimeoutError(Exception): + pass + + +class Command(object): + def __init__(self, cmd): + self.cmd = cmd + self.process = None + self.stdout = None + self.stderr = None + + def run(self, timeout=None): + def target(): + self.process = subprocess.Popen(self.cmd, shell=True, + close_fds=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + self.stdout, self.stderr = self.process.communicate() + + thread = threading.Thread(target=target) + thread.start() + + thread.join(timeout) + if thread.is_alive(): + self.process.terminate() + thread.join() + logger.log.error('Timeout: ' + self.cmd) + raise TimeoutError('Timeout: ' + self.cmd + ' ' + logger.log_path) + return self.stdout, self.stderr, self.process.returncode diff --git a/rplugin/python3/vim_matlab/input_controller.py b/rplugin/python3/vim_matlab/input_controller.py new file mode 100644 index 0000000..40e321a --- /dev/null +++ b/rplugin/python3/vim_matlab/input_controller.py @@ -0,0 +1,77 @@ +import random +import re +from functools import wraps +import threading + +import sh + +from command import Command + + +__author__ = 'daeyun' + + +class InputController(): + device_ids = None + stack = [] + lock = threading.Lock() + + def __init__(self, timeout=3): + if InputController.device_ids is None: + InputController.device_ids = self.find_device_ids() + if len(InputController.device_ids) < 1: + raise RuntimeError('Unable to find input devices.') + + def find_device_ids(self): + """ + :return: list of all device ids from xinput, excluding XTEST devices. + """ + device_info = str(sh.xinput('list', '--short')) + id_pattern = r'id=(\d+)' + xtest_id_pattern = r'XTEST[^\n]+id=(\d+)' + device_ids = list(set(re.findall(id_pattern, device_info)).difference( + set(re.findall(xtest_id_pattern, device_info)))) + return device_ids + + def disable_input(self): + with InputController.lock: + if not InputController.stack: + try: + for id in self.device_ids: + cmd = ';'.join(['xinput disable {}'.format(id) for id in + self.device_ids]) + Command(cmd).run(1) + except: + pass + + key = random.getrandbits(64) + InputController.stack.append(key) + return key + + def enable_input(self, key): + with InputController.lock: + if key in InputController.stack: + ind = InputController.stack.index(key) + InputController.stack = InputController.stack[:ind] + + if not InputController.stack: + try: + cmd = ';'.join(['xinput enable {}'.format(id) for id in + self.device_ids]) + Command(cmd).run(1) + except: + pass + + +def disable_input(func): + def wrapper(*args, **kwargs): + input_controller = InputController() + try: + key = input_controller.disable_input() + result = func(*args, **kwargs) + finally: + input_controller.enable_input(key) + return result + + return wraps(func)(wrapper) + diff --git a/rplugin/python3/vim_matlab/io_helper.py b/rplugin/python3/vim_matlab/io_helper.py new file mode 100644 index 0000000..77ffe1a --- /dev/null +++ b/rplugin/python3/vim_matlab/io_helper.py @@ -0,0 +1,7 @@ +import os + +__author__ = 'daeyun' + + +def find_plugin_matlab_path(): + return os.path.abspath(os.path.join(__file__, '../matlab')) \ No newline at end of file diff --git a/rplugin/python3/vim_matlab/logger.py b/rplugin/python3/vim_matlab/logger.py new file mode 100644 index 0000000..92b1d2a --- /dev/null +++ b/rplugin/python3/vim_matlab/logger.py @@ -0,0 +1,11 @@ +import logging +import os + +log_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), + 'vim-matlab.log') + +log_format = '%(asctime)s [%(levelname)s] %(pathname)s:%(lineno)d in ' \ + '%(funcName)s, pid %(process)s (%(processName)s):\n%(message)s\n' + +logging.basicConfig(filename=log_path, level=logging.INFO, format=log_format) +log = logging.getLogger('') \ No newline at end of file diff --git a/rplugin/python3/vim_matlab/matlab/evalAndClean.m b/rplugin/python3/vim_matlab/matlab/evalAndClean.m new file mode 100644 index 0000000..9190df1 --- /dev/null +++ b/rplugin/python3/vim_matlab/matlab/evalAndClean.m @@ -0,0 +1,10 @@ +function evalAndClean(expression) +try + evalc(expression); + numQuotes = sum(expression==''''); + argLen = length(expression); + funcNameLen = numel(mfilename); + printBackspace(argLen + funcNameLen + numQuotes + 9); +catch ex + rethrow(ex) +end \ No newline at end of file diff --git a/rplugin/python3/vim_matlab/matlab/openDocumentInEditor.m b/rplugin/python3/vim_matlab/matlab/openDocumentInEditor.m new file mode 100644 index 0000000..bb198dc --- /dev/null +++ b/rplugin/python3/vim_matlab/matlab/openDocumentInEditor.m @@ -0,0 +1,19 @@ +function openDocumentInEditor(filename) + +if ~matlab.desktop.editor.isOpen(filename) + numMaxFiles = 10; + openEditors = matlab.desktop.editor.Document.getAllOpenEditors; + numOpenFiles = numel(openEditors); + if numOpenFiles >= numMaxFiles + openEditors(1:(numOpenFiles-numMaxFiles+1)).closeNoPrompt(); + end +end +matlab.desktop.editor.openDocument(filename); +pause(0.05); +for i = 1:10 + if matlab.desktop.editor.isOpen(filename) && ... + matlab.desktop.editor.isEditorAvailable() + break + end + pause(0.1); +end \ No newline at end of file diff --git a/rplugin/python3/vim_matlab/matlab/printBackspace.m b/rplugin/python3/vim_matlab/matlab/printBackspace.m new file mode 100644 index 0000000..bcceb4b --- /dev/null +++ b/rplugin/python3/vim_matlab/matlab/printBackspace.m @@ -0,0 +1,3 @@ +function printBackspace(len) + +fprintf(repmat('\b', [1 len])); \ No newline at end of file diff --git a/rplugin/python3/vim_matlab/matlab/printVarInfo.m b/rplugin/python3/vim_matlab/matlab/printVarInfo.m new file mode 100644 index 0000000..d182186 --- /dev/null +++ b/rplugin/python3/vim_matlab/matlab/printVarInfo.m @@ -0,0 +1,13 @@ +function printVarInfo(varname) + +sz = mat2str(size(varname)); +type = class(varname); + +fprintf('%s %s\n', sz, type); + +if numel(varname) < 5 + fprintf('var: %s\n', mat2str(varname)); +else + u = unique(varname(:)); + fprintf('var(1:5): %s\nunique(1:5): %d\n', mat2str(varname(1:5)), mat2str(u(1:min(5, numel(u))))); +end diff --git a/rplugin/python3/vim_matlab/matlab/sendTcp.m b/rplugin/python3/vim_matlab/matlab/sendTcp.m new file mode 100644 index 0000000..5f53f44 --- /dev/null +++ b/rplugin/python3/vim_matlab/matlab/sendTcp.m @@ -0,0 +1,11 @@ +function sendTcp(port, msg) +t = tcpip('localhost'); +set(t, 'RemotePort', port); + +try + fopen(t); + fwrite(t, msg,'uchar'); +catch +end + +fclose(t); \ No newline at end of file diff --git a/rplugin/python3/vim_matlab/matlab/setEditorCursor.m b/rplugin/python3/vim_matlab/matlab/setEditorCursor.m new file mode 100644 index 0000000..c9da611 --- /dev/null +++ b/rplugin/python3/vim_matlab/matlab/setEditorCursor.m @@ -0,0 +1,4 @@ +function setEditorCursor(row, col) +activeEditor = matlab.desktop.editor.getActive(); +activeEditor.reload(); +activeEditor.goToPositionInLine(row, col); diff --git a/rplugin/python3/vim_matlab/matlab/testVimMatlab.m b/rplugin/python3/vim_matlab/matlab/testVimMatlab.m new file mode 100644 index 0000000..0f78042 --- /dev/null +++ b/rplugin/python3/vim_matlab/matlab/testVimMatlab.m @@ -0,0 +1,19 @@ +%% +disp('One'); +a = a + 1; +%% +disp('Two'); +a = a + 1; +a = a + 1; +%% +disp('Three'); +a = a + 1; +a = a + 1; +a = a + 1; +%% +assert(a==6); +clear 'a'; +%% +assert(a==5); +clear 'a'; +disp('Test successful'); \ No newline at end of file diff --git a/rplugin/python3/vim_matlab/matlab_cli_controller.py b/rplugin/python3/vim_matlab/matlab_cli_controller.py new file mode 100644 index 0000000..668ead5 --- /dev/null +++ b/rplugin/python3/vim_matlab/matlab_cli_controller.py @@ -0,0 +1,55 @@ +import time +from threading import Timer + +from vim_matlab.io_helper import find_plugin_matlab_path + + +__author__ = 'daeyun' + +import socket +import vim_matlab.logger as logger + + +class MatlabCliController: + def __init__(self): + self.host, self.port = "localhost", 43889 + self.connect_to_server() + + def connect_to_server(self): + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.connect((self.host, self.port)) + Timer(5, self.setup_matlab_path).start() + + def run_code(self, lines): + code = ','.join(lines) + + num_retry = 0 + while num_retry < 3: + try: + self.sock.sendall(bytes(code + "\n", "utf-8")) + logger.log.info(code) + break + except Exception as ex: + logger.log.error(ex) + self.connect_to_server() + num_retry += 1 + time.sleep(1) + + def setup_matlab_path(self): + mpath = find_plugin_matlab_path() + self.run_code(["addpath(genpath('{}'));".format(mpath)]) + + def open_in_matlab_editor(self, path): + self.run_code(["edit '{}';".format(path)]) + + def open_workspace(self): + self.run_code(["workspace;"]) + + def openvar(self, name): + self.run_code(["openvar {};".format(name)]) + + def help_command(self, name): + self.run_code(["help {};".format(name)]) + + def send_ctrl_c(self): + self.sock.sendall("cancel\n") diff --git a/rplugin/python3/vim_matlab/matlab_gui_controller.py b/rplugin/python3/vim_matlab/matlab_gui_controller.py new file mode 100644 index 0000000..4f6d635 --- /dev/null +++ b/rplugin/python3/vim_matlab/matlab_gui_controller.py @@ -0,0 +1,181 @@ +import multiprocessing +from subprocess import check_output +import socket +import re + +import pyperclip + +from input_controller import disable_input +from vim_matlab.io_helper import find_plugin_matlab_path +from xdotool import Xdotool + +""" +DEPRECATED. Use matlab_cli_controller. +""" + +__author__ = 'Daeyun Shin' + +# 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/. + + +class MatlabGuiController(): + @disable_input + def __init__(self): + self.device_ids = self.find_device_ids() + self.xdotool = Xdotool() + self.vim_window_id = self.xdotool.get_active_window_id() + self.find_matlab_window_ids() + self.__setup_matlab_path() + self.__launch_key_request_process() + + def __del__(self): + self.close() + + def close(self): + try: + self.key_handler.terminate() + self.sock.close() + except: + pass + + @disable_input + def run_cell_at(self, row, col, filename): + """ + Open file, move cursor to (row, col), and run cell. + :param row, col: new cursor position in the MATLAB editor. 1-indexed. + :param filename: absolute path to target file. + """ + for _ in range(self.key_handler_queue.qsize()): + self.key_handler_queue.get(False) + self.move_cursor(row, col, filename, 'perform-run-cell') + self.key_handler_queue.get(True, 5) + + @disable_input + def run_commands(self, commands, is_invisible=False, is_multiline=True): + """ + :param commands: list of MATLAB commands to run in Command Window. + :param is_invisible: insert backspaces to erase Command Window if true. + :param is_multiline: if true, delimiter will be \n, otherwise semicolon. + """ + if is_invisible: + command = "evalAndClean('{};');\n".format( + ';'.join(commands).replace("'", "''")) + else: + delimiter = '\n' if is_multiline else ';' + command = "{}\n".format(delimiter.join(commands)) + return self.__type_in_window(self.command_window_id, command) + + @disable_input + def move_cursor(self, row, col, filename, callback_name=None): + """ + :param row, col: new cursor position in the MATLAB editor. 1-indexed. + :param filename: open this file before moving the cursor. + :param callback_name: MATLAB sends this TCP message back after the + operation completes. + :return: + """ + set_cursor_command = 'setEditorCursor({}, {})'.format(row, col) + + if callback_name is None: + callback_command = '' + else: + callback_command = "sendTcp({}, '{}')".format( + self.key_handler_port, callback_name) + + return self.run_commands( + ["openDocumentInEditor('{}')".format(filename), set_cursor_command, + callback_command], True) + + def find_matlab_window_ids(self): + """ + :rtype : list of strings + :return: [command widow id, editor window id] + :raise Exception: + """ + self.command_window_id = self.xdotool. \ + find_windows('^Command Window', 'com-mathworks-util-PostVMInit')[0] + + self.editor_window_id = self.xdotool. \ + find_windows('^Editor', 'com-mathworks-util-PostVMInit')[0] + + return self.editor_window_id, self.command_window_id + + def find_device_ids(self): + """ + :return: list of all device ids from xinput, excluding XTEST devices. + """ + t = check_output('xinput list --short', shell=True) + id_pattern = r'id=(\d+)' + xtest_id_pattern = r'XTEST[^\n]+id=(\d+)' + device_ids = list(set(re.findall(id_pattern, t)).difference( + set(re.findall(xtest_id_pattern, t)))) + return device_ids + + @disable_input + def activate_vim_window(self): + self.xdotool.activate_window(self.vim_window_id) + + @disable_input + def activate_editor_window(self): + self.xdotool.activate_window(self.editor_window_id) + + @disable_input + def activate_command_window(self): + self.xdotool.activate_window(self.command_window_id) + + def __launch_key_request_process(self): + """ + Pick an unused port and start a TCP server. MATLAB will send callback + requests through this socket. + :return: port + """ + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.sock.bind(('localhost', 0)) + _, self.key_handler_port = self.sock.getsockname() + + self.key_handler_queue = multiprocessing.Queue() + self.key_handler = multiprocessing.Process( + target=self.__key_request_handler, + args=(self.sock, + [self.command_window_id, + self.editor_window_id, + self.vim_window_id], + self.key_handler_queue) + ) + self.key_handler.start() + self.key_handler_queue.get(True, 5) + return self.key_handler_port + + def __key_request_handler(self, sock, window_ids, queue): + """ + Routine for a process that handles key press requests from MATLAB. + :param port: + :param window_ids: [command window, editor window, vim window] + :param queue: + """ + sock.listen(1) + queue.put(True) + while True: + client_sock, _ = sock.accept() + msg = client_sock.recv(1024).strip() + if msg == 'perform-run-cell': + self.xdotool.activate_window(window_ids[0]) + self.xdotool.activate_window(window_ids[1]) + self.xdotool.enter_keys(['Ctrl+KP_Enter']) + self.xdotool.activate_window(window_ids[2]) + queue.put(True) + client_sock.close() + sock.close() + + @disable_input + def __type_in_window(self, window_id, string): + pyperclip.copy(string) + self.xdotool.enter_keys(['Ctrl+y'], window_id) + + @disable_input + def __setup_matlab_path(self): + mpath = find_plugin_matlab_path() + self.run_commands(["addpath(genpath('{}'))".format(mpath)], False) diff --git a/rplugin/python3/vim_matlab/python_vim_utils.py b/rplugin/python3/vim_matlab/python_vim_utils.py new file mode 100644 index 0000000..a175cdd --- /dev/null +++ b/rplugin/python3/vim_matlab/python_vim_utils.py @@ -0,0 +1,186 @@ +import re + +__author__ = 'Daeyun Shin' + +vim = None + + +class PythonVimUtils(object): + comment_pattern = re.compile(r"(^(?:(?') + lines = buf[row1 - 1:row2] + if len(lines) == 1: + lines[0] = lines[0][col1:col2 + 1] + else: + lines[0] = lines[0][col1:] + lines[-1] = lines[-1][:col2 + 1] + + if ignore_matlab_comments: + return PythonVimUtils.trim_matlab_code(lines) + return lines + + @staticmethod + def get_lines(): + buf = vim.current.buffer + return buf + + @staticmethod + def get_text_selection(): + pass + + @staticmethod + def is_current_buffer_modified(): + return vim.eval('&modified') == 1 + + @staticmethod + def echo_text(string): + vim.command("echo '{}'".format(string.replace("'", r"''"))) + + @staticmethod + def get_current_matlab_cell_lines(ignore_matlab_comments=True): + lines = PythonVimUtils.get_lines() + crow, _ = PythonVimUtils.get_cursor() + + cell_start = crow - 1 + while cell_start > 0: + if PythonVimUtils.cell_header_pattern.match(lines[cell_start]): + cell_start += 1 + break + cell_start -= 1 + + cell_end = crow - 1 + while cell_end < len(lines) - 1: + cell_end += 1 + if PythonVimUtils.cell_header_pattern.match(lines[cell_end]): + cell_end -= 1 + break + + lines = lines[cell_start:cell_end + 1] + if ignore_matlab_comments: + return PythonVimUtils.trim_matlab_code(lines) + return lines + + @staticmethod + def trim_matlab_code(lines): + new_lines = [] + + ellipsis = PythonVimUtils.ellipsis_pattern + + is_continuation = False + + for line in lines: + line = PythonVimUtils.comment_pattern.sub(r"\1", line).strip() + if line in ('', '...'): + continue + + has_ellipsis_suffix = ellipsis.match(line) + if has_ellipsis_suffix: + line = ellipsis.sub(r"\1", line) + + if is_continuation and new_lines: + new_lines[-1] += line + else: + new_lines.append(line) + + is_continuation = has_ellipsis_suffix + + return new_lines + + @staticmethod + def get_variable_under_cursor(): + line = PythonVimUtils.get_current_line() + if not line: + return None + _, col = PythonVimUtils.get_cursor() + + for m in PythonVimUtils.variable_pattern.finditer(line): + if m.start() < col <= m.end(): + return m.group(0) + + @staticmethod + def get_current_line(): + row, col = PythonVimUtils.get_cursor() + lines = PythonVimUtils.get_lines() + if len(lines) < row: + return None + return lines[row - 1] + + @staticmethod + def get_current_matlab_line(): + row, col = PythonVimUtils.get_cursor() + lines = PythonVimUtils.get_lines() + if len(lines) < row: + return None + + cur = row - 1 + + cont = PythonVimUtils.ellipsis_pattern + + off = 0 + while cur + 1 < len(lines) and cont.match(lines[cur + off]): + off += 1 + + line = lines[cur + off] + + while cur + off > 0 and cont.match(lines[cur + off - 1]): + line = cont.sub(r"\1", lines[cur + off - 1]) + line + off -= 1 + + return line + + @staticmethod + def get_options(): + lines = vim.current.buffer[:20] + options = {} + for line in lines: + m = PythonVimUtils.option_line_pattern.match(line) + if m is None: + break + options[m.group(1)] = [s.strip() for s in m.group(2).split(',')] + return options + + @staticmethod + def get_function_blocks(): + lines = vim.current.buffer + content = '\n'.join(lines) + function_blocks = {} + for m in PythonVimUtils.function_block_pattern.finditer(content): + function_blocks[m.group(1)] = m.group(0).strip() + + return function_blocks diff --git a/rplugin/python3/vim_matlab/requirements.txt b/rplugin/python3/vim_matlab/requirements.txt new file mode 100644 index 0000000..6e22162 --- /dev/null +++ b/rplugin/python3/vim_matlab/requirements.txt @@ -0,0 +1,3 @@ +neovim>=0.0.28 +pyperclip>=1.5.9 +sh>=1.11 \ No newline at end of file diff --git a/rplugin/python3/vim_matlab/xdotool.py b/rplugin/python3/vim_matlab/xdotool.py new file mode 100644 index 0000000..7a98040 --- /dev/null +++ b/rplugin/python3/vim_matlab/xdotool.py @@ -0,0 +1,81 @@ +from command import Command +from vim_matlabvim_matlab..logger import log + +__author__ = 'daeyun' + +# 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/. + + +class InvalidWindowIdError(Exception): + pass + + +class Xdotool(): + def __init__(self, timeout=2): + if Command('which xdotool').run()[2] != 0: + raise RuntimeError('xdotool not found') + self.timeout = timeout + + def run(self, command): + log.info(command) + result = Command(command).run(self.timeout) + if result[2] != 0: + if 'BadWindow' in result[1]: + raise InvalidWindowIdError() + log.error(result[1]) + raise RuntimeError() + return result[0] + + def find_windows_by_class(self, window_class): + result = self.run( + 'xdotool search --maxdepth 4 --class {}'.format(window_class)) + window_ids = result.strip().split() + + if len(window_ids) == 0: + raise RuntimeError( + 'Unable to find window class "{}"'.format(window_class)) + + return window_ids + + def find_windows_by_name(self, window_name): + result = self.run( + 'xdotool search --maxdepth 4 --name "{}"'.format(window_name)) + window_ids = result.strip().split() + + if len(window_ids) == 0: + raise RuntimeError( + 'Unable to find window name {}'.format(window_name)) + + return window_ids + + def find_windows(self, window_name, window_class, is_unique=True): + result = list( + set(self.find_windows_by_class(window_class)).intersection( + set(self.find_windows_by_name(window_name)))) + + if len(result) == 0: + raise RuntimeError( + 'Window not found: {}, {}'.format(window_name, window_class)) + + if is_unique and len(result) > 1: + raise RuntimeError( + 'More and one window found: {}, {}'.format(window_name, + window_class)) + + return result + + def enter_keys(self, keys, window_id=None): + if window_id is None: + self.run('xdotool key --clearmodifier {}'.format(' '.join(keys))) + else: + self.run( + 'xdotool windowactivate --sync {} key --clearmodifiers {}'.format( + window_id, ' '.join(keys))) + + def get_active_window_id(self): + return self.run('xdotool getactivewindow').strip() + + def activate_window(self, window_id): + self.run('xdotool windowactivate --sync {}'.format(window_id)) diff --git a/scripts/kill-process.sh b/scripts/kill-process.sh new file mode 100644 index 0000000..4c8c0f6 --- /dev/null +++ b/scripts/kill-process.sh @@ -0,0 +1,2 @@ +#!/bin/sh +pkill -f /MATLAB; pkill -f vim-matlab-server diff --git a/scripts/reload-vim.sh b/scripts/reload-vim.sh new file mode 100644 index 0000000..e3563c4 --- /dev/null +++ b/scripts/reload-vim.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +set -o xtrace + +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +find $DIR/../rplugin/python3 -type f -name '*.pyc' -exec rm {} \; +find $DIR/../rplugin/python3 -type d -name '__pycache__' -exec rm {} \; +nvim -c "UpdateRemotePlugins" -c "q" && nvim $@ -c "UpdateRemotePlugins" diff --git a/scripts/run-tests.sh b/scripts/run-tests.sh new file mode 100644 index 0000000..8e323a4 --- /dev/null +++ b/scripts/run-tests.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -o xtrace + +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +SRC_ROOT="${DIR}/../rplugin/python" + +cd ${DIR}/.. + +PYTHONPATH="${SRC_ROOT}:${SRC_ROOT}/vim_matlab" py.test -s diff --git a/scripts/vim-matlab-server.py b/scripts/vim-matlab-server.py new file mode 100644 index 0000000..0f0c05e --- /dev/null +++ b/scripts/vim-matlab-server.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python3 + +__author__ = 'daeyun' + +use_pexpect = True +if use_pexpect: + try: + import pexpect + except ImportError: + use_pexpect = False +if not use_pexpect: + from subprocess import Popen, PIPE + +import socketserver +import os +import random +import signal +import string +import sys +import threading +import time +import subprocess +from sys import stdin + +hide_until_newline = False +auto_restart = False +server = None + + +class Matlab: + def __init__(self): + self.launch_process() + + def launch_process(self): + self.kill() + if use_pexpect: + self.proc = pexpect.spawn("matlab", ["-nosplash", "-nodesktop"]) + else: + # self.proc = Popen(["matlab", "-nosplash", "-nodesktop"], stdin=PIPE, + # close_fds=True, preexec_fn=os.setsid) + # self.proc = Popen(["matlab", "-nosplash", "-nodesktop"], stdin=PIPE, + # close_fds=True, shell=True, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) + self.proc = Popen(["matlab", "-nosplash", "-nodesktop"], stdin=PIPE, + close_fds=True) + return self.proc + + def cancel(self): + os.kill(self.proc.pid, signal.SIGINT) + + def kill(self): + try: + os.killpg(self.proc.pid, signal.SIGTERM) + except: + pass + + def run_code(self, code, run_timer=True): + num_retry = 0 + rand_var = ''.join( + random.choice(string.ascii_uppercase) for _ in range(12)) + + if run_timer: + command = ("{randvar}=tic;{code},try,toc({randvar}),catch,end" + ",clear('{randvar}');\n").format(randvar=rand_var, + code=code.strip()) + else: + command = "{}\n".format(code.strip()) + + # The maximum number of characters allowed on a single line in Matlab's CLI is 4096. + delim = ' ...\n' + line_size = 4095 - len(delim) + command = delim.join([command[i:i+line_size] for i in range(0, len(command), line_size)]) + + global hide_until_newline + while num_retry < 3: + try: + if use_pexpect: + hide_until_newline = True + self.proc.send(command) + else: + self.proc.stdin.write(command) + self.proc.stdin.flush() + break + except Exception as ex: + print(ex) + self.launch_process() + num_retry += 1 + time.sleep(1) + + +class TCPHandler(socketserver.StreamRequestHandler): + def handle(self): + print_flush("New connection: {}".format(self.client_address)) + + while True: + msg = self.rfile.readline() + if not msg: + break + msg = msg.strip().decode("utf-8") + print_flush((msg[:74] + '...') if len(msg) > 74 else msg, end='') + + options = { + 'kill': self.server.matlab.kill, + 'cancel': self.server.matlab.cancel, + } + + if msg in options: + options[msg]() + else: + self.server.matlab.run_code(msg) + print_flush('Connection closed: {}'.format(self.client_address)) + + +def status_monitor_thread(matlab): + while True: + matlab.proc.wait() + if not auto_restart: + break + print_flush("Restarting...") + matlab.launch_process() + start_thread(target=forward_input, args=(matlab,)) + time.sleep(1) + + global server + server.shutdown() + server.server_close() + + +def output_filter(output_string): + """ + If the global variable `hide_until_newline` is True, this function will + return an empty string until it sees a string that contains a newline. + Used with `pexpect.spawn.interact` and `pexpect.spawn.send` to hide the + raw command from being shown. + + :param output_string: String forwarded from MATLAB's stdout. Provided + by `pexpect.spawn.interact`. + :return: The filtered string. + """ + global hide_until_newline + return output_string + # TODO broken ... + # if hide_until_newline: + # if '\n' in output_string: + # hide_until_newline = False + # return output_string[output_string.find('\n'):] + # else: + # return '' + # else: + # return output_string + + +def input_filter(input_string): + # Detect C-\ + if input_string == '\x1c': + print_flush('Terminating') + global auto_restart + auto_restart = False + return input_string + + +def forward_input(matlab): + """Forward stdin to Matlab.proc's stdin.""" + if use_pexpect: + matlab.proc.interact(input_filter=input_filter,output_filter=output_filter) + else: + while True: + matlab.proc.stdin.write(stdin.readline()) + + +def start_thread(target=None, args=()): + thread = threading.Thread(target=target, args=args) + thread.daemon = True + thread.start() + + +def print_flush(value, end='\n'): + """Manually flush the line if using pexpect.""" + if use_pexpect: + value += '\b' * len(value) + sys.stdout.write(value + end) + sys.stdout.flush() + + +def main(): + host, port = "localhost", 43889 + socketserver.TCPServer.allow_reuse_address = True + + global server + server = socketserver.TCPServer((host, port), TCPHandler) + server.matlab = Matlab() + + start_thread(target=forward_input, args=(server.matlab,)) + start_thread(target=status_monitor_thread, args=(server.matlab,)) + + print_flush("Started server: {}".format((host, port))) + server.serve_forever() + + +if __name__ == "__main__": + main() diff --git a/snippets/matlab.snippets b/snippets/matlab.snippets new file mode 100644 index 0000000..20b1106 --- /dev/null +++ b/snippets/matlab.snippets @@ -0,0 +1,27 @@ +snippet addpath + addpath(genpath('${1}')); +snippet function + function [varargout] = ${1:`vim_snippets#Filename()`}(varargin) + ${2} +snippet functionInputParser + function [varargout] = ${1:`vim_snippets#Filename()`}(varargin) + p=inputParser; + addOptional(p, 'isVerbose', false); + try parse(p,varargin{:}),catch parse(p,{}),end,args=p.Results; + %% + ${2} +snippet for + for ${1:i} = 1:${2} + ${3} + end +snippet bs + bsxfun(@${3:rdivide},); +snippet % + %% + ${1} + + %% +# Specific to https://github.com/daeyun/vim-matlab +snippet %%! + %%! vim-matlab: split(${1:`vim_snippets#Filename()`_temp}) + ${2} diff --git a/syntax/matlab.vim b/syntax/matlab.vim new file mode 100644 index 0000000..e8d3ac2 --- /dev/null +++ b/syntax/matlab.vim @@ -0,0 +1,367 @@ +" Vim syntax file +" Language: Matlab +" Maintainer: Fabrice Guy +" Original authors: Mario Eusebio and Preben Guldberg +" Last Change: 2008 Oct 16 : added try/catch/rethrow and class statements +" 2008 Oct 28 : added highlighting for most of Matlab functions +" 2009 Nov 23 : added 'todo' keyword in the matlabTodo keywords +" (for doxygen support) + +" For version 5.x: Clear all syntax items +" For version 6.x: Quit when a syntax file was already loaded +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +syn keyword matlabStatement return function +syn keyword matlabConditional switch case else elseif end if otherwise break continue +syn keyword matlabRepeat do for while +syn keyword matlabStorageClass classdef methods properties events persistent global +syn keyword matlabExceptions try catch rethrow throw + +syn keyword matlabTodo contained TODO NOTE FIXME XXX +syn keyword matlabImport import +" If you do not want these operators lit, uncommment them and the "hi link" below +syn match matlabRelationalOperator "\(==\|\~=\|>=\|<=\|=\~\|>\|<\|=\)" +syn match matlabArithmeticOperator "[-+]" +syn match matlabArithmeticOperator "\.\=[*/\\^]" +syn match matlabLogicalOperator "[&|~]" +syn keyword matlabBoolean true false + +syn match matlabLineContinuation "\.\{3}" + +" String +syn region matlabString start=+'+ end=+'+ oneline + +" If you don't like tabs +syn match matlabTab "\t" + +" Standard numbers +syn match matlabNumber "\<\d\+[ij]\=\>" +" floating point number, with dot, optional exponent +syn match matlabFloat "\<\d\+\(\.\d*\)\=\([edED][-+]\=\d\+\)\=[ij]\=\>" +" floating point number, starting with a dot, optional exponent +syn match matlabFloat "\.\d\+\([edED][-+]\=\d\+\)\=[ij]\=\>" +syn keyword matlabConstant eps Inf NaN pi + + +" Transpose character and delimiters: Either use just [...] or (...) aswell +syn match matlabDelimiter "[][]" +"syn match matlabDelimiter "[][()]" +syn match matlabTransposeOperator "[])a-zA-Z0-9.]'"lc=1 + +syn match matlabSemicolon ";" + +syn match matlabComment "%.*$" contains=matlabTodo,matlabTab +syn match matlabCell "^%%\([^%]\|$\).*$" +syn match matlabPluginMacro "^%%\!.*$" +syn region matlabBlockComment start=+%{+ end=+%}+ contains=matlabBlockComment + + +" trigonometric +syn keyword matlabFunc acos acosd acosh acot acotd acoth acsc acscd acsch asec asecd asech asin asind asinh +syn keyword matlabFunc atan atan2 atand atanh cos cosd cosh cot cotd coth csc cscd csch hypot sec secd +syn keyword matlabFunc sech sin sind sinh tan tand tanh +" exponential +syn keyword matlabFunc exp expm1 log log10 log1p log2 nextpow2 nthroot pow2 reallog realpow realsqrt sqrt +" Complex +syn keyword matlabFunc abs angle complex conj cplxpair imag real sign unwrap +" Rounding and Remainder +syn keyword matlabFunc ceil fix floor idivide mod rem round +"Discrete Math (e.g., Prime Factors) +syn keyword matlabFunc factor factorial gcd isprime lcm nchoosek perms primes rat rats +"Polynomials +syn keyword matlabFunc conv deconv poly polyder polyeig polyfit polyint polyval polyvalm residue roots +"Numeric Types +syn keyword matlabFunc arrayfun cast cat class find intmax intmin intwarning ipermute isa isequal isequalwithequalnans isfinite isinf isnan isnumeric isreal isscalar isvector permute realmax realmin reshape squeeze zeros +"Characters and Strings +syn keyword matlabFunc cellstr char eval findstr isstr regexp sprintf sscanf strcat strcmp strcmpi strings strjust strmatch strread strrep strtrim strvcat +"Structures +syn keyword matlabFunc cell2struct deal fieldnames getfield isfield isstruct orderfields rmfield setfield struct struct2cell structfun +"Cell Arrays +syn keyword matlabFunc cell cell2mat celldisp cellfun cellplot iscell iscellstr mat2cell num2cell +"Function Handles +syn keyword matlabFunc feval func2str functions str2func +"Java Classes and Objects +syn keyword matlabFunc clear depfun exist im2java inmem javaaddpath javaArray javachk Generate javaclasspath javaMethod javaObject javarmpath methodsview usejava which +"Data Type Identification +syn keyword matlabFunc ischar isfloat isinteger isjava islogical isobject validateattributes who whos +"Data type conversion +"Numeric +syn keyword matlabFunc double int8 int16 int32 int64 single typecast uint8 uint16 uint32 uint64 +"String to Numeric +syn keyword matlabFunc base2dec bin2dec hex2dec hex2num str2double str2num unicode2native +"Numeric to String +syn keyword matlabFunc dec2base dec2bin dec2hex int2str mat2str native2unicode num2str +"Other Conversions +syn keyword matlabFunc datestr logical num2hex str2mat +"String Creation +syn keyword matlabFunc blanks +"String Identification +syn keyword matlabFunc isletter isspace isstrprop validatestring +"String Manipulation +syn keyword matlabFunc deblank lower upper +"String Parsing +syn keyword matlabFunc regexpi regexprep regexptranslate strfind strtok +"String Evaluation +syn keyword matlabFunc evalc evalin +"String Comparison +syn keyword matlabFunc strncmp strncmpi +"Bit-wise Functions +syn keyword matlabFunc bitand bitcmp bitget bitmax bitor bitset bitshift bitxor swapbytes +"Logical Functions +syn keyword matlabFunc all and any iskeyword isvarname not or xor +"Predefined Dialog Boxes +syn keyword matlabFunc dialog errordlg export2wsdlg helpdlg inputdlg listdlg msgbox printdlg printpreview questdlg uigetdir uigetfile uigetpref uiopen uiputfile uisave uisetcolor uisetfont waitbar warndlg +"Deploying User Interfaces +syn keyword matlabFunc guidata guihandles movegui openfig +"Developing User Interfaces +syn keyword matlabFunc addpref getappdata getpref ginput guide inspect isappdata ispref rmappdata rmpref setappdata setpref uisetpref waitfor waitforbuttonpress +"User Interface Objects +syn keyword matlabFunc uibuttongroup uicontextmenu uicontrol uimenu uipanel uipushtool uitoggletool uitoolbar menu +"Finding Objects from Callbacks +syn keyword matlabFunc findall findfigs findobj gcbf gcbo +"GUI Utility Functions +syn keyword matlabFunc align getpixelposition listfonts selectmoveresize setpixelposition textwrap uistack +"Controlling Program Execution +syn keyword matlabFunc uiresume uiwait +"Basic Plots and Graphs +syn keyword matlabFunc box errorbar hold loglog plot plot3 plotyy polar semilogx semilogy subplot +"Plotting Tools +syn keyword matlabFunc figurepalette pan plotbrowser plotedit plottools propertyeditor rotate3d showplottool zoom + +"Annotating Plots +syn keyword matlabFunc annotation clabel datacursormode datetick gtext legend line rectangle texlabel title xlabel ylabel zlabel +"Area, Bar, and Pie Plots +syn keyword matlabFunc area bar barh bar3 bar3h pareto pie pie3 +"Contour Plots +syn keyword matlabFunc contour contour3 contourc contourf ezcontour ezcontourf +"Direction and Velocity Plots +syn keyword matlabFunc comet comet3 compass feather quiver quiver3 +"Discrete Data Plots +syn keyword matlabFunc stairs stem stem3 +"Function Plots +syn keyword matlabFunc ezmesh ezmeshc ezplot ezplot3 ezpolar ezsurf ezsurfc fplot +"Histograms +syn keyword matlabFunc hist histc rose +"Polygons and Surfaces +syn keyword matlabFunc convhull cylinder delaunay delaunay3 delaunayn dsearch dsearchn ellipsoid fill fill3 inpolygon pcolor polyarea rectint ribbon slice sphere tsearch tsearchn voronoi waterfall +"Scatter/Bubble Plots +syn keyword matlabFunc plotmatrix scatter scatter3 +"Animation +syn keyword matlabFunc getframe im2frame movie noanimate +"Bit-Mapped Images +syn keyword matlabFunc frame2im image imagesc imfinfo imformats imread imwrite ind2rgb +"Printing +syn keyword matlabFunc frameedit hgexport orient print printopt saveas +"Handle Graphics +syn keyword matlabFunc allchild ancestor copyobj delete gca gco get ishandle propedit set +"Object +syn keyword matlabFunc axes figure hggroup hgtransform light patch +"root object +syn keyword matlabFunc surface text +"Plot Objects +syn keyword matlabFunc clf close closereq drawnow gcf hgload hgsave newplot opengl refresh +"Axes Operations +syn keyword matlabFunc axis cla grid ishold makehgtform +"Operating on Object Properties +syn keyword matlabFunc linkaxes linkprop refreshdata +"Data analysis +"Basic Operations +syn keyword matlabFunc brush cumprod cumsum linkdata prod sort sortrows sum +"Descriptive Statistics +syn keyword matlabFunc corrcoef cov max mean median min mode std var +"Filtering and Convolution +syn keyword matlabFunc conv2 convn detrend filter filter2 +"Interpolation and Regression +syn keyword matlabFunc interp1 interp2 interp3 interpn mldivide mrdivide +"Fourier Transforms +syn keyword matlabFunc fft fft2 fftn fftshift fftw ifft ifft2 ifftn ifftshift +"Derivatives and Integrals +syn keyword matlabFunc cumtrapz del2 diff gradient trapz +"File Operations +syn keyword matlabFunc cd copyfile dir fileattrib filebrowser isdir lookfor ls matlabroot mkdir movefile pwd recycle rehash rmdir toolboxdir type what +"Operating System Interface +syn keyword matlabFunc clipboard computer dos getenv hostid maxNumCompThreads perl setenv system unix winqueryreg +"MATLAB Version and License +syn keyword matlabFunc ismac ispc isstudent isunix javachk license prefdir usejava ver verLessThan version +"Basic Information +syn keyword matlabFunc disp display isempty issparse length ndims numel size +"Elementary Matrices and Arrays +syn keyword matlabFunc blkdiag diag eye freqspace ind2sub linspace logspace meshgrid ndgrid ones rand randn sub2ind +"Array Operations +syn keyword matlabFunc accumarray bsxfun cross dot kron tril triu +"Array Manipulation +syn keyword matlabFunc circshift flipdim fliplr flipud horzcat inline repmat rot90 shiftdim vectorize vertcat +"Specialized Matrices +syn keyword matlabFunc compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson +"Matrix Analysis +syn keyword matlabFunc cond condeig det norm normest null orth rank rcond rref subspace trace +"Linear Equations +syn keyword matlabFunc chol cholinc condest funm ilu inv linsolve lscov lsqnonneg lu luinc pinv qr +"Eigenvalues and Singular Values +syn keyword matlabFunc balance cdf2rdf eig eigs gsvd hess ordeig ordqz ordschur rsf2csf schur sqrtm ss2tf svd svds +"Matrix Logarithms and Exponentials +syn keyword matlabFunc expm logm +"Factorization +syn keyword matlabFunc cholupdate planerot qrdelete qrinsert qrupdate qz +"Interpolation +syn keyword matlabFunc griddata griddata3 griddatan interp1q interpft mkpp padecoef pchip ppval spline unmkpp +"Delaunay Triangulation and Tessellation +syn keyword matlabFunc tetramesh trimesh triplot trisurf +"Convex Hull +syn keyword matlabFunc convhulln +"Voronoi Diagrams +syn keyword matlabFunc voronoin +"Cartesian Coordinate System Conversion +syn keyword matlabFunc cart2pol cart2sph pol2cart sph2cart +"Ordinary Differential Equations (IVP) +syn keyword matlabFunc decic deval ode15i ode23 ode45 ode113 ode15s ode23s ode23t ode23tb odefile odeget odeset odextend +"Delay Differential Equations +syn keyword matlabFunc dde23 ddeget ddesd ddeset +"Boundary Value Problems +syn keyword matlabFunc bvp4c bvp5c bvpget bvpinit bvpset bvpxtend +"Partial Differential Equations +syn keyword matlabFunc pdepe pdeval +"Optimization +syn keyword matlabFunc fminbnd fminsearch fzero optimget optimset +"Numerical Integration (Quadrature) +syn keyword matlabFunc dblquad quad quadgk quadl quadv triplequad +"Specialized Math +syn keyword matlabFunc airy besselh besseli besselj besselk bessely beta betainc betaln ellipj ellipke erf erfc erfcx erfinv erfcinv expint gamma gammainc gammaln legendre psi +"Elementary Sparse Matrices +syn keyword matlabFunc spdiags speye sprand sprandn sprandsym +"Full to Sparse Conversion +syn keyword matlabFunc full sparse spconvert +"Working with Sparse Matrices +syn keyword matlabFunc nnz nonzeros nzmax spalloc spfun spones spparms spy +"Reordering Algorithms +syn keyword matlabFunc amd colamd colperm dmperm ldl randperm symamd symrcm +"Linear Algebra +syn keyword matlabFunc spaugment sprank +"Linear Equations (Iterative Methods) +syn keyword matlabFunc bicg bicgstab cgs gmres lsqr minres pcg qmr symmlq +"Tree Operations +syn keyword matlabFunc etree etreeplot gplot symbfact treelayout treeplot +"Timeseries +"General Purpose +syn keyword matlabFunc getdatasamplesize getqualitydesc timeseries tsprops tstool +"Data Manipulation +syn keyword matlabFunc addsample ctranspose delsample getabstime getinterpmethod getsampleusingtime idealfilter resample setabstime setinterpmethod synchronize transpose +"Event Data +syn keyword matlabFunc addevent delevent gettsafteratevent gettsafterevent gettsatevent gettsbeforeatevent gettsbeforeevent gettsbetweenevents +"Descriptive Statistics +syn keyword matlabFunc iqr + +"Time Series Collections +"General Purpose +syn keyword matlabFunc tscollection +"Data Manipulation +syn keyword matlabFunc addsampletocollection addts delsamplefromcollection gettimeseriesnames removets settimeseriesnames +"Set Functions +syn keyword matlabFunc intersect ismember issorted setdiff setxor union unique +"Date and Time Functions +syn keyword matlabFunc addtodate calendar clock cputime date datenum datevec eomday etime now weekday +"M-File Functions and Scripts +syn keyword matlabFunc addOptional addParamValue addRequired createCopy depdir echo input inputname inputParser mfilename namelengthmax nargchk nargin nargout nargoutchk parse pcode +"script Script M-file description +syn keyword matlabFunc varargin varargout +"Evaluation of Expressions and Functions +syn keyword matlabFunc ans assert builtin pause run script symvar +"Timer Functions +syn keyword matlabFunc isvalid start startat stop timer timerfind timerfindall wait +"Variables and Functions in Memory +syn keyword matlabFunc assignin datatipinfo genvarname isglobal memory mislocked mlock munlock pack +"Control Flow +syn keyword matlabFunc parfor +"Error Handling +syn keyword matlabFunc addCause error ferror getReport last lasterr lasterror lastwarn warning +"Classes and Objects +syn keyword matlabFunc addlistener addprop dynamicprops +"events Display class event names +syn keyword matlabFunc findprop getdisp handle hgsetget inferiorto loadobj metaclass notify saveobj setdisp subsasgn subsindex subsref substruct superiorto +"File Name Construction +syn keyword matlabFunc filemarker fileparts filesep fullfile tempdir tempname +"Opening, Loading, Saving Files +syn keyword matlabFunc daqread filehandle importdata load open save uiimport winopen +"Memory Mapping +syn keyword matlabFunc memmapfile +"Low-Level File I/O +syn keyword matlabFunc fclose feof fgetl fgets fopen fprintf fread frewind fscanf fseek ftell fwrite + +"Text Files +syn keyword matlabFunc csvread csvwrite dlmread dlmwrite textread textscan +"XML Documents +syn keyword matlabFunc xmlread xmlwrite xslt +"Microsoft Excel Functions +syn keyword matlabFunc xlsfinfo xlsread xlswrite +"Lotus 1-2-3 Functions +syn keyword matlabFunc wk1finfo wk1read wk1write +"Common Data Format (CDF) +syn keyword matlabFunc cdfepoch cdfinfo cdfread cdfwrite todatenum +"Flexible Image Transport System +syn keyword matlabFunc fitsinfo fitsread +"Hierarchical Data Format (HDF) +syn keyword matlabFunc hdf hdf5 hdf5info hdf5read hdf5write hdfinfo hdfread hdftool +"Band-Interleaved Data +syn keyword matlabFunc multibandread multibandwrite + + +" Define the default highlighting. +" For version 5.7 and earlier: only when not done already +" For version 5.8 and later: only when an item doesn't have highlighting yet +if version >= 508 || !exists("did_matlab_syntax_inits") + if version < 508 + let did_matlab_syntax_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + + HiLink matlabTransposeOperator matlabOperator + HiLink matlabLineContinuation Special + HiLink matlabLabel Label + HiLink matlabConditional Conditional + HiLink matlabRepeat Repeat + HiLink matlabTodo Todo + HiLink matlabString String + HiLink matlabDelimiter Identifier + HiLink matlabTransposeOther Identifier + HiLink matlabNumber Number + HiLink matlabFloat Float + HiLink matlabConstant Constant + HiLink matlabImplicit matlabStatement + HiLink matlabStatement Statement + HiLink matlabSemicolon SpecialChar + HiLink matlabComment Comment + HiLink matlabBlockComment Comment + HiLink matlabImport Include + HiLink matlabBoolean Boolean + HiLink matlabStorageClass StorageClass + + HiLink matlabArithmeticOperator matlabOperator + HiLink matlabRelationalOperator matlabOperator + HiLink matlabLogicalOperator matlabOperator + HiLink matlabOperator Operator + HiLink matlabExceptions Exception + HiLink matlabFunc Function + + HiLink matlabPluginMacro Comment + +"optional highlighting + "HiLink matlabIdentifier Identifier + "HiLink matlabTab Error + delcommand HiLink + + + highlight matlabCell ctermfg=255 guifg=#eeeeee ctermbg=022 guibg=#005f00 cterm=bold gui=bold + highlight matlabPluginMacro ctermfg=244 guifg=#808080 ctermbg=236 guibg=#303030 cterm=underline gui=underline + +endif + +let b:current_syntax = "matlab" + + +"EOF vim: ts=8 noet tw=100 sw=8 sts=0 diff --git a/tests/test_patterns.py b/tests/test_patterns.py new file mode 100644 index 0000000..88f62a1 --- /dev/null +++ b/tests/test_patterns.py @@ -0,0 +1,30 @@ +from vim_matlab import python_vim_utils + +def strip_comments(line): + pattern = python_vim_utils.PythonVimUtils.comment_pattern + return pattern.sub(r"\1", line).strip() + +def test_comment_pattern(): + assert "hello" == strip_comments("hello") + assert "hello" == strip_comments("hello %") + assert "hello" == strip_comments("hello %%") + assert "disp('%')" == strip_comments("disp('%') % ") + assert "disp('%')" == strip_comments("disp('%')") + assert "disp('')" == strip_comments("disp('')") + assert "disp('')" == strip_comments("disp('')% ") + assert "disp('')" == strip_comments("disp('') % ") + assert "disp('')" == strip_comments("disp('') %%") + assert "disp('%');disp('%')" == strip_comments("disp('%');disp('%')%disp('')") + assert "A = sqrtm(B) \ C.';" == strip_comments("A = sqrtm(B) \ C.'; % foo") + assert "disp('100%');A = sqrtm(B) \ C.';" == strip_comments("disp('100%');A = sqrtm(B) \ C.';% foo") + assert "disp('%');C.'" == strip_comments("disp('%');C.'") + assert "disp('%');C.'" == strip_comments("disp('%');C.'% '") + assert "disp('%');C.'" == strip_comments("disp('%');C.'% ''") + assert "disp('%');C.'" == strip_comments("disp('%');C.'% '''") + assert "disp('%');C.'" == strip_comments("disp('%');C.'% '.''") + assert "disp('%');C.'" == strip_comments("disp('%');C.'% ' '") + assert "disp('%');C.'" == strip_comments("disp('%');C.'% ' ' %") + assert "disp('%');C.'" == strip_comments("disp('%');C.'% ' %' ") + assert "disp('%');C.'" == strip_comments("disp('%');C.'% ' %' %") + assert "disp('% ''');C.';" == strip_comments("disp('% ''');C.'; % ' %' %") + assert "disp('% .''');C.';" == strip_comments("disp('% .''');C.'; % ' %' %") diff --git a/vscode-matlab-interactive-terminal-master/.eslintrc.js b/vscode-matlab-interactive-terminal-master/.eslintrc.js new file mode 100644 index 0000000..d5a616b --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/.eslintrc.js @@ -0,0 +1,44 @@ +module.exports = { + "env": { + "es6": true, + "node": true + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "tsconfig.json", + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "@typescript-eslint/member-delimiter-style": [ + "warn", + { + "multiline": { + "delimiter": "semi", + "requireLast": true + }, + "singleline": { + "delimiter": "semi", + "requireLast": false + } + } + ], + "@typescript-eslint/naming-convention": "warn", + "@typescript-eslint/no-unused-expressions": "warn", + "@typescript-eslint/semi": [ + "warn", + "always" + ], + "curly": "warn", + "eqeqeq": [ + "warn", + "always" + ], + "no-redeclare": "warn", + "no-throw-literal": "warn", + "no-unused-expressions": "warn", + "semi": "warn" + } +}; diff --git a/vscode-matlab-interactive-terminal-master/.gitattributes b/vscode-matlab-interactive-terminal-master/.gitattributes new file mode 100644 index 0000000..5dc46e6 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/.gitattributes @@ -0,0 +1,3 @@ +* text=auto eol=lf +*.{cmd,[cC][mM][dD]} text eol=crlf +*.{bat,[bB][aA][tT]} text eol=crlf \ No newline at end of file diff --git a/vscode-matlab-interactive-terminal-master/.gitignore b/vscode-matlab-interactive-terminal-master/.gitignore new file mode 100644 index 0000000..307e100 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/.gitignore @@ -0,0 +1,7 @@ +out +node_modules +.vscode-test/ +*.vsix +__pycache__/ +*/__pycache__/ +*.pyc \ No newline at end of file diff --git a/vscode-matlab-interactive-terminal-master/.vscode/extensions.json b/vscode-matlab-interactive-terminal-master/.vscode/extensions.json new file mode 100644 index 0000000..0c2c85b --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "dbaeumer.vscode-eslint" + ] +} \ No newline at end of file diff --git a/vscode-matlab-interactive-terminal-master/.vscode/launch.json b/vscode-matlab-interactive-terminal-master/.vscode/launch.json new file mode 100644 index 0000000..b1fbaf5 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/.vscode/launch.json @@ -0,0 +1,36 @@ +// 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", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/out/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + }, + { + "name": "Extension Tests", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" + ], + "outFiles": [ + "${workspaceFolder}/out/test/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + } + ] +} diff --git a/vscode-matlab-interactive-terminal-master/.vscode/settings.json b/vscode-matlab-interactive-terminal-master/.vscode/settings.json new file mode 100644 index 0000000..de5d132 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/.vscode/settings.json @@ -0,0 +1,12 @@ +// 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 + }, + "search.exclude": { + "out": true // set this to false to include "out" folder in search results + }, + // Turn off tsc task auto detection since we have the necessary tasks as npm scripts + "typescript.tsc.autoDetect": "off", + "typescript.tsdk": "node_modules/typescript/lib" +} \ No newline at end of file diff --git a/vscode-matlab-interactive-terminal-master/.vscode/tasks.json b/vscode-matlab-interactive-terminal-master/.vscode/tasks.json new file mode 100644 index 0000000..3b17e53 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/.vscode/tasks.json @@ -0,0 +1,20 @@ +// 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": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never" + }, + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} diff --git a/vscode-matlab-interactive-terminal-master/.vscodeignore b/vscode-matlab-interactive-terminal-master/.vscodeignore new file mode 100644 index 0000000..d6ed9f5 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/.vscodeignore @@ -0,0 +1,13 @@ +.vscode/** +.vscode-test/** +out/test/** +src/** +.gitignore +vsc-extension-quickstart.md +**/tsconfig.json +**/tslint.json +**/*.map +**/*.ts +__pycache__/ +*/__pycache__/ +*.pyc \ No newline at end of file diff --git a/vscode-matlab-interactive-terminal-master/CHANGELOG.md b/vscode-matlab-interactive-terminal-master/CHANGELOG.md new file mode 100644 index 0000000..cae3cdf --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/CHANGELOG.md @@ -0,0 +1,111 @@ +# Change Log + +All notable changes to the Matlab Interactive Terminal extension for Visual Studio Code will be documented in this file. + +## Master + +## [0.4.0] - 2021-08-08 +### Added +- Terminal profile support (SNDST00M #37) +### Improved +- Boot experience and help messages (4086606 #34) + +## [0.3.4] - 2020-12-18 +### Fixed +- Cannot find Python path caused by encoding errors (fixed by TheBrenny #27) + +## [0.3.3] - 2020-10-11 +### Added +- Option to choose to switch focus to terminal or not (weihongliang233 #24) +### Fixed +- Cases where run selection was running behind #12 (fixed by weihongliang233 #19) + +## [0.3.2] - 2020-04-26 +### Added +- Added option to use unicode output, as if activated the output is not in real-time +### Fixed +- Consolidated temp file managing for run selection +- Corrected errors when spaces were present in the path to the path from which a selection was run + +## [0.3.1] - 2020-04-18 +### Fixed +- Properly displays error messages with unicode + +## [0.3.0] - 2020-04-18 +### Added +- Correct implementation and handling of unicode, including CJK, characters +### Fixed +- Impossibility to launch from previous update + +## [0.2.11] - 2020-04-18 +### Fixed +- Prompt locations in some cases #6 +- Relative path issues in run selection #8 + +## [0.2.10] - 2020-02-26 +### Added +- When a script is run, it is saved beforehand in order to be correctly updated +### Fixed +- Fixed discrepancies in run selection by using temporary files +- Updated readme + +## [0.2.9] - 2020-02-13 +### Added +- The script calling is hidden at initialization +### Fixed +- Implemented correctly Matlab `clc` command +- The terminal is correctly shown in certain situations + +## [0.2.8] - 2020-02-07 +### Added +- Added basic Python 2 compatibility +- Added prompts in the Matlab terminal Issue #2 + +## [0.2.7] - 2020-02-03 +### Added +- Added option to specify the Python executable to use in case of several versions Issue #1 + +## [0.2.6] - 2020-01-19 +### Fixed +- Resolve encoding issues when running selection in new terminal + +## [0.2.5] - 2020-01-16 +### Fixed +- The `Run selection` command should now handle properly the double quotes, by using a temporary file + +## [0.2.4] - 2020-01-15 +### Fixed +- The exceptions are now properly handled when a file or a selection are run +- Cleaned code with TSLint + +## [0.2.3] - 2020-01-15 +### Fixed +- Fixed bug where terminal was launching when dependencies were not satisfied + +## [0.2.2] - 2020-01-15 +### Added +- Reworked TypeScript code +### Fixed +- Multi-lines selections when no terminal is open +- Spaces in paths and instructions on all cases +- Corrected bug in Python related to Matlab error handling + +## [0.2.1] - 2020-01-14 +### Fixed +- Fixed a bug where the selected text could not be run in an empty terminal if it contained spaces + +## [0.2.0] - 2020-01-14 +### Added +- Implemented better code structure for the Python scripts +- Added command to launch current selection or current line in Matlab REPL + +## [0.1.4] - 2020-01-14 +### Fixed +- The matlab scripts are now properly reloaded when a script is launched in an existing terminal + +## [0.1.3] - 2020-01-13 +Initial release +- Created extension structure +- Implemented `Open a Matlab Terminal` command +- Implemented `Run current Matlab Script` command +- Added basic dependencies checks at activation to prevent errors \ No newline at end of file diff --git a/vscode-matlab-interactive-terminal-master/LICENSE b/vscode-matlab-interactive-terminal-master/LICENSE new file mode 100644 index 0000000..dbd82be --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Aurélien Pommel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vscode-matlab-interactive-terminal-master/README.md b/vscode-matlab-interactive-terminal-master/README.md new file mode 100644 index 0000000..698ed73 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/README.md @@ -0,0 +1,27 @@ +# Matlab Interactive Terminal for Visual Studio Code + +Matlab Interactive Terminal is an extension for Visual Studio Code that allows users to launch MATLAB scripts and have a working MATLAB REPL directly included in Visual Studio Code. This extension uses the MATLAB Engine for Python which must be correctly set up for the extension to work. It works equally on Windows, macOS and Linux. + +## Requirements + +- **Python** x64 2.7, 3.7 or 3.8 (added to PATH), available [here](https://www.python.org/downloads/) or through other distributions such as [Anaconda](https://www.anaconda.com/distribution/) +- **MATLAB** R2014b (Matlab 8.4) or higher +- **MATLAB Engine API for Python**, installations instructions are available [here](https://www.mathworks.com/help/matlab/matlab_external/install-the-matlab-engine-for-python.html) + +N.B.: The Python requirements may vary depending on the installed MATLAB version. More information about MATLAB-Python compatibility is available on [MathWorks website](https://www.mathworks.com/help/matlab/matlab_external/system-requirements-for-matlab-engine-for-python.html). + +## Features + +The extension adds three commands to Visual Studio Code, that can then be tied to key-bindings. These are: +- `Open a MATLAB Terminal` which opens an interactive MATLAB terminal in the VS Code integrated terminal, similar to the MATLAB command line +- `Run current MATLAB Script` which runs the currently opened MATLAB script and then allows the user to interact with it through the opened terminal +- `Run current selection in MATLAB` which runs the currently selected text in a MATLAB terminal. If no text is selected, the current line is run instead + +## Recommended VS Code Extensions + +- [Matlab](https://marketplace.visualstudio.com/items?itemName=Gimly81.matlab) (from Xavier Hahn) provides syntax coloration, snippets and linting for the Matlab language. Matlab Interactive Terminal is thought for working with it. +- [Matlab Code Run](https://marketplace.visualstudio.com/items?itemName=bramvanbilsen.matlab-code-run) (from Bram Vanbilsen) is a good alternative to Matlab Interactive Terminal without the Python and Matlab Engine API dependencies. It should provide similar functionalities on both Mac OS and Linux. + +## Known Issues + +See https://github.com/apommel/vscode-matlab-interactive-terminal/issues diff --git a/vscode-matlab-interactive-terminal-master/images/icon.png b/vscode-matlab-interactive-terminal-master/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8cd1883f92d4697d01ca0548c0aca1e04c5057 GIT binary patch literal 22583 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'Z`L7dPE#4#Tw8 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 trpx;TISSH{rnY;z@c)Bg2>> ', end='') + command = input() + + if command=="exit" or command=="exit()": # Keywords to leave the engine + loop=False + + elif command=="clc" or command=="clc()": # matlab terminal clearing must be reimplemented + self.clear() + + else: + try: + self.eng.eval(command, nargout=0) # Feed the instructions to Matlab eval + + except MatlabTerminated: + print("MATLAB process terminated.") + print("Restarting MATLAB Engine for Python...") + self.eng = matlab.engine.start_matlab() + print("Restarted MATLAB process.") + + except : # The other exceptions are handled by Matlab + pass + + if not import_fail: self.eng.quit() diff --git a/vscode-matlab-interactive-terminal-master/interfaces/standard/ml_script.py b/vscode-matlab-interactive-terminal-master/interfaces/standard/ml_script.py new file mode 100644 index 0000000..2045009 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/interfaces/standard/ml_script.py @@ -0,0 +1,9 @@ +# Developed by Aurelien Pommel and other contributors + +from matlab_interface import MatlabInterface +import sys + +matlab = MatlabInterface() +# Run the initial script given in arg +matlab.run_script(sys.argv[1]) +matlab.interactive_loop() diff --git a/vscode-matlab-interactive-terminal-master/interfaces/standard/ml_selection.py b/vscode-matlab-interactive-terminal-master/interfaces/standard/ml_selection.py new file mode 100644 index 0000000..0f2f3a2 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/interfaces/standard/ml_selection.py @@ -0,0 +1,9 @@ +# Developed by Aurelien Pommel and other contributors + +from matlab_interface import MatlabInterface +import sys + +matlab = MatlabInterface() +# Run the initial selection given in arg +matlab.run_selection(sys.argv[1]) +matlab.interactive_loop() \ No newline at end of file diff --git a/vscode-matlab-interactive-terminal-master/interfaces/standard/ml_terminal.py b/vscode-matlab-interactive-terminal-master/interfaces/standard/ml_terminal.py new file mode 100644 index 0000000..08ebff9 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/interfaces/standard/ml_terminal.py @@ -0,0 +1,6 @@ +# Developed by Aurelien Pommel and other contributors + +from matlab_interface import MatlabInterface + +matlab = MatlabInterface() +matlab.interactive_loop() \ No newline at end of file diff --git a/vscode-matlab-interactive-terminal-master/interfaces/unicode/check_dependencies.py b/vscode-matlab-interactive-terminal-master/interfaces/unicode/check_dependencies.py new file mode 100644 index 0000000..b93b496 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/interfaces/unicode/check_dependencies.py @@ -0,0 +1,9 @@ +# Developed by Aurelien Pommel and other contributors + +# Checks if the necessary Python dependencies are present on the system at activation +try: # Check if the Matlab Engine is installed + import matlab.engine +except ImportError: + print('1') +else: + print('0') \ No newline at end of file diff --git a/vscode-matlab-interactive-terminal-master/interfaces/unicode/matlab_interface.py b/vscode-matlab-interactive-terminal-master/interfaces/unicode/matlab_interface.py new file mode 100644 index 0000000..9229824 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/interfaces/unicode/matlab_interface.py @@ -0,0 +1,150 @@ +# Developed by Aurelien Pommel and other contributors + +# Trying to have a basic Python 2 compatibility +from __future__ import print_function +try: + input = raw_input +except NameError: + pass + +import os +from io import StringIO +from textwrap import dedent + +global import_fail +try: # Check if the Matlab Engine is installed + import matlab.engine + from matlab.engine import RejectedExecutionError as MatlabTerminated +except ImportError: + print("MATLAB Engine for Python cannot be detected. Please install it for the extension to work.") + import_fail = True +else: + import_fail = False + +class MatlabInterface: + global import_fail + + def __init__(self): + # OS checks related work + if os.name == 'nt': + self.cls_str = 'cls' + else: + self.cls_str = 'clear' + self.clear() + + if not import_fail: + try: + self.eng = matlab.engine.start_matlab() + intro = '''\ + MATLAB Interactive Terminal (R{release}) + + To get started, type one of these commands: + helpwin Provide access to help comments for all functions + helpdesk Open help browser + demo Access product examples in Help browser + + For product information, visit https://www.mathworks.com.\ + '''.format(release=self.release()) + print(dedent(intro)) + + except Exception as e: + self.clear() + print("MATLAB Engine for Python exited prematurely.") + print(e) + + else: + print("Launching MATLAB failed: Error starting MATLAB process in MATLAB Engine for Python.") + + def clear(self): + os.system(self.cls_str) + + def release(self): + release_str = "version('-release');" + res = self.eng.eval(release_str) + return res + + def run_script(self, script_path): + if not import_fail: + + try: + print("File: \"{}\"".format(script_path)) + stream = StringIO() + err_stream = StringIO() + self.eng.run(script_path, nargout=0, stdout=stream, stderr=err_stream) + print(stream.getvalue()) + + except MatlabTerminated: + print(stream.getvalue(), err_stream.getvalue(), sep="\n") + print("MATLAB process terminated.") + print("Restarting MATLAB Engine for Python...") + self.eng = matlab.engine.start_matlab() + print("Restarted MATLAB process.") + + except : # The other exceptions are handled by Matlab + print(stream.getvalue(), err_stream.getvalue(), sep="\n") + + def run_selection(self, temp_path): + if not import_fail: + f = open(temp_path, 'r') + print("Running:") + + try: # Print the content of the selection before running it, encoding issues can happen + for line in f: + print(line, end='') + + except UnicodeDecodeError: + print("current selection") + + print('\n') + f.close() + + try: + stream = StringIO() + err_stream = StringIO() + self.eng.run(temp_path, nargout=0, stdout=stream, stderr=err_stream) + print(stream.getvalue()) + + except MatlabTerminated: + print(stream.getvalue(), err_stream.getvalue(), sep="\n") + print("MATLAB terminated. Restarting the engine...") + self.eng = matlab.engine.start_matlab() + print("MATLAB restarted") + + except : # The other exceptions are handled by Matlab + print(stream.getvalue(), err_stream.getvalue(), sep="\n") + + finally: + os.remove(temp_path) + os.rmdir(os.path.dirname(temp_path)) + + def interactive_loop(self): + loop=True # Looping allows for an interactive terminal + + while loop and not import_fail: + print('>>> ', end='') + command = input() + + if command=="exit" or command=="exit()": # Keywords to leave the engine + loop=False + + elif command=="clc" or command=="clc()": # matlab terminal clearing must be reimplemented + self.clear() + + else: + try: + stream = StringIO() + err_stream = StringIO() + self.eng.eval(command, nargout=0, stdout=stream, stderr=err_stream) # Feed the instructions to Matlab eval + print(stream.getvalue()) + + except MatlabTerminated: + print(stream.getvalue(), err_stream.getvalue(), sep="\n") + print("MATLAB process terminated.") + print("Restarting MATLAB Engine for Python...") + self.eng = matlab.engine.start_matlab() + print("Restarted MATLAB process.") + + except : # The other exceptions are handled by Matlab + print(stream.getvalue(), err_stream.getvalue(), sep="\n") + + if not import_fail: self.eng.quit() diff --git a/vscode-matlab-interactive-terminal-master/interfaces/unicode/ml_script.py b/vscode-matlab-interactive-terminal-master/interfaces/unicode/ml_script.py new file mode 100644 index 0000000..2045009 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/interfaces/unicode/ml_script.py @@ -0,0 +1,9 @@ +# Developed by Aurelien Pommel and other contributors + +from matlab_interface import MatlabInterface +import sys + +matlab = MatlabInterface() +# Run the initial script given in arg +matlab.run_script(sys.argv[1]) +matlab.interactive_loop() diff --git a/vscode-matlab-interactive-terminal-master/interfaces/unicode/ml_selection.py b/vscode-matlab-interactive-terminal-master/interfaces/unicode/ml_selection.py new file mode 100644 index 0000000..0f2f3a2 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/interfaces/unicode/ml_selection.py @@ -0,0 +1,9 @@ +# Developed by Aurelien Pommel and other contributors + +from matlab_interface import MatlabInterface +import sys + +matlab = MatlabInterface() +# Run the initial selection given in arg +matlab.run_selection(sys.argv[1]) +matlab.interactive_loop() \ No newline at end of file diff --git a/vscode-matlab-interactive-terminal-master/interfaces/unicode/ml_terminal.py b/vscode-matlab-interactive-terminal-master/interfaces/unicode/ml_terminal.py new file mode 100644 index 0000000..08ebff9 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/interfaces/unicode/ml_terminal.py @@ -0,0 +1,6 @@ +# Developed by Aurelien Pommel and other contributors + +from matlab_interface import MatlabInterface + +matlab = MatlabInterface() +matlab.interactive_loop() \ No newline at end of file diff --git a/vscode-matlab-interactive-terminal-master/package-lock.json b/vscode-matlab-interactive-terminal-master/package-lock.json new file mode 100644 index 0000000..8193315 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/package-lock.json @@ -0,0 +1,5598 @@ +{ + "name": "matlab-interactive-terminal", + "version": "0.4.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "matlab-interactive-terminal", + "version": "0.4.0", + "license": "MIT", + "devDependencies": { + "@types/glob": "^7.1.3", + "@types/mocha": "^5.2.7", + "@types/node": "^12.12.67", + "@types/vscode": "^1.59.0", + "@typescript-eslint/eslint-plugin": "^4.28.0", + "@typescript-eslint/parser": "^4.28.0", + "eslint": "^7.30.0", + "glob": "^7.1.5", + "mocha": "^6.2.3", + "typescript": "^4.3.5", + "vscode-test": "^1.4.0" + }, + "engines": { + "vscode": "^1.59.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@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 + }, + "node_modules/@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 + }, + "node_modules/@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "12.20.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.19.tgz", + "integrity": "sha512-niAuZrwrjKck4+XhoCw6AAVQBENHftpXw9F4ryk66fTgYaKQ53R4FI7c9vUGGw5vQis1HKBHDR1gcYI/Bq1xvw==", + "dev": true + }, + "node_modules/@types/vscode": { + "version": "1.59.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.59.0.tgz", + "integrity": "sha512-Zg38rusx2nU6gy6QdF7v4iqgxNfxzlBlDhrRCjOiPQp+sfaNrp3f9J6OHIhpGNN1oOAca4+9Hq0+8u3jwzPMlQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.0.tgz", + "integrity": "sha512-eiREtqWRZ8aVJcNru7cT/AMVnYd9a2UHsfZT8MR1dW3UUEg6jDv9EQ9Cq4CUPZesyQ58YUpoAADGv71jY8RwgA==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.29.0", + "@typescript-eslint/scope-manager": "4.29.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.0.tgz", + "integrity": "sha512-FpNVKykfeaIxlArLUP/yQfv/5/3rhl1ov6RWgud4OgbqWLkEq7lqgQU9iiavZRzpzCRQV4XddyFz3wFXdkiX9w==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.29.0", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/typescript-estree": "4.29.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.0.tgz", + "integrity": "sha512-+92YRNHFdXgq+GhWQPT2bmjX09X7EH36JfgN2/4wmhtwV/HPxozpCNst8jrWcngLtEVd/4zAwA6BKojAlf+YqA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.29.0", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/typescript-estree": "4.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", + "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", + "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz", + "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz", + "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.29.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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 + }, + "node_modules/big-integer": { + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dev": true, + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dev": true, + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/es-abstract": { + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract/node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "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": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "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.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/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, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/fastq": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", + "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/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, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/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 + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-bigint": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.3.tgz", + "integrity": "sha512-ZU538ajmYJmzysE5yU4Y7uIrPQ2j704u+hXFiIPQExpqzzUbpe5jCPdTfmz7jXRxZdvjY3KZ3ZNenoXQovX+Dg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", + "dev": true + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/log-symbols/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", + "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", + "dev": true, + "dependencies": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.4", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "dev": true, + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "node_modules/node-environment-flags/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/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 + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/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, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/vscode-test": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.6.1.tgz", + "integrity": "sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA==", + "dev": true, + "dependencies": { + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "rimraf": "^3.0.2", + "unzipper": "^0.10.11" + }, + "engines": { + "node": ">=8.9.3" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "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" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "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/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + }, + "@types/node": { + "version": "12.20.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.19.tgz", + "integrity": "sha512-niAuZrwrjKck4+XhoCw6AAVQBENHftpXw9F4ryk66fTgYaKQ53R4FI7c9vUGGw5vQis1HKBHDR1gcYI/Bq1xvw==", + "dev": true + }, + "@types/vscode": { + "version": "1.59.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.59.0.tgz", + "integrity": "sha512-Zg38rusx2nU6gy6QdF7v4iqgxNfxzlBlDhrRCjOiPQp+sfaNrp3f9J6OHIhpGNN1oOAca4+9Hq0+8u3jwzPMlQ==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.0.tgz", + "integrity": "sha512-eiREtqWRZ8aVJcNru7cT/AMVnYd9a2UHsfZT8MR1dW3UUEg6jDv9EQ9Cq4CUPZesyQ58YUpoAADGv71jY8RwgA==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.29.0", + "@typescript-eslint/scope-manager": "4.29.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.0.tgz", + "integrity": "sha512-FpNVKykfeaIxlArLUP/yQfv/5/3rhl1ov6RWgud4OgbqWLkEq7lqgQU9iiavZRzpzCRQV4XddyFz3wFXdkiX9w==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.29.0", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/typescript-estree": "4.29.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.0.tgz", + "integrity": "sha512-+92YRNHFdXgq+GhWQPT2bmjX09X7EH36JfgN2/4wmhtwV/HPxozpCNst8jrWcngLtEVd/4zAwA6BKojAlf+YqA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.29.0", + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/typescript-estree": "4.29.0", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.0.tgz", + "integrity": "sha512-HPq7XAaDMM3DpmuijxLV9Io8/6pQnliiXMQUcAdjpJJSR+fdmbD/zHCd7hMkjJn04UQtCQBtshgxClzg6NIS2w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0" + } + }, + "@typescript-eslint/types": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.0.tgz", + "integrity": "sha512-2YJM6XfWfi8pgU2HRhTp7WgRw78TCRO3dOmSpAvIQ8MOv4B46JD2chnhpNT7Jq8j0APlIbzO1Bach734xxUl4A==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.0.tgz", + "integrity": "sha512-8ZpNHDIOyqzzgZrQW9+xQ4k5hM62Xy2R4RPO3DQxMc5Rq5QkCdSpk/drka+DL9w6sXNzV5nrdlBmf8+x495QXQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.0", + "@typescript-eslint/visitor-keys": "4.29.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.0.tgz", + "integrity": "sha512-LoaofO1C/jAJYs0uEpYMXfHboGXzOJeV118X4OsZu9f7rG7Pr9B3+4HTU8+err81rADa4xfQmAxnRnPAI2jp+Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.29.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "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, + "requires": {} + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "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" + } + }, + "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": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "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 + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "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 + }, + "big-integer": { + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", + "dev": true + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dev": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", + "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" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dev": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, + "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" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.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 + }, + "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 + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "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.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "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" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "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" + } + }, + "es-abstract": { + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "dependencies": { + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "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": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "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": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "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.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + } + } + }, + "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" + } + }, + "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 + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "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.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "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 + }, + "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 + }, + "fastq": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", + "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", + "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" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "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 + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "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-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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" + } + }, + "globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "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" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + } + } + }, + "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 + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "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-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "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 + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "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 + }, + "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" + } + }, + "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 + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-bigint": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.3.tgz", + "integrity": "sha512-ZU538ajmYJmzysE5yU4Y7uIrPQ2j704u+hXFiIPQExpqzzUbpe5jCPdTfmz7jXRxZdvjY3KZ3ZNenoXQovX+Dg==", + "dev": true + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "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-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "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-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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 + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "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 + }, + "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" + } + }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "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 + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", + "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.4", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "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 + }, + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "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-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": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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-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 + }, + "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 + }, + "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 + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "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 + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "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 + }, + "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" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "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 + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "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" + } + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "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" + } + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "dev": true + }, + "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.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "dev": true, + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "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" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "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 + }, + "vscode-test": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.6.1.tgz", + "integrity": "sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA==", + "dev": true, + "requires": { + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "rimraf": "^3.0.2", + "unzipper": "^0.10.11" + } + }, + "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" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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 + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "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 + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + } + } +} diff --git a/vscode-matlab-interactive-terminal-master/package.json b/vscode-matlab-interactive-terminal-master/package.json new file mode 100644 index 0000000..1fa9c59 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/package.json @@ -0,0 +1,94 @@ +{ + "name": "matlab-interactive-terminal", + "displayName": "Matlab Interactive Terminal", + "description": "Interactive MATLAB terminal for Visual Studio Code, compatible with Windows, Mac and Linux", + "version": "0.4.0", + "publisher": "apommel", + "license": "MIT", + "icon": "images/icon.png", + "repository": { + "type": "git", + "url": "https://github.com/apommel/vscode-matlab-interactive-terminal.git" + }, + "engines": { + "vscode": "^1.59.0" + }, + "categories": [ + "Programming Languages", + "Other" + ], + "activationEvents": [ + "onLanguage:matlab", + "onCommand:matlab-interactive-terminal.openMatlabTerminal", + "onCommand:matlab-interactive-terminal.runMatlabScript", + "onCommand:matlab-interactive-terminal.runMatlabSelection", + "onTerminalProfile:matlab-interactive-terminal.terminal-profile" + ], + "main": "./out/extension.js", + "contributes": { + "commands": [ + { + "command": "matlab-interactive-terminal.openMatlabTerminal", + "title": "Open a MATLAB Terminal" + }, + { + "command": "matlab-interactive-terminal.runMatlabScript", + "title": "Run current MATLAB Script" + }, + { + "command": "matlab-interactive-terminal.runMatlabSelection", + "title": "Run current selection in MATLAB" + } + ], + "configuration": { + "title": "Matlab Interactive Terminal", + "properties": { + "matlab-interactive-terminal.pythonPath": { + "type": "string", + "default": null, + "description": "Specifies the path to the Python executable to use (if leaved blank, Python in PATH is used)" + }, + "matlab-interactive-terminal.unicodeSwitch": { + "type": "boolean", + "default": "false", + "description": "Displays Unicode characters (ex: CJK characters) in MATLAB output (N.B.: output will not be in real time)" + }, + "matlab-interactive-terminal.CursorBack": { + "type": "boolean", + "default": "true", + "description": "Decides whether to make the cursor fall back onto your editor when you execute the command 'Run current selection' " + } + } + }, + "terminal": { + "profiles": [ + { + "id": "matlab-interactive-terminal.terminal-profile", + "icon": "variable-group", + "title": "MATLAB" + } + ] + } + }, + "scripts": { + "vscode:prepublish": "npm run compile", + "compile": "tsc -p ./", + "watch": "tsc -watch -p ./", + "pretest": "npm run compile", + "test": "node ./out/test/runTest.js" + }, + "devDependencies": { + "@types/glob": "^7.1.3", + "@types/mocha": "^5.2.7", + "@types/node": "^12.12.67", + "@types/vscode": "^1.59.0", + "@typescript-eslint/eslint-plugin": "^4.28.0", + "@typescript-eslint/parser": "^4.28.0", + "eslint": "^7.30.0", + "glob": "^7.1.5", + "mocha": "^6.2.3", + "typescript": "^4.3.5", + "vscode-test": "^1.4.0" + }, + "dependencies": {} +} diff --git a/vscode-matlab-interactive-terminal-master/src/extension.ts b/vscode-matlab-interactive-terminal-master/src/extension.ts new file mode 100644 index 0000000..c9607fe --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/src/extension.ts @@ -0,0 +1,225 @@ +// Developed by Aurelien Pommel and other contributors + +// The module 'vscode' contains the VS Code extensibility API +// Import the module and reference it with the alias vscode in your code below +import * as vscode from "vscode"; +import * as path from "path"; +import * as util from "util"; +import * as fs from "fs"; + +// this method is called when your extension is activated +// your extension is activated the very first time the command is executed +export function activate(context: vscode.ExtensionContext) { + + // Get basic directory information + const extDir = context.asAbsolutePath(""); + let scriptDir = path.join(extDir, "/interfaces/standard"); + + // Get configuration parameters + const getConfigMap = () => { + return vscode.workspace.getConfiguration("matlab-interactive-terminal"); + }; + + // Get Python interpreter path + const getPythonPath = () => { + let extConfig = getConfigMap(); + let pythonPath: string; + let pythonPathSetting: string | undefined; + pythonPathSetting = extConfig.get("pythonPath"); + + pythonPath = pythonPathSetting + ? path.normalize(pythonPathSetting) + : "python"; + + return pythonPath; + }; + let pythonPath: string | undefined = getPythonPath(); + + // Set up common terminal options + let terminalLaunchOptions: vscode.TerminalOptions = { + name: "MATLAB", + shellPath: pythonPath + }; + + const getUnicodeOption = () => { + let extConfig = getConfigMap(); + let unicodeOption: boolean | undefined; + unicodeOption = extConfig.get("unicodeSwitch"); + if (unicodeOption === undefined) { + unicodeOption = false; + } + if (unicodeOption) { + scriptDir = path.join(extDir, "/interfaces/unicode"); + } + else { + scriptDir = path.join(extDir, "/interfaces/standard"); + } + }; + getUnicodeOption(); + + // Check the dependencies and inform the user + let errMessage = ""; + let correctSetup: boolean; + + const checkSetup = () => { + let scriptPath = path.join(scriptDir, "check_dependencies.py"); + const { execFileSync } = require("child_process"); + if (!pythonPath) { + return false; + } + try { + let stdout = execFileSync(pythonPath, [scriptPath]); + if (stdout.toString() === "1") { + errMessage = "MATLAB Engine for Python seems to not be installed correctly."; + return false; + } + } + catch (error) { // If an error is caught, it means Python cannot be called + errMessage = error.message; + return false; + } + return true; + }; + + const openMatlabTerminal = () => { + getUnicodeOption(); + let scriptPath = path.join(scriptDir, "ml_terminal.py"); + pythonPath = getPythonPath(); + correctSetup = checkSetup(); + if (correctSetup) { + const opts: vscode.TerminalOptions = { ...terminalLaunchOptions }; + opts.shellPath = pythonPath; + opts.shellArgs = [scriptPath]; + vscode.window.createTerminal(opts).show(false); + } + else { + console.log(errMessage); + vscode.window.showErrorMessage(errMessage); + } + }; + context.subscriptions.push(vscode.commands.registerCommand("matlab-interactive-terminal.openMatlabTerminal", openMatlabTerminal)); + + + const terminalFallback = (activeTerminal: vscode.Terminal | undefined) => { + // The terminal is not opened if there is already a current one + if (activeTerminal === undefined || (activeTerminal && activeTerminal.name !== "MATLAB")) { + openMatlabTerminal(); + } + }; + + + const runMatlabScript = () => { + let activeTextEditor = vscode.window.activeTextEditor; + let activeTerminal = vscode.window.activeTerminal; + if (activeTextEditor) { + activeTextEditor.document.save(); + let currentFile = activeTextEditor.document.fileName; + getUnicodeOption(); + let scriptPath = path.join(scriptDir, "ml_script.py"); + if (activeTerminal && activeTerminal.name === "MATLAB") // If already a Matlab Engine started, the file is run in it + { + activeTerminal.sendText("clear functions"); // Force Matlab to reload the scripts + activeTerminal.sendText(util.format("run(\"%s\")", currentFile)); + activeTerminal.show(false); + } + else { + pythonPath = getPythonPath(); + correctSetup = checkSetup(); + if (correctSetup) { + const opts: vscode.TerminalOptions = { ...terminalLaunchOptions }; + opts.shellPath = pythonPath; + opts.shellArgs = [scriptPath, currentFile]; + vscode.window.createTerminal(opts).show(false); + } + else { + console.log(errMessage); + vscode.window.showErrorMessage(errMessage); + } + } + } + else { // If not any file is opened, a Matlab terminal is simply opened + terminalFallback(activeTerminal); + } + }; + context.subscriptions.push(vscode.commands.registerCommand("matlab-interactive-terminal.runMatlabScript", runMatlabScript)); + + + const runMatlabSelection = () => { + let activeTextEditor = vscode.window.activeTextEditor; + let activeTerminal = vscode.window.activeTerminal; + if (activeTextEditor) { + var currentSelection = null; + var cwd = path.dirname(activeTextEditor.document.uri.fsPath); // Get current file directory + if (cwd.charAt(1) === ":") { // Hack to have drive letter in uppercase + cwd = cwd.charAt(0).toUpperCase() + cwd.slice(1); + } + if (activeTextEditor.selection.isEmpty) { // Run current line if selection is empty + currentSelection = activeTextEditor.document.lineAt(activeTextEditor.selection.active).text; + } + else { + currentSelection = `cd \'${cwd}\'\n`.concat(activeTextEditor.document.getText(activeTextEditor.selection)); + } + getUnicodeOption(); + let scriptPath = path.join(scriptDir, "ml_selection.py"); + let tempDir = path.join(extDir, "temp"); // A temp file and directory are created in the ext dir + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir); + } + else { + var fileList = fs.readdirSync(tempDir); + for (const file of fileList) { + fs.unlinkSync(path.join(tempDir, file)); + } + } + let tempPath = path.join(tempDir, "temp.m"); + fs.writeFileSync(tempPath, currentSelection); + if (activeTerminal && activeTerminal.name === "MATLAB") { // If already a Matlab Engine started, the selection is run in it + activeTerminal.sendText(util.format("clear(\"%s\")", tempPath)); // Force Matlab to reload the scripts + activeTerminal.sendText(util.format("run(\"%s\")", tempPath)); + if (getConfigMap().get("CursorBack") === false) { + activeTerminal.show(false); + } + } + else { + pythonPath = getPythonPath(); + correctSetup = checkSetup(); + if (correctSetup) { + const opts: vscode.TerminalOptions = { ...terminalLaunchOptions }; + opts.shellPath = pythonPath; + opts.shellArgs = [scriptPath, tempPath]; + vscode.window.createTerminal(opts).show(false); + } + else { + console.log(errMessage); + vscode.window.showErrorMessage(errMessage); + } + } + } + else { + terminalFallback(activeTerminal); + } + }; + context.subscriptions.push(vscode.commands.registerCommand("matlab-interactive-terminal.runMatlabSelection", runMatlabSelection)); + + const resetPythonPath = () => { + pythonPath = getPythonPath(); + }; + context.subscriptions.push(vscode.workspace.onDidChangeConfiguration(resetPythonPath)); + + const matlabTerminalProfile: vscode.TerminalProfileProvider = { + provideTerminalProfile() { + let terminalPath = path.join(scriptDir, "ml_terminal.py"); + return { + options: { + ...terminalLaunchOptions, + shellArgs: [terminalPath] + } + }; + } + }; + context.subscriptions.push(vscode.window.registerTerminalProfileProvider('matlab-interactive-terminal.terminal-profile', matlabTerminalProfile)); + +} + +// this method is called when your extension is deactivated +export function deactivate() { } diff --git a/vscode-matlab-interactive-terminal-master/src/test/runTest.ts b/vscode-matlab-interactive-terminal-master/src/test/runTest.ts new file mode 100644 index 0000000..1eabfa3 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/src/test/runTest.ts @@ -0,0 +1,23 @@ +import * as path from 'path'; + +import { runTests } from 'vscode-test'; + +async function main() { + try { + // The folder containing the Extension Manifest package.json + // Passed to `--extensionDevelopmentPath` + const extensionDevelopmentPath = path.resolve(__dirname, '../../'); + + // The path to test runner + // Passed to --extensionTestsPath + const extensionTestsPath = path.resolve(__dirname, './suite/index'); + + // Download VS Code, unzip it and run the integration test + await runTests({ extensionDevelopmentPath, extensionTestsPath }); + } catch (err) { + console.error('Failed to run tests'); + process.exit(1); + } +} + +main(); diff --git a/vscode-matlab-interactive-terminal-master/src/test/suite/extension.test.ts b/vscode-matlab-interactive-terminal-master/src/test/suite/extension.test.ts new file mode 100644 index 0000000..d59ba91 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/src/test/suite/extension.test.ts @@ -0,0 +1,15 @@ +import * as assert from 'assert'; + +// You can import and use all API from the 'vscode' module +// as well as import your extension to test it +import * as vscode from 'vscode'; +// import * as myExtension from '../extension'; + +suite('Extension Test Suite', () => { + vscode.window.showInformationMessage('Start all tests.'); + + test('Sample test', () => { + assert.equal(-1, [1, 2, 3].indexOf(5)); + assert.equal(-1, [1, 2, 3].indexOf(0)); + }); +}); diff --git a/vscode-matlab-interactive-terminal-master/src/test/suite/index.ts b/vscode-matlab-interactive-terminal-master/src/test/suite/index.ts new file mode 100644 index 0000000..2cd152c --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/src/test/suite/index.ts @@ -0,0 +1,37 @@ +import * as path from 'path'; +import * as Mocha from 'mocha'; +import * as glob from 'glob'; + +export function run(): Promise { + // Create the mocha test + const mocha = new Mocha({ + ui: 'tdd', + }); + mocha.useColors(true); + + const testsRoot = path.resolve(__dirname, '..'); + + return new Promise((c, e) => { + glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { + if (err) { + return e(err); + } + + // Add files to the test suite + files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); + + try { + // Run the mocha test + mocha.run(failures => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + e(err); + } + }); + }); +} diff --git a/vscode-matlab-interactive-terminal-master/tsconfig.json b/vscode-matlab-interactive-terminal-master/tsconfig.json new file mode 100644 index 0000000..b65c745 --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "out", + "lib": [ + "es6" + ], + "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/vscode-matlab-interactive-terminal-master/vsc-extension-quickstart.md b/vscode-matlab-interactive-terminal-master/vsc-extension-quickstart.md new file mode 100644 index 0000000..b510bff --- /dev/null +++ b/vscode-matlab-interactive-terminal-master/vsc-extension-quickstart.md @@ -0,0 +1,42 @@ +# Welcome to your VS Code Extension + +## What's in the folder + +* This folder contains all of the files necessary for your extension. +* `package.json` - this is the manifest file in which you declare your extension and command. + * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. +* `src/extension.ts` - this is the main file where you will provide the implementation of your command. + * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. + * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. + +## Get up and running straight away + +* Press `F5` to open a new window with your extension loaded. +* Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. +* Set breakpoints in your code inside `src/extension.ts` to debug your extension. +* Find output from your extension in the debug console. + +## Make changes + +* You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. +* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. + + +## Explore the API + +* You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. + +## Run tests + +* Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Extension Tests`. +* Press `F5` to run the tests in a new window with your extension loaded. +* See the output of the test result in the debug console. +* Make changes to `src/test/suite/extension.test.ts` or create new test files inside the `test/suite` folder. + * The provided test runner will only consider files matching the name pattern `**.test.ts`. + * You can create folders inside the `test` folder to structure your tests any way you want. + +## Go further + + * Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension). + * [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VSCode extension marketplace. + * Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration).