diff --git a/.gitignore b/.gitignore
index 2e6183a..fa48c13 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@ node_modules
.gitignore
vsc-extension-quickstart.md
out/test/**
+/out/
test/**
*.vsix
.yarnrc
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 2654ffa..1bda08e 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,30 +1,43 @@
// 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",
- "cSpell.ignoreWords": [
- "backreference",
- "documentxml",
- "extention",
- "group",
- "json",
- "multiline",
- "snippets",
- "strikethrough",
- "to",
- "zampieri"
- ],
- "cSpell.words": [
- "minwebapi",
- "mstest",
- "nunit",
- "submenu",
- "xunit"
- ]
-}
\ No newline at end of file
+ "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",
+ "cSpell.ignoreWords": [
+ "backreference",
+ "documentxml",
+ "extention",
+ "group",
+ "json",
+ "multiline",
+ "snippets",
+ "strikethrough",
+ "to",
+ "zampieri"
+ ],
+ "cSpell.words": [
+ "Blazor",
+ "blazorserver",
+ "blazorwasm",
+ "classlib",
+ "designpattern",
+ "forminline",
+ "minwebapi",
+ "mstest",
+ "netcoreapp",
+ "nunit",
+ "paddding",
+ "razorclasslib",
+ "reactredux",
+ "readlines",
+ "richardzampieriprog",
+ "submenu",
+ "webapi",
+ "xunit"
+ ]
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ff957d4..2d10fca 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,91 +5,103 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how
## [Released]
+## [2.0.0] - [2024-01-14]
+
+## What's new in 2.0.0
+
+> - **_New Feature added_**: Added support for all project types and templates under project creation.
+> - **_New Feature added_**: Support for .NET 7.0 and .NET 8.0
+> - **_Performance improvements_**: Extension loading time decreased and command execution time decreased.
+> - **_Fix_**: Fixed snippet conflicts and non standard snippets.
+> - **_Enhancement_**: Validates the project template and framework compatibility based on the .NET SDK installed on the machine.
+> - **_Enhancement_**: Added validation to avoid creating projects with empty spaces.
+> - **_Enhancement_**: Reinforce the use of the default folder for project creation.
+
## [1.3.0] - [2022-07-03]
-> - **_New Feature added_**: Minimal Web API, MStest, xUnit, NUnit project template added.
-> - **_Fix_**: Creating Solution with the same name in the same directory.
-> - **_Fix_**: find-parent-dir dependency updated to remove the error message from vscode.
+> - **_New Feature added_**: Minimal Web API, MStest, xUnit, NUnit project template added.
+> - **_Fix_**: Creating Solution with the same name in the same directory.
+> - **_Fix_**: find-parent-dir dependency updated to remove the error message from vscode.
## [1.2.9] - [2022-05-14]
-> - **_New Feature added_**: Scoped namespaces in the .NET 6.0
-> - **_Improvement_**: Project creation highlighting the `create project button` after the project name is typed and tab is pressed.
+> - **_New Feature added_**: Scoped namespaces in the .NET 6.0
+> - **_Improvement_**: Project creation highlighting the `create project button` after the project name is typed and tab is pressed.
## [1.2.8] - [2021-11-13]
-> - **_New Feature added_**: Project support for C# .NET Core 6.0
+> - **_New Feature added_**: Project support for C# .NET Core 6.0
## [1.2.7] - [2021-09-04]
-- **_Fix_**: Classes, Interfaces, and other types created correctly even when the user type incorrect names.
-- **_New Features added_**: Added a default folder for project creation. Add this configuration to your settings with your path: `"csharp-snippet-productivity.defaultFolderForProjectCreation": "D:\\"` **{Your path}**
+- **_Fix_**: Classes, Interfaces, and other types created correctly even when the user type incorrect names.
+- **_New Features added_**: Added a default folder for project creation. Add this configuration to your settings with your path: `"csharp-snippet-productivity.defaultFolderForProjectCreation": "D:\\"` **{Your path}**
## [1.2.6] - 2021-08-28
-- **_Fix_**: Creating solutions in folders path with spaces were not possible. Now solutions and projects can be created in folders with spaces. **i.e: `c:\Your Project Folder\Solution.sln`**
+- **_Fix_**: Creating solutions in folders path with spaces were not possible. Now solutions and projects can be created in folders with spaces. **i.e: `c:\Your Project Folder\Solution.sln`**
## [1.2.5] - 2021-08-01
-- **_Fix_**: Removed the notes feature preview accidentally uploaded
+- **_Fix_**: Removed the notes feature preview accidentally uploaded
## [1.2.4] - 2021-08-01
-- **_Fix_**: Solution was being created with project name rather than solution data from solution field.
-- **_New Features added_**:
-- **_Add Project to a Solution_** : Capability to add projects to the same solution with a click of a button. You can select a different project framework as well as the template.
-- **_Submenu With Options_** :
-- Create Class
-- Create Interface
-- Create Record
-- Create Struct
+- **_Fix_**: Solution was being created with project name rather than solution data from solution field.
+- **_New Features added_**:
+- **_Add Project to a Solution_** : Capability to add projects to the same solution with a click of a button. You can select a different project framework as well as the template.
+- **_Submenu With Options_** :
+- Create Class
+- Create Interface
+- Create Record
+- Create Struct
## [1.2.3] - 2021-07-18
-- **_Fix_**: .NET target frameworks list on project creation are based on OS and SDKs installed.
-- **_Enhancement_**: Design patterns snippets added. It will create a commented pattern code to be used as reference
-- **_singleton_** : Creational singleton pattern
-- **_factoryMethod_** : Creational factory method pattern
-- **_adapter_** : Structural adapter pattern
-- **_observer_**: Structural observer pattern
-- **_Enhancement_**: Regex snippet cheat sheet added.
-- **_regex_** : Regex cheat sheet
+- **_Fix_**: .NET target frameworks list on project creation are based on OS and SDKs installed.
+- **_Enhancement_**: Design patterns snippets added. It will create a commented pattern code to be used as reference
+- **_singleton_** : Creational singleton pattern
+- **_factoryMethod_** : Creational factory method pattern
+- **_adapter_** : Structural adapter pattern
+- **_observer_**: Structural observer pattern
+- **_Enhancement_**: Regex snippet cheat sheet added.
+- **_regex_** : Regex cheat sheet
## [1.2.2] - 2021-03-24
-- Enhancement: When creating classes or interfaces system will consider if you have a \YourUniqueNamespace\ tag. If the tag is not found system will use your project name as your root namespace.
+- Enhancement: When creating classes or interfaces system will consider if you have a \YourUniqueNamespace\ tag. If the tag is not found system will use your project name as your root namespace.
## [1.2.1] - 2021-02-28
-- Fixing command not found issue on 1.2 version
+- Fixing command not found issue on 1.2 version
## [1.2.0] - 2021-02-28
-- Added command to create Class from the context/menu
-- Added command to create Interface from the context/menu
+- Added command to create Class from the context/menu
+- Added command to create Interface from the context/menu
## [1.1.0] - 2021-02-23
-- Command to create projects
-- Projects templates supported:
- - Blazor Server App
- - Blazor WebAssembly App
- - Console Application
- - Class Library
- - .NET Core: Empty, MVC, Razor Page, Angular SPA, React SPA, React/Redux SPA, Web Api, GRPC Services, Razor Class Library
-- Added snippets for creating arrays, lists and dictionaries using var
- - var myArray = new type[size];
- - var myList = new List\();
- - var myDictionary = new Dictionary\();
+- Command to create projects
+- Projects templates supported:
+ - Blazor Server App
+ - Blazor WebAssembly App
+ - Console Application
+ - Class Library
+ - .NET Core: Empty, MVC, Razor Page, Angular SPA, React SPA, React/Redux SPA, Web Api, GRPC Services, Razor Class Library
+- Added snippets for creating arrays, lists and dictionaries using var
+ - var myArray = new type[size];
+ - var myList = new List\();
+ - var myDictionary = new Dictionary\();
## [1.0.0] - 2021-02-11
-- Initial project release
-- Custom comments: colorful comments for better coding organization
- - NORMAL comments [***//***]
- - TODO: comments [***todo***]
- - REVIEW: comments [***review***]
- - BUG: comments [***bug***]
- - RESEARCH: comments [***research***]
-- General C# snippets
-- XML Documentation snippets
+- Initial project release
+- Custom comments: colorful comments for better coding organization
+ - NORMAL comments [***//***]
+ - TODO: comments [***todo***]
+ - REVIEW: comments [***review***]
+ - BUG: comments [***bug***]
+ - RESEARCH: comments [***research***]
+- General C# snippets
+- XML Documentation snippets
diff --git a/README.md b/README.md
index e4ad700..3ac9102 100644
--- a/README.md
+++ b/README.md
@@ -19,56 +19,66 @@ C# Snippet Productivity
## Goal
-> - C# Snippet Productivity aims to increase the use of vscode editor as the main tool for console, web and game development in C# Programming Language providing the same shortcuts, efficiency, intellisense that is offered by Visual Studio Community.
-> - One of the first objectives is to reduce the amount of extensions downloaded for C# reducing the time and effort on configuration that has to be done by the user as well as to avoid extensions conflicts. Also great features to speed up your development workflow.
+> - C# Snippet Productivity aims to increase the use of vscode editor as the main tool for console, web and game development in C# Programming Language providing the same shortcuts, efficiency, intellisense that is offered by Visual Studio Community.
+> - One of the first objectives is to reduce the amount of extensions downloaded for C# reducing the time and effort on configuration that has to be done by the user as well as to avoid extensions conflicts. Also great features to speed up your development workflow.
## Changelog
> [Click here](https://github.com/rsaz/csharp-snippet-productivity/blob/main/CHANGELOG.md)
+## What's new in 2.0.0
+
+> - **_All Project Types_**: Added support for all project types and templates under project creation.
+> - **_Support for .NET 7.0 and .NET 8.0_**
+> - **_Performance improvements_**: Extension loading time decreased and command execution time decreased.
+> - **_Snippet improvements_**: Fixed snippet conflicts and non standard snippets.
+> - **_Project Template and Framework Compatibility Validation_**: Validates the project template and framework compatibility based on the .NET SDK installed on the machine.
+> - **_Add or Create Project with empty space_**: Added validation to avoid creating projects with empty spaces.
+> - **_Suggests the user to add the default folder_**: Reinforce the use of the default folder for project creation.
+
## What's new in 1.3.0
-> - **_New Feature added_**: Minimal Web API, MStest, xUnit, NUnit project template added.
-> - **_Fix_**: Creating Solution with the same name in the same directory.
-> - **_Improvement_**: Extension loading time decreased.
+> - **_New Feature added_**: Minimal Web API, MStest, xUnit, NUnit project template added.
+> - **_Fix_**: Creating Solution with the same name in the same directory.
+> - **_Improvement_**: Extension loading time decreased.
## What's new in 1.2.9
-> - **_New Feature added_**: Scoped namespaces in the .NET 6.0
-> - **_Improvement_**: Project creation highlighting the `create project button` after the project name is typed and tab is pressed.
+> - **_New Feature added_**: Scoped namespaces in the .NET 6.0
+> - **_Improvement_**: Project creation highlighting the `create project button` after the project name is typed and tab is pressed.
## What's new in 1.2.8
-> - **_New Feature added_**: Project support for C# .NET Core 6.0
+> - **_New Feature added_**: Project support for C# .NET Core 6.0
## Current features
-> - **_Fix_**: Classes, Interfaces, and other types created correctly even when the user type incorrect names.
-> - **_New Features added_**: Added a default folder for project creation. Add this configuration to your settings with your path: `"csharp-snippet-productivity.defaultFolderForProjectCreation": "D:\\"` **{Your path}**
-> - **_New Features added_**:
-> - **_Add Project to a Solution_** : Capability to add projects to the same solution with a click of a button. You can select a different project framework as well as the template.
+> - **_Fix_**: Classes, Interfaces, and other types created correctly even when the user type incorrect names.
+> - **_New Features added_**: Added a default folder for project creation. Add this configuration to your settings with your path: `"csharp-snippet-productivity.defaultFolderForProjectCreation": "D:\\"` **{Your path}**
+> - **_New Features added_**:
+> - **_Add Project to a Solution_** : Capability to add projects to the same solution with a click of a button. You can select a different project framework as well as the template.
>
> 
>
-> - **_Submenu With Options_** :
-> - Create Class
-> - Create Interface
-> - Create Record
-> - Create Struct
-> - **_Fix_**: .NET target frameworks list on project creation are based on OS and SDKs installed.
-> - **_Enhancement_**: Design patterns snippets added. It will create a commented pattern code to be used as reference
-> - **_singleton_** : Creational singleton pattern
-> - **_factoryMethod_** : Creational factory method pattern
-> - **_adapter_** : Structural adapter pattern
-> - **_observer_**: Structural observer pattern
-> - **_Enhancement_**: Regex snippet cheat sheet added.
-> - **_regex_** : Regex cheat sheet
-> - When creating classes or interfaces system will consider if you have a ``YourUniqueNamespace` ` tag on your **_.csproj_**. If the tag is not found system will use your project name as your root namespace
-> - Added command to create Class from the context/menu
-> - Added command to create Interface from the context/menu
-> - How to use:
-> - Right click in the project folder or any folder inside of your project folder and select either Create Class or Create Interface
-> - Give it a name of your file and class or interface will be created automatically in the selected folder
+> - **_Submenu With Options_** :
+> - Create Class
+> - Create Interface
+> - Create Record
+> - Create Struct
+> - **_Fix_**: .NET target frameworks list on project creation are based on OS and SDKs installed.
+> - **_Enhancement_**: Design patterns snippets added. It will create a commented pattern code to be used as reference
+> - **_singleton_** : Creational singleton pattern
+> - **_factoryMethod_** : Creational factory method pattern
+> - **_adapter_** : Structural adapter pattern
+> - **_observer_**: Structural observer pattern
+> - **_Enhancement_**: Regex snippet cheat sheet added.
+> - **_regex_** : Regex cheat sheet
+> - When creating classes or interfaces system will consider if you have a ``YourUniqueNamespace` ` tag on your **_.csproj_**. If the tag is not found system will use your project name as your root namespace
+> - Added command to create Class from the context/menu
+> - Added command to create Interface from the context/menu
+> - How to use:
+> - Right click in the project folder or any folder inside of your project folder and select either Create Class or Create Interface
+> - Give it a name of your file and class or interface will be created automatically in the selected folder
>
> 
@@ -81,106 +91,106 @@ C# Snippet Productivity
>
> > 
>
-> - Projects templates supported:
-> - Blazor Server App
-> - Blazor WebAssembly App
-> - Console Application
-> - Class Library
-> - .NET Core: Empty, MVC, Razor Page, Angular SPA, React SPA, React/Redux SPA, Web Api, GRPC Services, Razor Class Library
+> - Projects templates supported:
+> - Blazor Server App
+> - Blazor WebAssembly App
+> - Console Application
+> - Class Library
+> - .NET Core: Empty, MVC, Razor Page, Angular SPA, React SPA, React/Redux SPA, Web Api, GRPC Services, Razor Class Library
>
-> - Added snippets for creating arrays, lists and dictionaries using var
-> - var myArray = new type[size];
-> - var myList = new List\();
-> - var myDictionary = new Dictionary\();
+> - Added snippets for creating arrays, lists and dictionaries using var
+> - var myArray = new type[size];
+> - var myList = new List\();
+> - var myDictionary = new Dictionary\();
> ### Smart Comments
>
-> - Colorful and configurable comments to better emphasize your work
-> - Snippets:
-> - **_todo_** : comments
-> - **_review_** : comments
-> - **_bug_** : comments
-> - **_research_** : comments
-> > 
+> - Colorful and configurable comments to better emphasize your work
+> - Snippets:
+> - **_todo_** : comments
+> - **_review_** : comments
+> - **_bug_** : comments
+> - **_research_** : comments
+> > 
> ### General Snippets
>
-> - **_cw_** : console write/writeline
-> - **_cwi_** : console writeline interpolation
-> - **_cr_** : console readline
-> - **_crk_**: console readkey
-> - **_clr_**: console clear
-> - **_var_**: variable declaration
-> - **_if_**: if statement
-> - **_else_**: else statement
-> - **_ifelse_**: if/else statement
-> - **_iif_**: conditional operator
-> - **_enum_**: enum type
-> - **_switch_**: switch statement
-> - **_using_**: using statement
-> - **_while_**: while loop
-> - **_dowhile_**: do/while loop
-> - **_for_**: for loop
-> - **_foreach_**: foreach loop
-> - **_arr_**: array structure
-> - **_varr_**: array structure using var
-> - **_lst_**: list structure
-> - **_vlst_**: list structure using var
-> - **_ilst_**: Ilist structure
-> - **_dic_**: dictionary structure
-> - **_vdic_**: dictionary structure using var
-> - **_cdic_**: concurrent dictionary structure
-> - **_idic_**: idictionary structure
-> - **_func_**: create a void function
-> - **_vfunc_**: create a virtual function
-> - **_afunc_**: create an abstract function
-> - **_rfunc_**: create a function with return type
-> - **_sfunc_**: create a static function
-> - **_pfunc_**: create a function using params
-> - **_try_**: create a try/catch block
-> - **_namespace_**: add namespace
-> - **_struct_**: create a struct
-> - **_class_**: create a class based on the file name
-> - **_ctor_**: class constructor
-> - **_instantiate_**: object instantiation
-> - **_fclass_**: class created with a default constructor and three overrides [ToString, Equals, GetHashCode]
-> - **_sclass_**: create a static class
-> - **_aclass_**: create an abstract class
-> - **_interface_**: create an interface based on the file name
-> - **_prop_**: create a property
-> - **_prope_**: create an expanded property
-> - **_record_**: create a record
+> - **_cw_** : console write/writeline
+> - **_cwi_** : console writeline interpolation
+> - **_cr_** : console readline
+> - **_crk_**: console readkey
+> - **_clr_**: console clear
+> - **_var_**: variable declaration
+> - **_if_**: if statement
+> - **_else_**: else statement
+> - **_ifelse_**: if/else statement
+> - **_iif_**: conditional operator
+> - **_enum_**: enum type
+> - **_switch_**: switch statement
+> - **_using_**: using statement
+> - **_while_**: while loop
+> - **_dowhile_**: do/while loop
+> - **_for_**: for loop
+> - **_foreach_**: foreach loop
+> - **_arr_**: array structure
+> - **_varr_**: array structure using var
+> - **_lst_**: list structure
+> - **_vlst_**: list structure using var
+> - **_ilst_**: Ilist structure
+> - **_dic_**: dictionary structure
+> - **_vdic_**: dictionary structure using var
+> - **_cdic_**: concurrent dictionary structure
+> - **_idic_**: idictionary structure
+> - **_func_**: create a void function
+> - **_vfunc_**: create a virtual function
+> - **_afunc_**: create an abstract function
+> - **_rfunc_**: create a function with return type
+> - **_sfunc_**: create a static function
+> - **_pfunc_**: create a function using params
+> - **_try_**: create a try/catch block
+> - **_namespace_**: add namespace
+> - **_struct_**: create a struct
+> - **_class_**: create a class based on the file name
+> - **_ctor_**: class constructor
+> - **_instantiate_**: object instantiation
+> - **_fclass_**: class created with a default constructor and three overrides [ToString, Equals, GetHashCode]
+> - **_sclass_**: create a static class
+> - **_aclass_**: create an abstract class
+> - **_interface_**: create an interface based on the file name
+> - **_prop_**: create a property
+> - **_prope_**: create an expanded property
+> - **_record_**: create a record
>
> ### XML Documentation Snippets
>
-> - **_xml-summary_**: this tag adds brief information about a type or member
-> - **_xml-remarks_**: the [remarks] tag supplements the information about types or members that the [summary] tag provides
-> - **_xml-returns_**: the [returns] tag describes the return value of a method declaration
-> - **_xml-value_**: the [value] tag is similar to the [returns] tag, except that you use it for properties
-> - **_xml-example_**: You use the [example] tag to include an example in your XML documentation. This involves using the child [code] tag
-> - **_xml-para_**: you use the [para] tag to format the content within its parent tag. [para] is usually used inside a tag, such as [remarks] or [returns], to divide text into paragraphs. You can format the contents of the [remarks] tag for your class definition
-> - **_xml-c_**: still on the topic of formatting, you use the [c] tag for marking part of text as code. It's like the [code] tag but inline. It's useful when you want to show a quick code example as part of a tag's content
-> - **_xml-exception_**: by using the [exception] tag, you let your developers know that a method can throw specific exceptions
-> - **_xml-see_**: the [see] tag lets you create a clickable link to a documentation page for another code element
-> - **_xml-seealso_**: you use the [seealso] tag in the same way you do the [see] tag. The only difference is that its content is typically placed in a \"See Also\" section
-> - **_xml-param_**: you use the [param] tag to describe a method's parameters
-> - **_xml-typeparam_**: You use [typeparam] tag just like the [param] tag but for generic type or method declarations to describe a generic parameter
-> - **_xml-paramref_**: sometimes you might be in the middle of describing what a method does in what could be a [summary] tag, and you might want to make a reference to a parameter
-> - **_xml-typeparamref_**: you use [typeparamref] tag just like the [paramref] tag but for generic type or method declarations to describe a generic parameter
-> - **_xml-list_**: you use the [list] tag to format documentation information as an ordered list, unordered list, or table
-> - **_xml-inheritdoc_**: you can use the [inheritdoc] tag to inherit XML comments from base classes, interfaces, and similar methods
-> - **_xml-include_**: the [include] tag lets you refer to comments in a separate XML file that describe the types and members in your source code, as opposed to placing documentation comments directly in your source code file
+> - **_xml-summary_**: this tag adds brief information about a type or member
+> - **_xml-remarks_**: the [remarks] tag supplements the information about types or members that the [summary] tag provides
+> - **_xml-returns_**: the [returns] tag describes the return value of a method declaration
+> - **_xml-value_**: the [value] tag is similar to the [returns] tag, except that you use it for properties
+> - **_xml-example_**: You use the [example] tag to include an example in your XML documentation. This involves using the child [code] tag
+> - **_xml-para_**: you use the [para] tag to format the content within its parent tag. [para] is usually used inside a tag, such as [remarks] or [returns], to divide text into paragraphs. You can format the contents of the [remarks] tag for your class definition
+> - **_xml-c_**: still on the topic of formatting, you use the [c] tag for marking part of text as code. It's like the [code] tag but inline. It's useful when you want to show a quick code example as part of a tag's content
+> - **_xml-exception_**: by using the [exception] tag, you let your developers know that a method can throw specific exceptions
+> - **_xml-see_**: the [see] tag lets you create a clickable link to a documentation page for another code element
+> - **_xml-seealso_**: you use the [seealso] tag in the same way you do the [see] tag. The only difference is that its content is typically placed in a \"See Also\" section
+> - **_xml-param_**: you use the [param] tag to describe a method's parameters
+> - **_xml-typeparam_**: You use [typeparam] tag just like the [param] tag but for generic type or method declarations to describe a generic parameter
+> - **_xml-paramref_**: sometimes you might be in the middle of describing what a method does in what could be a [summary] tag, and you might want to make a reference to a parameter
+> - **_xml-typeparamref_**: you use [typeparamref] tag just like the [paramref] tag but for generic type or method declarations to describe a generic parameter
+> - **_xml-list_**: you use the [list] tag to format documentation information as an ordered list, unordered list, or table
+> - **_xml-inheritdoc_**: you can use the [inheritdoc] tag to inherit XML comments from base classes, interfaces, and similar methods
+> - **_xml-include_**: the [include] tag lets you refer to comments in a separate XML file that describe the types and members in your source code, as opposed to placing documentation comments directly in your source code file
## How to use
-> - All the snippets comments are shown as -> snippet name
-> - Snippets were created thinking on productivity and the extensive use of tab key
+> - All the snippets comments are shown as -> snippet name
+> - Snippets were created thinking on productivity and the extensive use of tab key
>
> 
>
> 
>
-> - Colored comments were created to increase visibility of todo's, reviews, bugs and research
+> - Colored comments were created to increase visibility of todo's, reviews, bugs and research
>
> 
@@ -197,6 +207,6 @@ C# Snippet Productivity
### For more information
-- [Richard Zampieri](https://github.com/rsaz)
+- [Richard Zampieri](https://github.com/rsaz)
**Enjoy!**
diff --git a/media/index.html b/media/index.html
index 5127958..aa12f03 100644
--- a/media/index.html
+++ b/media/index.html
@@ -39,13 +39,7 @@ Select the project template
Framework
- 2.0
- 2.1
- 2.2
- 3.0
- 3.1
- 5.0
- 6.0
+ {{sdkOptions}}
Create Project
diff --git a/media/main.js b/media/main.js
index f036b28..b8f0aa0 100644
--- a/media/main.js
+++ b/media/main.js
@@ -1,28 +1,35 @@
+/* eslint-disable curly */
// This script will be run within the webview itself
// It cannot access the main VS Code APIs directly.
(function () {
-
// vscode api
const vscode = acquireVsCodeApi();
// Html elements bindings
- const buttonCreateProject = document.getElementById('create-project-button');
- const buttonFilePicker = document.getElementById('selectFolder');
- const template = document.getElementById('custom-select');
- const project = document.getElementById('projectName');
- const filePath = document.getElementById('inputLocal');
- const solution = document.getElementById('solution');
- const framework = document.getElementById('custom-select2');
-
- document.addEventListener("DOMContentLoaded", function(event) {
+ const buttonCreateProject = document.getElementById("create-project-button");
+ const buttonFilePicker = document.getElementById("selectFolder");
+ const projectGroupSelect = document.getElementById("project-group-select");
+ const template = document.getElementById("custom-select");
+ const project = document.getElementById("projectName");
+ const filePath = document.getElementById("inputLocal");
+ const solution = document.getElementById("solution");
+ const framework = document.getElementById("custom-select2");
+
+ document.addEventListener("DOMContentLoaded", function (event) {
buttonCreateProject.disabled = "true";
buttonCreateProject.style.backgroundColor = "#3C3C3C";
+
+ // Event listener for project group selection
+ projectGroupSelect.addEventListener("change", function () {
+ loadTemplateSelect(this.value, "");
+ });
+
fieldValidation();
});
-
+
function fieldValidation() {
- if (project.value === "" || solution.value === "") {
+ if (project.value === "" || solution.value === "") {
buttonCreateProject.disabled = true;
} else {
buttonCreateProject.disabled = false;
@@ -30,32 +37,142 @@
}
}
- template.addEventListener('keydown'| 'click', ()=>{
+ /* Project group select */
+ const projectGroupToTemplates = {
+ api: [
+ { templateName: ".NET Core Web API", shortName: "webapi" },
+ { templateName: ".NET Core Web API (native AOT)", shortName: "webapiaot" },
+ { templateName: "API Controller", shortName: "apicontroller" },
+ ],
+ blazor: [
+ { templateName: ".NET MAUI Blazor Hybrid App", shortName: "maui-blazor" },
+ { templateName: "Blazor Server App", shortName: "blazorserver" },
+ { templateName: "Blazor Server App Empty", shortName: "blazorserver-empty" },
+ { templateName: "Blazor Web App", shortName: "blazor" },
+ { templateName: "Blazor WebAssembly App Empty", shortName: "blazorwasm-empty" },
+ { templateName: "Blazor WebAssembly Standalone App", shortName: "blazorwasm" },
+ ],
+ cloud: [], // No specific templates for cloud in the given list
+ console: [{ templateName: "Console App", shortName: "console" }],
+ desktop: [
+ { templateName: "Windows Forms App", shortName: "winforms" },
+ { templateName: "Windows Forms Class Library", shortName: "winformslib" },
+ { templateName: "Windows Forms Control Library", shortName: "winformscontrollib" },
+ { templateName: "WPF Application", shortName: "wpf" },
+ { templateName: "WPF Class Library", shortName: "wpflib" },
+ { templateName: "WPF Custom Control Library", shortName: "wpfcustomcontrollib" },
+ { templateName: "WPF User Control Library", shortName: "wpfusercontrollib" },
+ ],
+ extensions: [], // No specific templates for extensions in the given list
+ game: [], // No specific templates for game in the given list
+ iot: [], // No specific templates for IoT in the given list
+ lib: [
+ { templateName: "Class Library", shortName: "classlib" },
+ { templateName: ".NET MAUI Class Library", shortName: "mauilib" },
+ { templateName: "Android Class Library", shortName: "androidlib" },
+ { templateName: "iOS Class Library", shortName: "ioslib" },
+ { templateName: "Mac Catalyst Class Library", shortName: "maccatalystlib" },
+ { templateName: "Razor Class Library", shortName: "razorclasslib" },
+ ],
+ machinelearning: [], // No specific templates for machine learning in the given list
+ maui: [
+ { templateName: ".NET MAUI App", shortName: "maui" },
+ { templateName: ".NET MAUI ContentPage (C#)", shortName: "maui-page-csharp" },
+ { templateName: ".NET MAUI ContentPage (XAML)", shortName: "maui-page-xaml" },
+ { templateName: ".NET MAUI ContentView (C#)", shortName: "maui-view-csharp" },
+ { templateName: ".NET MAUI ContentView (XAML)", shortName: "maui-view-xaml" },
+ { templateName: ".NET MAUI ResourceDictionary (XAML)", shortName: "maui-dict-xaml" },
+ ],
+ mobile: [
+ { templateName: "Android Application", shortName: "android" },
+ { templateName: "Android Wear Application", shortName: "androidwear" },
+ { templateName: "iOS Application", shortName: "ios" },
+ { templateName: "iOS Tabbed Application", shortName: "ios-tabbed" },
+ ],
+ test: [
+ { templateName: "MSTest Test Project", shortName: "mstest" },
+ { templateName: "MSTest Playwright Test Project", shortName: "mstest-playwright" },
+ { templateName: "NUnit 3 Test Project", shortName: "nunit" },
+ { templateName: "NUnit 3 Test Item", shortName: "nunit-test" },
+ { templateName: "NUnit Playwright Test Project", shortName: "nunit-playwright" },
+ { templateName: "xUnit Test Project", shortName: "xunit" },
+ ],
+ web: [
+ { templateName: "ASP.NET Core Empty", shortName: "web" },
+ { templateName: "ASP.NET Core gRPC Service", shortName: "grpc" },
+ { templateName: "ASP.NET Core Web App (Model-View-Controller)", shortName: "mvc" },
+ { templateName: "ASP.NET Core Web App (Razor Pages)", shortName: "webapp" },
+ { templateName: "ASP.NET Core with Angular", shortName: "angular" },
+ { templateName: "ASP.NET Core with React.js", shortName: "react" },
+ { templateName: "ASP.NET Core with React.js and Redux", shortName: "reactredux" },
+ { templateName: "Razor Component", shortName: "razorcomponent" },
+ { templateName: "Razor Page", shortName: "page" },
+ { templateName: "Razor View", shortName: "view" },
+ ],
+ };
+
+ // Load template select based on selected project group
+ function loadTemplateSelect(group, selectedTemplate) {
+ template.innerHTML = ""; // Clear existing options
+
+ // Add default 'Select Template' option
+ const defaultOption = document.createElement("option");
+ defaultOption.value = "";
+ defaultOption.textContent = "Select Template";
+ template.appendChild(defaultOption);
+
+ // Check if a project group is selected before populating templates
+ if (group && projectGroupToTemplates[group]) {
+ const templates = projectGroupToTemplates[group];
+ templates.forEach((tmpl) => {
+ const option = document.createElement("option");
+ option.value = tmpl.shortName;
+ option.textContent = tmpl.templateName;
+ if (tmpl.shortName === selectedTemplate) option.selected = true;
+ template.appendChild(option);
+ });
+ }
+ }
+
+ // Receive message from the extension
+ window.addEventListener("message", (event) => {
+ const message = event.data; // The JSON data our extension sent
+
+ switch (message.command) {
+ case "updateState":
+ projectGroupSelect.value = message.projectGroup;
+ loadTemplateSelect(message.projectGroup, message.selectedTemplate);
+ break;
+ }
+ });
+ /* Project group select End of Implementation */
+
+ template.addEventListener("keydown" | "click", () => {
project.focus();
});
- project.addEventListener('change', () => {
+ project.addEventListener("change", () => {
solution.value = project.value;
fieldValidation();
});
- solution.addEventListener('keyup', () => {
+ solution.addEventListener("keyup", () => {
fieldValidation();
});
- filePath.addEventListener('keyup' | 'focus', () => {
+ filePath.addEventListener("keyup" | "focus", () => {
fieldValidation();
});
- filePath.addEventListener('keydown', ()=>{
+ filePath.addEventListener("keydown", () => {
buttonFilePicker.focus();
});
// create console project
- buttonCreateProject.addEventListener('click', () => {
+ buttonCreateProject.addEventListener("click", () => {
let frameworkSelected = framework.options[framework.selectedIndex].value;
let frameworkRun = "";
-
+
if (frameworkSelected === "2.0") frameworkRun = "netcoreapp2.0";
else if (frameworkSelected === "2.1") frameworkRun = "netcoreapp2.1";
else if (frameworkSelected === "2.2") frameworkRun = "netcoreapp2.2";
@@ -63,9 +180,11 @@
else if (frameworkSelected === "3.1") frameworkRun = "netcoreapp3.1";
else if (frameworkSelected === "5.0") frameworkRun = "net5.0";
else if (frameworkSelected === "6.0") frameworkRun = "net6.0";
+ else if (frameworkSelected === "7.0") frameworkRun = "net7.0";
+ else if (frameworkSelected === "8.0") frameworkRun = "net8.0";
vscode.postMessage({
- command: 'createProject',
+ command: "createProject",
template: template.options[template.selectedIndex].value,
project: project.value,
filePath: filePath.value,
@@ -75,16 +194,17 @@
});
// file picker to save the project in a specific location
- buttonFilePicker.addEventListener('click', ()=> {
+ buttonFilePicker.addEventListener("click", () => {
solution.focus();
vscode.postMessage({
command: "selectDirectory",
+ projectGroupSelect:
+ projectGroupSelect.options[projectGroupSelect.selectedIndex].textContent,
templateName: template.options[template.selectedIndex].text,
template: template.options[template.selectedIndex].value,
project: project.value,
solution: solution.value,
framework: framework.options[framework.selectedIndex].value,
- });
- });
-
+ });
+ });
})();
diff --git a/media/sdks.txt b/media/sdks.txt
index 2b70666..280f92d 100644
Binary files a/media/sdks.txt and b/media/sdks.txt differ
diff --git a/media/vscode.css b/media/vscode.css
index 2b80f6e..565064d 100644
--- a/media/vscode.css
+++ b/media/vscode.css
@@ -91,7 +91,8 @@ textarea::placeholder {
}
/* custom select */
-#custom-select {
+#custom-select,
+#project-group-select {
width: 230px;
height: 30px;
}
@@ -109,6 +110,7 @@ textarea::placeholder {
#inputLocal {
width: 500px;
height: 30px;
+ background-color: #434443;
}
#selectFolder {
@@ -119,11 +121,15 @@ textarea::placeholder {
#projectName {
width: 500px;
height: 30px;
+ background-color: #434443;
+ color: white;
}
#solution {
width: 500px;
height: 30px;
+ background-color: #434443;
+ color: white;
}
#forminline {
diff --git a/out/CommandRegister.js b/out/CommandRegister.js
deleted file mode 100644
index 977ac72..0000000
--- a/out/CommandRegister.js
+++ /dev/null
@@ -1,72 +0,0 @@
-"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CommandRegister = void 0;
-const vscode = require("vscode");
-const CreateProject_1 = require("./resource/createProjectWebView/CreateProject");
-const SmartComments_1 = require("./resource/smartComments/SmartComments");
-const ContextualMenu_1 = require("./resource/contextualMenu/ContextualMenu");
-const AddProjectToSolution_1 = require("./resource/addProjectToSolution/AddProjectToSolution");
-/**
- * Singleton class to hold all CommandRegister configuration
- * This class is used to register new CommandRegister available in the system
- */
-class CommandRegister {
- constructor() { }
- static getInstance() {
- if (!CommandRegister._instance) {
- CommandRegister._instance = new CommandRegister();
- }
- return CommandRegister._instance;
- }
- // Initialize all commands
- initializeCommands(context) {
- this.context = context;
- this.createProject(context);
- this.addProjectToSolution();
- this.menuActivation();
- this.smartCommentsActivation();
- }
- // ****** Command registration ******
- smartCommentsActivation() {
- let smartComment = new SmartComments_1.SmartComments(this.context);
- smartComment.activateSmartComments();
- }
- createProject(context) {
- this.context.subscriptions.push(vscode.commands.registerCommand('csharp-snippet-productivity.createProject', () => __awaiter(this, void 0, void 0, function* () {
- CreateProject_1.CreateProjectPanel.createOrShow(this.context.extensionUri, this.context);
- })));
- }
- menuActivation() {
- if (this.context.globalState.get("framework") !== undefined) {
- this.framework = this.context.globalState.get("framework");
- }
- this.context.subscriptions.push(vscode.commands.registerCommand('csharp-snippet-productivity.createClass', (uri) => __awaiter(this, void 0, void 0, function* () {
- ContextualMenu_1.ContextualMenu.init(uri, 'class', this.framework);
- })));
- this.context.subscriptions.push(vscode.commands.registerCommand('csharp-snippet-productivity.createInterface', (uri) => __awaiter(this, void 0, void 0, function* () {
- ContextualMenu_1.ContextualMenu.init(uri, 'interface', this.framework);
- })));
- this.context.subscriptions.push(vscode.commands.registerCommand('csharp-snippet-productivity.createStruct', (uri) => __awaiter(this, void 0, void 0, function* () {
- ContextualMenu_1.ContextualMenu.init(uri, 'struct', this.framework);
- })));
- this.context.subscriptions.push(vscode.commands.registerCommand('csharp-snippet-productivity.createRecord', (uri) => __awaiter(this, void 0, void 0, function* () {
- ContextualMenu_1.ContextualMenu.init(uri, 'record', this.framework);
- })));
- }
- addProjectToSolution() {
- this.context.subscriptions.push(vscode.commands.registerCommand('csharp-snippet-productivity.addProjectToSolution', (uri) => __awaiter(this, void 0, void 0, function* () {
- AddProjectToSolution_1.AddProjectToSolution.init(uri, this.context);
- })));
- }
-}
-exports.CommandRegister = CommandRegister;
-//# sourceMappingURL=CommandRegister.js.map
\ No newline at end of file
diff --git a/out/extension.js b/out/extension.js
deleted file mode 100644
index 7a435f0..0000000
--- a/out/extension.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.deactivate = exports.activate = void 0;
-const CommandRegister_1 = require("./CommandRegister");
-function activate(context) {
- const commands = CommandRegister_1.CommandRegister.getInstance();
- commands.initializeCommands(context);
-}
-exports.activate = activate;
-function deactivate() { }
-exports.deactivate = deactivate;
-//# sourceMappingURL=extension.js.map
\ No newline at end of file
diff --git a/out/extension.js.map b/out/extension.js.map
deleted file mode 100644
index f170294..0000000
--- a/out/extension.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;AACA,uDAAoD;AAEpD,SAAgB,QAAQ,CAAC,OAAgC;IAErD,MAAM,QAAQ,GAAG,iCAAe,CAAC,WAAW,EAAE,CAAC;IAC/C,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAJD,4BAIC;AAED,SAAgB,UAAU,KAAK,CAAC;AAAhC,gCAAgC"}
\ No newline at end of file
diff --git a/out/resource/addProjectToSolution/AddProjectToSolution.js b/out/resource/addProjectToSolution/AddProjectToSolution.js
deleted file mode 100644
index 7dd237e..0000000
--- a/out/resource/addProjectToSolution/AddProjectToSolution.js
+++ /dev/null
@@ -1,55 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.AddProjectToSolution = void 0;
-const vscode = require("vscode");
-const path = require("path");
-const fs = require("fs");
-const Panel_1 = require("./Panel");
-class AddProjectToSolution {
- static init(uri, context) {
- vscode.window.showInputBox({ ignoreFocusOut: true, prompt: 'Type the project name', value: 'New project name' })
- .then((newFileName) => {
- var _a, _b;
- if (typeof (newFileName) === undefined || newFileName === '') {
- vscode.window.showErrorMessage('Please input a valid name or press Scape to cancel the operation!');
- return this.init(uri, context);
- }
- // Acquiring the solution root folder
- let root = (_a = vscode.workspace.workspaceFolders) === null || _a === void 0 ? void 0 : _a.map(folder => folder.uri.path)[0].replace(/\//g, '\\');
- root = root === null || root === void 0 ? void 0 : root.slice(1, root.length);
- // Removing white spaces within the new project name
- if (newFileName)
- newFileName = newFileName.replace(/\s/g, "");
- // Setting the new project path
- const newFilePath = root + path.sep + newFileName;
- // Verify if project already exist
- if (fs.existsSync(newFilePath)) {
- vscode.window.showErrorMessage(`Project ${newFileName} already exist`);
- return this.init(uri, context);
- }
- let rootDir = getProjectRootDirOrFilePath(root);
- if (rootDir === null) {
- vscode.window.showErrorMessage('Unable to find *.sln (solution)');
- return;
- }
- // Create a project
- // TODO: Pass project solution, project name
- if (newFileName) {
- const panel = new Panel_1.Panel(context, newFileName, rootDir, "Add Project", { folder: 'media', file: 'addProjectIcon.png' });
- (_b = panel.webViewPanel) === null || _b === void 0 ? void 0 : _b.onDidDispose(() => { panel.webViewPanel = undefined; }, context.subscriptions);
- }
- ;
- });
- }
-}
-exports.AddProjectToSolution = AddProjectToSolution;
-// function to detect the root directory where the .csproj is included
-function getProjectRootDirOrFilePath(filePath) {
- const paths = filePath.split("\\");
- const solution = filePath + path.sep + paths[paths.length - 1] + '.sln';
- if (!fs.existsSync(solution)) {
- return null;
- }
- return solution;
-}
-//# sourceMappingURL=AddProjectToSolution.js.map
\ No newline at end of file
diff --git a/out/resource/addProjectToSolution/Panel.js b/out/resource/addProjectToSolution/Panel.js
deleted file mode 100644
index 8721f80..0000000
--- a/out/resource/addProjectToSolution/Panel.js
+++ /dev/null
@@ -1,153 +0,0 @@
-"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Panel = void 0;
-const vscode_1 = require("vscode");
-const path = require("path");
-const fs = require("fs");
-class Panel {
- constructor(context, projectName, solution, title, iconPath = { folder: '', file: '' }, viewColumn = vscode_1.ViewColumn.One, preserveFocus = false, enableFindWidget = false, retainContextWhenHidden = false) {
- var _a;
- this._webViewPanel = undefined;
- // context from the extension main entry point
- this._context = context;
- this._projectName = projectName;
- this._solution = solution;
- let _viewType = title.replace(/[^A-Z0-9]/ig, "-");
- if (this._webViewPanel) {
- this._webViewPanel.reveal((_a = vscode_1.window.activeTextEditor) === null || _a === void 0 ? void 0 : _a.viewColumn);
- }
- else {
- // creating the panel
- this._webViewPanel = vscode_1.window.createWebviewPanel(_viewType, title, { preserveFocus, viewColumn }, { enableFindWidget, retainContextWhenHidden });
- this._webViewPanel.iconPath = vscode_1.Uri.file(path.join(this._context.extensionPath, iconPath.folder, iconPath.file));
- // webview options
- this._webViewPanel.webview.options = {
- enableCommandUris: false,
- enableScripts: true,
- localResourceRoots: [
- vscode_1.Uri.file(path.join(this._context.extensionPath, 'media')),
- vscode_1.Uri.file(path.join(this._context.extensionPath, 'out')),
- ],
- portMapping: []
- };
- // html content
- // Review: review th sdks. They are manually being inserted currently
- //this._sdks = this._webViewPanel.webview.asWebviewUri(Uri.file(path.join(this._context.extensionPath, 'media', 'sdks.txt')));
- //this._sdks = this.getTargetFrameworks(sdksResource);
- this._resetCss = this._webViewPanel.webview.asWebviewUri(vscode_1.Uri.file(path.join(this._context.extensionPath, 'media', 'reset.css')));
- this._vscodeCss = this._webViewPanel.webview.asWebviewUri(vscode_1.Uri.file(path.join(this._context.extensionPath, 'media', 'vscode.css')));
- this._script = this._webViewPanel.webview.asWebviewUri(vscode_1.Uri.file(path.join(this._context.extensionPath, 'media', 'addProject.js')));
- this._webViewPanel.webview.html = this.baseHtml('index.html', this._resetCss, this._vscodeCss, this._script);
- }
- // control event listener
- this._webViewPanel.webview.onDidReceiveMessage((message) => __awaiter(this, void 0, void 0, function* () {
- switch (message.command) {
- case "addProject":
- yield this.addProject(message);
- return;
- }
- }));
- }
- // TODO: Add the framework list in the add project load
- getSDKs(sdksResource) {
- const sdksList = fs.readFileSync(sdksResource.fsPath, 'utf8');
- let lines = sdksList.split('\n');
- let sdks = [];
- lines.forEach((line) => {
- let lineUpdated = line.replace(/\s+/g, '');
- lineUpdated = lineUpdated.replace(/[^a-z0-9A-Z.]/g, '');
- let sdk = lineUpdated.substring(0, 3);
- if (sdk) {
- sdks.push(sdk);
- }
- });
- // Eliminate duplicates
- sdks = sdks.filter((value, index, self) => self.indexOf(value) === index);
- return sdks;
- }
- addProject(message) {
- var _a;
- return __awaiter(this, void 0, void 0, function* () {
- let root = (_a = vscode_1.workspace.workspaceFolders) === null || _a === void 0 ? void 0 : _a.map(folder => folder.uri.path)[0].replace(/\//g, '\\');
- root = root === null || root === void 0 ? void 0 : root.slice(1, root.length);
- const terminal = vscode_1.window.createTerminal();
- terminal.show(true);
- terminal.sendText("dotnet new " + message.template + " --language c# -n " + message.project + " -o " + root + "\\" + message.project + " -f " + message.framework + " --force");
- terminal.sendText("dotnet sln " + this._solution + " add " + root + "\\" + message.project + "\\" + message.project + ".csproj");
- });
- }
- getNonce() {
- let text = '';
- const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
- for (let i = 0; i < 32; i++) {
- text += possible.charAt(Math.floor(Math.random() * possible.length));
- }
- return text;
- }
- get webViewPanel() { return this._webViewPanel; }
- set webViewPanel(panelInstance) { this._webViewPanel = panelInstance; }
- set iconPath(icon) {
- if (this._webViewPanel) {
- if (Array.isArray(icon)) {
- this._webViewPanel.iconPath = {
- dark: vscode_1.Uri.file(path.join(this._context.extensionPath, icon[0].folder, icon[0].file)),
- light: vscode_1.Uri.file(path.join(this._context.extensionPath, icon[1].folder, icon[1].file))
- };
- }
- else {
- this._webViewPanel.iconPath = vscode_1.Uri.file(path.join(this._context.extensionPath, icon.folder, icon.file));
- }
- }
- }
- set options(options) {
- if (this._webViewPanel) {
- this._webViewPanel.webview.options = options;
- }
- }
- allowedLocalResource(...folders) {
- if (this._webViewPanel) {
- let foldersRoot = [];
- for (let i = 0; i < folders.length; i++) {
- foldersRoot[i] = vscode_1.Uri.file(path.join(this._context.extensionPath, folders[i]));
- }
- this._webViewPanel.webview.options = {
- localResourceRoots: foldersRoot
- };
- }
- }
- set html(htmlDoc) {
- if (this._webViewPanel) {
- this._webViewPanel.webview.html = htmlDoc;
- }
- ;
- }
- addResource(content) {
- var _a;
- const diskResource = vscode_1.Uri.file(path.join(this._context.extensionPath, content.folder, content.resource));
- return (_a = this._webViewPanel) === null || _a === void 0 ? void 0 : _a.webview.asWebviewUri(diskResource);
- }
- baseHtml(page, ...resource) {
- let html = fs.readFileSync(path.join(this._context.extensionPath, 'media', page), 'utf-8');
- html = html.replace(`{{project}}`, this._projectName);
- html = html.replace(`{{stylesResetUri}}`, resource[0].toString());
- html = html.replace(`{{stylesMainUri}}`, resource[1].toString());
- html = html.replace(`{{script}}`, resource[2].toString());
- if (this._webViewPanel) {
- html = html.split(`{{nonce}}`).join(this.getNonce());
- html = html.split(`{{cspSource}}`).join(this._webViewPanel.webview.cspSource);
- }
- ;
- return html.toString();
- }
-}
-exports.Panel = Panel;
-//# sourceMappingURL=Panel.js.map
\ No newline at end of file
diff --git a/out/resource/contextualMenu/ContextualMenu.js b/out/resource/contextualMenu/ContextualMenu.js
deleted file mode 100644
index 924b9f7..0000000
--- a/out/resource/contextualMenu/ContextualMenu.js
+++ /dev/null
@@ -1,140 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ContextualMenu = void 0;
-const vscode = require("vscode");
-const path = require("path");
-const fs = require("fs");
-const parentFinder = require("find-parent-dir");
-const os = require("os");
-const findUpGlob = require('find-up-glob');
-const lineByLine = require('n-readlines');
-class ContextualMenu {
- static init(uri, fileType, framework) {
- let pathSelected = uri.fsPath;
- vscode.window.showInputBox({ ignoreFocusOut: true, prompt: 'Type the file name', value: 'New ' + fileType + '.cs' })
- .then((newFileName) => {
- if (typeof (newFileName) === undefined || newFileName === '') {
- vscode.window.showErrorMessage('Please input a valid name or press Scape to cancel the operation!');
- return this.init(uri, fileType, framework);
- }
- if (newFileName) {
- newFileName = newFileName.replace(/\s/g, '');
- }
- else {
- newFileName = 'New' + fileType + '.cs';
- }
- let newFilePath = pathSelected + path.sep + newFileName;
- if (fs.existsSync(newFilePath)) {
- vscode.window.showErrorMessage(`File ${newFileName} already exist`);
- return;
- }
- newFilePath = correctFileNameExtension(newFilePath);
- let originalFilePath = newFilePath;
- let rootDir = getProjectRootDirOrFilePath(newFilePath);
- if (rootDir === null) {
- vscode.window.showErrorMessage('Unable to find *.csproj or project.json');
- return;
- }
- let rootNamespace = checkRootNameOnCsproj(newFilePath);
- // Review: removing trailing separator. Check if works in other OS languages
- rootDir = (rootDir[rootDir.length - 1] === path.sep) ? rootDir.substring(0, rootDir.length - 1) : rootDir;
- let projRootDir = rootDir.substring(rootDir.lastIndexOf(path.sep) + 1);
- let childFilePath = newFilePath.substring(newFilePath.lastIndexOf(projRootDir));
- if (rootNamespace !== null) {
- childFilePath = childFilePath.replace(childFilePath.substring(0, childFilePath.indexOf('\\')), rootNamespace);
- }
- // set the regex pattern for path structure
- let pathSepRegEX = /\//g;
- if (os.platform() === 'win32') {
- pathSepRegEX = /\\/g;
- }
- // replace \\ for . in following the namespace convention
- let namespace = path.dirname(childFilePath);
- namespace = namespace.replace(pathSepRegEX, '.');
- // replace file name empty space or dash by underscore
- namespace = namespace.replace(/\s+/g, '_');
- namespace = namespace.replace(/-/g, '_');
- newFilePath = path.basename(newFilePath, '.cs');
- loadTemplate(fileType, namespace, newFilePath, originalFilePath, framework);
- });
- }
-}
-exports.ContextualMenu = ContextualMenu;
-// function to fix the file extension in case user forget to input .cs
-function correctFileNameExtension(fileName) {
- if (path.extname(fileName) !== '.cs') {
- if (fileName.endsWith('.')) {
- fileName = fileName + 'cs';
- }
- else {
- fileName = fileName + '.cs';
- }
- }
- return fileName;
-}
-// function to detect the root directory where the .csproj is included
-function getProjectRootDirOrFilePath(filePath) {
- var projectRootDir = parentFinder.sync(path.dirname(filePath), 'project.json');
- if (projectRootDir === null) {
- let csProjFiles = findUpGlob.sync('*.csproj', { cwd: path.dirname(filePath) });
- if (csProjFiles === null) {
- return null;
- }
- projectRootDir = path.dirname(csProjFiles[0]);
- }
- return projectRootDir;
-}
-// load the template, replace by current values and create the document in the folder selected
-function loadTemplate(templateType, namespace, newFilepath, originalFilePath, framework) {
- var _a;
- let fileTemplate = "";
- if (framework === "net6.0") {
- fileTemplate = templateType + '6.mdl';
- }
- else {
- fileTemplate = templateType + '.mdl';
- }
- vscode.workspace.openTextDocument(((_a = vscode.extensions.getExtension('richardzampieriprog.csharp-snippet-productivity')) === null || _a === void 0 ? void 0 : _a.extensionPath) + '/models/' + fileTemplate)
- .then((doc) => {
- let content = doc.getText();
- content = content.replace('${namespace}', namespace);
- content = content.replace('${fileName}', newFilepath);
- let cursorPos = findCursorPos(content);
- content = content.replace('${cursor}', '');
- fs.writeFileSync(originalFilePath, content);
- vscode.workspace.openTextDocument(originalFilePath).then((doc) => {
- vscode.window.showTextDocument(doc).then((editor) => {
- let selection = new vscode.Selection(cursorPos, cursorPos);
- editor.selection = selection;
- });
- });
- });
-}
-// find cursor position in the template file
-function findCursorPos(content) {
- var _a;
- let cursorPos = content.indexOf('${cursor}');
- let beforePos = content.substring(0, cursorPos);
- let line = (_a = beforePos.match(/\n/gi)) === null || _a === void 0 ? void 0 : _a.length;
- let charId = beforePos.substring(beforePos.lastIndexOf('\n')).length;
- return new vscode.Position((line !== undefined) ? line : 0, charId);
-}
-function checkRootNameOnCsproj(filePath) {
- let rootNamespace = (findUpGlob.sync('*.csproj', { cwd: path.dirname(filePath) }))[0];
- const liner = new lineByLine(rootNamespace);
- let line;
- while (line = liner.next()) {
- let l = line.toString('ascii');
- let result = l.match(/(.*?)<\/RootNamespace>/g);
- if (result === null) {
- continue;
- }
- let content = result[0];
- let root = content.substring(content.indexOf('>') + 1, content.indexOf(''));
- if (root !== null && root !== '') {
- return root;
- }
- }
- return null;
-}
-//# sourceMappingURL=ContextualMenu.js.map
\ No newline at end of file
diff --git a/out/resource/createProjectWebView/CreateProject.js b/out/resource/createProjectWebView/CreateProject.js
deleted file mode 100644
index 3acdb77..0000000
--- a/out/resource/createProjectWebView/CreateProject.js
+++ /dev/null
@@ -1,246 +0,0 @@
-"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CreateProjectPanel = void 0;
-const vscode = require("vscode");
-const GetNonce_1 = require("./GetNonce");
-const path = require("path");
-const fs = require("fs");
-class CreateProjectPanel {
- // constructor
- constructor(panel, extensionUri) {
- this.filepath = "";
- this._disposables = [];
- this._sdks = [];
- this._panel = panel;
- this._extensionUri = extensionUri;
- this._defaultFolder = vscode.workspace.getConfiguration('csharp-snippet-productivity').get('defaultFolderForProjectCreation');
- this.filepath = this._defaultFolder;
- this._terminal = vscode.window.activeTerminal === undefined ? vscode.window.createTerminal() : vscode.window.activeTerminal;
- this._terminal.show();
- // Set the Webview initial html content
- this._update();
- // OnPanel Close
- this._panel.onDidDispose(() => this.dispose(), null, this._disposables);
- this._panel.webview.onDidReceiveMessage((message) => __awaiter(this, void 0, void 0, function* () {
- switch (message.command) {
- case "createProject": //console
- yield this.projectCreation(message);
- return;
- case "selectDirectory":
- const options = {
- canSelectMany: false,
- openLabel: 'Select',
- canSelectFiles: false,
- canSelectFolders: true
- };
- vscode.window.showOpenDialog(options).then(fileUri => {
- if (fileUri && fileUri[0]) {
- this.filepath = fileUri[0].fsPath;
- this._update(message.templateName, message.template, message.project, message.solution, message.framework);
- }
- });
- return;
- }
- }), null, this._disposables);
- }
- static createOrShow(extensionUri, context) {
- this.context = context;
- const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined;
- // If we already have a panel, show it.
- if (CreateProjectPanel.currentPanel) {
- CreateProjectPanel.currentPanel._panel.reveal(column);
- CreateProjectPanel.currentPanel._update();
- return;
- }
- // Otherwise, create a new panel.
- const panel = vscode.window.createWebviewPanel('create-project', "Create Project", column || vscode.ViewColumn.One, {
- enableScripts: true,
- localResourceRoots: [
- vscode.Uri.joinPath(extensionUri, "media"),
- vscode.Uri.joinPath(extensionUri, "out/compiled")
- ],
- });
- // adding panel icon
- panel.iconPath = vscode.Uri.file(path.join(this.context.extensionPath, "media", "addProjectIcon.png"));
- CreateProjectPanel.currentPanel = new CreateProjectPanel(panel, extensionUri);
- }
- static kill() {
- var _a;
- (_a = CreateProjectPanel.currentPanel) === null || _a === void 0 ? void 0 : _a.dispose();
- CreateProjectPanel.currentPanel = undefined;
- }
- static revive(panel, extensionUri, newFileName) {
- CreateProjectPanel.currentPanel = new CreateProjectPanel(panel, extensionUri);
- }
- dispose() {
- CreateProjectPanel.currentPanel = undefined;
- // Clean up our resources
- this._panel.dispose();
- while (this._disposables.length) {
- const x = this._disposables.pop();
- if (x) {
- x.dispose();
- }
- }
- }
- projectCreation(message) {
- return __awaiter(this, void 0, void 0, function* () {
- if (fs.existsSync(this.filepath + "\\" + message.solution)) {
- vscode.window.showErrorMessage("Solution folder already exist");
- return;
- }
- if (message.template === 'grpc') {
- this._terminal.sendText("mkdir " + "\'" + this.filepath + "\\" + message.solution + "\'");
- this._terminal.sendText("dotnet new sln -n " + message.solution + " -o " + "\'" + this.filepath + "\\" + message.solution + "\'" + " --force");
- this._terminal.sendText("mkdir " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\'");
- this._terminal.sendText("dotnet new " + message.template + " --language c# -n " + message.project + " -o " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\'" + " --force");
- this._terminal.sendText("dotnet sln " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.solution + ".sln" + "\'" + " add " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\\" + message.project + ".csproj" + "\'");
- this._terminal.sendText("code " + "\'" + this.filepath + "\\" + message.solution + "\'" + " -r");
- }
- else if (message.template === 'minwebapi') {
- if (message.framework !== "net6.0") {
- vscode.window.showWarningMessage("Please select net6.0 for Minimal WebAPI");
- return;
- }
- this._terminal.sendText("mkdir " + "\'" + this.filepath + "\\" + message.solution + "\'");
- this._terminal.sendText("dotnet new sln -n " + message.solution + " -o " + "\'" + this.filepath + "\\" + message.solution + "\'" + " --force");
- this._terminal.sendText("mkdir " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\'");
- this._terminal.sendText("dotnet new webapi -minimal --language c# -n " + message.project + " -o " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\'" + " --framework " + message.framework + " --force");
- this._terminal.sendText("dotnet sln " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.solution + ".sln" + "\'" + " add " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\\" + message.project + ".csproj" + "\'");
- this._terminal.sendText("code " + "\'" + this.filepath + "\\" + message.solution + "\'" + " -r");
- }
- else {
- this._terminal.sendText("mkdir " + "\'" + this.filepath + "\\" + message.solution + "\'");
- this._terminal.sendText("dotnet new sln -n " + message.solution + " -o " + "\'" + this.filepath + "\\" + message.solution + "\'" + " --force");
- this._terminal.sendText("mkdir " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\'");
- this._terminal.sendText("dotnet new " + message.template + " --language c# -n " + message.project + " -o " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\'" + " --framework " + message.framework + " --force");
- this._terminal.sendText("dotnet sln " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.solution + ".sln" + "\'" + " add " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\\" + message.project + ".csproj" + "\'");
- this._terminal.sendText("code " + "\'" + this.filepath + "\\" + message.solution + "\'" + " -r");
- }
- // setting the current project framework to define the template namespace to be used
- CreateProjectPanel.context.globalState.update("framework", message.framework);
- });
- }
- getTargetFrameworks(sdksResource) {
- // Cleaning the sdk's folder path
- let sdkFile = String(sdksResource.fsPath);
- sdkFile.replace('/', '\\');
- sdkFile = sdkFile.substring(0, sdkFile.length);
- // clean file
- fs.truncate(sdksResource.fsPath, 0, () => { });
- this.writeSDKOnFile(sdkFile);
- const sdksList = fs.readFileSync(sdksResource.fsPath, 'utf8');
- let lines = sdksList.split('\n');
- let sdks = [];
- lines.forEach((line) => {
- let lineUpdated = line.replace(/\s+/g, '');
- lineUpdated = lineUpdated.replace(/[^a-z0-9A-Z.]/g, '');
- let sdk = lineUpdated.substring(0, 3);
- if (sdk) {
- sdks.push(sdk);
- }
- });
- // Eliminate duplicates
- sdks = sdks.filter((value, index, self) => self.indexOf(value) === index);
- return sdks;
- }
- writeSDKOnFile(sdkFile) {
- const os = process.platform;
- if (os === 'win32') {
- this._terminal.sendText(`Write-Output --noEnumeration | dotnet --list-sdks > "${sdkFile}"`);
- }
- else {
- this._terminal.sendText(`echo -n | dotnet --list-sdks > "${sdkFile}"`);
- }
- this._terminal.sendText("clear");
- }
- _update(templateName = 'Select Template', template = 'console', project = '', solution = '', framework = '') {
- return __awaiter(this, void 0, void 0, function* () {
- const webview = this._panel.webview;
- // list of sdk's
- const sdksResource = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'media', 'sdks.txt'));
- this._sdks = this.getTargetFrameworks(sdksResource);
- this._panel.webview.html = this._getHtmlForWebview(webview, templateName, template, project, solution, framework);
- });
- }
- _getHtmlForWebview(webview, templateName, template, project, solution, framework) {
- // main script integration
- const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, "media", "main.js"));
- // Local path to css styles
- const styleResetPath = vscode.Uri.joinPath(this._extensionUri, "media", "reset.css");
- const stylesPathMainPath = vscode.Uri.joinPath(this._extensionUri, "media", "vscode.css");
- // Uri to load styles into webview
- const stylesResetUri = webview.asWebviewUri(styleResetPath);
- const stylesMainUri = webview.asWebviewUri(stylesPathMainPath);
- // Use a nonce to only allow specific scripts to be run
- const nonce = GetNonce_1.getNonce();
- return `
-
-
-
-
-
-
-
-
-
- Create a new Solution or Project
-
-
- Select the project template
-
- ${(templateName === '') ? 'Select Template' : templateName}
- Blazor Server App
- Blazor WebAssembly App
- Console Application
- Class Library
- ASP.NET Core Empty
- ASP.NET Core MVC
- ASP.NET Core MVC Razor Page
- ASP.NET Core MVC Angular SPA
- ASP.NET Core MVC React SPA
- ASP.NET Core MVC React/Redux SPA
- ASP.NET Core Web API
- Minimal Web API
- ASP.NET Core GRPC Services
- Razor Class Library
- MSTest Project
- NUnit Test Project
- xUnit Test Project
-
-
-
- Project Name:
-
-
- Location:
-
-
- ...
-
-
- Solution Name:
-
-
- Framework
-
-
- ${this._sdks.map((sdk) => `${sdk} `).join('')}
-
- Create Project
-
-
-`;
- }
-}
-exports.CreateProjectPanel = CreateProjectPanel;
-//# sourceMappingURL=CreateProject.js.map
\ No newline at end of file
diff --git a/out/resource/createProjectWebView/GetNonce.js b/out/resource/createProjectWebView/GetNonce.js
deleted file mode 100644
index ab35364..0000000
--- a/out/resource/createProjectWebView/GetNonce.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.getNonce = void 0;
-function getNonce() {
- let text = '';
- const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
- for (let i = 0; i < 32; i++) {
- text += possible.charAt(Math.floor(Math.random() * possible.length));
- }
- return text;
-}
-exports.getNonce = getNonce;
-//# sourceMappingURL=GetNonce.js.map
\ No newline at end of file
diff --git a/out/resource/smartComments/Parser.js b/out/resource/smartComments/Parser.js
deleted file mode 100644
index fb2aeeb..0000000
--- a/out/resource/smartComments/Parser.js
+++ /dev/null
@@ -1,392 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Parser = void 0;
-const vscode = require("vscode");
-class Parser {
- constructor() {
- this.tags = [];
- this.expression = "";
- this.delimiter = "";
- this.blockCommentStart = "";
- this.blockCommentEnd = "";
- this.highlightSingleLineComments = true;
- this.highlightMultilineComments = false;
- this.highlightJSDoc = false;
- // this will allow plaintext files to show comment highlighting if switched on
- this.isPlainText = false;
- // this is used to prevent the first line of the file (specifically python) from coloring like other comments
- this.ignoreFirstLine = false;
- // this is used to trigger the events when a supported language code is found
- this.supportedLanguage = true;
- // Read from the package.json
- this.contributions = vscode.workspace.getConfiguration('csharp-snippet-productivity');
- this.setTags();
- }
- /**
- * Sets the regex to be used by the matcher based on the config specified in the package.json
- * @param languageCode The short code of the current language
- * https://code.visualstudio.com/docs/languages/identifiers
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- SetRegex(languageCode) {
- this.setDelimiter(languageCode);
- // if the language isn't supported, we don't need to go any further
- if (!this.supportedLanguage) {
- return;
- }
- let characters = [];
- for (let commentTag of this.tags) {
- characters.push(commentTag.escapedTag);
- }
- if (this.isPlainText && this.contributions.highlightPlainText) {
- // start by tying the regex to the first character in a line
- this.expression = "(^)+([ \\t]*[ \\t]*)";
- }
- else {
- // start by finding the delimiter (//, --, #, ') with optional spaces or tabs
- this.expression = "(" + this.delimiter.replace(/\//ig, "\\/") + ")+( |\t)*";
- }
- // Apply all configurable comment start tags
- this.expression += "(";
- this.expression += characters.join("|");
- this.expression += ")+(.*)";
- }
- /**
- * Finds all single line comments delimited by a given delimiter and matching tags specified in package.json
- * @param activeEditor The active text editor containing the code document
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- FindSingleLineComments(activeEditor) {
- // If highlight single line comments is off, single line comments are not supported for this language
- if (!this.highlightSingleLineComments) {
- return;
- }
- let text = activeEditor.document.getText();
- // if it's plain text, we have to do multiline regex to catch the start of the line with ^
- let regexFlags = (this.isPlainText) ? "igm" : "ig";
- let regEx = new RegExp(this.expression, regexFlags);
- let match;
- while (match = regEx.exec(text)) {
- let startPos = activeEditor.document.positionAt(match.index);
- let endPos = activeEditor.document.positionAt(match.index + match[0].length);
- let range = { range: new vscode.Range(startPos, endPos) };
- // Required to ignore the first line of .py files (#61)
- if (this.ignoreFirstLine && startPos.line === 0 && startPos.character === 0) {
- continue;
- }
- // Find which custom delimiter was used in order to add it to the collection
- let matchTag = this.tags.find(item => item.tag.toLowerCase() === match[3].toLowerCase());
- if (matchTag) {
- matchTag.ranges.push(range);
- }
- }
- }
- /**
- * Finds block comments as indicated by start and end delimiter
- * @param activeEditor The active text editor containing the code document
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- FindBlockComments(activeEditor) {
- // If highlight multiline is off in package.json or doesn't apply to his language, return
- if (!this.highlightMultilineComments) {
- return;
- }
- let text = activeEditor.document.getText();
- // Build up regex matcher for custom delimiter tags
- let characters = [];
- for (let commentTag of this.tags) {
- characters.push(commentTag.escapedTag);
- }
- // Combine custom delimiters and the rest of the comment block matcher
- let commentMatchString = "(^)+([ \\t]*[ \\t]*)(";
- commentMatchString += characters.join("|");
- commentMatchString += ")([ ]*|[:])+([^*/][^\\r\\n]*)";
- // Use start and end delimiters to find block comments
- let regexString = "(^|[ \\t])(";
- regexString += this.blockCommentStart;
- regexString += "[\\s])+([\\s\\S]*?)(";
- regexString += this.blockCommentEnd;
- regexString += ")";
- let regEx = new RegExp(regexString, "gm");
- let commentRegEx = new RegExp(commentMatchString, "igm");
- // Find the multiline comment block
- let match;
- while (match = regEx.exec(text)) {
- let commentBlock = match[0];
- // Find the line
- let line;
- while (line = commentRegEx.exec(commentBlock)) {
- let startPos = activeEditor.document.positionAt(match.index + line.index + line[2].length);
- let endPos = activeEditor.document.positionAt(match.index + line.index + line[0].length);
- let range = { range: new vscode.Range(startPos, endPos) };
- // Find which custom delimiter was used in order to add it to the collection
- let matchString = line[3];
- let matchTag = this.tags.find(item => item.tag.toLowerCase() === matchString.toLowerCase());
- if (matchTag) {
- matchTag.ranges.push(range);
- }
- }
- }
- }
- /**
- * Finds all multiline comments starting with "*"
- * @param activeEditor The active text editor containing the code document
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- FindJSDocComments(activeEditor) {
- // If highlight multiline is off in package.json or doesn't apply to his language, return
- if (!this.highlightMultilineComments && !this.highlightJSDoc) {
- return;
- }
- let text = activeEditor.document.getText();
- // Build up regex matcher for custom delimiter tags
- let characters = [];
- for (let commentTag of this.tags) {
- characters.push(commentTag.escapedTag);
- }
- // Combine custom delimiters and the rest of the comment block matcher
- let commentMatchString = "(^)+([ \\t]*\\*[ \\t]*)("; // Highlight after leading *
- let regEx = /(^|[ \t])(\/\*\*)+([\s\S]*?)(\*\/)/gm; // Find rows of comments matching pattern /** */
- commentMatchString += characters.join("|");
- commentMatchString += ")([ ]*|[:])+([^*/][^\\r\\n]*)";
- let commentRegEx = new RegExp(commentMatchString, "igm");
- // Find the multiline comment block
- let match;
- while (match = regEx.exec(text)) {
- let commentBlock = match[0];
- // Find the line
- let line;
- while (line = commentRegEx.exec(commentBlock)) {
- let startPos = activeEditor.document.positionAt(match.index + line.index + line[2].length);
- let endPos = activeEditor.document.positionAt(match.index + line.index + line[0].length);
- let range = { range: new vscode.Range(startPos, endPos) };
- // Find which custom delimiter was used in order to add it to the collection
- let matchString = line[3];
- let matchTag = this.tags.find(item => item.tag.toLowerCase() === matchString.toLowerCase());
- if (matchTag) {
- matchTag.ranges.push(range);
- }
- }
- }
- }
- /**
- * Apply decorations after finding all relevant comments
- * @param activeEditor The active text editor containing the code document
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- ApplyDecorations(activeEditor) {
- for (let tag of this.tags) {
- activeEditor.setDecorations(tag.decoration, tag.ranges);
- // clear the ranges for the next pass
- tag.ranges.length = 0;
- }
- }
- /**
- * Sets the comment delimiter [//, #, --, '] of a given language
- * @param languageCode The short code of the current language
- * https://code.visualstudio.com/docs/languages/identifiers
- */
- setDelimiter(languageCode) {
- this.supportedLanguage = true;
- this.ignoreFirstLine = false;
- this.isPlainText = false;
- switch (languageCode) {
- case "asciidoc":
- this.setCommentFormat("//", "////", "////");
- break;
- case "apex":
- case "javascript":
- case "javascriptreact":
- case "typescript":
- case "typescriptreact":
- this.setCommentFormat("//", "/*", "*/");
- this.highlightJSDoc = true;
- break;
- case "al":
- case "c":
- case "cpp":
- case "csharp":
- case "dart":
- case "flax":
- case "fsharp":
- case "go":
- case "groovy":
- case "haxe":
- case "java":
- case "jsonc":
- case "kotlin":
- case "less":
- case "pascal":
- case "objectpascal":
- case "php":
- case "rust":
- case "scala":
- case "sass":
- case "scss":
- case "shaderlab":
- case "stylus":
- case "swift":
- case "verilog":
- case "vue":
- this.setCommentFormat("//", "/*", "*/");
- break;
- case "css":
- this.setCommentFormat("/*", "/*", "*/");
- break;
- case "coffeescript":
- case "dockerfile":
- case "gdscript":
- case "graphql":
- case "julia":
- case "makefile":
- case "perl":
- case "perl6":
- case "puppet":
- case "r":
- case "ruby":
- case "shellscript":
- case "tcl":
- case "yaml":
- this.delimiter = "#";
- break;
- case "tcl":
- this.delimiter = "#";
- this.ignoreFirstLine = true;
- break;
- case "elixir":
- case "python":
- this.setCommentFormat("#", '"""', '"""');
- this.ignoreFirstLine = true;
- break;
- case "nim":
- this.setCommentFormat("#", "#[", "]#");
- break;
- case "powershell":
- this.setCommentFormat("#", "<#", "#>");
- break;
- case "ada":
- case "hive-sql":
- case "pig":
- case "plsql":
- case "sql":
- this.delimiter = "--";
- break;
- case "lua":
- this.setCommentFormat("--", "--[[", "]]");
- break;
- case "elm":
- case "haskell":
- this.setCommentFormat("--", "{-", "-}");
- break;
- case "brightscript":
- case "diagram": // ? PlantUML is recognized as Diagram (diagram)
- case "vb":
- this.delimiter = "'";
- break;
- case "bibtex":
- case "erlang":
- case "latex":
- case "matlab":
- this.delimiter = "%";
- break;
- case "clojure":
- case "racket":
- case "lisp":
- this.delimiter = ";";
- break;
- case "terraform":
- this.setCommentFormat("#", "/*", "*/");
- break;
- case "COBOL":
- this.delimiter = this.escapeRegExp("*>");
- break;
- case "fortran-modern":
- this.delimiter = "c";
- break;
- case "SAS":
- case "stata":
- this.setCommentFormat("*", "/*", "*/");
- break;
- case "html":
- case "markdown":
- case "xml":
- this.setCommentFormat("");
- break;
- case "twig":
- this.setCommentFormat("{#", "{#", "#}");
- break;
- case "genstat":
- this.setCommentFormat("\\", '"', '"');
- break;
- case "cfml":
- this.setCommentFormat("");
- break;
- case "plaintext":
- this.isPlainText = true;
- // If highlight plaintext is enabeld, this is a supported language
- this.supportedLanguage = this.contributions.highlightPlainText;
- break;
- default:
- this.supportedLanguage = false;
- break;
- }
- }
- /**
- * Sets the highlighting tags up for use by the parser
- */
- setTags() {
- let items = this.contributions.tags;
- for (let item of items) {
- let options = { color: item.color, backgroundColor: item.backgroundColor };
- // ? the textDecoration is initialized to empty so we can concat a preceding space on it
- options.textDecoration = "";
- if (item.strikethrough) {
- options.textDecoration += "line-through";
- }
- if (item.underline) {
- options.textDecoration += " underline";
- }
- if (item.bold) {
- options.fontWeight = "bold";
- }
- if (item.italic) {
- options.fontStyle = "italic";
- }
- let escapedSequence = item.tag.replace(/([()[{*+.$^\\|?])/g, '\\$1');
- this.tags.push({
- tag: item.tag,
- escapedTag: escapedSequence.replace(/\//gi, "\\/"),
- ranges: [],
- decoration: vscode.window.createTextEditorDecorationType(options)
- });
- }
- }
- /**
- * Escapes a given string for use in a regular expression
- * @param input The input string to be escaped
- * @returns {string} The escaped string
- */
- escapeRegExp(input) {
- return input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
- }
- /**
- * Set up the comment format for single and multiline highlighting
- * @param singleLine The single line comment delimiter. If NULL, single line is not supported
- * @param start The start delimiter for block comments
- * @param end The end delimiter for block comments
- */
- setCommentFormat(singleLine, start, end) {
- // If no single line comment delimiter is passed, single line comments are not supported
- if (singleLine) {
- this.delimiter = this.escapeRegExp(singleLine);
- }
- else {
- this.highlightSingleLineComments = false;
- }
- this.blockCommentStart = this.escapeRegExp(start);
- this.blockCommentEnd = this.escapeRegExp(end);
- this.highlightMultilineComments = this.contributions.multilineComments;
- }
-}
-exports.Parser = Parser;
-//# sourceMappingURL=Parser.js.map
\ No newline at end of file
diff --git a/out/resource/smartComments/SmartComments.js b/out/resource/smartComments/SmartComments.js
deleted file mode 100644
index 8b306a4..0000000
--- a/out/resource/smartComments/SmartComments.js
+++ /dev/null
@@ -1,70 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SmartComments = void 0;
-const vscode = require("vscode");
-const Parser_1 = require("./Parser");
-class SmartComments {
- constructor(context) {
- this.context = context;
- }
- activateSmartComments() {
- let activeEditor;
- let parser = new Parser_1.Parser();
- // Called to handle events below
- let updateDecorations = function (useHash = false) {
- // if no active window is open, return
- if (!activeEditor) {
- return;
- }
- // check language support
- if (!parser.supportedLanguage) {
- return;
- }
- // Finds the single line comments using the language comment delimiter
- parser.FindSingleLineComments(activeEditor);
- // Finds the multi line comments using the language comment delimiter
- parser.FindBlockComments(activeEditor);
- // Finds the jsdoc comments
- parser.FindJSDocComments(activeEditor);
- // Apply the styles set in the package.json
- parser.ApplyDecorations(activeEditor);
- };
- // Get the active editor for the first time and initialize the regex
- if (vscode.window.activeTextEditor) {
- activeEditor = vscode.window.activeTextEditor;
- // Set the regex patterns for the specified language's comments
- parser.SetRegex(activeEditor.document.languageId);
- // Trigger first update of decorators
- triggerUpdateDecorations();
- }
- // * Handle active file changed
- vscode.window.onDidChangeActiveTextEditor(editor => {
- if (editor) {
- activeEditor = editor;
- // Set regex for updated language
- parser.SetRegex(editor.document.languageId);
- // Trigger update to set decorations for newly active file
- triggerUpdateDecorations();
- }
- }, null, this.context.subscriptions);
- // * Handle file contents changed
- vscode.workspace.onDidChangeTextDocument(event => {
- // Trigger updates if the text was changed in the same document
- if (activeEditor && event.document === activeEditor.document) {
- triggerUpdateDecorations();
- }
- }, null, this.context.subscriptions);
- // * IMPORTANT:
- // To avoid calling update too often,
- // set a timer for 200ms to wait before updating decorations
- var timeout;
- function triggerUpdateDecorations() {
- if (timeout) {
- clearTimeout(timeout);
- }
- timeout = setTimeout(updateDecorations, 200);
- }
- }
-}
-exports.SmartComments = SmartComments;
-//# sourceMappingURL=SmartComments.js.map
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 1a401c9..366d7be 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,2028 +1,2863 @@
{
- "name": "csharp-snippet-productivity",
- "version": "1.3.0",
- "lockfileVersion": 1,
- "requires": true,
- "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.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
- "dev": true
- },
- "@babel/highlight": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz",
- "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.12.11",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
- "dependencies": {
- "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"
- }
- }
- }
- },
- "@eslint/eslintrc": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz",
- "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==",
- "dev": true,
- "requires": {
- "ajv": "^6.12.4",
- "debug": "^4.1.1",
- "espree": "^7.3.0",
- "globals": "^12.1.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.2.1",
- "js-yaml": "^3.13.1",
- "lodash": "^4.17.20",
- "minimatch": "^3.0.4",
- "strip-json-comments": "^3.1.1"
- },
- "dependencies": {
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true
- }
- }
- },
- "@nodelib/fs.scandir": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
- "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "2.0.4",
- "run-parallel": "^1.1.9"
- }
- },
- "@nodelib/fs.stat": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
- "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==",
- "dev": true
- },
- "@nodelib/fs.walk": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
- "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
- "dev": true,
- "requires": {
- "@nodelib/fs.scandir": "2.1.4",
- "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/find-parent-dir": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@types/find-parent-dir/-/find-parent-dir-0.3.0.tgz",
- "integrity": "sha512-jz1cHlySrflg1Xf6fhy8xe/Bc//eO7wkg7OQePQei4vIYHm9IIQs0Ed8pakV6qVuihTnmy+Le+xUYDardq7yNg==",
- "dev": true
- },
- "@types/glob": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
- "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
- "dev": true,
- "requires": {
- "@types/minimatch": "*",
- "@types/node": "*"
- }
- },
- "@types/json-schema": {
- "version": "7.0.7",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
- "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==",
- "dev": true
- },
- "@types/minimatch": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
- "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
- "dev": true
- },
- "@types/mocha": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz",
- "integrity": "sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ==",
- "dev": true
- },
- "@types/node": {
- "version": "18.0.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz",
- "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==",
- "dev": true
- },
- "@types/vscode": {
- "version": "1.53.0",
- "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.53.0.tgz",
- "integrity": "sha512-XjFWbSPOM0EKIT2XhhYm3D3cx3nn3lshMUcWNy1eqefk+oqRuBq8unVb6BYIZqXy9lQZyeUl7eaBCOZWv+LcXQ==",
- "dev": true
- },
- "@typescript-eslint/eslint-plugin": {
- "version": "4.15.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.0.tgz",
- "integrity": "sha512-DJgdGZW+8CFUTz5C/dnn4ONcUm2h2T0itWD85Ob5/V27Ndie8hUoX5HKyGssvR8sUMkAIlUc/AMK67Lqa3kBIQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/experimental-utils": "4.15.0",
- "@typescript-eslint/scope-manager": "4.15.0",
- "debug": "^4.1.1",
- "functional-red-black-tree": "^1.0.1",
- "lodash": "^4.17.15",
- "regexpp": "^3.0.0",
- "semver": "^7.3.2",
- "tsutils": "^3.17.1"
- }
- },
- "@typescript-eslint/experimental-utils": {
- "version": "4.15.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.0.tgz",
- "integrity": "sha512-V4vaDWvxA2zgesg4KPgEGiomWEBpJXvY4ZX34Y3qxK8LUm5I87L+qGIOTd9tHZOARXNRt9pLbblSKiYBlGMawg==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.3",
- "@typescript-eslint/scope-manager": "4.15.0",
- "@typescript-eslint/types": "4.15.0",
- "@typescript-eslint/typescript-estree": "4.15.0",
- "eslint-scope": "^5.0.0",
- "eslint-utils": "^2.0.0"
- }
- },
- "@typescript-eslint/parser": {
- "version": "4.15.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.0.tgz",
- "integrity": "sha512-L6Dtbq8Bc7g2aZwnIBETpmUa9XDKCMzKVwAArnGp5Mn7PRNFjf3mUzq8UeBjL3K8t311hvevnyqXAMSmxO8Gpg==",
- "dev": true,
- "requires": {
- "@typescript-eslint/scope-manager": "4.15.0",
- "@typescript-eslint/types": "4.15.0",
- "@typescript-eslint/typescript-estree": "4.15.0",
- "debug": "^4.1.1"
- }
- },
- "@typescript-eslint/scope-manager": {
- "version": "4.15.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.0.tgz",
- "integrity": "sha512-CSNBZnCC2jEA/a+pR9Ljh8Y+5TY5qgbPz7ICEk9WCpSEgT6Pi7H2RIjxfrrbUXvotd6ta+i27sssKEH8Azm75g==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "4.15.0",
- "@typescript-eslint/visitor-keys": "4.15.0"
- }
- },
- "@typescript-eslint/types": {
- "version": "4.15.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.0.tgz",
- "integrity": "sha512-su4RHkJhS+iFwyqyXHcS8EGPlUVoC+XREfy5daivjLur9JP8GhvTmDipuRpcujtGC4M+GYhUOJCPDE3rC5NJrg==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "4.15.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.0.tgz",
- "integrity": "sha512-jG6xTmcNbi6xzZq0SdWh7wQ9cMb2pqXaUp6bUZOMsIlu5aOlxGxgE/t6L/gPybybQGvdguajXGkZKSndZJpksA==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "4.15.0",
- "@typescript-eslint/visitor-keys": "4.15.0",
- "debug": "^4.1.1",
- "globby": "^11.0.1",
- "is-glob": "^4.0.1",
- "semver": "^7.3.2",
- "tsutils": "^3.17.1"
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "4.15.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.0.tgz",
- "integrity": "sha512-RnDtJwOwFucWFAMjG3ghCG/ikImFJFEg20DI7mn4pHEx3vC48lIAoyjhffvfHmErRDboUPC7p9Z2il4CLb7qxA==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "4.15.0",
- "eslint-visitor-keys": "^2.0.0"
- }
- },
- "@ungap/promise-all-settled": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
- "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
- "dev": true
- },
- "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.1",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
- "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
- "dev": true
- },
- "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": "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"
- }
- },
- "anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
- "dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "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"
- }
- },
- "arr-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
- "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
- "requires": {
- "make-iterator": "^1.0.0"
- }
- },
- "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.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "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"
- }
- },
- "binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true
- },
- "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==",
- "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
- },
- "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": "6.2.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
- "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
- "dev": true
- },
- "cb2promise": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/cb2promise/-/cb2promise-1.1.1.tgz",
- "integrity": "sha512-ShCxBARPFJlSO+Y4pxSpbXh6y+tW54Dmy4jKf0gB1C7qUslRqWqFi80+W9416zSoj6RsqMsnKUcpkt3bOrZmDg==",
- "requires": {
- "mimic-fn": "~2.0.0",
- "sliced": "~1.0.1"
- }
- },
- "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.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "dependencies": {
- "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"
- }
- },
- "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
- },
- "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
- },
- "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"
- }
- }
- }
- },
- "chokidar": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
- "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.1",
- "braces": "~3.0.2",
- "fsevents": "~2.3.1",
- "glob-parent": "~5.1.0",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.5.0"
- }
- },
- "cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
- "requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.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
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "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.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "decamelize": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
- "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
- },
- "diff": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
- "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
- "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"
- }
- },
- "escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
- },
- "eslint": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz",
- "integrity": "sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "7.12.11",
- "@eslint/eslintrc": "^0.3.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",
- "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",
- "file-entry-cache": "^6.0.0",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^5.0.0",
- "globals": "^12.1.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": "^4.17.20",
- "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.4",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
- },
- "dependencies": {
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true
- }
- }
- },
- "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": "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-visitor-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
- "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
- "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.5",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
- "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.0",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.2",
- "picomatch": "^2.2.1"
- }
- },
- "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.10.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz",
- "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==",
- "dev": true,
- "requires": {
- "reusify": "^1.0.4"
- }
- },
- "file-entry-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
- "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
- "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-parent-dir": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.1.tgz",
- "integrity": "sha512-o4UcykWV/XN9wm+jMEtWLPlV8RXCZnMhQI6F6OdHeSez7iiJWePw8ijOlskJZMsaQoGR/b7dH6lO02HhaTN7+A=="
- },
- "find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "requires": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "find-up-glob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/find-up-glob/-/find-up-glob-1.0.0.tgz",
- "integrity": "sha1-bBHr0ADHMBCtQpkbDV45iYkZpzY=",
- "requires": {
- "arr-map": "^2.0.0",
- "cb2promise": "^1.0.2",
- "minimatch": "^3.0.0",
- "pinkie-promise": "^2.0.1"
- }
- },
- "flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "dev": true
- },
- "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.1.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
- "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
- "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
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": 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"
- }
- }
- }
- },
- "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
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "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": "12.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
- "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
- "dev": true,
- "requires": {
- "type-fest": "^0.8.1"
- }
- },
- "globby": {
- "version": "11.0.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz",
- "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==",
- "dev": true,
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.1.1",
- "ignore": "^5.1.4",
- "merge2": "^1.3.0",
- "slash": "^3.0.0"
- }
- },
- "graceful-fs": {
- "version": "4.2.6",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
- "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
- "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-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "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": "5.1.8",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
- "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
- "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
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "requires": {
- "binary-extensions": "^2.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-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "dev": true
- },
- "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
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
- },
- "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": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "requires": {
- "p-locate": "^5.0.0"
- }
- },
- "lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true
- },
- "log-symbols": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
- "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
- "dev": true,
- "requires": {
- "chalk": "^4.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"
- }
- },
- "make-iterator": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
- "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
- "requires": {
- "kind-of": "^6.0.2"
- }
- },
- "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.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
- "dev": true,
- "requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.0.5"
- }
- },
- "mimic-fn": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.0.0.tgz",
- "integrity": "sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA=="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "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.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "mocha": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.0.tgz",
- "integrity": "sha512-TQqyC89V1J/Vxx0DhJIXlq9gbbL9XFNdeLQ1+JsnZsVaSOV1z3tWfw0qZmQJGQRIfkvZcs7snQnZnOCKoldq1Q==",
- "dev": true,
- "requires": {
- "@ungap/promise-all-settled": "1.1.2",
- "ansi-colors": "4.1.1",
- "browser-stdout": "1.3.1",
- "chokidar": "3.5.1",
- "debug": "4.3.1",
- "diff": "5.0.0",
- "escape-string-regexp": "4.0.0",
- "find-up": "5.0.0",
- "glob": "7.1.6",
- "growl": "1.10.5",
- "he": "1.2.0",
- "js-yaml": "4.0.0",
- "log-symbols": "4.0.0",
- "minimatch": "3.0.4",
- "ms": "2.1.3",
- "nanoid": "3.1.20",
- "serialize-javascript": "5.0.1",
- "strip-json-comments": "3.1.1",
- "supports-color": "8.1.1",
- "which": "2.0.2",
- "wide-align": "1.1.3",
- "workerpool": "6.1.0",
- "yargs": "16.2.0",
- "yargs-parser": "20.2.4",
- "yargs-unparser": "2.0.0"
- },
- "dependencies": {
- "argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- },
- "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
- },
- "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
- },
- "js-yaml": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz",
- "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==",
- "dev": true,
- "requires": {
- "argparse": "^2.0.1"
- }
- },
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- },
- "supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "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
- },
- "n-readlines": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/n-readlines/-/n-readlines-1.0.1.tgz",
- "integrity": "sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ=="
- },
- "nanoid": {
- "version": "3.1.20",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz",
- "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==",
- "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
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "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"
- }
- },
- "os": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz",
- "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M="
- },
- "p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "requires": {
- "yocto-queue": "^0.1.0"
- }
- },
- "p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "requires": {
- "p-limit": "^3.0.2"
- }
- },
- "parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "requires": {
- "callsites": "^3.0.0"
- }
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
- },
- "path-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.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
- "dev": true
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "^2.0.0"
- }
- },
- "prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true
- },
- "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.2",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz",
- "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==",
- "dev": true
- },
- "randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.1.0"
- }
- },
- "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"
- },
- "dependencies": {
- "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
- }
- }
- },
- "readdirp": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
- "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
- "dev": true,
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
- "regexpp": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
- "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
- "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
- },
- "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.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true
- },
- "semver": {
- "version": "7.3.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
- "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "serialize-javascript": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
- "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
- "dev": true,
- "requires": {
- "randombytes": "^2.1.0"
- }
- },
- "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
- },
- "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"
- },
- "dependencies": {
- "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"
- }
- },
- "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
- }
- }
- },
- "sliced": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
- "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
- },
- "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-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "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"
- },
- "dependencies": {
- "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
- }
- }
- },
- "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": "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"
- }
- },
- "table": {
- "version": "6.0.7",
- "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
- "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
- "dev": true,
- "requires": {
- "ajv": "^7.0.2",
- "lodash": "^4.17.20",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.0"
- },
- "dependencies": {
- "ajv": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz",
- "integrity": "sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g==",
- "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.20.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz",
- "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==",
- "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.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true
- },
- "typescript": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz",
- "integrity": "sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==",
- "dev": true
- },
- "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.2.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
- "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
- "dev": true
- },
- "vscode-test": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.5.0.tgz",
- "integrity": "sha512-svwE/mhBBqrB77C1U7pkUKfUmxnkzg0dLGi1vEmitsleu88oNsqZEhG3ANZrL/Ia4m0CW0oYEKRw2EojpFxLlQ==",
- "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"
- }
- },
- "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.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "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
- },
- "workerpool": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz",
- "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==",
- "dev": true
- },
- "wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "dependencies": {
- "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"
- }
- },
- "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
- }
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- },
- "y18n": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
- "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
- "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": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "requires": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- }
- },
- "yargs-parser": {
- "version": "20.2.4",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
- "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
- "dev": true
- },
- "yargs-unparser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
- "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
- "dev": true,
- "requires": {
- "camelcase": "^6.0.0",
- "decamelize": "^4.0.0",
- "flat": "^5.0.2",
- "is-plain-obj": "^2.1.0"
- }
- },
- "yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true
- }
- }
+ "name": "csharp-snippet-productivity",
+ "version": "1.3.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "csharp-snippet-productivity",
+ "version": "1.3.0",
+ "license": "SEE LICENSE IN LICENSE.md",
+ "dependencies": {
+ "find-parent-dir": "^0.3.1",
+ "find-up-glob": "^1.0.0",
+ "n-readlines": "^1.0.1",
+ "os": "^0.1.2"
+ },
+ "devDependencies": {
+ "@types/find-parent-dir": "^0.3.3",
+ "@types/glob": "^8.1.0",
+ "@types/mocha": "^10.0.6",
+ "@types/node": "^20.11.0",
+ "@types/vscode": "^1.85.0",
+ "@typescript-eslint/eslint-plugin": "^6.18.1",
+ "@typescript-eslint/parser": "^6.18.1",
+ "eslint": "^8.56.0",
+ "glob": "^10.3.10",
+ "mocha": "^10.2.0",
+ "typescript": "^5.3.3",
+ "vscode-test": "^1.5.0"
+ },
+ "engines": {
+ "vscode": "^1.53.0"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+ "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.56.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
+ "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.14",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+ "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.2",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
+ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
+ "dev": true
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "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/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "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/find-parent-dir": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@types/find-parent-dir/-/find-parent-dir-0.3.3.tgz",
+ "integrity": "sha512-oXxAjqOLsR1Buf0+e/uu4QskIaS+rz/jkmc6Og021y3PXQVQ197tpHQCC+WHAqU90NHI+qEDdY+NlVVlWAyONQ==",
+ "dev": true
+ },
+ "node_modules/@types/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==",
+ "dev": true,
+ "dependencies": {
+ "@types/minimatch": "^5.1.2",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
+ "node_modules/@types/minimatch": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
+ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
+ "dev": true
+ },
+ "node_modules/@types/mocha": {
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz",
+ "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.11.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz",
+ "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.6",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
+ "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+ "dev": true
+ },
+ "node_modules/@types/vscode": {
+ "version": "1.85.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.85.0.tgz",
+ "integrity": "sha512-CF/RBon/GXwdfmnjZj0WTUMZN5H6YITOfBCP4iEZlOtVQXuzw6t7Le7+cR+7JzdMrnlm7Mfp49Oj2TuSXIWo3g==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "6.18.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz",
+ "integrity": "sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.18.1",
+ "@typescript-eslint/type-utils": "6.18.1",
+ "@typescript-eslint/utils": "6.18.1",
+ "@typescript-eslint/visitor-keys": "6.18.1",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.18.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.1.tgz",
+ "integrity": "sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "6.18.1",
+ "@typescript-eslint/types": "6.18.1",
+ "@typescript-eslint/typescript-estree": "6.18.1",
+ "@typescript-eslint/visitor-keys": "6.18.1",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.18.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz",
+ "integrity": "sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.18.1",
+ "@typescript-eslint/visitor-keys": "6.18.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "6.18.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz",
+ "integrity": "sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "6.18.1",
+ "@typescript-eslint/utils": "6.18.1",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.18.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.1.tgz",
+ "integrity": "sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==",
+ "dev": true,
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.18.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz",
+ "integrity": "sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.18.1",
+ "@typescript-eslint/visitor-keys": "6.18.1",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "9.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "6.18.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.1.tgz",
+ "integrity": "sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.18.1",
+ "@typescript-eslint/types": "6.18.1",
+ "@typescript-eslint/typescript-estree": "6.18.1",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.18.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz",
+ "integrity": "sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.18.1",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "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/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/arr-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
+ "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
+ "dependencies": {
+ "make-iterator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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/balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "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/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "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/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": "6.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cb2promise": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cb2promise/-/cb2promise-1.1.1.tgz",
+ "integrity": "sha512-ShCxBARPFJlSO+Y4pxSpbXh6y+tW54Dmy4jKf0gB1C7qUslRqWqFi80+W9416zSoj6RsqMsnKUcpkt3bOrZmDg==",
+ "dependencies": {
+ "mimic-fn": "~2.0.0",
+ "sliced": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "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.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "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/chalk/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "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="
+ },
+ "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.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "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/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "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/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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": "8.56.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
+ "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.56.0",
+ "@humanwhocodes/config-array": "^0.11.13",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "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/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "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.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "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.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "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": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
+ "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
+ "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-parent-dir": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.1.tgz",
+ "integrity": "sha512-o4UcykWV/XN9wm+jMEtWLPlV8RXCZnMhQI6F6OdHeSez7iiJWePw8ijOlskJZMsaQoGR/b7dH6lO02HhaTN7+A=="
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-up-glob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/find-up-glob/-/find-up-glob-1.0.0.tgz",
+ "integrity": "sha1-bBHr0ADHMBCtQpkbDV45iYkZpzY=",
+ "dependencies": {
+ "arr-map": "^2.0.0",
+ "cb2promise": "^1.0.2",
+ "minimatch": "^3.0.0",
+ "pinkie-promise": "^2.0.1"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+ "dev": true
+ },
+ "node_modules/foreground-child": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "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/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/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/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/glob": {
+ "version": "10.3.10",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+ "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.3.5",
+ "minimatch": "^9.0.1",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+ "path-scurry": "^1.10.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
+ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
+ "dev": true
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/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": "5.3.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
+ "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+ "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": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "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": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "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/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/jackspeak": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+ "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
+ "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
+ "dev": true,
+ "engines": {
+ "node": "14 || >=16.14"
+ }
+ },
+ "node_modules/make-iterator": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
+ "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.0.0.tgz",
+ "integrity": "sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "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/minipass": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+ "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mocha": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz",
+ "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.2.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "nanoid": "3.3.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mochajs"
+ }
+ },
+ "node_modules/mocha/node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "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/mocha/node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mocha/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/mocha/node_modules/minimatch": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
+ "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/mocha/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "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/n-readlines": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/n-readlines/-/n-readlines-1.0.1.tgz",
+ "integrity": "sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ==",
+ "engines": {
+ "node": ">=6.x.x"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
+ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/os": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz",
+ "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ=="
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "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-scurry": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
+ "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^9.1.1 || ^10.0.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dependencies": {
+ "pinkie": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "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/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "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/readable-stream/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/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "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/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/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/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.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "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/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "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/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "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/sliced": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
+ "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
+ },
+ "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_decoder/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/string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "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-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "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/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/to-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/ts-api-utils": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
+ "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.13.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/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": "5.3.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
+ "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "node_modules/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/vscode-test": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.5.0.tgz",
+ "integrity": "sha512-svwE/mhBBqrB77C1U7pkUKfUmxnkzg0dLGi1vEmitsleu88oNsqZEhG3ANZrL/Ia4m0CW0oYEKRw2EojpFxLlQ==",
+ "deprecated": "This package has been renamed to @vscode/test-electron, please update to the new name",
+ "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/workerpool": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
+ "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/y18n": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
+ "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
}
diff --git a/package.json b/package.json
index d93e6d0..8c561ef 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "csharp-snippet-productivity",
"displayName": "C# Toolbox of Productivity",
"description": "The complete set of tools for C# development",
- "version": "1.3.0",
+ "version": "2.0.0",
"icon": "icon.png",
"publisher": "richardzampieriprog",
"license": "SEE LICENSE IN LICENSE.md",
@@ -11,7 +11,7 @@
"url": "https://github.com/rsaz/csharp-snippet-productivity"
},
"engines": {
- "vscode": "^1.53.0"
+ "vscode": "^1.85.0"
},
"categories": [
"Programming Languages",
@@ -33,13 +33,7 @@
"activationEvents": [
"onLanguage:csharp",
"onLanguage:markdown",
- "onLanguage:plaintext",
- "onCommand:csharp-snippet-productivity.createProject",
- "onCommand:csharp-snippet-productivity.createClass",
- "onCommand:csharp-snippet-productivity.createInterface",
- "onCommand:csharp-snippet-productivity.createStruct",
- "onCommand:csharp-snippet-productivity.createRecord",
- "onCommand:csharp-snippet-productivity.addProjectToSolution"
+ "onLanguage:plaintext"
],
"contributes": {
"snippets": [
@@ -230,23 +224,23 @@
"package": "vsce package"
},
"devDependencies": {
- "@types/find-parent-dir": "^0.3.0",
- "@types/glob": "^7.1.3",
- "@types/mocha": "^8.0.4",
- "@types/node": "^18.0.0",
- "@types/vscode": "^1.53.0",
- "@typescript-eslint/eslint-plugin": "^4.14.1",
- "@typescript-eslint/parser": "^4.14.1",
- "eslint": "^7.19.0",
- "glob": "^7.1.6",
- "mocha": "^8.2.1",
- "typescript": "^4.1.3",
+ "@types/find-parent-dir": "^0.3.3",
+ "@types/glob": "^8.1.0",
+ "@types/mocha": "^10.0.6",
+ "@types/node": "^20.11.0",
+ "@types/vscode": "^1.85.0",
+ "@typescript-eslint/eslint-plugin": "^6.18.1",
+ "@typescript-eslint/parser": "^6.18.1",
+ "eslint": "^8.56.0",
+ "glob": "^10.3.10",
+ "mocha": "^10.2.0",
+ "typescript": "^5.3.3",
"vscode-test": "^1.5.0"
},
"dependencies": {
"find-parent-dir": "^0.3.1",
"find-up-glob": "^1.0.0",
"n-readlines": "^1.0.1",
- "os": "^0.1.1"
+ "os": "^0.1.2"
}
}
diff --git a/snippets/designpattern.json b/snippets/designpattern.json
index f26b503..7743804 100644
--- a/snippets/designpattern.json
+++ b/snippets/designpattern.json
@@ -3,11 +3,12 @@
"prefix": "singleton",
"body": [
"// class Singleton {",
- "//\t\tprivate static Singleton _instance",
+ "//\t\tprivate static Singleton _instance = null;",
"//\t\tpublic static Singleton GetInstance() {",
"//\t\t\tif (_instance == null) {",
"//\t\t\t\t_instance = new Singleton();",
- "// return _instance;",
+ "//\t\treturn _instance;",
+ "//\t\t}",
"//}"
],
"description": "Creational design pattern singleton"
@@ -134,4 +135,4 @@
],
"description": "Behavioral design pattern observer"
}
-}
\ No newline at end of file
+}
diff --git a/snippets/general.json b/snippets/general.json
index e8c9c7c..c8f3235 100644
--- a/snippets/general.json
+++ b/snippets/general.json
@@ -1,495 +1,312 @@
{
- "-> TODO Comments": {
- "prefix": "todo",
- "body": [
- "// TODO: ${0: comments}"
- ],
- "description": "TODO Comments"
- },
- "-> REVIEW Comments": {
- "prefix": "review",
- "body": [
- "// REVIEW: ${0: comments}"
- ],
- "description": "To Review Comments"
- },
- "-> BUG Comments": {
- "prefix": "bug",
- "body": [
- "// BUG: ${0: comments}"
- ],
- "description": "Bug Comments"
- },
- "-> RESEARCH Comments": {
- "prefix": "research",
- "body": [
- "// RESEARCH: ${0: comments}"
- ],
- "description": "Research Comments"
- },
- "-> Console WriteLine": {
- "prefix": "cw",
- "body": [
- "Console.${1|WriteLine,Write|}($0);"
- ],
- "description": "Console WriteLine();"
- },
- "-> WriteLine Interpolation": {
- "prefix": "cwi",
- "body": [
- "Console.${1|WriteLine,Write|}($\"${0:Text}\");"
- ],
- "description": "Console WriteLine with Interpolation"
- },
- "-> Console ReadLine": {
- "prefix": "cr",
- "body": [
- "Console.ReadLine();",
- "$0"
- ],
- "description": "Console ReadLine"
- },
- "-> Console ReadKey": {
- "prefix": "crk",
- "body": [
- "Console.ReadKey(true);",
- "$0"
- ],
- "description": "Console ReadKey"
- },
- "-> Console Clear": {
- "prefix": "clr",
- "body": [
- "Console.Clear();",
- "$0"
- ],
- "description": "Console Clear"
- },
- "-> Variable Declaration": {
- "prefix": "var",
- "body": [
- "${1:int} ${2:variable} = ${3:0};",
- "$0"
- ],
- "description": "Variable declaration"
- },
- "-> if statement": {
- "prefix": "if",
- "body": [
- "if (${1:condition})",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates an if statement"
- },
- "-> Else statement": {
- "prefix": "else",
- "body": [
- "else",
- "{",
- " $0",
- "}"
- ],
- "description": "Else statement"
- },
- "-> if else statement": {
- "prefix": "ifelse",
- "body": [
- "if (${1:condition})",
- "{",
- "\t$0",
- "}",
- "else",
- "{",
- "\t",
- "}"
- ],
- "description": "Creates an if else statement"
- },
- "-> Conditional operator": {
- "prefix": "iif",
- "body": [
- "var ${1:variable} = ${2:true};",
- "var ${3:result} = (${1} ? ${4:true} : ${5:false});",
- "$0"
- ],
- "description": "Creates a conditional operator"
- },
- "-> Enum": {
- "prefix": "enum",
- "body": [
- "enum ${1:Name}",
- "{",
- " $0",
- "}"
- ],
- "description": "Create a Enum Type"
- },
- "-> Switch statement": {
- "prefix": "switch",
- "body": [
- "switch (${1:condition})",
- "{",
- " $0",
- " default:",
- " break;",
- "}"
- ],
- "description": "Create a Switch statement"
- },
- "-> Using statement": {
- "prefix": "using",
- "body": [
- "using (${1:resource})",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Using statement"
- },
- "-> While loop": {
- "prefix": "while",
- "body": [
- "while (${1:condition})",
- "{",
- "\t$0",
- "}"
- ],
- "description": "While loop"
- },
- "-> Do while loop": {
- "prefix": "dowhile",
- "body": [
- "do",
- "{",
- "\t$0",
- "} while (${1:condition})"
- ],
- "description": "Creates a do while loop"
- },
- "-> for loop": {
- "prefix": "for",
- "body": [
- "for (var ${1:i} = ${2:0}; $1 < ${3:length}; $1++)",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates a for loop"
- },
- "-> reverse for loop": {
- "prefix": "forr",
- "body": [
- "for (int ${1:i} = ${2:length}; ${1:i} >= ${3:0} ; ${1:i}--)",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates a reverse for loop"
- },
- "-> foreach statement": {
- "prefix": "foreach",
- "body": [
- "foreach (var ${1:item} in ${2:collection})",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates a foreach statement"
- },
- "-> Array": {
- "prefix": "arr",
- "body": [
- "${1:type}[] ${2:arrayName} = new ${1}[${3:size}];",
- "$0"
- ],
- "description": "Creates an array"
- },
- "-> Var Array": {
- "prefix": "varr",
- "body": [
- "var ${1:arrayName} = new ${2:type}[${3:size}];",
- "$0"
- ],
- "description": "Creates an array using var"
- },
- "-> List": {
- "prefix": "lst",
- "body": [
- "List<${1:type}> ${2:arrayName} = new List<${1}>();",
- "$0"
- ],
- "description": "Creates a list"
- },
- "-> Var List": {
- "prefix": "vlst",
- "body": [
- "var ${1:arrayName} = new List<${2}>();",
- "$0"
- ],
- "description": "Creates a list with var"
- },
- "-> IList": {
- "prefix": "ilst",
- "body": [
- "IList<${1:type}> ${2:arrayName} = new List<${1}>();",
- "$0"
- ],
- "description": "Creates a generic list"
- },
- "-> Dictionary": {
- "prefix": "dic",
- "body": [
- "Dictionary<${1:key}, ${2:value}> ${3:dictionaryName} = new Dictionary<${1},${2}>();",
- "$0"
- ],
- "description": "Creates a dictionary"
- },
- "-> Var Dictionary": {
- "prefix": "vdic",
- "body": [
- "var ${1:dictionaryName} = new Dictionary<${2},${3}>();",
- "$0"
- ],
- "description": "Creates a dictionary with var"
- },
- "-> Concurrent Dictionary": {
- "prefix": "cdic",
- "body": [
- "ConcurrentDictionary<${1:key}, ${2:value}> ${3:dictionaryName} = new ConcurrentDictionary<${1},${2}>();",
- "$0"
- ],
- "description": "Creates a concurrent dictionary"
- },
- "-> IDictionary": {
- "prefix": "idic",
- "body": [
- "IDictionary<${1:key}, ${2:value}> ${3:dictionaryName} = new Dictionary<${1},${2}>();",
- "$0"
- ],
- "description": "Creates a idictionary"
- },
- "-> Function": {
- "prefix": "func",
- "body": [
- "public ${1:void} ${2:functionName}()",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates a standard function"
- },
- "-> Virtual Function": {
- "prefix": "vfunc",
- "body": [
- "public virtual ${1:void} ${2:functionName}()",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates a virtual function"
- },
- "-> Abstract Function": {
- "prefix": "afunc",
- "body": [
- "public abstract ${1:void} ${2:functionName}();",
- "\t$0"
- ],
- "description": "Creates a virtual function"
- },
- "-> Return Function": {
- "prefix": "rfunc",
- "body": [
- "public ${1:int} ${2:functionName}()",
- "{",
- "\t$0",
- "\treturn 0;",
- "}"
- ],
- "description": "Creates a function with return type"
- },
- "-> Static Function": {
- "prefix": "sfunc",
- "body": [
- "public static ${1:void} ${2:functionName}()",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates a static function"
- },
- "-> Params Function": {
- "prefix": "pfunc",
- "body": [
- "public ${1:void} ${2:functionName}(params ${3:type}[] list)",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates a static function"
- },
- "-> Exception Try Catch": {
- "prefix": "try",
- "body": [
- "try",
- "{",
- "\t$0",
- "}",
- "catch (${1:Exception} ${2:ex})",
- "{",
- "\t // TODO",
- "}"
- ],
- "description": "Creates a try catch block"
- },
- "-> Namespace": {
- "prefix": "namespace",
- "body": [
- "namespace ${name}",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Add namespace based on file directory"
- },
- "-> Struct": {
- "prefix": "struct",
- "body": [
- "struct ${1:structName}",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates a struct"
- },
- "-> Class": {
- "prefix": "class",
- "body": [
- "public class ${TM_FILENAME_BASE}",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates a basic class"
- },
- "-> Class Constructor": {
- "prefix": "ctor",
- "body": [
- "public ${TM_FILENAME_BASE}()",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates a constructor"
- },
- "-> Object Instantiation": {
- "prefix": "instantiate",
- "body": [
- "${1:class} ${2:objectName} = new ${1}($3);",
- "$0"
- ],
- "description": "Creates an object"
- },
- "-> Full Class": {
- "prefix": "fclass",
- "body": [
- "public class ${TM_FILENAME_BASE}",
- "{",
- "\tpublic ${TM_FILENAME_BASE}(){}",
- "\tpublic override string ToString(){throw new NotImplementedException();}",
- "\tpublic override bool Equals(object obj){throw new NotImplementedException();}",
- "\tpublic override int GetHashCode(){throw new NotImplementedException();}",
- "\t$0",
- "}"
- ],
- "description": "Creates a complete class implementation"
- },
- "-> Static Class": {
- "prefix": "sclass",
- "body": [
- "public static class ${TM_FILENAME_BASE}",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates a basic static class"
- },
- "-> Abstract Class": {
- "prefix": "aclass",
- "body": [
- "public abstract class ${TM_FILENAME_BASE}",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates an abstract class"
- },
- "-> Interface": {
- "prefix": "interface",
- "body": [
- "public interface I${TM_FILENAME_BASE}",
- "{",
- "\t$0",
- "}"
- ],
- "description": "Creates an interface"
- },
- "-> Properties": {
- "prefix": "prop",
- "body": [
- "public ${1:type} ${2:Property} { get; set; }"
- ],
- "description": "Creates property"
- },
- "-> Expanded Properties": {
- "prefix": "prope",
- "body": [
- "private ${1} _${3:property};",
- "public ${1:type} ${2:Property}",
- "{",
- "\tget => _${3}; ",
- "\tset => _${3} = value;",
- "}"
- ],
- "description": "Creates property"
- },
- "-> Record": {
- "prefix": "record",
- "body": [
- "public record ${1:RecordName}($0);"
- ],
- "description": "Creates a record model"
- },
- "-> Regex": {
- "prefix": "regex",
- "body": [
- "// ********** Character Class **********",
- "// . any character except newline",
- "// \\w\\d\\s word, digit, whitespace.",
- "// \\W\\D\\S not word, digit, whitespace",
- "// [abc] any of a, b, or c",
- "// [^abc] not a, b, or c",
- "// [a-g] character between a & g",
- "// ********** Anchors **********",
- "// ^abc$ start / end of the string",
- "// \\b\\B word, not-word boundary",
- "// ********** Escaped Characters **********",
- "// \\.\\*\\\\ escaped special characters",
- "// \\t\\n\\r tab, linefeed, carriage return",
- "// ********** Groups & Lookaround **********",
- "// (abc) capture group",
- "// \\1 backreference to group #1",
- "// (?:abc) non-capturing group",
- "// (?=abc) positive lookahead,",
- "// (?!abc) negative lookahead",
- "// ********** Quantifiers & Alternations **********",
- "// a*a+a? 0 or more, 1 or more, 0 or 1",
- "// a{5}a{2,} exactly five, two or more",
- "// a{1,3} between one & three",
- "// a+?a{2,}? match as few as possible",
- "// ab|cd match ab or cd"
- ],
- "description": "Regex cheat sheet"
- }
-}
\ No newline at end of file
+ "-> TODO Comments": {
+ "prefix": "todo",
+ "body": ["// TODO: ${0: comments}"],
+ "description": "TODO Comments"
+ },
+ "-> REVIEW Comments": {
+ "prefix": "review",
+ "body": ["// REVIEW: ${0: comments}"],
+ "description": "To Review Comments"
+ },
+ "-> BUG Comments": {
+ "prefix": "bug",
+ "body": ["// BUG: ${0: comments}"],
+ "description": "Bug Comments"
+ },
+ "-> RESEARCH Comments": {
+ "prefix": "research",
+ "body": ["// RESEARCH: ${0: comments}"],
+ "description": "Research Comments"
+ },
+ "-> Console WriteLine": {
+ "prefix": "cw",
+ "body": ["Console.${1|WriteLine,Write|}($0);"],
+ "description": "Console WriteLine();"
+ },
+ "-> WriteLine Interpolation": {
+ "prefix": "cwi",
+ "body": ["Console.${1|WriteLine,Write|}($\"${0:Text}\");"],
+ "description": "Console WriteLine with Interpolation"
+ },
+ "-> Console ReadLine": {
+ "prefix": "cr",
+ "body": ["Console.ReadLine();", "$0"],
+ "description": "Console ReadLine"
+ },
+ "-> Console ReadKey": {
+ "prefix": "crk",
+ "body": ["Console.ReadKey(true);", "$0"],
+ "description": "Console ReadKey"
+ },
+ "-> Console Clear": {
+ "prefix": "clr",
+ "body": ["Console.Clear();", "$0"],
+ "description": "Console Clear"
+ },
+ "-> Variable Declaration": {
+ "prefix": "var",
+ "body": ["${1:int} ${2:variable} = ${3:0};", "$0"],
+ "description": "Variable declaration"
+ },
+ "-> if statement": {
+ "prefix": "if",
+ "body": ["if (${1:condition})", "{", "\t$0", "}"],
+ "description": "Creates an if statement"
+ },
+ "-> Else statement": {
+ "prefix": "else",
+ "body": ["else", "{", " $0", "}"],
+ "description": "Else statement"
+ },
+ "-> if else statement": {
+ "prefix": "ifelse",
+ "body": ["if (${1:condition})", "{", "\t$0", "}", "else", "{", "\t", "}"],
+ "description": "Creates an if else statement"
+ },
+ "-> Conditional operator": {
+ "prefix": "iif",
+ "body": [
+ "var ${1:variable} = ${2:true};",
+ "var ${3:result} = (${1} ? ${4:true} : ${5:false});",
+ "$0"
+ ],
+ "description": "Creates a conditional operator"
+ },
+ "-> Enum": {
+ "prefix": "enum",
+ "body": ["enum ${1:Name}", "{", " $0", "}"],
+ "description": "Create a Enum Type"
+ },
+ "-> Switch statement": {
+ "prefix": "switch",
+ "body": ["switch (${1:condition})", "{", " $0", " default:", " break;", "}"],
+ "description": "Create a Switch statement"
+ },
+ "-> Using statement": {
+ "prefix": "using",
+ "body": ["using (${1:resource})", "{", "\t$0", "}"],
+ "description": "Using statement"
+ },
+ "-> While loop": {
+ "prefix": "while",
+ "body": ["while (${1:condition})", "{", "\t$0", "}"],
+ "description": "While loop"
+ },
+ "-> Do while loop": {
+ "prefix": "dowhile",
+ "body": ["do", "{", "\t$0", "} while (${1:condition})"],
+ "description": "Creates a do while loop"
+ },
+ "-> for loop": {
+ "prefix": "for",
+ "body": ["for (var ${1:i} = ${2:0}; $1 < ${3:length}; $1++)", "{", "\t$0", "}"],
+ "description": "Creates a for loop"
+ },
+ "-> reverse for loop": {
+ "prefix": "forr",
+ "body": ["for (int ${1:i} = ${2:length}; ${1:i} >= ${3:0} ; ${1:i}--)", "{", "\t$0", "}"],
+ "description": "Creates a reverse for loop"
+ },
+ "-> foreach statement": {
+ "prefix": "foreach",
+ "body": ["foreach (var ${1:item} in ${2:collection})", "{", "\t$0", "}"],
+ "description": "Creates a foreach statement"
+ },
+ "-> Array": {
+ "prefix": "arr",
+ "body": ["${1:type}[] ${2:arrayName} = new ${1}[${3:size}];", "$0"],
+ "description": "Creates an array"
+ },
+ "-> Var Array": {
+ "prefix": "varr",
+ "body": ["var ${1:arrayName} = new ${2:type}[${3:size}];", "$0"],
+ "description": "Creates an array using var"
+ },
+ "-> List": {
+ "prefix": "lst",
+ "body": ["List<${1:type}> ${2:arrayName} = new List<${1}>();", "$0"],
+ "description": "Creates a list"
+ },
+ "-> Var List": {
+ "prefix": "vlst",
+ "body": ["var ${1:arrayName} = new List<${2}>();", "$0"],
+ "description": "Creates a list with var"
+ },
+ "-> IList": {
+ "prefix": "ilst",
+ "body": ["IList<${1:type}> ${2:arrayName} = new List<${1}>();", "$0"],
+ "description": "Creates a generic list"
+ },
+ "-> Dictionary": {
+ "prefix": "dic",
+ "body": [
+ "Dictionary<${1:key}, ${2:value}> ${3:dictionaryName} = new Dictionary<${1},${2}>();",
+ "$0"
+ ],
+ "description": "Creates a dictionary"
+ },
+ "-> Var Dictionary": {
+ "prefix": "vdic",
+ "body": ["var ${1:dictionaryName} = new Dictionary<${2},${3}>();", "$0"],
+ "description": "Creates a dictionary with var"
+ },
+ "-> Concurrent Dictionary": {
+ "prefix": "cdic",
+ "body": [
+ "ConcurrentDictionary<${1:key}, ${2:value}> ${3:dictionaryName} = new ConcurrentDictionary<${1},${2}>();",
+ "$0"
+ ],
+ "description": "Creates a concurrent dictionary"
+ },
+ "-> IDictionary": {
+ "prefix": "idic",
+ "body": [
+ "IDictionary<${1:key}, ${2:value}> ${3:dictionaryName} = new Dictionary<${1},${2}>();",
+ "$0"
+ ],
+ "description": "Creates a idictionary"
+ },
+ "-> Function": {
+ "prefix": "func",
+ "body": ["public ${1:void} ${2:functionName}()", "{", "\t$0", "}"],
+ "description": "Creates a standard function"
+ },
+ "-> Virtual Function": {
+ "prefix": "vfunc",
+ "body": ["public virtual ${1:void} ${2:functionName}()", "{", "\t$0", "}"],
+ "description": "Creates a virtual function"
+ },
+ "-> Abstract Function": {
+ "prefix": "afunc",
+ "body": ["public abstract ${1:void} ${2:functionName}();", "\t$0"],
+ "description": "Creates a virtual function"
+ },
+ "-> Return Function": {
+ "prefix": "rfunc",
+ "body": ["public ${1:int} ${2:functionName}()", "{", "\t$0", "\treturn 0;", "}"],
+ "description": "Creates a function with return type"
+ },
+ "-> Static Function": {
+ "prefix": "sfunc",
+ "body": ["public static ${1:void} ${2:functionName}()", "{", "\t$0", "}"],
+ "description": "Creates a static function"
+ },
+ "-> Params Function": {
+ "prefix": "pfunc",
+ "body": ["public ${1:void} ${2:functionName}(params ${3:type}[] list)", "{", "\t$0", "}"],
+ "description": "Creates a static function"
+ },
+ "-> Exception Try Catch": {
+ "prefix": "try",
+ "body": ["try", "{", "\t$0", "}", "catch (${1:Exception} ${2:ex})", "{", "\t // TODO", "}"],
+ "description": "Creates a try catch block"
+ },
+ "-> Namespace": {
+ "prefix": "namespace",
+ "body": ["namespace ${1:name}", "{", "\t$0", "}"],
+ "description": "Add namespace based on file directory"
+ },
+ "-> Struct": {
+ "prefix": "struct",
+ "body": ["struct ${1:structName}", "{", "\t$0", "}"],
+ "description": "Creates a struct"
+ },
+ "-> Class": {
+ "prefix": "class",
+ "body": ["public class ${TM_FILENAME_BASE}", "{", "\t$0", "}"],
+ "description": "Creates a basic class"
+ },
+ "-> Class Constructor": {
+ "prefix": "ctor",
+ "body": ["public ${TM_FILENAME_BASE}()", "{", "\t$0", "}"],
+ "description": "Creates a constructor"
+ },
+ "-> Object Instantiation": {
+ "prefix": "instantiate",
+ "body": ["${1:class} ${2:objectName} = new ${1}($3);", "$0"],
+ "description": "Creates an object"
+ },
+ "-> Full Class": {
+ "prefix": "fclass",
+ "body": [
+ "public class ${TM_FILENAME_BASE}",
+ "{",
+ "\tpublic ${TM_FILENAME_BASE}(){}",
+ "\tpublic override string ToString(){throw new NotImplementedException();}",
+ "\tpublic override bool Equals(object obj){throw new NotImplementedException();}",
+ "\tpublic override int GetHashCode(){throw new NotImplementedException();}",
+ "\t$0",
+ "}"
+ ],
+ "description": "Creates a complete class implementation"
+ },
+ "-> Static Class": {
+ "prefix": "sclass",
+ "body": ["public static class ${TM_FILENAME_BASE}", "{", "\t$0", "}"],
+ "description": "Creates a basic static class"
+ },
+ "-> Abstract Class": {
+ "prefix": "aclass",
+ "body": ["public abstract class ${TM_FILENAME_BASE}", "{", "\t$0", "}"],
+ "description": "Creates an abstract class"
+ },
+ "-> Interface": {
+ "prefix": "interface",
+ "body": ["public interface I${TM_FILENAME_BASE}", "{", "\t$0", "}"],
+ "description": "Creates an interface"
+ },
+ "-> Properties": {
+ "prefix": "prop",
+ "body": ["public ${1:type} ${2:Property} { get; set; }"],
+ "description": "Creates property"
+ },
+ "-> Expanded Properties": {
+ "prefix": "prope",
+ "body": [
+ "private ${1} _${3:property};",
+ "public ${1:type} ${2:Property}",
+ "{",
+ "\tget => _${3}; ",
+ "\tset => _${3} = value;",
+ "}"
+ ],
+ "description": "Creates property"
+ },
+ "-> Record": {
+ "prefix": "record",
+ "body": ["public record ${1:RecordName}($0);"],
+ "description": "Creates a record model"
+ },
+ "-> Regex": {
+ "prefix": "regex",
+ "body": [
+ "// ********** Character Class **********",
+ "// . any character except newline",
+ "// \\w\\d\\s word, digit, whitespace.",
+ "// \\W\\D\\S not word, digit, whitespace",
+ "// [abc] any of a, b, or c",
+ "// [^abc] not a, b, or c",
+ "// [a-g] character between a & g",
+ "// ********** Anchors **********",
+ "// ^abc$ start / end of the string",
+ "// \\b\\B word, not-word boundary",
+ "// ********** Escaped Characters **********",
+ "// \\.\\*\\\\ escaped special characters",
+ "// \\t\\n\\r tab, linefeed, carriage return",
+ "// ********** Groups & Lookaround **********",
+ "// (abc) capture group",
+ "// \\1 backreference to group #1",
+ "// (?:abc) non-capturing group",
+ "// (?=abc) positive lookahead,",
+ "// (?!abc) negative lookahead",
+ "// ********** Quantifiers & Alternations **********",
+ "// a*a+a? 0 or more, 1 or more, 0 or 1",
+ "// a{5}a{2,} exactly five, two or more",
+ "// a{1,3} between one & three",
+ "// a+?a{2,}? match as few as possible",
+ "// ab|cd match ab or cd"
+ ],
+ "description": "Regex cheat sheet"
+ }
+}
diff --git a/src/CommandRegister.ts b/src/CommandRegister.ts
index c64a1e1..d9ae4c4 100644
--- a/src/CommandRegister.ts
+++ b/src/CommandRegister.ts
@@ -1,77 +1,81 @@
-import * as vscode from 'vscode';
-import { CreateProjectPanel } from './resource/createProjectWebView/CreateProject';
-import { SmartComments } from './resource/smartComments/SmartComments';
-import { ContextualMenu } from './resource/contextualMenu/ContextualMenu';
-import { AddProjectToSolution } from './resource/addProjectToSolution/AddProjectToSolution';
+import * as vscode from "vscode";
+import { CreateProjectPanel } from "./resource/createProjectWebView/CreateProject";
+import { SmartComments } from "./resource/smartComments/SmartComments";
+import { ContextualMenu } from "./resource/contextualMenu/ContextualMenu";
+import { AddProjectToSolution } from "./resource/addProjectToSolution/AddProjectToSolution";
/**
- * Singleton class to hold all CommandRegister configuration
- * This class is used to register new CommandRegister available in the system
+ * Singleton class to hold all CommandRegister configuration.
+ * This class is used to register new commands available in the system.
*/
export class CommandRegister {
- private static _instance: CommandRegister;
- private context!: vscode.ExtensionContext;
- private framework!: string;
+ private static _instance: CommandRegister | null = null;
+ private readonly context: vscode.ExtensionContext;
+ private framework: string;
- private constructor() {}
-
- public static getInstance(): CommandRegister {
- if (!CommandRegister._instance) {
- CommandRegister._instance = new CommandRegister();
- }
- return CommandRegister._instance;
+ private constructor(context: vscode.ExtensionContext) {
+ this.context = context;
+ this.framework = context.globalState.get("framework") ?? "";
+ }
+
+ public static getInstance(context: vscode.ExtensionContext): CommandRegister {
+ if (!CommandRegister._instance) {
+ CommandRegister._instance = new CommandRegister(context);
}
+ return CommandRegister._instance;
+ }
- // Initialize all commands
- public initializeCommands(context: vscode.ExtensionContext): void {
- this.context = context;
+ /**
+ * Initialize all commands
+ */
+ public initializeCommands(): void {
+ this.registerCommand("csharp-snippet-productivity.createProject", async () => {
+ CreateProjectPanel.createOrShow(this.context);
+ });
+ this.registerCommand(
+ "csharp-snippet-productivity.addProjectToSolution",
+ async (uri: vscode.Uri) => {
+ AddProjectToSolution.init(uri, this.context);
+ }
+ );
- this.createProject(context);
- this.addProjectToSolution();
- this.menuActivation();
- this.smartCommentsActivation();
- }
+ // Initialize smart comments
+ this.activateSmartComments();
- // ****** Command registration ******
- private smartCommentsActivation(): void {
- let smartComment = new SmartComments(this.context);
- smartComment.activateSmartComments();
- }
+ // Initialize contextual menu
+ this.activateContextualMenu();
+ }
- private createProject(context: vscode.ExtensionContext): void {
- this.context.subscriptions.push(vscode.commands.registerCommand('csharp-snippet-productivity.createProject', async ()=> {
- CreateProjectPanel.createOrShow(this.context.extensionUri, this.context);
- }));
- }
+ /**
+ * Activate SmartComments
+ */
+ private activateSmartComments(): void {
+ const smartComment = new SmartComments(this.context);
+ smartComment.activateSmartComments();
+ }
- private menuActivation(): void {
-
- if (this.context.globalState.get("framework") !== undefined) {
- this.framework = this.context.globalState.get("framework") as string;
+ /**
+ * Activate Contextual Menu
+ */
+ private activateContextualMenu(): void {
+ const types = ["class", "interface", "struct", "record"];
+ for (const type of types) {
+ this.registerCommand(
+ `csharp-snippet-productivity.create${type.charAt(0).toUpperCase() + type.slice(1)}`,
+ async (uri: vscode.Uri) => {
+ ContextualMenu.init(uri, type, this.framework);
}
-
- this.context.subscriptions.push(vscode.commands.registerCommand('csharp-snippet-productivity.createClass', async (uri: vscode.Uri)=> {
- ContextualMenu.init(uri, 'class', this.framework);
- }));
-
- this.context.subscriptions.push(vscode.commands.registerCommand('csharp-snippet-productivity.createInterface', async (uri: vscode.Uri)=> {
- ContextualMenu.init(uri, 'interface', this.framework);
- }));
-
- this.context.subscriptions.push(vscode.commands.registerCommand('csharp-snippet-productivity.createStruct', async (uri: vscode.Uri)=> {
- ContextualMenu.init(uri, 'struct', this.framework);
- }));
-
- this.context.subscriptions.push(vscode.commands.registerCommand('csharp-snippet-productivity.createRecord', async (uri: vscode.Uri)=> {
- ContextualMenu.init(uri, 'record', this.framework);
- }));
+ );
}
+ }
- private addProjectToSolution() {
- this.context.subscriptions.push(vscode.commands.registerCommand('csharp-snippet-productivity.addProjectToSolution', async (uri: vscode.Uri)=> {
- AddProjectToSolution.init(uri, this.context);
- }));
-
- }
+ /**
+ * Utility function to register a command
+ * @param commandId - The ID of the command
+ * @param callback - The callback function to execute when the command is triggered
+ */
+ private registerCommand(commandId: string, callback: (...args: any[]) => any): void {
+ this.context.subscriptions.push(vscode.commands.registerCommand(commandId, callback));
+ }
}
diff --git a/src/extension.ts b/src/extension.ts
index d06a04e..00868e3 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -1,10 +1,15 @@
-import * as vscode from 'vscode';
-import { CommandRegister } from './CommandRegister';
+import * as vscode from "vscode";
+import { CommandRegister } from "./CommandRegister";
+/**
+ * This method is called when the extension is activated
+ */
export function activate(context: vscode.ExtensionContext) {
-
- const commands = CommandRegister.getInstance();
- commands.initializeCommands(context);
+ const commands = CommandRegister.getInstance(context);
+ commands.initializeCommands();
}
-export function deactivate() { }
\ No newline at end of file
+/**
+ * This method is called when the extension is deactivated
+ */
+export function deactivate() {}
diff --git a/src/resource/addProjectToSolution/AddProjectToSolution.ts b/src/resource/addProjectToSolution/AddProjectToSolution.ts
index 0c16e81..3b3bc16 100644
--- a/src/resource/addProjectToSolution/AddProjectToSolution.ts
+++ b/src/resource/addProjectToSolution/AddProjectToSolution.ts
@@ -1,62 +1,73 @@
-import * as vscode from 'vscode';
-import * as path from 'path';
-import * as fs from 'fs';
-import { Panel } from './Panel';
-
+import * as vscode from "vscode";
+import * as path from "path";
+import * as fs from "fs";
+import { Panel } from "./Panel";
export class AddProjectToSolution {
-
- public static init(uri: vscode.Uri, context: vscode.ExtensionContext) {
- vscode.window.showInputBox({ignoreFocusOut: true, prompt: 'Type the project name', value: 'New project name'})
- .then((newFileName) => {
- if (typeof(newFileName) === undefined || newFileName === '') {
- vscode.window.showErrorMessage('Please input a valid name or press Scape to cancel the operation!');
- return this.init(uri, context);
- }
-
- // Acquiring the solution root folder
- let root = vscode.workspace.workspaceFolders?.map(folder => folder.uri.path)[0]
- .replace(/\//g,'\\');
- root = root?.slice(1, root.length);
-
- // Removing white spaces within the new project name
- if (newFileName) newFileName = newFileName.replace(/\s/g, "");
-
- // Setting the new project path
- const newFilePath = root + path.sep + newFileName;
-
- // Verify if project already exist
- if (fs.existsSync(newFilePath)) {
- vscode.window.showErrorMessage(`Project ${newFileName} already exist`);
- return this.init(uri, context);
- }
-
- let rootDir = getProjectRootDirOrFilePath(root);
-
- if (rootDir === null){
- vscode.window.showErrorMessage('Unable to find *.sln (solution)');
- return;
- }
-
- // Create a project
- // TODO: Pass project solution, project name
- if (newFileName) {
- const panel = new Panel(context, newFileName, rootDir, "Add Project", {folder: 'media', file: 'addProjectIcon.png'});
- panel.webViewPanel?.onDidDispose(()=> {panel.webViewPanel = undefined;}, context.subscriptions);
-
- };
- }
- );
- }
+ public static init(uri: vscode.Uri, context: vscode.ExtensionContext) {
+ vscode.window
+ .showInputBox({
+ ignoreFocusOut: true,
+ prompt: "Type the project name",
+ value: "New project name",
+ })
+ .then((newFileName) => {
+ if (typeof newFileName === undefined || newFileName === "") {
+ vscode.window.showErrorMessage(
+ "Please input a valid name or press Scape to cancel the operation!"
+ );
+ return this.init(uri, context);
+ }
+
+ // Acquiring the solution root folder
+ let root = vscode.workspace.workspaceFolders
+ ?.map((folder) => folder.uri.path)[0]
+ .replace(/\//g, "\\");
+ root = root?.slice(1, root.length);
+
+ // Removing white spaces within the new project name
+ if (newFileName) {
+ newFileName = newFileName.replace(/\s/g, "");
+ }
+
+ // Setting the new project path
+ const newFilePath = root + path.sep + newFileName;
+
+ // Verify if project already exist
+ if (fs.existsSync(newFilePath)) {
+ vscode.window.showErrorMessage(`Project ${newFileName} already exist`);
+ return this.init(uri, context);
+ }
+
+ let rootDir = getProjectRootDirOrFilePath(root);
+
+ if (rootDir === null) {
+ vscode.window.showErrorMessage("Unable to find *.sln (solution)");
+ return;
+ }
+
+ // Create a project
+ // TODO: Pass project solution, project name
+ if (newFileName) {
+ const panel = new Panel(context, newFileName, rootDir, "Add Project", {
+ folder: "media",
+ file: "addProjectIcon.png",
+ });
+ panel.webViewPanel?.onDidDispose(() => {
+ panel.webViewPanel = undefined;
+ }, context.subscriptions);
+ }
+ });
+ }
}
// function to detect the root directory where the .csproj is included
-function getProjectRootDirOrFilePath(filePath: any){
- const paths : string[] = filePath.split("\\");
- const solution: string = filePath + path.sep + paths[paths.length-1] + '.sln';
-
- if (!fs.existsSync(solution)) {
- return null;
- }
- return solution;
-}
\ No newline at end of file
+function getProjectRootDirOrFilePath(filePath: any) {
+ const paths: string[] = filePath.split("\\");
+ const solution: string = filePath + path.sep + paths[paths.length - 1] + ".sln";
+
+ if (!fs.existsSync(solution)) {
+ return null;
+ }
+ return solution;
+}
diff --git a/src/resource/addProjectToSolution/Panel.ts b/src/resource/addProjectToSolution/Panel.ts
index 6615fdc..5df1250 100644
--- a/src/resource/addProjectToSolution/Panel.ts
+++ b/src/resource/addProjectToSolution/Panel.ts
@@ -1,179 +1,236 @@
-import {window, Uri, ViewColumn, WebviewPanel, ExtensionContext, WebviewOptions, workspace} from 'vscode';
-import * as path from 'path';
-import * as fs from 'fs';
+import {
+ window,
+ Uri,
+ ViewColumn,
+ WebviewPanel,
+ ExtensionContext,
+ WebviewOptions,
+ workspace,
+} from "vscode";
+import * as path from "path";
+import * as fs from "fs";
+import { getTargetFrameworks } from "../../utils/sdk.provider";
+
+type FrameworkCommand = {
+ [key: string]: string;
+};
+
+const frameworkCommands: FrameworkCommand = {
+ ["3.1"]: "netcoreapp3.1",
+ ["5.0"]: "net5.0",
+ ["6.0"]: "net6.0",
+ ["7.0"]: "net7.0",
+ ["8.0"]: "net8.0",
+};
export class Panel {
-
- readonly _context: ExtensionContext;
+ readonly _context: ExtensionContext;
private _webViewPanel: WebviewPanel | undefined = undefined;
private _vscodeCss!: Uri;
private _resetCss!: Uri;
private _script!: Uri;
private _projectName: string;
private _solution: string;
- private _sdks!: Uri;
-
+ private _sdksResources!: Uri;
+ private _sdks!: string[];
+
constructor(
- context: ExtensionContext,
- projectName: string,
- solution: string,
- title: string,
- iconPath: {folder: string, file: string} = {folder:'', file:''},
- viewColumn: ViewColumn = ViewColumn.One,
- preserveFocus: boolean = false,
- enableFindWidget: boolean = false,
- retainContextWhenHidden: boolean = false
+ context: ExtensionContext,
+ projectName: string,
+ solution: string,
+ title: string,
+ iconPath: { folder: string; file: string } = { folder: "", file: "" },
+ viewColumn: ViewColumn = ViewColumn.One,
+ preserveFocus: boolean = false,
+ enableFindWidget: boolean = false,
+ retainContextWhenHidden: boolean = false
) {
// context from the extension main entry point
this._context = context;
this._projectName = projectName;
this._solution = solution;
- let _viewType:string = title.replace(/[^A-Z0-9]/ig,"-");
-
+ let _viewType: string = title.replace(/[^A-Z0-9]/gi, "-");
+
if (this._webViewPanel) {
- this._webViewPanel.reveal(window.activeTextEditor?.viewColumn);
+ this._webViewPanel.reveal(window.activeTextEditor?.viewColumn);
} else {
- // creating the panel
- this._webViewPanel = window.createWebviewPanel(_viewType, title, {preserveFocus, viewColumn},{enableFindWidget, retainContextWhenHidden});
- this._webViewPanel.iconPath = Uri.file(path.join(this._context.extensionPath,iconPath.folder, iconPath.file));
-
- // webview options
- this._webViewPanel.webview.options = {
- enableCommandUris: false,
- enableScripts: true,
- localResourceRoots: [
- Uri.file(path.join(this._context.extensionPath, 'media')),
- Uri.file(path.join(this._context.extensionPath, 'out')),
- ],
- portMapping: []
- };
-
- // html content
- // Review: review th sdks. They are manually being inserted currently
- //this._sdks = this._webViewPanel.webview.asWebviewUri(Uri.file(path.join(this._context.extensionPath, 'media', 'sdks.txt')));
- //this._sdks = this.getTargetFrameworks(sdksResource);
- this._resetCss = this._webViewPanel.webview.asWebviewUri(Uri.file(path.join(this._context.extensionPath, 'media', 'reset.css')));
- this._vscodeCss = this._webViewPanel.webview.asWebviewUri(Uri.file(path.join(this._context.extensionPath, 'media', 'vscode.css')));
- this._script = this._webViewPanel.webview.asWebviewUri(Uri.file(path.join(this._context.extensionPath, 'media', 'addProject.js')));
- this._webViewPanel.webview.html = this.baseHtml('index.html', this._resetCss, this._vscodeCss,this._script);
+ // creating the panel
+ this._webViewPanel = window.createWebviewPanel(
+ _viewType,
+ title,
+ { preserveFocus, viewColumn },
+ { enableFindWidget, retainContextWhenHidden }
+ );
+ this._webViewPanel.iconPath = Uri.file(
+ path.join(this._context.extensionPath, iconPath.folder, iconPath.file)
+ );
+
+ // webview options
+ this._webViewPanel.webview.options = {
+ enableCommandUris: false,
+ enableScripts: true,
+ localResourceRoots: [
+ Uri.file(path.join(this._context.extensionPath, "media")),
+ Uri.file(path.join(this._context.extensionPath, "out")),
+ ],
+ portMapping: [],
+ };
+
+ this._sdksResources = this._webViewPanel.webview.asWebviewUri(
+ Uri.file(path.join(this._context.extensionPath, "media", "sdks.txt"))
+ );
+ this._sdks = getTargetFrameworks(this._sdksResources);
+ this._resetCss = this._webViewPanel.webview.asWebviewUri(
+ Uri.file(path.join(this._context.extensionPath, "media", "reset.css"))
+ );
+ this._vscodeCss = this._webViewPanel.webview.asWebviewUri(
+ Uri.file(path.join(this._context.extensionPath, "media", "vscode.css"))
+ );
+ this._script = this._webViewPanel.webview.asWebviewUri(
+ Uri.file(path.join(this._context.extensionPath, "media", "addProject.js"))
+ );
+ this._webViewPanel.webview.html = this.baseHtml(
+ "index.html",
+ this._resetCss,
+ this._vscodeCss,
+ this._script
+ );
}
// control event listener
- this._webViewPanel.webview.onDidReceiveMessage(
- async (message) => {
+ this._webViewPanel.webview.onDidReceiveMessage(async (message) => {
switch (message.command) {
- case "addProject":
- await this.addProject(message);
- return;
+ case "addProject":
+ await this.addProject(message);
+ return;
}
- }
- );
- }
-
- // TODO: Add the framework list in the add project load
- private getSDKs(sdksResource: Uri): string[] {
-
- const sdksList: string = fs.readFileSync(sdksResource.fsPath, 'utf8');
- let lines: string[] = sdksList.split('\n');
- let sdks: string[] = [];
-
- lines.forEach((line: string) => {
- let lineUpdated: string = line.replace(/\s+/g, '');
- lineUpdated = lineUpdated.replace(/[^a-z0-9A-Z.]/g,'');
- let sdk: string = lineUpdated.substring(0,3);
- if (sdk) {
- sdks.push(sdk);
- }
- });
-
- // Eliminate duplicates
- sdks = sdks.filter((value, index, self) => self.indexOf(value) === index);
-
- return sdks;
-
+ });
}
private async addProject(message: any): Promise {
-
- let root = workspace.workspaceFolders?.map(folder => folder.uri.path)[0]
- .replace(/\//g,'\\');
- root = root?.slice(1, root.length);
-
- const terminal = window.createTerminal();
- terminal.show(true);
- terminal.sendText("dotnet new "+message.template+" --language c# -n "+message.project+" -o "+root+"\\"+message.project+" -f "+message.framework+" --force");
- terminal.sendText("dotnet sln "+this._solution+" add "+root+"\\"+message.project+"\\"+message.project+".csproj");
+ let root = workspace.workspaceFolders
+ ?.map((folder) => folder.uri.path)[0]
+ .replace(/\//g, "\\");
+ root = root?.slice(1, root.length);
+
+ // Get the framework command
+ message.framework = frameworkCommands[message.framework];
+
+ const terminal = window.createTerminal();
+ terminal.show(true);
+ terminal.sendText(
+ "dotnet new " +
+ message.template +
+ " --language c# -n " +
+ message.project +
+ " -o " +
+ root +
+ "\\" +
+ message.project +
+ " -f " +
+ message.framework +
+ " --force"
+ );
+ terminal.sendText(
+ "dotnet sln " +
+ this._solution +
+ " add " +
+ root +
+ "\\" +
+ message.project +
+ "\\" +
+ message.project +
+ ".csproj"
+ );
}
private getNonce() {
- let text = '';
- const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
- for (let i:number = 0; i < 32; i++)
- {
- text += possible.charAt(Math.floor(Math.random() * possible.length));
- }
- return text;
+ let text = "";
+ const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+ for (let i: number = 0; i < 32; i++) {
+ text += possible.charAt(Math.floor(Math.random() * possible.length));
+ }
+ return text;
}
- public get webViewPanel(): WebviewPanel | undefined {return this._webViewPanel;}
- public set webViewPanel(panelInstance: WebviewPanel | undefined) { this._webViewPanel = panelInstance;}
+ public get webViewPanel(): WebviewPanel | undefined {
+ return this._webViewPanel;
+ }
+ public set webViewPanel(panelInstance: WebviewPanel | undefined) {
+ this._webViewPanel = panelInstance;
+ }
- public set iconPath(icon: {folder: string, file: string} | {folder: string, file: string}[]) {
- if (this._webViewPanel) {
- if (Array.isArray(icon)) {
- this._webViewPanel.iconPath = {
- dark: Uri.file(path.join(this._context.extensionPath,icon[0].folder, icon[0].file)),
- light: Uri.file(path.join(this._context.extensionPath,icon[1].folder, icon[1].file))
- };
- } else {
- this._webViewPanel.iconPath = Uri.file(path.join(this._context.extensionPath,icon.folder, icon.file));
+ public set iconPath(
+ icon: { folder: string; file: string } | { folder: string; file: string }[]
+ ) {
+ if (this._webViewPanel) {
+ if (Array.isArray(icon)) {
+ this._webViewPanel.iconPath = {
+ dark: Uri.file(
+ path.join(this._context.extensionPath, icon[0].folder, icon[0].file)
+ ),
+ light: Uri.file(
+ path.join(this._context.extensionPath, icon[1].folder, icon[1].file)
+ ),
+ };
+ } else {
+ this._webViewPanel.iconPath = Uri.file(
+ path.join(this._context.extensionPath, icon.folder, icon.file)
+ );
+ }
}
- }
}
public set options(options: WebviewOptions) {
- if (this._webViewPanel) {
- this._webViewPanel.webview.options = options;
- }
- }
- public allowedLocalResource(...folders: string[])
- {
- if (this._webViewPanel) {
- let foldersRoot: Uri[] = [];
-
- for (let i:number = 0; i < folders.length; i++)
- {
- foldersRoot[i] = Uri.file(path.join(this._context.extensionPath, folders[i]));
+ if (this._webViewPanel) {
+ this._webViewPanel.webview.options = options;
}
+ }
+ public allowedLocalResource(...folders: string[]) {
+ if (this._webViewPanel) {
+ let foldersRoot: Uri[] = [];
- this._webViewPanel.webview.options = {
- localResourceRoots: foldersRoot
- };
- }
+ for (let i: number = 0; i < folders.length; i++) {
+ foldersRoot[i] = Uri.file(path.join(this._context.extensionPath, folders[i]));
+ }
+
+ this._webViewPanel.webview.options = {
+ localResourceRoots: foldersRoot,
+ };
+ }
}
public set html(htmlDoc: string) {
- if (this._webViewPanel) {
- this._webViewPanel.webview.html = htmlDoc;
- };
+ if (this._webViewPanel) {
+ this._webViewPanel.webview.html = htmlDoc;
+ }
}
- public addResource(content: {folder: string, resource: string}): Uri | undefined {
- const diskResource = Uri.file(path.join(this._context.extensionPath, content.folder, content.resource));
- return this._webViewPanel?.webview.asWebviewUri(diskResource);
+ public addResource(content: { folder: string; resource: string }): Uri | undefined {
+ const diskResource = Uri.file(
+ path.join(this._context.extensionPath, content.folder, content.resource)
+ );
+ return this._webViewPanel?.webview.asWebviewUri(diskResource);
}
- private baseHtml(page:string, ...resource: Uri[]): string {
- let html = fs.readFileSync(path.join(this._context.extensionPath, 'media', page), 'utf-8');
- html = html.replace(`{{project}}`, this._projectName);
- html = html.replace(`{{stylesResetUri}}`, resource[0].toString());
- html = html.replace(`{{stylesMainUri}}`, resource[1].toString());
- html = html.replace(`{{script}}`, resource[2].toString());
- if (this._webViewPanel) {
- html = html.split(`{{nonce}}`).join(this.getNonce());
- html = html.split(`{{cspSource}}`).join( this._webViewPanel.webview.cspSource);
- };
- return html.toString();
+ private baseHtml(page: string, ...resource: Uri[]): string {
+ let html = fs.readFileSync(path.join(this._context.extensionPath, "media", page), "utf-8");
+ html = html.replace(`{{project}}`, this._projectName);
+ html = html.replace(`{{stylesResetUri}}`, resource[0].toString());
+ html = html.replace(`{{stylesMainUri}}`, resource[1].toString());
+ html = html.replace(`{{script}}`, resource[2].toString());
+
+ const sdkOptions = this._sdks
+ .map((sdk) => `${sdk} `)
+ .join("");
+
+ html = html.replace(`{{sdkOptions}}`, sdkOptions);
+
+ if (this._webViewPanel) {
+ html = html.split(`{{nonce}}`).join(this.getNonce());
+ html = html.split(`{{cspSource}}`).join(this._webViewPanel.webview.cspSource);
+ }
+ return html.toString();
}
-}
\ No newline at end of file
+}
diff --git a/src/resource/createProjectWebView/CreateProject.ts b/src/resource/createProjectWebView/CreateProject.ts
index 57539ac..8436eca 100644
--- a/src/resource/createProjectWebView/CreateProject.ts
+++ b/src/resource/createProjectWebView/CreateProject.ts
@@ -1,230 +1,236 @@
+import * as fs from "fs";
+import * as path from "path";
import * as vscode from "vscode";
+import { getTargetFrameworks } from "../../utils/sdk.provider";
import { getNonce } from "./GetNonce";
-import * as path from 'path';
-import * as fs from "fs";
+import { CommandFactory, Message } from "../../utils/terminal-cmd.provider";
export class CreateProjectPanel {
-
- public static currentPanel: CreateProjectPanel | undefined;
- private static context: vscode.ExtensionContext;
-
- private filepath: any = "";
- private readonly _panel: vscode.WebviewPanel;
- private readonly _extensionUri: vscode.Uri;
- private _disposables: vscode.Disposable[] = [];
- private _sdks: string[] = [];
- private _defaultFolder: vscode.WorkspaceConfiguration | undefined;
- private _terminal: vscode.Terminal;
-
- // constructor
- private constructor(panel: vscode.WebviewPanel, extensionUri: vscode.Uri) {
- this._panel = panel;
- this._extensionUri = extensionUri;
- this._defaultFolder = vscode.workspace.getConfiguration('csharp-snippet-productivity').get('defaultFolderForProjectCreation');
- this.filepath = this._defaultFolder;
- this._terminal = vscode.window.activeTerminal === undefined ? vscode.window.createTerminal() : vscode.window.activeTerminal;
- this._terminal.show();
-
- // Set the Webview initial html content
- this._update();
-
- // OnPanel Close
- this._panel.onDidDispose(() => this.dispose(), null, this._disposables);
-
- this._panel.webview.onDidReceiveMessage(
- async (message) => {
- switch (message.command) {
- case "createProject": //console
- await this.projectCreation(message);
- return;
-
- case "selectDirectory":
- const options: vscode.OpenDialogOptions = {
- canSelectMany: false,
- openLabel: 'Select',
- canSelectFiles: false,
- canSelectFolders: true
- };
-
- vscode.window.showOpenDialog(options).then(fileUri => {
- if (fileUri && fileUri[0]) {
- this.filepath = fileUri[0].fsPath;
- this._update(message.templateName, message.template, message.project, message.solution, message.framework);
- }
- });
+ private static context: vscode.ExtensionContext;
+ private static _filepath: any = "";
+ private static _panel: vscode.WebviewPanel;
+ private static _disposables: vscode.Disposable[] = [];
+ private static _sdks: string[] = [];
+ private static _defaultFolder: vscode.WorkspaceConfiguration | undefined;
+ private static _terminal: vscode.Terminal;
+
+ // To avoid direct instantiation use the createOrShow method
+ private constructor() {}
+
+ // Main method to create or show the panel
+ public static createOrShow(context: vscode.ExtensionContext): void {
+ this.context = context;
+
+ const column = vscode.window.activeTextEditor
+ ? vscode.window.activeTextEditor.viewColumn
+ : undefined;
+
+ // If we already have a panel, show it.
+ if (CreateProjectPanel._panel) {
+ CreateProjectPanel._panel.reveal(column);
+ CreateProjectPanel.update();
return;
}
- },
- null,
- this._disposables
- );
- }
-
- public static createOrShow(extensionUri: vscode.Uri, context: vscode.ExtensionContext): void {
-
- this.context = context;
-
- const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined;
- // If we already have a panel, show it.
- if (CreateProjectPanel.currentPanel) {
- CreateProjectPanel.currentPanel._panel.reveal(column);
- CreateProjectPanel.currentPanel._update();
- return;
+ // Otherwise, create a new panel.
+ const panel = vscode.window.createWebviewPanel(
+ "create-project",
+ "Create Project",
+ column || vscode.ViewColumn.One,
+ {
+ enableScripts: true,
+ localResourceRoots: [
+ vscode.Uri.joinPath(context.extensionUri, "media"),
+ vscode.Uri.joinPath(context.extensionUri, "out/compiled"),
+ ],
+ }
+ );
+
+ // adding panel icon
+ panel.iconPath = vscode.Uri.file(
+ path.join(this.context.extensionPath, "media", "addProjectIcon.png")
+ );
+
+ CreateProjectPanel.defaultConstructor(panel);
}
- // Otherwise, create a new panel.
- const panel = vscode.window.createWebviewPanel('create-project', "Create Project", column || vscode.ViewColumn.One,
- {
- enableScripts: true,
- localResourceRoots: [
- vscode.Uri.joinPath(extensionUri, "media"),
- vscode.Uri.joinPath(extensionUri, "out/compiled")
- ],
- }
- );
-
- // adding panel icon
- panel.iconPath = vscode.Uri.file(path.join(this.context.extensionPath, "media", "addProjectIcon.png"));
-
- CreateProjectPanel.currentPanel = new CreateProjectPanel(panel, extensionUri);
- }
-
- public static kill() {
- CreateProjectPanel.currentPanel?.dispose();
- CreateProjectPanel.currentPanel = undefined;
- }
-
- public static revive(panel: vscode.WebviewPanel, extensionUri: vscode.Uri, newFileName: string) {
- CreateProjectPanel.currentPanel = new CreateProjectPanel(panel, extensionUri);
- }
-
- public dispose() {
- CreateProjectPanel.currentPanel = undefined;
-
- // Clean up our resources
- this._panel.dispose();
-
- while (this._disposables.length) {
- const x = this._disposables.pop();
- if (x) {
- x.dispose();
- }
- }
- }
+ private static async defaultConstructor(panel: vscode.WebviewPanel) {
+ this._panel = panel;
- private async projectCreation(message: any) {
+ this._defaultFolder = vscode.workspace
+ .getConfiguration("csharp-snippet-productivity")
+ .get("defaultFolderForProjectCreation");
- if (fs.existsSync(this.filepath + "\\" + message.solution)) {
- vscode.window.showErrorMessage("Solution folder already exist");
- return;
- }
+ if (!this._defaultFolder) {
+ vscode.window.showInformationMessage(
+ "Please set a default folder for project creation"
+ );
+ }
- if (message.template === 'grpc') {
- this._terminal.sendText("mkdir " + "\'" + this.filepath + "\\" + message.solution + "\'");
- this._terminal.sendText("dotnet new sln -n " + message.solution + " -o " + "\'" + this.filepath + "\\" + message.solution + "\'" + " --force");
- this._terminal.sendText("mkdir " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\'");
- this._terminal.sendText("dotnet new " + message.template + " --language c# -n " + message.project + " -o " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\'" + " --force");
- this._terminal.sendText("dotnet sln " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.solution + ".sln" + "\'" + " add " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\\" + message.project + ".csproj" + "\'");
- this._terminal.sendText("code " + "\'" + this.filepath + "\\" + message.solution + "\'" + " -r");
-
- } else if (message.template === 'minwebapi') {
-
- if (message.framework !== "net6.0") {
- vscode.window.showWarningMessage("Please select net6.0 for Minimal WebAPI");
- return;
- }
-
- this._terminal.sendText("mkdir " + "\'" + this.filepath + "\\" + message.solution + "\'");
- this._terminal.sendText("dotnet new sln -n " + message.solution + " -o " + "\'" + this.filepath + "\\" + message.solution + "\'" + " --force");
- this._terminal.sendText("mkdir " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\'");
- this._terminal.sendText("dotnet new webapi -minimal --language c# -n " + message.project + " -o " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\'" + " --framework " + message.framework + " --force");
- this._terminal.sendText("dotnet sln " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.solution + ".sln" + "\'" + " add " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\\" + message.project + ".csproj" + "\'");
- this._terminal.sendText("code " + "\'" + this.filepath + "\\" + message.solution + "\'" + " -r");
-
- } else {
- this._terminal.sendText("mkdir " + "\'" + this.filepath + "\\" + message.solution + "\'");
- this._terminal.sendText("dotnet new sln -n " + message.solution + " -o " + "\'" + this.filepath + "\\" + message.solution + "\'" + " --force");
- this._terminal.sendText("mkdir " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\'");
- this._terminal.sendText("dotnet new " + message.template + " --language c# -n " + message.project + " -o " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\'" + " --framework " + message.framework + " --force");
- this._terminal.sendText("dotnet sln " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.solution + ".sln" + "\'" + " add " + "\'" + this.filepath + "\\" + message.solution + "\\" + message.project + "\\" + message.project + ".csproj" + "\'");
- this._terminal.sendText("code " + "\'" + this.filepath + "\\" + message.solution + "\'" + " -r");
+ this._filepath = this._defaultFolder;
+ this._terminal =
+ vscode.window.activeTerminal === undefined
+ ? vscode.window.createTerminal()
+ : vscode.window.activeTerminal;
+ this._terminal.show();
+
+ // OnPanel Close
+ this._panel.onDidDispose(() => this.dispose(), null, this._disposables);
+
+ this._panel.webview.onDidReceiveMessage(
+ async (message) => {
+ switch (message.command) {
+ case "createProject":
+ await this.projectCreation(message);
+ return;
+
+ case "selectDirectory":
+ const options: vscode.OpenDialogOptions = {
+ canSelectMany: false,
+ openLabel: "Select",
+ canSelectFiles: false,
+ canSelectFolders: true,
+ };
+ vscode.window.showOpenDialog(options).then((fileUri) => {
+ if (fileUri && fileUri[0]) {
+ this._filepath = fileUri[0].fsPath;
+ this.update(
+ message.projectGroupSelect,
+ message.projectGroupSelect,
+ message.templateName,
+ message.template,
+ message.project,
+ message.solution,
+ message.framework
+ );
+ }
+ });
+
+ this._panel.webview.postMessage({
+ command: "updateState",
+ projectGroupSelect: message.projectGroupSelect,
+ selectedTemplate: message.template,
+ });
+ return;
+ }
+ },
+ null,
+ this._disposables
+ );
+
+ // Set the Webview initial html content
+ this.update();
}
- // setting the current project framework to define the template namespace to be used
- CreateProjectPanel.context.globalState.update("framework", message.framework);
- }
-
- private getTargetFrameworks(sdksResource: vscode.Uri): string[] {
-
- // Cleaning the sdk's folder path
- let sdkFile: string = String(sdksResource.fsPath);
- sdkFile.replace('/', '\\');
- sdkFile = sdkFile.substring(0, sdkFile.length);
-
- // clean file
- fs.truncate(sdksResource.fsPath, 0, () => { });
-
- this.writeSDKOnFile(sdkFile);
- const sdksList: string = fs.readFileSync(sdksResource.fsPath, 'utf8');
- let lines: string[] = sdksList.split('\n');
- let sdks: string[] = [];
+ private static dispose() {
+ // Clean up our resources
+ this._panel.dispose();
- lines.forEach((line: string) => {
- let lineUpdated: string = line.replace(/\s+/g, '');
- lineUpdated = lineUpdated.replace(/[^a-z0-9A-Z.]/g, '');
- let sdk: string = lineUpdated.substring(0, 3);
- if (sdk) {
- sdks.push(sdk);
- }
- });
+ CreateProjectPanel._panel = undefined as any;
- // Eliminate duplicates
- sdks = sdks.filter((value, index, self) => self.indexOf(value) === index);
-
- return sdks;
- }
-
- private writeSDKOnFile(sdkFile: string) {
- const os = process.platform;
- if (os === 'win32') { this._terminal.sendText(`Write-Output --noEnumeration | dotnet --list-sdks > "${sdkFile}"`); }
- else { this._terminal.sendText(`echo -n | dotnet --list-sdks > "${sdkFile}"`); }
- this._terminal.sendText("clear");
- }
-
- private async _update(templateName: any = 'Select Template', template: any = 'console', project: any = '', solution: any = '', framework: any = '') {
-
- const webview = this._panel.webview;
-
- // list of sdk's
- const sdksResource: vscode.Uri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'media', 'sdks.txt'));
- this._sdks = this.getTargetFrameworks(sdksResource);
+ while (this._disposables.length) {
+ const x = this._disposables.pop();
+ if (x) {
+ x.dispose();
+ }
+ }
+ }
- this._panel.webview.html = this._getHtmlForWebview(webview, templateName, template, project, solution, framework);
- }
+ private static async projectCreation(message: Message) {
+ // Adjust filepath from the default or selection
+ message.filepath = this._filepath;
- private _getHtmlForWebview(webview: vscode.Webview, templateName: any, template: any, project: any, solution: any, framework: any) {
+ // Remove spaces from project and solution names
+ message.solution = message.solution.replace(/\s+/g, "");
+ message.project = message.project.replace(/\s+/g, "");
- // main script integration
- const scriptUri = webview.asWebviewUri(
- vscode.Uri.joinPath(this._extensionUri, "media", "main.js"));
+ if (fs.existsSync(this._filepath + "\\" + message.solution)) {
+ vscode.window.showErrorMessage("Solution folder already exist");
+ return;
+ }
- // Local path to css styles
- const styleResetPath = vscode.Uri.joinPath(this._extensionUri, "media", "reset.css");
- const stylesPathMainPath = vscode.Uri.joinPath(this._extensionUri, "media", "vscode.css");
+ const command = CommandFactory.getCommand(this._terminal, message);
+ command.execute();
- // Uri to load styles into webview
- const stylesResetUri = webview.asWebviewUri(styleResetPath);
- const stylesMainUri = webview.asWebviewUri(stylesPathMainPath);
+ // setting the current project framework to define the template namespace to be used
+ CreateProjectPanel.context.globalState.update("framework", message.framework);
+ }
- // Use a nonce to only allow specific scripts to be run
- const nonce = getNonce();
+ private static async update(
+ projectGroupName: any = "Select Project Type",
+ projectGroup: any = "api",
+ templateName: any = "Select Template",
+ template: any = "console",
+ project: any = "",
+ solution: any = "",
+ framework: any = ""
+ ) {
+ const webview = this._panel.webview;
+
+ // list of sdk's
+ const sdksResource: vscode.Uri = webview.asWebviewUri(
+ vscode.Uri.joinPath(this.context.extensionUri, "media", "sdks.txt")
+ );
+ this._sdks = getTargetFrameworks(sdksResource);
+
+ this._panel.webview.html = this.getHtmlForWebview(
+ webview,
+ projectGroupName,
+ projectGroup,
+ templateName,
+ template,
+ project,
+ solution,
+ framework
+ );
+ }
- return `
+ private static getHtmlForWebview(
+ webview: vscode.Webview,
+ projectGroupName: any,
+ projectGroup: any,
+ templateName: any,
+ template: any,
+ project: any,
+ solution: any,
+ framework: any
+ ) {
+ // main script integration
+ const scriptUri = webview.asWebviewUri(
+ vscode.Uri.joinPath(this.context.extensionUri, "media", "main.js")
+ );
+
+ // Local path to css styles
+ const styleResetPath = vscode.Uri.joinPath(this.context.extensionUri, "media", "reset.css");
+ const stylesPathMainPath = vscode.Uri.joinPath(
+ this.context.extensionUri,
+ "media",
+ "vscode.css"
+ );
+
+ // Uri to load styles into webview
+ const stylesResetUri = webview.asWebviewUri(styleResetPath);
+ const stylesMainUri = webview.asWebviewUri(stylesPathMainPath);
+
+ // Use a nonce to only allow specific scripts to be run
+ const nonce = getNonce();
+
+ // Post message transformation before sending to the webview
+ const frameworkPostMessage = this._sdks
+ .map((sdk: string) => {
+ return `${sdk} `;
+ })
+ .join("");
+
+ return `
-
+
@@ -233,26 +239,32 @@ export class CreateProjectPanel {
Create a new Solution or Project
+ Select the project type
+
+ ${
+ projectGroupName === "" ? "Select Project Type" : projectGroupName
+ }
+ API
+ Blazor
+ Cloud
+ Console
+ Desktop
+ Extensions
+ Game
+ IoT
+ Libraries
+ Machine Learning
+ MAUI
+ Mobile
+ Test
+ Web
+
+
+
Select the project template
- ${(templateName === '') ? 'Select Template' : templateName}
- Blazor Server App
- Blazor WebAssembly App
- Console Application
- Class Library
- ASP.NET Core Empty
- ASP.NET Core MVC
- ASP.NET Core MVC Razor Page
- ASP.NET Core MVC Angular SPA
- ASP.NET Core MVC React SPA
- ASP.NET Core MVC React/Redux SPA
- ASP.NET Core Web API
- Minimal Web API
- ASP.NET Core GRPC Services
- Razor Class Library
- MSTest Project
- NUnit Test Project
- xUnit Test Project
+ ${templateName}
+
@@ -261,7 +273,9 @@ export class CreateProjectPanel {
Location:
-
+
...
@@ -271,11 +285,11 @@ export class CreateProjectPanel {
Framework
- ${this._sdks.map((sdk: string) => `${sdk} `).join('')}
+ ${frameworkPostMessage}
Create Project
`;
- }
-}
\ No newline at end of file
+ }
+}
diff --git a/src/resource/smartComments/SmartComments.ts b/src/resource/smartComments/SmartComments.ts
index 83c44ec..7dff44a 100644
--- a/src/resource/smartComments/SmartComments.ts
+++ b/src/resource/smartComments/SmartComments.ts
@@ -1,83 +1,91 @@
-import * as vscode from 'vscode';
-import { Parser } from './Parser';
+import * as vscode from "vscode";
+import { Parser } from "./Parser";
export class SmartComments {
+ private context: vscode.ExtensionContext;
- private context: vscode.ExtensionContext;
-
- constructor(context: vscode.ExtensionContext){
- this.context = context;
- }
+ constructor(context: vscode.ExtensionContext) {
+ this.context = context;
+ }
- public activateSmartComments(){
+ public activateSmartComments() {
+ let activeEditor: vscode.TextEditor;
+ let parser: Parser = new Parser();
- let activeEditor: vscode.TextEditor;
- let parser: Parser = new Parser();
+ // Called to handle events below
+ let updateDecorations = function (useHash = false) {
+ // if no active window is open, return
+ if (!activeEditor) {
+ return;
+ }
- // Called to handle events below
- let updateDecorations = function (useHash = false) {
-
- // if no active window is open, return
- if (!activeEditor) {return;}
+ // check language support
+ if (!parser.supportedLanguage) {
+ return;
+ }
- // check language support
- if (!parser.supportedLanguage) {return;}
+ // Finds the single line comments using the language comment delimiter
+ parser.FindSingleLineComments(activeEditor);
- // Finds the single line comments using the language comment delimiter
- parser.FindSingleLineComments(activeEditor);
+ // Finds the multi line comments using the language comment delimiter
+ parser.FindBlockComments(activeEditor);
- // Finds the multi line comments using the language comment delimiter
- parser.FindBlockComments(activeEditor);
+ // Finds the jsdoc comments
+ parser.FindJSDocComments(activeEditor);
- // Finds the jsdoc comments
- parser.FindJSDocComments(activeEditor);
+ // Apply the styles set in the package.json
+ parser.ApplyDecorations(activeEditor);
+ };
- // Apply the styles set in the package.json
- parser.ApplyDecorations(activeEditor);
- };
+ // Get the active editor for the first time and initialize the regex
+ if (vscode.window.activeTextEditor) {
+ activeEditor = vscode.window.activeTextEditor;
- // Get the active editor for the first time and initialize the regex
- if (vscode.window.activeTextEditor) {
- activeEditor = vscode.window.activeTextEditor;
+ // Set the regex patterns for the specified language's comments
+ parser.SetRegex(activeEditor.document.languageId);
- // Set the regex patterns for the specified language's comments
- parser.SetRegex(activeEditor.document.languageId);
+ // Trigger first update of decorators
+ triggerUpdateDecorations();
+ }
- // Trigger first update of decorators
- triggerUpdateDecorations();
- }
+ // * Handle active file changed
+ vscode.window.onDidChangeActiveTextEditor(
+ (editor) => {
+ if (editor) {
+ activeEditor = editor;
- // * Handle active file changed
- vscode.window.onDidChangeActiveTextEditor(editor => {
- if (editor) {
- activeEditor = editor;
-
- // Set regex for updated language
- parser.SetRegex(editor.document.languageId);
-
- // Trigger update to set decorations for newly active file
- triggerUpdateDecorations();
- }
- }, null, this.context.subscriptions);
-
- // * Handle file contents changed
- vscode.workspace.onDidChangeTextDocument(event => {
-
- // Trigger updates if the text was changed in the same document
- if (activeEditor && event.document === activeEditor.document) {
- triggerUpdateDecorations();
- }
- }, null, this.context.subscriptions);
-
- // * IMPORTANT:
- // To avoid calling update too often,
- // set a timer for 200ms to wait before updating decorations
- var timeout: NodeJS.Timer;
- function triggerUpdateDecorations() {
- if (timeout) {
- clearTimeout(timeout);
- }
- timeout = setTimeout(updateDecorations, 200);
+ // Set regex for updated language
+ parser.SetRegex(editor.document.languageId);
+
+ // Trigger update to set decorations for newly active file
+ triggerUpdateDecorations();
+ }
+ },
+ null,
+ this.context.subscriptions
+ );
+
+ // * Handle file contents changed
+ vscode.workspace.onDidChangeTextDocument(
+ (event) => {
+ // Trigger updates if the text was changed in the same document
+ if (activeEditor && event.document === activeEditor.document) {
+ triggerUpdateDecorations();
}
+ },
+ null,
+ this.context.subscriptions
+ );
+
+ // * IMPORTANT:
+ // To avoid calling update too often,
+ // set a timer for 200ms to wait before updating decorations
+ var timeout: NodeJS.Timeout;
+ function triggerUpdateDecorations() {
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ timeout = setTimeout(updateDecorations, 200);
}
-}
\ No newline at end of file
+ }
+}
diff --git a/src/utils/sdk.provider.ts b/src/utils/sdk.provider.ts
new file mode 100644
index 0000000..40e8412
--- /dev/null
+++ b/src/utils/sdk.provider.ts
@@ -0,0 +1,64 @@
+import * as vscode from "vscode";
+import * as fs from "fs";
+
+export function getTargetFrameworks(sdksResource: vscode.Uri): string[] {
+ // Cleaning the sdk's folder path
+ let sdkFile: string = String(sdksResource.fsPath);
+ sdkFile.replace("/", "\\");
+ sdkFile = sdkFile.substring(0, sdkFile.length);
+
+ // clean file
+ fs.truncate(sdksResource.fsPath, 0, () => {});
+
+ writeSDKOnFile(sdkFile);
+
+ const sdksList: string = fs.readFileSync(sdksResource.fsPath, "utf8");
+ let lines: string[] = sdksList.split("\n");
+ let sdks: string[] = [];
+
+ lines.forEach((line: string) => {
+ let lineUpdated: string = line.replace(/\s+/g, "");
+ lineUpdated = lineUpdated.replace(/[^a-z0-9A-Z.]/g, "");
+ let sdk: string = lineUpdated.substring(0, 3);
+ if (sdk) {
+ sdks.push(sdk);
+ }
+ });
+
+ // Eliminate duplicates
+ sdks = sdks.filter((value, index, self) => self.indexOf(value) === index);
+
+ return sdks;
+}
+
+function writeSDKOnFile(sdkFile: string) {
+ const os = process.platform;
+ const terminal = getTerminal();
+ const terminalPath = vscode.workspace
+ .getConfiguration("terminal.integrated")
+ .get("shell.windows");
+
+ if (os === "win32") {
+ if (terminalPath && (terminalPath as string).includes("cmd.exe")) {
+ terminal.sendText(`dotnet --list-sdks > "${sdkFile}"`);
+ } else if (
+ terminalPath &&
+ ((terminalPath as string).includes("bash.exe") ||
+ (terminalPath as string).includes("git-bash.exe"))
+ ) {
+ terminal.sendText(`dotnet --list-sdks > "${sdkFile}"`);
+ } else {
+ // Default to PowerShell command
+ terminal.sendText(`Write-Output --noEnumeration | dotnet --list-sdks > "${sdkFile}"`);
+ }
+ } else {
+ terminal.sendText(`echo -n | dotnet --list-sdks > "${sdkFile}"`);
+ }
+ terminal.sendText("clear");
+}
+
+function getTerminal(): vscode.Terminal {
+ return vscode.window.activeTerminal === undefined
+ ? vscode.window.createTerminal()
+ : vscode.window.activeTerminal;
+}
diff --git a/src/utils/terminal-cmd.provider.ts b/src/utils/terminal-cmd.provider.ts
new file mode 100644
index 0000000..a513b58
--- /dev/null
+++ b/src/utils/terminal-cmd.provider.ts
@@ -0,0 +1,126 @@
+import * as vscode from "vscode";
+
+export type Message = {
+ command: string;
+ filepath: string;
+ solution: string;
+ project: string;
+ template: string;
+ framework: string;
+};
+
+type TemplateCompatibility = {
+ [key: string]: string[];
+};
+
+const TEMPLATE_COMPATIBILITY: TemplateCompatibility = {
+ react: ["net5.0", "net6.0", "net7.0"],
+ // add other templates here
+};
+
+export class Command {
+ protected terminal: vscode.Terminal;
+ protected message: Message;
+
+ constructor(terminal: vscode.Terminal, message: Message) {
+ this.terminal = terminal;
+ this.message = message;
+ }
+
+ executeCommonCommands() {
+ this.terminal.sendText(`mkdir '${this.message.filepath}\\${this.message.solution}'`);
+ this.terminal.sendText(
+ `dotnet new sln -n ${this.message.solution} -o '${this.message.filepath}\\${this.message.solution}' --force`
+ );
+ this.terminal.sendText(
+ `mkdir '${this.message.filepath}\\${this.message.solution}\\${this.message.project}'`
+ );
+ }
+
+ addProjectToSolution() {
+ this.terminal.sendText(
+ `dotnet sln '${this.message.filepath}\\${this.message.solution}\\${this.message.solution}.sln' add '${this.message.filepath}\\${this.message.solution}\\${this.message.project}\\${this.message.project}.csproj'`
+ );
+ }
+
+ openInVsCode() {
+ this.terminal.sendText(`code '${this.message.filepath}\\${this.message.solution}' -r`);
+ }
+
+ execute() {
+ // This method will be overridden in derived classes
+ }
+
+ isFrameworkCompatible() {
+ // Verify if template is not undefined
+ if (!this.message.template || !(this.message.template in TEMPLATE_COMPATIBILITY)) {
+ return true;
+ }
+ return TEMPLATE_COMPATIBILITY[this.message.template].includes(this.message.framework);
+ }
+}
+
+export class GrpcCommand extends Command {
+ execute(): void {
+ this.executeCommonCommands();
+ this.terminal.sendText(
+ `dotnet new grpc -n ${this.message.project} -o '${this.message.filepath}\\${this.message.solution}\\${this.message.project}' --force`
+ );
+ this.addProjectToSolution();
+ this.openInVsCode();
+ }
+}
+
+export class MinWebApiCommand extends Command {
+ execute() {
+ if (this.message.framework !== "net6.0") {
+ vscode.window.showWarningMessage("Please select net6.0 for Minimal WebAPI");
+ return;
+ }
+ this.executeCommonCommands();
+ this.terminal.sendText(
+ `dotnet new webapi -minimal --language c# -n ${this.message.project} -o '${this.message.filepath}\\${this.message.solution}\\${this.message.project}' --framework ${this.message.framework} --force`
+ );
+ this.addProjectToSolution();
+ this.openInVsCode();
+ }
+}
+
+export class DefaultCommand extends Command {
+ execute() {
+ if (!this.isFrameworkCompatible()) {
+ // Format list of compatible frameworks
+ const compatibleFrameworks = TEMPLATE_COMPATIBILITY[this.message.template]
+ .map((f) => `'${f.substring(3)}'`)
+ .join(", ");
+
+ vscode.window.showWarningMessage(
+ `Please select a compatible framework for ${this.message.template} - [${
+ compatibleFrameworks || "None"
+ }]`
+ );
+ return;
+ }
+
+ this.executeCommonCommands();
+ this.terminal.sendText(
+ `dotnet new ${this.message.template} -n ${this.message.project} -o '${this.message.filepath}\\${this.message.solution}\\${this.message.project}' --framework ${this.message.framework} --force`
+ );
+ this.addProjectToSolution();
+ this.openInVsCode();
+ }
+}
+
+export class CommandFactory {
+ static getCommand(terminal: vscode.Terminal, message: Message) {
+ switch (message.template) {
+ case "grpc":
+ return new GrpcCommand(terminal, message);
+ case "minwebapi":
+ return new MinWebApiCommand(terminal, message);
+ // Cases for other templates...
+ default:
+ return new DefaultCommand(terminal, message);
+ }
+ }
+}
diff --git a/tsconfig.json b/tsconfig.json
index 736c23f..a1867e4 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,19 +1,14 @@
{
- "compilerOptions": {
- "module": "commonjs",
- "target": "es6",
- "outDir": "out",
- "lib": [
- "es6"
- ],
- "sourceMap": true,
- "rootDir": "src",
- "strict": true, /* enable all strict type-checking options */
- "strictNullChecks": true,
- },
- "exclude": [
- "node_modules",
- ".vscode-test",
- "src/_test*"
- ]
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "es6",
+ "outDir": "out",
+ "lib": ["es6"],
+ "sourceMap": true,
+ "rootDir": "src",
+ "strict": true /* enable all strict type-checking options */,
+ "strictNullChecks": true,
+ "strictPropertyInitialization": false
+ },
+ "exclude": ["node_modules", ".vscode-test", "src/_test*"]
}