From 217c7786811ef0f0f6d5a0dc2d52da766905de2d Mon Sep 17 00:00:00 2001 From: Richard Zampieri Date: Tue, 3 Oct 2023 00:31:03 -0700 Subject: [PATCH 01/12] fix: add out folder gitignore, refac. command register --- .gitignore | 1 + out/CommandRegister.js | 72 ---- out/extension.js | 12 - out/extension.js.map | 1 - .../AddProjectToSolution.js | 55 --- out/resource/addProjectToSolution/Panel.js | 153 ------- out/resource/contextualMenu/ContextualMenu.js | 140 ------- .../createProjectWebView/CreateProject.js | 246 ----------- out/resource/createProjectWebView/GetNonce.js | 13 - out/resource/smartComments/Parser.js | 392 ------------------ out/resource/smartComments/SmartComments.js | 70 ---- src/CommandRegister.ts | 126 +++--- src/extension.ts | 17 +- .../AddProjectToSolution.ts | 125 +++--- 14 files changed, 145 insertions(+), 1278 deletions(-) delete mode 100644 out/CommandRegister.js delete mode 100644 out/extension.js delete mode 100644 out/extension.js.map delete mode 100644 out/resource/addProjectToSolution/AddProjectToSolution.js delete mode 100644 out/resource/addProjectToSolution/Panel.js delete mode 100644 out/resource/contextualMenu/ContextualMenu.js delete mode 100644 out/resource/createProjectWebView/CreateProject.js delete mode 100644 out/resource/createProjectWebView/GetNonce.js delete mode 100644 out/resource/smartComments/Parser.js delete mode 100644 out/resource/smartComments/SmartComments.js 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/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(' 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

- -
-
- - -
- -
- - -
-
- - -
- -
- - - - -`; - } -} -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/src/CommandRegister.ts b/src/CommandRegister.ts index c64a1e1..bb36421 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.extensionUri, 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; +} From ab205bb514f996c3ce70497b52e85568a9b4095b Mon Sep 17 00:00:00 2001 From: Richard Zampieri Date: Fri, 12 Jan 2024 22:28:24 -0800 Subject: [PATCH 02/12] create project performance adjustment --- .vscode/settings.json | 67 +- media/main.js | 143 +- media/sdks.txt | Bin 2022 -> 1022 bytes package-lock.json | 4887 ++++++++++------- package.json | 464 +- src/CommandRegister.ts | 2 +- .../createProjectWebView/CreateProject.ts | 444 +- src/resource/smartComments/SmartComments.ts | 140 +- src/utils/sdk.provider.ts | 50 + tsconfig.json | 29 +- 10 files changed, 3639 insertions(+), 2587 deletions(-) create mode 100644 src/utils/sdk.provider.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 2654ffa..4cdaf79 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,30 +1,41 @@ // 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", + "nunit", + "razorclasslib", + "reactredux", + "readlines", + "richardzampieriprog", + "submenu", + "webapi", + "xunit" + ] +} diff --git a/media/main.js b/media/main.js index f036b28..f9b36b2 100644 --- a/media/main.js +++ b/media/main.js @@ -1,90 +1,89 @@ +/* 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(); - // 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"); - // 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) { + buttonCreateProject.disabled = "true"; + buttonCreateProject.style.backgroundColor = "#3C3C3C"; + fieldValidation(); + }); - document.addEventListener("DOMContentLoaded", function(event) { - buttonCreateProject.disabled = "true"; - buttonCreateProject.style.backgroundColor = "#3C3C3C"; - fieldValidation(); - }); - - function fieldValidation() { - if (project.value === "" || solution.value === "") { - buttonCreateProject.disabled = true; - } else { - buttonCreateProject.disabled = false; - buttonCreateProject.style.backgroundColor = "#0E639C"; - } + function fieldValidation() { + if (project.value === "" || solution.value === "") { + buttonCreateProject.disabled = true; + } else { + buttonCreateProject.disabled = false; + buttonCreateProject.style.backgroundColor = "#0E639C"; } + } - template.addEventListener('keydown'| 'click', ()=>{ - project.focus(); - }); + template.addEventListener("keydown" | "click", () => { + project.focus(); + }); - project.addEventListener('change', () => { - solution.value = project.value; - fieldValidation(); - }); + project.addEventListener("change", () => { + solution.value = project.value; + fieldValidation(); + }); - solution.addEventListener('keyup', () => { - fieldValidation(); - }); + solution.addEventListener("keyup", () => { + fieldValidation(); + }); - filePath.addEventListener('keyup' | 'focus', () => { - fieldValidation(); - }); + filePath.addEventListener("keyup" | "focus", () => { + fieldValidation(); + }); - filePath.addEventListener('keydown', ()=>{ - buttonFilePicker.focus(); - }); + filePath.addEventListener("keydown", () => { + buttonFilePicker.focus(); + }); - // create console project - 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"; - else if (frameworkSelected === "3.0") frameworkRun = "netcoreapp3.0"; - else if (frameworkSelected === "3.1") frameworkRun = "netcoreapp3.1"; - else if (frameworkSelected === "5.0") frameworkRun = "net5.0"; - else if (frameworkSelected === "6.0") frameworkRun = "net6.0"; + // create console project + buttonCreateProject.addEventListener("click", () => { + let frameworkSelected = framework.options[framework.selectedIndex].value; + let frameworkRun = ""; - vscode.postMessage({ - command: 'createProject', - template: template.options[template.selectedIndex].value, - project: project.value, - filePath: filePath.value, - solution: solution.value, - framework: frameworkRun, - }); + if (frameworkSelected === "2.0") frameworkRun = "netcoreapp2.0"; + else if (frameworkSelected === "2.1") frameworkRun = "netcoreapp2.1"; + else if (frameworkSelected === "2.2") frameworkRun = "netcoreapp2.2"; + else if (frameworkSelected === "3.0") frameworkRun = "netcoreapp3.0"; + else if (frameworkSelected === "3.1") frameworkRun = "netcoreapp3.1"; + else if (frameworkSelected === "5.0") frameworkRun = "net5.0"; + else if (frameworkSelected === "6.0") frameworkRun = "net6.0"; + + vscode.postMessage({ + command: "createProject", + template: template.options[template.selectedIndex].value, + project: project.value, + filePath: filePath.value, + solution: solution.value, + framework: frameworkRun, }); + }); - // file picker to save the project in a specific location - buttonFilePicker.addEventListener('click', ()=> { - solution.focus(); - vscode.postMessage({ - command: "selectDirectory", - templateName: template.options[template.selectedIndex].text, - template: template.options[template.selectedIndex].value, - project: project.value, - solution: solution.value, - framework: framework.options[framework.selectedIndex].value, - }); - }); - + // file picker to save the project in a specific location + buttonFilePicker.addEventListener("click", () => { + solution.focus(); + vscode.postMessage({ + command: "selectDirectory", + 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 2b70666bd6fee8e0c90a4f009a0535429718b4de..280f92d844262558ada7169af46f51bbeede1118 100644 GIT binary patch literal 1022 zcma*lOAf*?3|{JHCf;37$8uTb z$8!I4=jVG`%Q$b}X)Ejax*hy)B4J#OQq(@>R3J9?o(Pp}Ak?5rDJF?*8P0MEM5->4 zR4CO@Zw>S6MaAI8U7_Yw<%;gulrggcH7hF0K2d*c3f{3QhmGD9N}{UZs9(9g9(DBx Df~Zkc literal 2022 zcmb`Iy$ZrW5QL`|d}+1ofH_J& z0W)l{!~$Ea(c^&=-+SEneT6fwIAY-0fhQyGtVUJ?>kD?6VnV`~RLMvI1$$HVWi+Kq zH7&}N*3{X^XbnARWwe$q6jGXQLOLq#B)wS{qHKDNR>^7pEW}^pEnD84)}$35q9XM< v&A*Wn&2;*6`lprjRdsJRZ@S)W-uzi;q@Lz9|9(p}&3_@M`CUjf%?^13vAswY 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..02ec0d2 100644 --- a/package.json +++ b/package.json @@ -1,252 +1,246 @@ { - "name": "csharp-snippet-productivity", - "displayName": "C# Toolbox of Productivity", - "description": "The complete set of tools for C# development", - "version": "1.3.0", - "icon": "icon.png", - "publisher": "richardzampieriprog", - "license": "SEE LICENSE IN LICENSE.md", - "repository": { - "type": "git", - "url": "https://github.com/rsaz/csharp-snippet-productivity" - }, - "engines": { - "vscode": "^1.53.0" - }, - "categories": [ - "Programming Languages", - "Snippets", - "Formatters" - ], - "keywords": [ - ".NET", - ".NET Core", - "C#", - "Visual Studio", - "snippet", - "productivity", - "keybindings" + "name": "csharp-snippet-productivity", + "displayName": "C# Toolbox of Productivity", + "description": "The complete set of tools for C# development", + "version": "1.3.0", + "icon": "icon.png", + "publisher": "richardzampieriprog", + "license": "SEE LICENSE IN LICENSE.md", + "repository": { + "type": "git", + "url": "https://github.com/rsaz/csharp-snippet-productivity" + }, + "engines": { + "vscode": "^1.53.0" + }, + "categories": [ + "Programming Languages", + "Snippets", + "Formatters" + ], + "keywords": [ + ".NET", + ".NET Core", + "C#", + "Visual Studio", + "snippet", + "productivity", + "keybindings" + ], + "extensionKind": [ + "ui" + ], + "activationEvents": [ + "onLanguage:csharp", + "onLanguage:markdown", + "onLanguage:plaintext" + ], + "contributes": { + "snippets": [ + { + "language": "csharp", + "path": "./snippets/general.json" + }, + { + "language": "csharp", + "path": "./snippets/documentxml.json" + }, + { + "language": "csharp", + "path": "./snippets/designpattern.json" + } ], - "extensionKind": [ - "ui" + "commands": [ + { + "command": "csharp-snippet-productivity.createProject", + "title": "Create Project", + "category": "C# Toolbox" + }, + { + "command": "csharp-snippet-productivity.createClass", + "title": "Create Class" + }, + { + "command": "csharp-snippet-productivity.createInterface", + "title": "Create Interface" + }, + { + "command": "csharp-snippet-productivity.createStruct", + "title": "Create Struct" + }, + { + "command": "csharp-snippet-productivity.createRecord", + "title": "Create Record" + }, + { + "command": "csharp-snippet-productivity.addProjectToSolution", + "title": "Add Project" + } ], - "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" + "menus": { + "explorer/context": [ + { + "submenu": "cSharp.subMenu", + "group": "navigation@-1" + } + ], + "cSharp.subMenu": [ + { + "command": "csharp-snippet-productivity.createClass" + }, + { + "command": "csharp-snippet-productivity.createInterface" + }, + { + "command": "csharp-snippet-productivity.createStruct" + }, + { + "command": "csharp-snippet-productivity.createRecord" + }, + { + "command": "csharp-snippet-productivity.addProjectToSolution" + } + ], + "commandPalette": [ + { + "command": "csharp-snippet-productivity.createProject", + "when": "true" + }, + { + "command": "csharp-snippet-productivity.createClass", + "when": "false" + }, + { + "command": "csharp-snippet-productivity.createInterface", + "when": "false" + }, + { + "command": "csharp-snippet-productivity.createStruct", + "when": "false" + }, + { + "command": "csharp-snippet-productivity.createRecord", + "when": "false" + }, + { + "command": "csharp-snippet-productivity.addProjectToSolution", + "when": "false" + } + ] + }, + "submenus": [ + { + "id": "cSharp.subMenu", + "label": "C# Toolbox: Options" + } ], - "contributes": { - "snippets": [ - { - "language": "csharp", - "path": "./snippets/general.json" - }, - { - "language": "csharp", - "path": "./snippets/documentxml.json" - }, - { - "language": "csharp", - "path": "./snippets/designpattern.json" - } - ], - "commands": [ - { - "command": "csharp-snippet-productivity.createProject", - "title": "Create Project", - "category": "C# Toolbox" - }, + "configuration": { + "title": "C# Toolbox of Productivity", + "properties": { + "csharp-snippet-productivity.defaultFolderForProjectCreation": { + "type": [ + "string", + "null" + ], + "description": "Set the default folder for project creation", + "default": null + }, + "csharp-snippet-productivity.multilineComments": { + "type": "boolean", + "description": "Whether the multiline comment highlighter should be active", + "default": true + }, + "csharp-snippet-productivity.highlightPlainText": { + "type": "boolean", + "description": "Whether the plaintext comment highlighter should be active", + "default": false + }, + "csharp-snippet-productivity.tags": { + "type": "array", + "description": "Colored comments. Select your favorite colors. Changes require a restart of VS Code to take effect", + "default": [ { - "command": "csharp-snippet-productivity.createClass", - "title": "Create Class" + "tag": "bug", + "color": "#FF2D00", + "strikethrough": false, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false }, { - "command": "csharp-snippet-productivity.createInterface", - "title": "Create Interface" + "tag": "research", + "color": "#3498DB", + "strikethrough": false, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false }, { - "command": "csharp-snippet-productivity.createStruct", - "title": "Create Struct" + "tag": "//", + "color": "#474747", + "strikethrough": true, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false }, { - "command": "csharp-snippet-productivity.createRecord", - "title": "Create Record" + "tag": "todo", + "color": "#FF8C00", + "strikethrough": false, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false }, { - "command": "csharp-snippet-productivity.addProjectToSolution", - "title": "Add Project" - } - ], - "menus": { - "explorer/context": [ - { - "submenu": "cSharp.subMenu", - "group": "navigation@-1" - } - ], - "cSharp.subMenu": [ - { - "command": "csharp-snippet-productivity.createClass" - }, - { - "command": "csharp-snippet-productivity.createInterface" - }, - { - "command": "csharp-snippet-productivity.createStruct" - }, - { - "command": "csharp-snippet-productivity.createRecord" - }, - { - "command": "csharp-snippet-productivity.addProjectToSolution" - } - ], - "commandPalette": [ - { - "command": "csharp-snippet-productivity.createProject", - "when": "true" - }, - { - "command": "csharp-snippet-productivity.createClass", - "when": "false" - }, - { - "command": "csharp-snippet-productivity.createInterface", - "when": "false" - }, - { - "command": "csharp-snippet-productivity.createStruct", - "when": "false" - }, - { - "command": "csharp-snippet-productivity.createRecord", - "when": "false" - }, - { - "command": "csharp-snippet-productivity.addProjectToSolution", - "when": "false" - } - ] - }, - "submenus": [ - { - "id": "cSharp.subMenu", - "label": "C# Toolbox: Options" - } - ], - "configuration": { - "title": "C# Toolbox of Productivity", - "properties": { - "csharp-snippet-productivity.defaultFolderForProjectCreation": { - "type": [ - "string", - "null" - ], - "description": "Set the default folder for project creation", - "default": null - }, - "csharp-snippet-productivity.multilineComments": { - "type": "boolean", - "description": "Whether the multiline comment highlighter should be active", - "default": true - }, - "csharp-snippet-productivity.highlightPlainText": { - "type": "boolean", - "description": "Whether the plaintext comment highlighter should be active", - "default": false - }, - "csharp-snippet-productivity.tags": { - "type": "array", - "description": "Colored comments. Select your favorite colors. Changes require a restart of VS Code to take effect", - "default": [ - { - "tag": "bug", - "color": "#FF2D00", - "strikethrough": false, - "underline": false, - "backgroundColor": "transparent", - "bold": false, - "italic": false - }, - { - "tag": "research", - "color": "#3498DB", - "strikethrough": false, - "underline": false, - "backgroundColor": "transparent", - "bold": false, - "italic": false - }, - { - "tag": "//", - "color": "#474747", - "strikethrough": true, - "underline": false, - "backgroundColor": "transparent", - "bold": false, - "italic": false - }, - { - "tag": "todo", - "color": "#FF8C00", - "strikethrough": false, - "underline": false, - "backgroundColor": "transparent", - "bold": false, - "italic": false - }, - { - "tag": "review", - "color": "#B429A9", - "strikethrough": false, - "underline": false, - "backgroundColor": "transparent", - "bold": false, - "italic": false - } - ] - } + "tag": "review", + "color": "#B429A9", + "strikethrough": false, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false } + ] } - }, - "galleryBanner": { - "color": "#e3f4ff", - "theme": "light" - }, - "main": "./out/extension.js", - "scripts": { - "vscode:prepublish": "npm run compile", - "compile": "tsc -p ./", - "watch": "tsc -watch -p ./", - "pretest": "npm run compile && npm run lint", - "lint": "eslint src --ext ts", - "test": "node ./out/test/runTest.js", - "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", - "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" + } } + }, + "galleryBanner": { + "color": "#e3f4ff", + "theme": "light" + }, + "main": "./out/extension.js", + "scripts": { + "vscode:prepublish": "npm run compile", + "compile": "tsc -p ./", + "watch": "tsc -watch -p ./", + "pretest": "npm run compile && npm run lint", + "lint": "eslint src --ext ts", + "test": "node ./out/test/runTest.js", + "package": "vsce package" + }, + "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" + }, + "dependencies": { + "find-parent-dir": "^0.3.1", + "find-up-glob": "^1.0.0", + "n-readlines": "^1.0.1", + "os": "^0.1.2" + } } diff --git a/src/CommandRegister.ts b/src/CommandRegister.ts index bb36421..d9ae4c4 100644 --- a/src/CommandRegister.ts +++ b/src/CommandRegister.ts @@ -30,7 +30,7 @@ export class CommandRegister { */ public initializeCommands(): void { this.registerCommand("csharp-snippet-productivity.createProject", async () => { - CreateProjectPanel.createOrShow(this.context.extensionUri, this.context); + CreateProjectPanel.createOrShow(this.context); }); this.registerCommand( diff --git a/src/resource/createProjectWebView/CreateProject.ts b/src/resource/createProjectWebView/CreateProject.ts index 57539ac..0c4b58d 100644 --- a/src/resource/createProjectWebView/CreateProject.ts +++ b/src/resource/createProjectWebView/CreateProject.ts @@ -1,32 +1,75 @@ +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"; export class CreateProjectPanel { - - public static currentPanel: CreateProjectPanel | undefined; 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; - 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; + // If we already have a panel, show it. + if (CreateProjectPanel._panel) { + CreateProjectPanel._panel.reveal(column); + CreateProjectPanel._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") + ); - // constructor - private constructor(panel: vscode.WebviewPanel, extensionUri: vscode.Uri) { + CreateProjectPanel.defaultConstructor(panel); + } + + private static async defaultConstructor(panel: vscode.WebviewPanel) { 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(); + this._defaultFolder = vscode.workspace + .getConfiguration("csharp-snippet-productivity") + .get("defaultFolderForProjectCreation"); + + if (!this._defaultFolder) { + vscode.window.showInformationMessage("Please set a default folder for project creation"); + } + + 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); @@ -41,15 +84,21 @@ export class CreateProjectPanel { case "selectDirectory": const options: vscode.OpenDialogOptions = { canSelectMany: false, - openLabel: 'Select', + openLabel: "Select", canSelectFiles: false, - canSelectFolders: true + canSelectFolders: true, }; - vscode.window.showOpenDialog(options).then(fileUri => { + 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); + this._filepath = fileUri[0].fsPath; + this._update( + message.templateName, + message.template, + message.project, + message.solution, + message.framework + ); } }); return; @@ -58,53 +107,26 @@ export class CreateProjectPanel { 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(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); + // Set the Webview initial html content + this._update(); } - public static kill() { - CreateProjectPanel.currentPanel?.dispose(); - CreateProjectPanel.currentPanel = undefined; + private static kill() { + CreateProjectPanel._panel?.dispose(); + CreateProjectPanel._panel = undefined as any; } - public static revive(panel: vscode.WebviewPanel, extensionUri: vscode.Uri, newFileName: string) { - CreateProjectPanel.currentPanel = new CreateProjectPanel(panel, extensionUri); + private static revive(panel: vscode.WebviewPanel) { + CreateProjectPanel.defaultConstructor(panel); } - public dispose() { - CreateProjectPanel.currentPanel = undefined; - + private static dispose() { // Clean up our resources this._panel.dispose(); + CreateProjectPanel._panel = undefined as any; + while (this._disposables.length) { const x = this._disposables.pop(); if (x) { @@ -113,105 +135,237 @@ export class CreateProjectPanel { } } - private async projectCreation(message: any) { - - if (fs.existsSync(this.filepath + "\\" + message.solution)) { + private static async projectCreation(message: any) { + 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.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"); - + 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._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); } - 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[] = []; - - 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 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 = '') { - + private static 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); - - this._panel.webview.html = this._getHtmlForWebview(webview, templateName, template, project, solution, framework); + 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, + templateName, + template, + project, + solution, + framework + ); } - private _getHtmlForWebview(webview: vscode.Webview, templateName: any, template: any, project: any, solution: any, framework: any) { - + private static _getHtmlForWebview( + webview: vscode.Webview, + templateName: any, + template: any, + project: any, + solution: any, + framework: any + ) { // main script integration const scriptUri = webview.asWebviewUri( - vscode.Uri.joinPath(this._extensionUri, "media", "main.js")); + vscode.Uri.joinPath(this.context.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"); + 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); @@ -224,7 +378,9 @@ export class CreateProjectPanel { - + @@ -235,7 +391,9 @@ export class CreateProjectPanel {

Select the project template

+
@@ -271,11 +431,11 @@ export class CreateProjectPanel {
`; } -} \ 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..633889e --- /dev/null +++ b/src/utils/sdk.provider.ts @@ -0,0 +1,50 @@ +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(); + + if (os === "win32") { + 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/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*"] } From ea18901d5534106eac4a46eb8458a48ab2b39ee7 Mon Sep 17 00:00:00 2001 From: Richard Zampieri Date: Fri, 12 Jan 2024 22:47:20 -0800 Subject: [PATCH 03/12] add support for .net 7 and 8 --- media/main.js | 2 ++ .../createProjectWebView/CreateProject.ts | 21 ++++++------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/media/main.js b/media/main.js index f9b36b2..259805e 100644 --- a/media/main.js +++ b/media/main.js @@ -63,6 +63,8 @@ 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", diff --git a/src/resource/createProjectWebView/CreateProject.ts b/src/resource/createProjectWebView/CreateProject.ts index 0c4b58d..0a47c84 100644 --- a/src/resource/createProjectWebView/CreateProject.ts +++ b/src/resource/createProjectWebView/CreateProject.ts @@ -27,7 +27,7 @@ export class CreateProjectPanel { // If we already have a panel, show it. if (CreateProjectPanel._panel) { CreateProjectPanel._panel.reveal(column); - CreateProjectPanel._update(); + CreateProjectPanel.update(); return; } @@ -92,7 +92,7 @@ export class CreateProjectPanel { vscode.window.showOpenDialog(options).then((fileUri) => { if (fileUri && fileUri[0]) { this._filepath = fileUri[0].fsPath; - this._update( + this.update( message.templateName, message.template, message.project, @@ -109,16 +109,7 @@ export class CreateProjectPanel { ); // Set the Webview initial html content - this._update(); - } - - private static kill() { - CreateProjectPanel._panel?.dispose(); - CreateProjectPanel._panel = undefined as any; - } - - private static revive(panel: vscode.WebviewPanel) { - CreateProjectPanel.defaultConstructor(panel); + this.update(); } private static dispose() { @@ -321,7 +312,7 @@ export class CreateProjectPanel { CreateProjectPanel.context.globalState.update("framework", message.framework); } - private static async _update( + private static async update( templateName: any = "Select Template", template: any = "console", project: any = "", @@ -336,7 +327,7 @@ export class CreateProjectPanel { ); this._sdks = getTargetFrameworks(sdksResource); - this._panel.webview.html = this._getHtmlForWebview( + this._panel.webview.html = this.getHtmlForWebview( webview, templateName, template, @@ -346,7 +337,7 @@ export class CreateProjectPanel { ); } - private static _getHtmlForWebview( + private static getHtmlForWebview( webview: vscode.Webview, templateName: any, template: any, From a1f202fcbdda65a11288b07d5304fb943b84cf20 Mon Sep 17 00:00:00 2001 From: Richard Zampieri Date: Sat, 13 Jan 2024 00:21:36 -0800 Subject: [PATCH 04/12] add project group filtering project template support --- .vscode/settings.json | 2 + media/main.js | 110 ++++++++++++++++++ media/vscode.css | 8 +- .../createProjectWebView/CreateProject.ts | 46 +++++--- 4 files changed, 148 insertions(+), 18 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 4cdaf79..1bda08e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -29,7 +29,9 @@ "forminline", "minwebapi", "mstest", + "netcoreapp", "nunit", + "paddding", "razorclasslib", "reactredux", "readlines", diff --git a/media/main.js b/media/main.js index 259805e..d956e7c 100644 --- a/media/main.js +++ b/media/main.js @@ -9,6 +9,7 @@ // Html elements bindings 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"); @@ -30,6 +31,115 @@ } } + /* 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" }, + ], + }; + + // Update template select based on selected project group + function updateTemplateSelect(group) { + 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; + template.appendChild(option); + }); + } + } + + // Event listener for project group selection + projectGroupSelect.addEventListener("change", function () { + updateTemplateSelect(this.value); + }); + + // Initialize the template select with the default or initial project group + document.addEventListener("DOMContentLoaded", function () { + updateTemplateSelect(""); // Initialize with default option + fieldValidation(); + }); + + /* Project group select End of Implementation */ + template.addEventListener("keydown" | "click", () => { project.focus(); }); 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/src/resource/createProjectWebView/CreateProject.ts b/src/resource/createProjectWebView/CreateProject.ts index 0a47c84..cb6bf9e 100644 --- a/src/resource/createProjectWebView/CreateProject.ts +++ b/src/resource/createProjectWebView/CreateProject.ts @@ -313,6 +313,8 @@ export class CreateProjectPanel { } private static async update( + projectGroup: any = "api", + projectGroupName: any = "Select Project Type", templateName: any = "Select Template", template: any = "console", project: any = "", @@ -329,6 +331,8 @@ export class CreateProjectPanel { this._panel.webview.html = this.getHtmlForWebview( webview, + projectGroup, + projectGroupName, templateName, template, project, @@ -339,6 +343,8 @@ export class CreateProjectPanel { private static getHtmlForWebview( webview: vscode.Webview, + projectGroup: any, + projectGroupName: any, templateName: any, template: any, project: any, @@ -380,28 +386,34 @@ export class CreateProjectPanel {

Create a new Solution or Project



+

Select the project type

+ +
+

Select the project template



From a60235eb171d32765986bb5cbf45aa16100c9924 Mon Sep 17 00:00:00 2001 From: Richard Zampieri Date: Sat, 13 Jan 2024 03:36:38 -0800 Subject: [PATCH 05/12] improve terminal cmd execution and framework compatibility --- media/main.js | 381 +++++++------ .../createProjectWebView/CreateProject.ts | 514 ++++++------------ src/utils/terminal-cmd.provider.ts | 114 ++++ 3 files changed, 476 insertions(+), 533 deletions(-) create mode 100644 src/utils/terminal-cmd.provider.ts diff --git a/media/main.js b/media/main.js index d956e7c..82cb82e 100644 --- a/media/main.js +++ b/media/main.js @@ -3,199 +3,198 @@ // 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 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"; - fieldValidation(); - }); - - function fieldValidation() { - if (project.value === "" || solution.value === "") { - buttonCreateProject.disabled = true; - } else { - buttonCreateProject.disabled = false; - buttonCreateProject.style.backgroundColor = "#0E639C"; + // vscode api + const vscode = acquireVsCodeApi(); + + // Html elements bindings + 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"; + fieldValidation(); + }); + + function fieldValidation() { + if (project.value === "" || solution.value === "") { + buttonCreateProject.disabled = true; + } else { + buttonCreateProject.disabled = false; + buttonCreateProject.style.backgroundColor = "#0E639C"; + } } - } - - /* 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" }, - ], - }; - - // Update template select based on selected project group - function updateTemplateSelect(group) { - 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; - template.appendChild(option); - }); + + /* 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" }, + ], + }; + + // Update template select based on selected project group + function updateTemplateSelect(group) { + 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; + template.appendChild(option); + }); + } } - } - - // Event listener for project group selection - projectGroupSelect.addEventListener("change", function () { - updateTemplateSelect(this.value); - }); - - // Initialize the template select with the default or initial project group - document.addEventListener("DOMContentLoaded", function () { - updateTemplateSelect(""); // Initialize with default option - fieldValidation(); - }); - - /* Project group select End of Implementation */ - - template.addEventListener("keydown" | "click", () => { - project.focus(); - }); - - project.addEventListener("change", () => { - solution.value = project.value; - fieldValidation(); - }); - - solution.addEventListener("keyup", () => { - fieldValidation(); - }); - - filePath.addEventListener("keyup" | "focus", () => { - fieldValidation(); - }); - - filePath.addEventListener("keydown", () => { - buttonFilePicker.focus(); - }); - - // create console project - 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"; - else if (frameworkSelected === "3.0") frameworkRun = "netcoreapp3.0"; - 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", - template: template.options[template.selectedIndex].value, - project: project.value, - filePath: filePath.value, - solution: solution.value, - framework: frameworkRun, + + // Event listener for project group selection + projectGroupSelect.addEventListener("change", function () { + updateTemplateSelect(this.value); + }); + + // Initialize the template select with the default or initial project group + document.addEventListener("DOMContentLoaded", function () { + updateTemplateSelect(""); // Initialize with default option + fieldValidation(); + }); + /* Project group select End of Implementation */ + + template.addEventListener("keydown" | "click", () => { + project.focus(); + }); + + project.addEventListener("change", () => { + solution.value = project.value; + fieldValidation(); }); - }); - - // file picker to save the project in a specific location - buttonFilePicker.addEventListener("click", () => { - solution.focus(); - vscode.postMessage({ - command: "selectDirectory", - templateName: template.options[template.selectedIndex].text, - template: template.options[template.selectedIndex].value, - project: project.value, - solution: solution.value, - framework: framework.options[framework.selectedIndex].value, + + solution.addEventListener("keyup", () => { + fieldValidation(); + }); + + filePath.addEventListener("keyup" | "focus", () => { + fieldValidation(); + }); + + filePath.addEventListener("keydown", () => { + buttonFilePicker.focus(); + }); + + // create console project + 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"; + else if (frameworkSelected === "3.0") frameworkRun = "netcoreapp3.0"; + 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", + template: template.options[template.selectedIndex].value, + project: project.value, + filePath: filePath.value, + solution: solution.value, + framework: frameworkRun, + }); + }); + + // file picker to save the project in a specific location + buttonFilePicker.addEventListener("click", () => { + solution.focus(); + vscode.postMessage({ + command: "selectDirectory", + 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/src/resource/createProjectWebView/CreateProject.ts b/src/resource/createProjectWebView/CreateProject.ts index cb6bf9e..3175d3d 100644 --- a/src/resource/createProjectWebView/CreateProject.ts +++ b/src/resource/createProjectWebView/CreateProject.ts @@ -3,380 +3,210 @@ import * as path from "path"; import * as vscode from "vscode"; import { getTargetFrameworks } from "../../utils/sdk.provider"; import { getNonce } from "./GetNonce"; +import { CommandFactory, Message } from "../../utils/terminal-cmd.provider"; export class CreateProjectPanel { - 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; + 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() {} + // 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; + // 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; + 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; - } + // If we already have a panel, show it. + if (CreateProjectPanel._panel) { + CreateProjectPanel._panel.reveal(column); + CreateProjectPanel.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"), - ], - } - ); + // 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") - ); + // adding panel icon + panel.iconPath = vscode.Uri.file( + path.join(this.context.extensionPath, "media", "addProjectIcon.png") + ); - CreateProjectPanel.defaultConstructor(panel); - } + CreateProjectPanel.defaultConstructor(panel); + } - private static async defaultConstructor(panel: vscode.WebviewPanel) { - this._panel = panel; + private static async defaultConstructor(panel: vscode.WebviewPanel) { + this._panel = panel; - this._defaultFolder = vscode.workspace - .getConfiguration("csharp-snippet-productivity") - .get("defaultFolderForProjectCreation"); + this._defaultFolder = vscode.workspace + .getConfiguration("csharp-snippet-productivity") + .get("defaultFolderForProjectCreation"); - if (!this._defaultFolder) { - vscode.window.showInformationMessage("Please set a default folder for project creation"); - } + if (!this._defaultFolder) { + vscode.window.showInformationMessage( + "Please set a default folder for project creation" + ); + } - this._filepath = this._defaultFolder; - this._terminal = - vscode.window.activeTerminal === undefined - ? vscode.window.createTerminal() - : vscode.window.activeTerminal; - this._terminal.show(); + 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); + // 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; + 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, - }; + 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 - ); - } - }); - return; - } - }, - null, - this._disposables - ); + 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 + ); - // Set the Webview initial html content - this.update(); - } + // Set the Webview initial html content + this.update(); + } - private static dispose() { - // Clean up our resources - this._panel.dispose(); + private static dispose() { + // Clean up our resources + this._panel.dispose(); - CreateProjectPanel._panel = undefined as any; + CreateProjectPanel._panel = undefined as any; - while (this._disposables.length) { - const x = this._disposables.pop(); - if (x) { - x.dispose(); - } + while (this._disposables.length) { + const x = this._disposables.pop(); + if (x) { + x.dispose(); + } + } } - } - private static async projectCreation(message: any) { - if (fs.existsSync(this._filepath + "\\" + message.solution)) { - vscode.window.showErrorMessage("Solution folder already exist"); - return; - } + private static async projectCreation(message: Message) { + 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; - } + const command = CommandFactory.getCommand(this._terminal, message); + command.execute(); - 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); } - // setting the current project framework to define the template namespace to be used - CreateProjectPanel.context.globalState.update("framework", message.framework); - } - private static async update( - projectGroup: any = "api", - projectGroupName: any = "Select Project Type", - templateName: any = "Select Template", - template: any = "console", - project: any = "", - solution: any = "", - framework: any = "" - ) { - const webview = this._panel.webview; + private static async update( + projectGroup: any = "api", + projectGroupName: any = "Select Project Type", + 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); + // 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, - projectGroup, - projectGroupName, - templateName, - template, - project, - solution, - framework - ); - } + this._panel.webview.html = this.getHtmlForWebview( + webview, + projectGroup, + projectGroupName, + templateName, + template, + project, + solution, + framework + ); + } - private static getHtmlForWebview( - webview: vscode.Webview, - projectGroup: any, - projectGroupName: 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") - ); + private static getHtmlForWebview( + webview: vscode.Webview, + projectGroup: any, + projectGroupName: 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" - ); + // 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); + // 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(); + // Use a nonce to only allow specific scripts to be run + const nonce = getNonce(); - return ` + return ` @@ -389,8 +219,8 @@ export class CreateProjectPanel {

Select the project type

+ templateName === "" ? "Select Template" : templateName + }
@@ -423,7 +253,7 @@ export class CreateProjectPanel {
@@ -440,5 +270,5 @@ export class CreateProjectPanel { `; - } + } } diff --git a/src/utils/terminal-cmd.provider.ts b/src/utils/terminal-cmd.provider.ts new file mode 100644 index 0000000..5815118 --- /dev/null +++ b/src/utils/terminal-cmd.provider.ts @@ -0,0 +1,114 @@ +import * as vscode from "vscode"; + +export type Message = { + 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() { + 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()) { + vscode.window.showWarningMessage( + `Please select a compatible framework for ${this.message.template}` + ); + 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); + } + } +} From c1c916d78453b2cf55433b97366869b17163862e Mon Sep 17 00:00:00 2001 From: Richard Zampieri Date: Sat, 13 Jan 2024 18:06:33 -0800 Subject: [PATCH 06/12] fix folder picker webview state --- media/main.js | 30 ++++++++++------ .../createProjectWebView/CreateProject.ts | 34 +++++++++++++------ src/utils/terminal-cmd.provider.ts | 6 ++++ 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/media/main.js b/media/main.js index 82cb82e..b8f0aa0 100644 --- a/media/main.js +++ b/media/main.js @@ -19,6 +19,12 @@ 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(); }); @@ -105,8 +111,8 @@ ], }; - // Update template select based on selected project group - function updateTemplateSelect(group) { + // Load template select based on selected project group + function loadTemplateSelect(group, selectedTemplate) { template.innerHTML = ""; // Clear existing options // Add default 'Select Template' option @@ -122,20 +128,22 @@ const option = document.createElement("option"); option.value = tmpl.shortName; option.textContent = tmpl.templateName; + if (tmpl.shortName === selectedTemplate) option.selected = true; template.appendChild(option); }); } } - // Event listener for project group selection - projectGroupSelect.addEventListener("change", function () { - updateTemplateSelect(this.value); - }); + // Receive message from the extension + window.addEventListener("message", (event) => { + const message = event.data; // The JSON data our extension sent - // Initialize the template select with the default or initial project group - document.addEventListener("DOMContentLoaded", function () { - updateTemplateSelect(""); // Initialize with default option - fieldValidation(); + switch (message.command) { + case "updateState": + projectGroupSelect.value = message.projectGroup; + loadTemplateSelect(message.projectGroup, message.selectedTemplate); + break; + } }); /* Project group select End of Implementation */ @@ -190,6 +198,8 @@ 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, diff --git a/src/resource/createProjectWebView/CreateProject.ts b/src/resource/createProjectWebView/CreateProject.ts index 3175d3d..2596c87 100644 --- a/src/resource/createProjectWebView/CreateProject.ts +++ b/src/resource/createProjectWebView/CreateProject.ts @@ -80,7 +80,7 @@ export class CreateProjectPanel { this._panel.webview.onDidReceiveMessage( async (message) => { switch (message.command) { - case "createProject": //console + case "createProject": await this.projectCreation(message); return; @@ -91,11 +91,12 @@ export class CreateProjectPanel { 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, @@ -104,6 +105,12 @@ export class CreateProjectPanel { ); } }); + + this._panel.webview.postMessage({ + command: "updateState", + projectGroupSelect: message.projectGroupSelect, + selectedTemplate: message.template, + }); return; } }, @@ -143,8 +150,8 @@ export class CreateProjectPanel { } private static async update( - projectGroup: any = "api", projectGroupName: any = "Select Project Type", + projectGroup: any = "api", templateName: any = "Select Template", template: any = "console", project: any = "", @@ -161,8 +168,8 @@ export class CreateProjectPanel { this._panel.webview.html = this.getHtmlForWebview( webview, - projectGroup, projectGroupName, + projectGroup, templateName, template, project, @@ -173,8 +180,8 @@ export class CreateProjectPanel { private static getHtmlForWebview( webview: vscode.Webview, - projectGroup: any, projectGroupName: any, + projectGroup: any, templateName: any, template: any, project: any, @@ -201,6 +208,15 @@ export class CreateProjectPanel { // 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 ``; + }) + .join(""); + return ` @@ -240,10 +256,8 @@ export class CreateProjectPanel {

Select the project template



@@ -264,7 +278,7 @@ export class CreateProjectPanel {
diff --git a/src/utils/terminal-cmd.provider.ts b/src/utils/terminal-cmd.provider.ts index 5815118..3100d96 100644 --- a/src/utils/terminal-cmd.provider.ts +++ b/src/utils/terminal-cmd.provider.ts @@ -1,6 +1,7 @@ import * as vscode from "vscode"; export type Message = { + command: string; filepath: string; solution: string; project: string; @@ -51,6 +52,10 @@ export class Command { } 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); } } @@ -90,6 +95,7 @@ export class DefaultCommand extends Command { return; } + console.log("Default command: ", this.message); 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` From 80bb0f5d4f0e2f6b5b53345f973a79068b6c5e18 Mon Sep 17 00:00:00 2001 From: Richard Zampieri Date: Sat, 13 Jan 2024 19:45:00 -0800 Subject: [PATCH 07/12] fix snippets conflicts --- snippets/designpattern.json | 7 +- snippets/general.json | 805 ++++++++++++++---------------------- 2 files changed, 315 insertions(+), 497 deletions(-) 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" + } +} From c2065bfd50294391514cff07e1466224aa58999e Mon Sep 17 00:00:00 2001 From: Richard Zampieri Date: Sat, 13 Jan 2024 21:21:08 -0800 Subject: [PATCH 08/12] Add better msg on framework compatibility check --- src/utils/terminal-cmd.provider.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/utils/terminal-cmd.provider.ts b/src/utils/terminal-cmd.provider.ts index 3100d96..a513b58 100644 --- a/src/utils/terminal-cmd.provider.ts +++ b/src/utils/terminal-cmd.provider.ts @@ -89,13 +89,19 @@ export class MinWebApiCommand extends Command { 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}` + `Please select a compatible framework for ${this.message.template} - [${ + compatibleFrameworks || "None" + }]` ); return; } - console.log("Default command: ", this.message); 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` From 6484033219c541dfde9a76bf6e5d33eaba044026 Mon Sep 17 00:00:00 2001 From: Richard Zampieri Date: Sat, 13 Jan 2024 22:49:29 -0800 Subject: [PATCH 09/12] fix sdk gen for all win terminals --- package.json | 458 +++++++++--------- .../createProjectWebView/CreateProject.ts | 2 + src/utils/sdk.provider.ts | 88 ++-- 3 files changed, 282 insertions(+), 266 deletions(-) diff --git a/package.json b/package.json index 02ec0d2..8c561ef 100644 --- a/package.json +++ b/package.json @@ -1,246 +1,246 @@ { - "name": "csharp-snippet-productivity", - "displayName": "C# Toolbox of Productivity", - "description": "The complete set of tools for C# development", - "version": "1.3.0", - "icon": "icon.png", - "publisher": "richardzampieriprog", - "license": "SEE LICENSE IN LICENSE.md", - "repository": { - "type": "git", - "url": "https://github.com/rsaz/csharp-snippet-productivity" - }, - "engines": { - "vscode": "^1.53.0" - }, - "categories": [ - "Programming Languages", - "Snippets", - "Formatters" - ], - "keywords": [ - ".NET", - ".NET Core", - "C#", - "Visual Studio", - "snippet", - "productivity", - "keybindings" - ], - "extensionKind": [ - "ui" - ], - "activationEvents": [ - "onLanguage:csharp", - "onLanguage:markdown", - "onLanguage:plaintext" - ], - "contributes": { - "snippets": [ - { - "language": "csharp", - "path": "./snippets/general.json" - }, - { - "language": "csharp", - "path": "./snippets/documentxml.json" - }, - { - "language": "csharp", - "path": "./snippets/designpattern.json" - } + "name": "csharp-snippet-productivity", + "displayName": "C# Toolbox of Productivity", + "description": "The complete set of tools for C# development", + "version": "2.0.0", + "icon": "icon.png", + "publisher": "richardzampieriprog", + "license": "SEE LICENSE IN LICENSE.md", + "repository": { + "type": "git", + "url": "https://github.com/rsaz/csharp-snippet-productivity" + }, + "engines": { + "vscode": "^1.85.0" + }, + "categories": [ + "Programming Languages", + "Snippets", + "Formatters" ], - "commands": [ - { - "command": "csharp-snippet-productivity.createProject", - "title": "Create Project", - "category": "C# Toolbox" - }, - { - "command": "csharp-snippet-productivity.createClass", - "title": "Create Class" - }, - { - "command": "csharp-snippet-productivity.createInterface", - "title": "Create Interface" - }, - { - "command": "csharp-snippet-productivity.createStruct", - "title": "Create Struct" - }, - { - "command": "csharp-snippet-productivity.createRecord", - "title": "Create Record" - }, - { - "command": "csharp-snippet-productivity.addProjectToSolution", - "title": "Add Project" - } + "keywords": [ + ".NET", + ".NET Core", + "C#", + "Visual Studio", + "snippet", + "productivity", + "keybindings" ], - "menus": { - "explorer/context": [ - { - "submenu": "cSharp.subMenu", - "group": "navigation@-1" - } - ], - "cSharp.subMenu": [ - { - "command": "csharp-snippet-productivity.createClass" - }, - { - "command": "csharp-snippet-productivity.createInterface" - }, - { - "command": "csharp-snippet-productivity.createStruct" - }, - { - "command": "csharp-snippet-productivity.createRecord" - }, - { - "command": "csharp-snippet-productivity.addProjectToSolution" - } - ], - "commandPalette": [ - { - "command": "csharp-snippet-productivity.createProject", - "when": "true" - }, - { - "command": "csharp-snippet-productivity.createClass", - "when": "false" - }, - { - "command": "csharp-snippet-productivity.createInterface", - "when": "false" - }, - { - "command": "csharp-snippet-productivity.createStruct", - "when": "false" - }, - { - "command": "csharp-snippet-productivity.createRecord", - "when": "false" - }, - { - "command": "csharp-snippet-productivity.addProjectToSolution", - "when": "false" - } - ] - }, - "submenus": [ - { - "id": "cSharp.subMenu", - "label": "C# Toolbox: Options" - } + "extensionKind": [ + "ui" ], - "configuration": { - "title": "C# Toolbox of Productivity", - "properties": { - "csharp-snippet-productivity.defaultFolderForProjectCreation": { - "type": [ - "string", - "null" - ], - "description": "Set the default folder for project creation", - "default": null - }, - "csharp-snippet-productivity.multilineComments": { - "type": "boolean", - "description": "Whether the multiline comment highlighter should be active", - "default": true - }, - "csharp-snippet-productivity.highlightPlainText": { - "type": "boolean", - "description": "Whether the plaintext comment highlighter should be active", - "default": false - }, - "csharp-snippet-productivity.tags": { - "type": "array", - "description": "Colored comments. Select your favorite colors. Changes require a restart of VS Code to take effect", - "default": [ + "activationEvents": [ + "onLanguage:csharp", + "onLanguage:markdown", + "onLanguage:plaintext" + ], + "contributes": { + "snippets": [ + { + "language": "csharp", + "path": "./snippets/general.json" + }, + { + "language": "csharp", + "path": "./snippets/documentxml.json" + }, + { + "language": "csharp", + "path": "./snippets/designpattern.json" + } + ], + "commands": [ + { + "command": "csharp-snippet-productivity.createProject", + "title": "Create Project", + "category": "C# Toolbox" + }, { - "tag": "bug", - "color": "#FF2D00", - "strikethrough": false, - "underline": false, - "backgroundColor": "transparent", - "bold": false, - "italic": false + "command": "csharp-snippet-productivity.createClass", + "title": "Create Class" }, { - "tag": "research", - "color": "#3498DB", - "strikethrough": false, - "underline": false, - "backgroundColor": "transparent", - "bold": false, - "italic": false + "command": "csharp-snippet-productivity.createInterface", + "title": "Create Interface" }, { - "tag": "//", - "color": "#474747", - "strikethrough": true, - "underline": false, - "backgroundColor": "transparent", - "bold": false, - "italic": false + "command": "csharp-snippet-productivity.createStruct", + "title": "Create Struct" }, { - "tag": "todo", - "color": "#FF8C00", - "strikethrough": false, - "underline": false, - "backgroundColor": "transparent", - "bold": false, - "italic": false + "command": "csharp-snippet-productivity.createRecord", + "title": "Create Record" }, { - "tag": "review", - "color": "#B429A9", - "strikethrough": false, - "underline": false, - "backgroundColor": "transparent", - "bold": false, - "italic": false + "command": "csharp-snippet-productivity.addProjectToSolution", + "title": "Add Project" + } + ], + "menus": { + "explorer/context": [ + { + "submenu": "cSharp.subMenu", + "group": "navigation@-1" + } + ], + "cSharp.subMenu": [ + { + "command": "csharp-snippet-productivity.createClass" + }, + { + "command": "csharp-snippet-productivity.createInterface" + }, + { + "command": "csharp-snippet-productivity.createStruct" + }, + { + "command": "csharp-snippet-productivity.createRecord" + }, + { + "command": "csharp-snippet-productivity.addProjectToSolution" + } + ], + "commandPalette": [ + { + "command": "csharp-snippet-productivity.createProject", + "when": "true" + }, + { + "command": "csharp-snippet-productivity.createClass", + "when": "false" + }, + { + "command": "csharp-snippet-productivity.createInterface", + "when": "false" + }, + { + "command": "csharp-snippet-productivity.createStruct", + "when": "false" + }, + { + "command": "csharp-snippet-productivity.createRecord", + "when": "false" + }, + { + "command": "csharp-snippet-productivity.addProjectToSolution", + "when": "false" + } + ] + }, + "submenus": [ + { + "id": "cSharp.subMenu", + "label": "C# Toolbox: Options" + } + ], + "configuration": { + "title": "C# Toolbox of Productivity", + "properties": { + "csharp-snippet-productivity.defaultFolderForProjectCreation": { + "type": [ + "string", + "null" + ], + "description": "Set the default folder for project creation", + "default": null + }, + "csharp-snippet-productivity.multilineComments": { + "type": "boolean", + "description": "Whether the multiline comment highlighter should be active", + "default": true + }, + "csharp-snippet-productivity.highlightPlainText": { + "type": "boolean", + "description": "Whether the plaintext comment highlighter should be active", + "default": false + }, + "csharp-snippet-productivity.tags": { + "type": "array", + "description": "Colored comments. Select your favorite colors. Changes require a restart of VS Code to take effect", + "default": [ + { + "tag": "bug", + "color": "#FF2D00", + "strikethrough": false, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false + }, + { + "tag": "research", + "color": "#3498DB", + "strikethrough": false, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false + }, + { + "tag": "//", + "color": "#474747", + "strikethrough": true, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false + }, + { + "tag": "todo", + "color": "#FF8C00", + "strikethrough": false, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false + }, + { + "tag": "review", + "color": "#B429A9", + "strikethrough": false, + "underline": false, + "backgroundColor": "transparent", + "bold": false, + "italic": false + } + ] + } } - ] } - } + }, + "galleryBanner": { + "color": "#e3f4ff", + "theme": "light" + }, + "main": "./out/extension.js", + "scripts": { + "vscode:prepublish": "npm run compile", + "compile": "tsc -p ./", + "watch": "tsc -watch -p ./", + "pretest": "npm run compile && npm run lint", + "lint": "eslint src --ext ts", + "test": "node ./out/test/runTest.js", + "package": "vsce package" + }, + "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" + }, + "dependencies": { + "find-parent-dir": "^0.3.1", + "find-up-glob": "^1.0.0", + "n-readlines": "^1.0.1", + "os": "^0.1.2" } - }, - "galleryBanner": { - "color": "#e3f4ff", - "theme": "light" - }, - "main": "./out/extension.js", - "scripts": { - "vscode:prepublish": "npm run compile", - "compile": "tsc -p ./", - "watch": "tsc -watch -p ./", - "pretest": "npm run compile && npm run lint", - "lint": "eslint src --ext ts", - "test": "node ./out/test/runTest.js", - "package": "vsce package" - }, - "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" - }, - "dependencies": { - "find-parent-dir": "^0.3.1", - "find-up-glob": "^1.0.0", - "n-readlines": "^1.0.1", - "os": "^0.1.2" - } } diff --git a/src/resource/createProjectWebView/CreateProject.ts b/src/resource/createProjectWebView/CreateProject.ts index 2596c87..9b5660e 100644 --- a/src/resource/createProjectWebView/CreateProject.ts +++ b/src/resource/createProjectWebView/CreateProject.ts @@ -137,6 +137,8 @@ export class CreateProjectPanel { } private static async projectCreation(message: Message) { + message.filepath = this._filepath; + if (fs.existsSync(this._filepath + "\\" + message.solution)) { vscode.window.showErrorMessage("Solution folder already exist"); return; diff --git a/src/utils/sdk.provider.ts b/src/utils/sdk.provider.ts index 633889e..40e8412 100644 --- a/src/utils/sdk.provider.ts +++ b/src/utils/sdk.provider.ts @@ -2,49 +2,63 @@ 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); - } - }); + // 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[] = []; - // Eliminate duplicates - sdks = sdks.filter((value, index, self) => self.indexOf(value) === index); + 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); + } + }); - return sdks; + // 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(); - - if (os === "win32") { - terminal.sendText(`Write-Output --noEnumeration | dotnet --list-sdks > "${sdkFile}"`); - } else { - terminal.sendText(`echo -n | dotnet --list-sdks > "${sdkFile}"`); - } - terminal.sendText("clear"); + 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; + return vscode.window.activeTerminal === undefined + ? vscode.window.createTerminal() + : vscode.window.activeTerminal; } From 7077fdf9ab7f920a117f3d723a16e694a6cd59e6 Mon Sep 17 00:00:00 2001 From: Richard Zampieri Date: Sat, 13 Jan 2024 23:09:05 -0800 Subject: [PATCH 10/12] Remove white spaces on project and solution name creation --- src/resource/createProjectWebView/CreateProject.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/resource/createProjectWebView/CreateProject.ts b/src/resource/createProjectWebView/CreateProject.ts index 9b5660e..8436eca 100644 --- a/src/resource/createProjectWebView/CreateProject.ts +++ b/src/resource/createProjectWebView/CreateProject.ts @@ -137,8 +137,13 @@ export class CreateProjectPanel { } private static async projectCreation(message: Message) { + // Adjust filepath from the default or selection message.filepath = this._filepath; + // Remove spaces from project and solution names + message.solution = message.solution.replace(/\s+/g, ""); + message.project = message.project.replace(/\s+/g, ""); + if (fs.existsSync(this._filepath + "\\" + message.solution)) { vscode.window.showErrorMessage("Solution folder already exist"); return; From 12537e37cd23a81b64956cbbe71110521b5be369 Mon Sep 17 00:00:00 2001 From: Richard Zampieri Date: Sun, 14 Jan 2024 00:06:27 -0800 Subject: [PATCH 11/12] fix add project sdk list dynamically --- media/index.html | 8 +- src/resource/addProjectToSolution/Panel.ts | 325 ++++++++++++--------- 2 files changed, 192 insertions(+), 141 deletions(-) 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


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) => ``) + .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 +} From 3774c8ad9b690192866366518588a93e5ed6506a Mon Sep 17 00:00:00 2001 From: Richard Zampieri Date: Sun, 14 Jan 2024 00:34:20 -0800 Subject: [PATCH 12/12] Update readme, version and changelog --- CHANGELOG.md | 112 +++++++++++++----------- README.md | 238 +++++++++++++++++++++++++++------------------------ 2 files changed, 186 insertions(+), 164 deletions(-) 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. > > ![Add Project](https://github.com/rsaz/csharp-snippet-productivity/blob/main/videos/addProject.PNG?raw=true) > -> - **_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 > > ![Class and Interface](https://github.com/rsaz/csharp-snippet-productivity/blob/main/videos/classInterface.PNG?raw=true) @@ -81,106 +91,106 @@ C# Snippet Productivity > > > ![Create Project](https://github.com/rsaz/csharp-snippet-productivity/blob/main/videos/createproject.PNG?raw=true) > -> - 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 -> > ![Colored comments](https://github.com/rsaz/csharp-snippet-productivity/blob/main/videos/comment.gif?raw=true) +> - Colorful and configurable comments to better emphasize your work +> - Snippets: +> - **_todo_** : comments +> - **_review_** : comments +> - **_bug_** : comments +> - **_research_** : comments +> > ![Colored comments](https://github.com/rsaz/csharp-snippet-productivity/blob/main/videos/comment.gif?raw=true) > ### 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 > > ![Add var, class, function](https://github.com/rsaz/csharp-snippet-productivity/blob/main/videos/clipvarclassfunc.gif?raw=true) > > ![Add property, dictionary](https://github.com/rsaz/csharp-snippet-productivity/blob/main/videos/clippropdic.gif?raw=true) > -> - 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 > > ![Add list, comments](https://github.com/rsaz/csharp-snippet-productivity/blob/main/videos/cliplistcom.gif?raw=true) @@ -197,6 +207,6 @@ C# Snippet Productivity ### For more information -- [Richard Zampieri](https://github.com/rsaz) +- [Richard Zampieri](https://github.com/rsaz) **Enjoy!**