From 7cb26b14b2be4817c36dc75157441a6ae377c953 Mon Sep 17 00:00:00 2001 From: Bela VanderVoort Date: Thu, 2 Jan 2025 11:05:33 -0600 Subject: [PATCH 1/7] Adding support for 1.0.0 to vscode extension #1385 #1274 --- Src/CSharpier.VSCode/CHANGELOG.md | 3 +++ Src/CSharpier.VSCode/README.md | 14 ++++++++++---- .../src/CSharpierProcessPipeMultipleFiles.ts | 9 ++++++++- Src/CSharpier.VSCode/src/CSharpierProcessServer.ts | 9 ++++++--- Src/CSharpier.VSCode/src/CustomPathInstaller.ts | 5 ++++- Src/CSharpier.VSCode/src/FormattingService.ts | 6 ++++++ 6 files changed, 37 insertions(+), 9 deletions(-) diff --git a/Src/CSharpier.VSCode/CHANGELOG.md b/Src/CSharpier.VSCode/CHANGELOG.md index 9ef5cead6..28caafead 100644 --- a/Src/CSharpier.VSCode/CHANGELOG.md +++ b/Src/CSharpier.VSCode/CHANGELOG.md @@ -1,3 +1,6 @@ +## 2.0.0 +- Adding support for CSharpier 1.0.0 + ## 1.9.2 - Add option for diagnostic level, default to warning - Modify behavior of diagnostics so that new ones only appear on file save, not as a user types. diff --git a/Src/CSharpier.VSCode/README.md b/Src/CSharpier.VSCode/README.md index 21ae28c08..7cb830f8c 100644 --- a/Src/CSharpier.VSCode/README.md +++ b/Src/CSharpier.VSCode/README.md @@ -2,8 +2,8 @@ This extension makes use of the dotnet tool [CSharpier](https://github.com/belav/csharpier) to format your code and is versioned independently. -CSharpier is an opinionated code formatter for c#. -It uses Roslyn to parse your code and re-prints it using its own rules. +CSharpier is an opinionated code formatter for c# and xml. +It provides very few options and provides a deterministic way to enforce formatting of your code. The printing process was ported from [prettier](https://prettier.io) but has evolved over time. ## Installation @@ -27,12 +27,15 @@ The extension makes use of `dotnet` commands and uses the following logic to loc - For non-windows - Try running `sh -c "dotnet --info"` to see if `dotnet` is on the PATH ## Default Formatter -To ensure that CSharpier is used to format c# files, be sure to set it as the default formatter. +To ensure that CSharpier is used to format files, be sure to set it as the default formatter. ```json "[csharp]": { "editor.defaultFormatter": "csharpier.csharpier-vscode" - } + }, + "[xml]": { + "editor.defaultFormatter": "csharpier.csharpier-vscode" + }, ``` ## Usage @@ -57,6 +60,9 @@ You can turn on format-on-save on a per-language basis by scoping the setting: // Enable per-language "[csharp]": { "editor.formatOnSave": true +}, +"[xml]": { + "editor.formatOnSave": true } ``` diff --git a/Src/CSharpier.VSCode/src/CSharpierProcessPipeMultipleFiles.ts b/Src/CSharpier.VSCode/src/CSharpierProcessPipeMultipleFiles.ts index 505533f82..08d61dcc8 100644 --- a/Src/CSharpier.VSCode/src/CSharpierProcessPipeMultipleFiles.ts +++ b/Src/CSharpier.VSCode/src/CSharpierProcessPipeMultipleFiles.ts @@ -3,6 +3,7 @@ import { Logger } from "./Logger"; import { ICSharpierProcess } from "./ICSharpierProcess"; import { getDotNetRoot } from "./DotNetProvider"; import * as process from "process"; +import * as semver from "semver"; export class CSharpierProcessPipeMultipleFiles implements ICSharpierProcess { private process: ChildProcessWithoutNullStreams; @@ -29,7 +30,13 @@ export class CSharpierProcessPipeMultipleFiles implements ICSharpierProcess { } private spawnProcess = (csharpierPath: string, workingDirectory: string) => { - const csharpierProcess = spawn(csharpierPath, ["--pipe-multiple-files"], { + // TODO test this + let newCommandsVersion = "1.0.0"; + let argument = semver.gte(this.version, newCommandsVersion) + ? "pipe-files" + : "--pipe-multiple-files"; + + const csharpierProcess = spawn(csharpierPath, [argument], { stdio: "pipe", cwd: workingDirectory, env: { ...process.env, DOTNET_NOLOGO: "1", DOTNET_ROOT: getDotNetRoot() }, diff --git a/Src/CSharpier.VSCode/src/CSharpierProcessServer.ts b/Src/CSharpier.VSCode/src/CSharpierProcessServer.ts index d2a6a1415..a0e2db556 100644 --- a/Src/CSharpier.VSCode/src/CSharpierProcessServer.ts +++ b/Src/CSharpier.VSCode/src/CSharpierProcessServer.ts @@ -3,9 +3,9 @@ import { Logger } from "./Logger"; import { FormatFileParameter, FormatFileResult, ICSharpierProcess2 } from "./ICSharpierProcess"; import fetch from "node-fetch"; import { getDotNetRoot } from "./DotNetProvider"; +import * as semver from "semver"; export class CSharpierProcessServer implements ICSharpierProcess2 { - private csharpierPath: string; private logger: Logger; private port: number = 0; private process: ChildProcessWithoutNullStreams | undefined; @@ -14,7 +14,6 @@ export class CSharpierProcessServer implements ICSharpierProcess2 { constructor(logger: Logger, csharpierPath: string, workingDirectory: string, version: string) { this.logger = logger; - this.csharpierPath = csharpierPath; this.spawnProcess(csharpierPath, workingDirectory); this.version = version; @@ -31,7 +30,11 @@ export class CSharpierProcessServer implements ICSharpierProcess2 { } private spawnProcess(csharpierPath: string, workingDirectory: string) { - const csharpierProcess = spawn(csharpierPath, ["--server"], { + // TODO test this + let newCommandsVersion = "1.0.0"; + let argument = semver.gte(this.version, newCommandsVersion) ? "server" : "--server"; + + const csharpierProcess = spawn(csharpierPath, [argument], { stdio: "pipe", cwd: workingDirectory, env: { ...process.env, DOTNET_NOLOGO: "1", DOTNET_ROOT: getDotNetRoot() }, diff --git a/Src/CSharpier.VSCode/src/CustomPathInstaller.ts b/Src/CSharpier.VSCode/src/CustomPathInstaller.ts index b80bbed18..73b02dca3 100644 --- a/Src/CSharpier.VSCode/src/CustomPathInstaller.ts +++ b/Src/CSharpier.VSCode/src/CustomPathInstaller.ts @@ -4,6 +4,7 @@ import * as fs from "fs"; import { workspace } from "vscode"; import { getDotNetRoot, execDotNet } from "./DotNetProvider"; import { execSync } from "child_process"; +import * as semver from "semver"; export class CustomPathInstaller { logger: Logger; @@ -92,6 +93,8 @@ export class CustomPathInstaller { } public getPathForVersion(version: string) { - return path.resolve(this.getDirectoryForVersion(version), "dotnet-csharpier"); + let newCommandsVersion = "1.0.0"; + let filename = semver.gte(version, newCommandsVersion) ? "CSharpier" : "dotnet-csharpier"; + return path.resolve(this.getDirectoryForVersion(version), filename); } } diff --git a/Src/CSharpier.VSCode/src/FormattingService.ts b/Src/CSharpier.VSCode/src/FormattingService.ts index 213d563a8..2e84c91a0 100644 --- a/Src/CSharpier.VSCode/src/FormattingService.ts +++ b/Src/CSharpier.VSCode/src/FormattingService.ts @@ -12,6 +12,12 @@ import { FormatDocumentProvider } from "./FormatDocumentProvider"; export class FormattingService { constructor(private readonly formatDocumentProvider: FormatDocumentProvider) { + // TODO will this cover all the actual xml files, maybe we need to use patterns? + // { pattern: '**/*.{props,csproj}' } + + languages.registerDocumentFormattingEditProvider("xml", { + provideDocumentFormattingEdits: this.provideDocumentFormattingEdits, + }); languages.registerDocumentFormattingEditProvider("csharp", { provideDocumentFormattingEdits: this.provideDocumentFormattingEdits, }); From eca956971d125f86e225d023ef6dc65b68c88a0a Mon Sep 17 00:00:00 2001 From: Bela VanderVoort Date: Sat, 4 Jan 2025 12:22:30 -0600 Subject: [PATCH 2/7] Getting vscode mostly ready for 1.0.0 --- Src/CSharpier.VSCode/package.json | 3 +- .../src/CSharpierProcessPipeMultipleFiles.ts | 5 +- .../src/CSharpierProcessProvider.ts | 7 ++- .../src/CSharpierProcessServer.ts | 3 +- .../src/CustomPathInstaller.ts | 16 +++--- .../src/DiagnosticsService.ts | 6 +-- .../src/FormatDocumentProvider.ts | 50 +++++++++++++------ Src/CSharpier.VSCode/src/FormattingService.ts | 1 + Src/CSharpier.VSCode/src/ICSharpierProcess.ts | 2 +- 9 files changed, 56 insertions(+), 37 deletions(-) diff --git a/Src/CSharpier.VSCode/package.json b/Src/CSharpier.VSCode/package.json index b8129456a..f6463375d 100644 --- a/Src/CSharpier.VSCode/package.json +++ b/Src/CSharpier.VSCode/package.json @@ -28,7 +28,8 @@ "Formatters" ], "activationEvents": [ - "onLanguage:csharp" + "onLanguage:csharp", + "onLanguage:xml" ], "icon": "logo.png", "main": "./build/Extension.js", diff --git a/Src/CSharpier.VSCode/src/CSharpierProcessPipeMultipleFiles.ts b/Src/CSharpier.VSCode/src/CSharpierProcessPipeMultipleFiles.ts index 08d61dcc8..596c09efb 100644 --- a/Src/CSharpier.VSCode/src/CSharpierProcessPipeMultipleFiles.ts +++ b/Src/CSharpier.VSCode/src/CSharpierProcessPipeMultipleFiles.ts @@ -15,8 +15,8 @@ export class CSharpierProcessPipeMultipleFiles implements ICSharpierProcess { constructor(logger: Logger, csharpierPath: string, workingDirectory: string, version: string) { this.logger = logger; - this.process = this.spawnProcess(csharpierPath, workingDirectory); this.version = version; + this.process = this.spawnProcess(csharpierPath, workingDirectory); this.logger.debug("Warm CSharpier with initial format"); // warm by formatting a file twice, the 3rd time is when it gets really fast @@ -30,7 +30,6 @@ export class CSharpierProcessPipeMultipleFiles implements ICSharpierProcess { } private spawnProcess = (csharpierPath: string, workingDirectory: string) => { - // TODO test this let newCommandsVersion = "1.0.0"; let argument = semver.gte(this.version, newCommandsVersion) ? "pipe-files" @@ -64,11 +63,9 @@ export class CSharpierProcessPipeMultipleFiles implements ICSharpierProcess { }); csharpierProcess.stdout.on("data", chunk => { - this.logger.debug("Got chunk of size " + chunk.length); this.nextFile += chunk; let number = this.nextFile.indexOf("\u0003"); while (number >= 0) { - this.logger.debug("Got last chunk with ETX at " + number); const result = this.nextFile.substring(0, number); this.nextFile = this.nextFile.substring(number + 1); const callback = this.callbacks.shift(); diff --git a/Src/CSharpier.VSCode/src/CSharpierProcessProvider.ts b/Src/CSharpier.VSCode/src/CSharpierProcessProvider.ts index b19ad2516..b1c854dbd 100644 --- a/Src/CSharpier.VSCode/src/CSharpierProcessProvider.ts +++ b/Src/CSharpier.VSCode/src/CSharpierProcessProvider.ts @@ -94,7 +94,6 @@ export class CSharpierProcessProvider implements Disposable { }; private getDirectoryOfFile = (filePath: string) => { - this.logger.debug(__dirname); let directory = path.parse(filePath).dir; if (directory) { return directory; @@ -281,10 +280,10 @@ export class CSharpierProcessProvider implements Disposable { } return csharpierProcess; - } catch (ex: any) { - this.logger.error(ex.output.toString()); - this.logger.debug( + } catch (error: any) { + this.logger.error( `returning NullCSharpierProcess because of the previous error when trying to set up a csharpier process`, + error, ); return NullCSharpierProcess.instance; } diff --git a/Src/CSharpier.VSCode/src/CSharpierProcessServer.ts b/Src/CSharpier.VSCode/src/CSharpierProcessServer.ts index a0e2db556..a7aa762f1 100644 --- a/Src/CSharpier.VSCode/src/CSharpierProcessServer.ts +++ b/Src/CSharpier.VSCode/src/CSharpierProcessServer.ts @@ -14,8 +14,8 @@ export class CSharpierProcessServer implements ICSharpierProcess2 { constructor(logger: Logger, csharpierPath: string, workingDirectory: string, version: string) { this.logger = logger; - this.spawnProcess(csharpierPath, workingDirectory); this.version = version; + this.spawnProcess(csharpierPath, workingDirectory); this.logger.debug("Warm CSharpier with initial format"); // warm by formatting a file twice, the 3rd time is when it gets really fast @@ -30,7 +30,6 @@ export class CSharpierProcessServer implements ICSharpierProcess2 { } private spawnProcess(csharpierPath: string, workingDirectory: string) { - // TODO test this let newCommandsVersion = "1.0.0"; let argument = semver.gte(this.version, newCommandsVersion) ? "server" : "--server"; diff --git a/Src/CSharpier.VSCode/src/CustomPathInstaller.ts b/Src/CSharpier.VSCode/src/CustomPathInstaller.ts index 73b02dca3..ed9c5d209 100644 --- a/Src/CSharpier.VSCode/src/CustomPathInstaller.ts +++ b/Src/CSharpier.VSCode/src/CustomPathInstaller.ts @@ -46,14 +46,15 @@ export class CustomPathInstaller { } private validateInstall(pathToDirectoryForVersion: string, version: string): boolean { + let pathForVersion = this.getPathForVersion(version); try { - const output = execSync(`"${this.getPathForVersion(version)}" --version`, { + const output = execSync(`"${pathForVersion}" --version`, { env: { ...process.env, DOTNET_ROOT: getDotNetRoot() }, }) .toString() .trim(); - this.logger.debug(`"${this.getPathForVersion(version)}" --version output: ${output}`); + this.logger.debug(`"${pathForVersion}" --version output: ${output}`); const versionWithoutHash = output.split("+")[0]; this.logger.debug(`Using ${versionWithoutHash} as the version number.`); @@ -70,11 +71,7 @@ export class CustomPathInstaller { } } catch (error: any) { const message = !error.stderr ? error.toString() : error.stderr.toString(); - this.logger.warn( - "Exception while running 'dotnet-csharpier --version' in " + - pathToDirectoryForVersion, - message, - ); + this.logger.warn(`Exception while running '${pathForVersion} --version'`, message); } return false; @@ -88,7 +85,10 @@ export class CustomPathInstaller { const result = process.platform !== "win32" ? path.resolve(process.env.HOME!, ".cache/csharpier", version) - : path.resolve(process.env.LOCALAPPDATA!, "CSharpier", version); + : // TODO use two copies of the repo to figure out why csharpier thinks props is not supported + + // TODO this is just csharpier.exe on windows, will linux have all lower case too? + path.resolve(process.env.LOCALAPPDATA!, "CSharpier", version); return result.toString(); } diff --git a/Src/CSharpier.VSCode/src/DiagnosticsService.ts b/Src/CSharpier.VSCode/src/DiagnosticsService.ts index 50c5317c0..4ab123601 100644 --- a/Src/CSharpier.VSCode/src/DiagnosticsService.ts +++ b/Src/CSharpier.VSCode/src/DiagnosticsService.ts @@ -101,7 +101,7 @@ export class DiagnosticsService implements vscode.CodeActionProvider, vscode.Dis try { const source = document.getText(); const formattedSource = - (await this.formatDocumentProvider.formatDocument(document)) ?? source; + (await this.formatDocumentProvider.formatDocument(document, false)) ?? source; const differences = generateDifferences(source, formattedSource); const diff = { source, @@ -117,8 +117,8 @@ export class DiagnosticsService implements vscode.CodeActionProvider, vscode.Dis } } this.diagnosticCollection.set(document.uri, diagnostics); - } catch (e) { - this.logger.error(`Unable to provide diagnostics: ${(e as Error).message}`); + } catch (error) { + this.logger.error(`Exception while trying to provide diagnostics`, error); } } diff --git a/Src/CSharpier.VSCode/src/FormatDocumentProvider.ts b/Src/CSharpier.VSCode/src/FormatDocumentProvider.ts index 0c7fed3f7..69d5e25bc 100644 --- a/Src/CSharpier.VSCode/src/FormatDocumentProvider.ts +++ b/Src/CSharpier.VSCode/src/FormatDocumentProvider.ts @@ -9,7 +9,10 @@ export class FormatDocumentProvider { private csharpierProcessProvider: CSharpierProcessProvider, ) {} - async formatDocument(document: TextDocument): Promise { + async formatDocument( + document: TextDocument, + writeLogs: boolean = true, + ): Promise { const csharpierProcess = this.csharpierProcessProvider.getProcessFor(document.fileName); const text = document.getText(); const startTime = performance.now(); @@ -21,7 +24,9 @@ export class FormatDocumentProvider { }; const result = await csharpierProcess.formatFile2(parameter); - this.logger.info("Formatted in " + (performance.now() - startTime) + "ms"); + if (writeLogs) { + this.logger.info("Formatted in " + (performance.now() - startTime) + "ms"); + } if (result == null) { return null; @@ -31,28 +36,45 @@ export class FormatDocumentProvider { case "Formatted": return result.formattedFile; case "Ignored": - this.logger.info("File is ignored by csharpier cli."); + if (writeLogs) { + this.logger.info("File is ignored by csharpier cli."); + } break; case "Failed": - this.logger.warn( - "CSharpier cli failed to format the file and returned the following error: " + - result.errorMessage, - ); + if (writeLogs) { + this.logger.warn( + "CSharpier cli failed to format the file and returned the following error: " + + result.errorMessage, + ); + } + break; + case "UnsupportedFile": + if (writeLogs) { + this.logger.debug( + "CSharpier does not support formatting the file " + document.fileName, + ); + } break; default: - this.logger.warn("Didn't handle " + result.status); + if (writeLogs) { + this.logger.warn("Didn't handle " + result.status); + } break; } } else { const newText = await csharpierProcess.formatFile(text, document.fileName); const endTime = performance.now(); - this.logger.info("Formatted in " + (endTime - startTime) + "ms"); + if (writeLogs) { + this.logger.info("Formatted in " + (endTime - startTime) + "ms"); + } if (!newText || newText === text) { - this.logger.debug( - "Skipping write because " + !newText - ? "result is empty" - : "current document equals result", - ); + if (writeLogs) { + this.logger.debug( + "Skipping write because " + !newText + ? "result is empty" + : "current document equals result", + ); + } return null; } diff --git a/Src/CSharpier.VSCode/src/FormattingService.ts b/Src/CSharpier.VSCode/src/FormattingService.ts index 2e84c91a0..e82550281 100644 --- a/Src/CSharpier.VSCode/src/FormattingService.ts +++ b/Src/CSharpier.VSCode/src/FormattingService.ts @@ -9,6 +9,7 @@ import { } from "vscode"; import { Difference, generateDifferences } from "prettier-linter-helpers"; import { FormatDocumentProvider } from "./FormatDocumentProvider"; +import { Logger } from "./Logger"; export class FormattingService { constructor(private readonly formatDocumentProvider: FormatDocumentProvider) { diff --git a/Src/CSharpier.VSCode/src/ICSharpierProcess.ts b/Src/CSharpier.VSCode/src/ICSharpierProcess.ts index b037c602e..b517d4c8b 100644 --- a/Src/CSharpier.VSCode/src/ICSharpierProcess.ts +++ b/Src/CSharpier.VSCode/src/ICSharpierProcess.ts @@ -21,4 +21,4 @@ export interface FormatFileResult { errorMessage: string; } -export type Status = "Formatted" | "Ignored" | "Failed"; +export type Status = "Formatted" | "Ignored" | "Failed" | "UnsupportedFile"; From 792a1fca4d03c872a6d4a6e9027cc1e9a7998fa2 Mon Sep 17 00:00:00 2001 From: Bela VanderVoort Date: Sat, 4 Jan 2025 15:34:50 -0600 Subject: [PATCH 3/7] self code review --- Src/CSharpier.VSCode/README.md | 9 ++++++--- Src/CSharpier.VSCode/package.json | 2 +- Src/CSharpier.VSCode/src/CustomPathInstaller.ts | 5 ++--- Src/CSharpier.VSCode/src/FormatDocumentProvider.ts | 1 + Src/CSharpier.VSCode/src/FormattingService.ts | 3 --- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Src/CSharpier.VSCode/README.md b/Src/CSharpier.VSCode/README.md index 7cb830f8c..8c748ac83 100644 --- a/Src/CSharpier.VSCode/README.md +++ b/Src/CSharpier.VSCode/README.md @@ -2,9 +2,9 @@ This extension makes use of the dotnet tool [CSharpier](https://github.com/belav/csharpier) to format your code and is versioned independently. -CSharpier is an opinionated code formatter for c# and xml. -It provides very few options and provides a deterministic way to enforce formatting of your code. -The printing process was ported from [prettier](https://prettier.io) but has evolved over time. +CSharpier is an opinionated code formatter for c# and xml. \ +It provides very few options and provides a deterministic way to enforce formatting of your code. \ +The printing process was ported from [prettier](https://prettier.io) but has evolved over time. \ ## Installation @@ -19,6 +19,9 @@ ext install csharpier.csharpier-vscode ## CSharpier Version The extension determines which version of csharpier is needed to format a given file by looking for a dotnet manifest file. If one is not found it looks for a globally installed version of CSharpier. +## XML Formatting +Formatting XML is only available using CSharpier >= 1.0.0 + ## Dotnet Commands The extension makes use of `dotnet` commands and uses the following logic to locate `dotnet`. - If `dotnet.dotnetPath` is set try using that to find `dotnet` diff --git a/Src/CSharpier.VSCode/package.json b/Src/CSharpier.VSCode/package.json index f6463375d..7c59d83f3 100644 --- a/Src/CSharpier.VSCode/package.json +++ b/Src/CSharpier.VSCode/package.json @@ -2,7 +2,7 @@ "name": "csharpier-vscode", "displayName": "CSharpier - Code formatter", "description": "Code formatter using csharpier", - "version": "1.9.2", + "version": "2.0.0", "publisher": "csharpier", "author": "CSharpier", "homepage": "https://marketplace.visualstudio.com/items?itemName=csharpier.csharpier-vscode", diff --git a/Src/CSharpier.VSCode/src/CustomPathInstaller.ts b/Src/CSharpier.VSCode/src/CustomPathInstaller.ts index ed9c5d209..a12df1c10 100644 --- a/Src/CSharpier.VSCode/src/CustomPathInstaller.ts +++ b/Src/CSharpier.VSCode/src/CustomPathInstaller.ts @@ -85,9 +85,8 @@ export class CustomPathInstaller { const result = process.platform !== "win32" ? path.resolve(process.env.HOME!, ".cache/csharpier", version) - : // TODO use two copies of the repo to figure out why csharpier thinks props is not supported - - // TODO this is just csharpier.exe on windows, will linux have all lower case too? + : // TODO this is just csharpier.exe on windows, will linux have all lower case too? + // TODO test this with older csharpier to see what it does with xml files, maybe log something to tell the user path.resolve(process.env.LOCALAPPDATA!, "CSharpier", version); return result.toString(); } diff --git a/Src/CSharpier.VSCode/src/FormatDocumentProvider.ts b/Src/CSharpier.VSCode/src/FormatDocumentProvider.ts index 69d5e25bc..38a102f8b 100644 --- a/Src/CSharpier.VSCode/src/FormatDocumentProvider.ts +++ b/Src/CSharpier.VSCode/src/FormatDocumentProvider.ts @@ -11,6 +11,7 @@ export class FormatDocumentProvider { async formatDocument( document: TextDocument, + // the diagnostic service calls format on almost every keypress, avoid logging those formats so we don't spawn the output writeLogs: boolean = true, ): Promise { const csharpierProcess = this.csharpierProcessProvider.getProcessFor(document.fileName); diff --git a/Src/CSharpier.VSCode/src/FormattingService.ts b/Src/CSharpier.VSCode/src/FormattingService.ts index e82550281..4524a1875 100644 --- a/Src/CSharpier.VSCode/src/FormattingService.ts +++ b/Src/CSharpier.VSCode/src/FormattingService.ts @@ -13,9 +13,6 @@ import { Logger } from "./Logger"; export class FormattingService { constructor(private readonly formatDocumentProvider: FormatDocumentProvider) { - // TODO will this cover all the actual xml files, maybe we need to use patterns? - // { pattern: '**/*.{props,csproj}' } - languages.registerDocumentFormattingEditProvider("xml", { provideDocumentFormattingEdits: this.provideDocumentFormattingEdits, }); From 8c4453db4f9bb168ea90bbf7c91e274dda5418f9 Mon Sep 17 00:00:00 2001 From: Bela VanderVoort Date: Sat, 4 Jan 2025 15:34:50 -0600 Subject: [PATCH 4/7] self code review --- Src/CSharpier.VSCode/CHANGELOG.md | 2 +- Src/CSharpier.VSCode/README.md | 9 ++++++--- Src/CSharpier.VSCode/package.json | 2 +- Src/CSharpier.VSCode/src/CustomPathInstaller.ts | 5 ++--- Src/CSharpier.VSCode/src/FormatDocumentProvider.ts | 1 + Src/CSharpier.VSCode/src/FormattingService.ts | 3 --- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Src/CSharpier.VSCode/CHANGELOG.md b/Src/CSharpier.VSCode/CHANGELOG.md index 28caafead..9db7f451a 100644 --- a/Src/CSharpier.VSCode/CHANGELOG.md +++ b/Src/CSharpier.VSCode/CHANGELOG.md @@ -1,5 +1,5 @@ ## 2.0.0 -- Adding support for CSharpier 1.0.0 +- Adding support for CSharpier 1.0.0 which includes the ability to format xml files. ## 1.9.2 - Add option for diagnostic level, default to warning diff --git a/Src/CSharpier.VSCode/README.md b/Src/CSharpier.VSCode/README.md index 7cb830f8c..8c748ac83 100644 --- a/Src/CSharpier.VSCode/README.md +++ b/Src/CSharpier.VSCode/README.md @@ -2,9 +2,9 @@ This extension makes use of the dotnet tool [CSharpier](https://github.com/belav/csharpier) to format your code and is versioned independently. -CSharpier is an opinionated code formatter for c# and xml. -It provides very few options and provides a deterministic way to enforce formatting of your code. -The printing process was ported from [prettier](https://prettier.io) but has evolved over time. +CSharpier is an opinionated code formatter for c# and xml. \ +It provides very few options and provides a deterministic way to enforce formatting of your code. \ +The printing process was ported from [prettier](https://prettier.io) but has evolved over time. \ ## Installation @@ -19,6 +19,9 @@ ext install csharpier.csharpier-vscode ## CSharpier Version The extension determines which version of csharpier is needed to format a given file by looking for a dotnet manifest file. If one is not found it looks for a globally installed version of CSharpier. +## XML Formatting +Formatting XML is only available using CSharpier >= 1.0.0 + ## Dotnet Commands The extension makes use of `dotnet` commands and uses the following logic to locate `dotnet`. - If `dotnet.dotnetPath` is set try using that to find `dotnet` diff --git a/Src/CSharpier.VSCode/package.json b/Src/CSharpier.VSCode/package.json index f6463375d..7c59d83f3 100644 --- a/Src/CSharpier.VSCode/package.json +++ b/Src/CSharpier.VSCode/package.json @@ -2,7 +2,7 @@ "name": "csharpier-vscode", "displayName": "CSharpier - Code formatter", "description": "Code formatter using csharpier", - "version": "1.9.2", + "version": "2.0.0", "publisher": "csharpier", "author": "CSharpier", "homepage": "https://marketplace.visualstudio.com/items?itemName=csharpier.csharpier-vscode", diff --git a/Src/CSharpier.VSCode/src/CustomPathInstaller.ts b/Src/CSharpier.VSCode/src/CustomPathInstaller.ts index ed9c5d209..a12df1c10 100644 --- a/Src/CSharpier.VSCode/src/CustomPathInstaller.ts +++ b/Src/CSharpier.VSCode/src/CustomPathInstaller.ts @@ -85,9 +85,8 @@ export class CustomPathInstaller { const result = process.platform !== "win32" ? path.resolve(process.env.HOME!, ".cache/csharpier", version) - : // TODO use two copies of the repo to figure out why csharpier thinks props is not supported - - // TODO this is just csharpier.exe on windows, will linux have all lower case too? + : // TODO this is just csharpier.exe on windows, will linux have all lower case too? + // TODO test this with older csharpier to see what it does with xml files, maybe log something to tell the user path.resolve(process.env.LOCALAPPDATA!, "CSharpier", version); return result.toString(); } diff --git a/Src/CSharpier.VSCode/src/FormatDocumentProvider.ts b/Src/CSharpier.VSCode/src/FormatDocumentProvider.ts index 69d5e25bc..38a102f8b 100644 --- a/Src/CSharpier.VSCode/src/FormatDocumentProvider.ts +++ b/Src/CSharpier.VSCode/src/FormatDocumentProvider.ts @@ -11,6 +11,7 @@ export class FormatDocumentProvider { async formatDocument( document: TextDocument, + // the diagnostic service calls format on almost every keypress, avoid logging those formats so we don't spawn the output writeLogs: boolean = true, ): Promise { const csharpierProcess = this.csharpierProcessProvider.getProcessFor(document.fileName); diff --git a/Src/CSharpier.VSCode/src/FormattingService.ts b/Src/CSharpier.VSCode/src/FormattingService.ts index e82550281..4524a1875 100644 --- a/Src/CSharpier.VSCode/src/FormattingService.ts +++ b/Src/CSharpier.VSCode/src/FormattingService.ts @@ -13,9 +13,6 @@ import { Logger } from "./Logger"; export class FormattingService { constructor(private readonly formatDocumentProvider: FormatDocumentProvider) { - // TODO will this cover all the actual xml files, maybe we need to use patterns? - // { pattern: '**/*.{props,csproj}' } - languages.registerDocumentFormattingEditProvider("xml", { provideDocumentFormattingEdits: this.provideDocumentFormattingEdits, }); From 4baaf09f30740b3595529ea18d4bf30b753a8b18 Mon Sep 17 00:00:00 2001 From: Bela VanderVoort Date: Sat, 4 Jan 2025 18:32:07 -0600 Subject: [PATCH 5/7] fix issue with new csharpier on linux --- Src/CSharpier.VSCode/src/CustomPathInstaller.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Src/CSharpier.VSCode/src/CustomPathInstaller.ts b/Src/CSharpier.VSCode/src/CustomPathInstaller.ts index a12df1c10..ee2973039 100644 --- a/Src/CSharpier.VSCode/src/CustomPathInstaller.ts +++ b/Src/CSharpier.VSCode/src/CustomPathInstaller.ts @@ -85,9 +85,7 @@ export class CustomPathInstaller { const result = process.platform !== "win32" ? path.resolve(process.env.HOME!, ".cache/csharpier", version) - : // TODO this is just csharpier.exe on windows, will linux have all lower case too? - // TODO test this with older csharpier to see what it does with xml files, maybe log something to tell the user - path.resolve(process.env.LOCALAPPDATA!, "CSharpier", version); + : path.resolve(process.env.LOCALAPPDATA!, "csharpier", version); return result.toString(); } From 5f9990693b11cc7fd6262433c139cc53671e860b Mon Sep 17 00:00:00 2001 From: Bela VanderVoort Date: Tue, 7 Jan 2025 19:12:18 -0600 Subject: [PATCH 6/7] centralizing the supported languages. Tweaking diagnostics so they don't run as often --- .../src/CSharpierProcessProvider.ts | 15 ++++++----- .../src/DiagnosticsService.ts | 26 +++++++++++++------ Src/CSharpier.VSCode/src/Extension.ts | 21 ++++++++------- .../src/FixAllCodeActionProvider.ts | 4 +-- Src/CSharpier.VSCode/src/FormattingService.ts | 22 +++++++++------- 5 files changed, 52 insertions(+), 36 deletions(-) diff --git a/Src/CSharpier.VSCode/src/CSharpierProcessProvider.ts b/Src/CSharpier.VSCode/src/CSharpierProcessProvider.ts index b1c854dbd..f33fed84b 100644 --- a/Src/CSharpier.VSCode/src/CSharpierProcessProvider.ts +++ b/Src/CSharpier.VSCode/src/CSharpierProcessProvider.ts @@ -17,7 +17,6 @@ import { runFunctionsUntilResultFound } from "./RunFunctionsUntilResultFound"; export class CSharpierProcessProvider implements Disposable { warnedForOldVersion = false; - logger: Logger; customPathInstaller: CustomPathInstaller; installerService: InstallerService; warmingByDirectory: Record = {}; @@ -28,9 +27,12 @@ export class CSharpierProcessProvider implements Disposable { > = {}; disableCSharpierServer: boolean; - constructor(logger: Logger, extension: Extension) { - this.logger = logger; - this.customPathInstaller = new CustomPathInstaller(logger); + constructor( + private readonly logger: Logger, + extension: Extension, + private readonly supportedLanguageIds: string[], + ) { + this.customPathInstaller = new CustomPathInstaller(this.logger); this.installerService = new InstallerService( this.logger, this.killRunningProcesses, @@ -42,10 +44,11 @@ export class CSharpierProcessProvider implements Disposable { false; window.onDidChangeActiveTextEditor((event: TextEditor | undefined) => { - if (event?.document?.languageId !== "csharp") { + let languageId = event?.document?.languageId; + if (!languageId || !this.supportedLanguageIds.includes(languageId)) { return; } - this.findAndWarmProcess(event.document.fileName); + this.findAndWarmProcess(event!.document.fileName); }); } diff --git a/Src/CSharpier.VSCode/src/DiagnosticsService.ts b/Src/CSharpier.VSCode/src/DiagnosticsService.ts index 4ab123601..7c2e53834 100644 --- a/Src/CSharpier.VSCode/src/DiagnosticsService.ts +++ b/Src/CSharpier.VSCode/src/DiagnosticsService.ts @@ -29,12 +29,12 @@ export class DiagnosticsService implements vscode.CodeActionProvider, vscode.Dis constructor( private readonly formatDocumentProvider: FormatDocumentProvider, - private readonly documentSelector: Array, + private readonly supportedLanguageIds: string[], private readonly logger: Logger, ) { this.diagnosticCollection = vscode.languages.createDiagnosticCollection(DIAGNOSTICS_ID); this.codeActionsProvider = vscode.languages.registerCodeActionsProvider( - this.documentSelector, + this.supportedLanguageIds, this, DiagnosticsService.metadata, ); @@ -49,6 +49,8 @@ export class DiagnosticsService implements vscode.CodeActionProvider, vscode.Dis this.codeActionsProvider.dispose(); } + private onChangeTimeout: NodeJS.Timeout | undefined; + private registerEditorEvents(): void { const activeDocument = vscode.window.activeTextEditor?.document; if (activeDocument) { @@ -58,10 +60,14 @@ export class DiagnosticsService implements vscode.CodeActionProvider, vscode.Dis const onDidChangeTextDocument = vscode.workspace.onDidChangeTextDocument(e => { if ( e.contentChanges.length && - vscode.window.activeTextEditor?.document === e.document + vscode.window.activeTextEditor?.document === e.document && + this.supportedLanguageIds.includes(e.document.languageId) ) { - // when editing don't pop up any new diagnostics, but if someone cleans up one then allow that update - void this.runDiagnostics(e.document, true); + clearTimeout(this.onChangeTimeout); + this.onChangeTimeout = setTimeout(() => { + // when editing don't pop up any new diagnostics, but if someone cleans up one then allow that update + void this.runDiagnostics(e.document, true); + }, 100); } }); @@ -90,10 +96,15 @@ export class DiagnosticsService implements vscode.CodeActionProvider, vscode.Dis onlyAllowLessDiagnostics = false, ): Promise { const shouldRunDiagnostics = - this.documentSelector.some(selector => selector.language === document.languageId) && !!vscode.workspace.getWorkspaceFolder(document.uri) && (workspace.getConfiguration("csharpier").get("enableDiagnostics") ?? true); - if (!shouldRunDiagnostics) { + + let currentDiagnostics = this.diagnosticCollection.get(document.uri); + + if ( + !shouldRunDiagnostics || + (currentDiagnostics?.length === 0 && onlyAllowLessDiagnostics) + ) { this.diagnosticCollection.set(document.uri, []); return; } @@ -110,7 +121,6 @@ export class DiagnosticsService implements vscode.CodeActionProvider, vscode.Dis }; const diagnostics = this.getDiagnostics(document, diff); if (onlyAllowLessDiagnostics) { - let currentDiagnostics = this.diagnosticCollection.get(document.uri); let currentCount = !currentDiagnostics ? 0 : currentDiagnostics.length; if (diagnostics.length >= currentCount) { return; diff --git a/Src/CSharpier.VSCode/src/Extension.ts b/Src/CSharpier.VSCode/src/Extension.ts index b88b4a981..b10012933 100644 --- a/Src/CSharpier.VSCode/src/Extension.ts +++ b/Src/CSharpier.VSCode/src/Extension.ts @@ -19,6 +19,8 @@ export async function activate(context: ExtensionContext) { await initPlugin(context); } +export const supportedLanguageIds = ["csharp", "xml"]; + const initPlugin = async (context: ExtensionContext) => { const enableDebugLogs = workspace.getConfiguration("csharpier").get("enableDebugLogs") ?? false; @@ -40,22 +42,21 @@ const initPlugin = async (context: ExtensionContext) => { NullCSharpierProcess.create(logger); - const csharpierProcessProvider = new CSharpierProcessProvider(logger, context.extension); + const csharpierProcessProvider = new CSharpierProcessProvider( + logger, + context.extension, + supportedLanguageIds, + ); const formatDocumentProvider = new FormatDocumentProvider(logger, csharpierProcessProvider); - const diagnosticsDocumentSelector: DocumentFilter[] = [ - { - language: "csharp", - scheme: "file", - }, - ]; + const diagnosticsService = new DiagnosticsService( formatDocumentProvider, - diagnosticsDocumentSelector, + supportedLanguageIds, logger, ); - const fixAllCodeActionProvider = new FixAllCodeActionProvider(diagnosticsDocumentSelector); + const fixAllCodeActionProvider = new FixAllCodeActionProvider(supportedLanguageIds); - new FormattingService(formatDocumentProvider); + new FormattingService(formatDocumentProvider, supportedLanguageIds); new FixAllCodeActionsCommand(context, formatDocumentProvider, logger); context.subscriptions.push( diff --git a/Src/CSharpier.VSCode/src/FixAllCodeActionProvider.ts b/Src/CSharpier.VSCode/src/FixAllCodeActionProvider.ts index 3a57a7b4c..d83cca381 100644 --- a/Src/CSharpier.VSCode/src/FixAllCodeActionProvider.ts +++ b/Src/CSharpier.VSCode/src/FixAllCodeActionProvider.ts @@ -13,9 +13,9 @@ export class FixAllCodeActionProvider implements vscode.CodeActionProvider, vsco private readonly codeActionsProvider: vscode.Disposable; - constructor(private readonly documentSelector: vscode.DocumentSelector) { + constructor(private readonly supportedLanguageIds: string[]) { this.codeActionsProvider = vscode.languages.registerCodeActionsProvider( - this.documentSelector, + this.supportedLanguageIds, this, FixAllCodeActionProvider.metadata, ); diff --git a/Src/CSharpier.VSCode/src/FormattingService.ts b/Src/CSharpier.VSCode/src/FormattingService.ts index 4524a1875..3dad73c63 100644 --- a/Src/CSharpier.VSCode/src/FormattingService.ts +++ b/Src/CSharpier.VSCode/src/FormattingService.ts @@ -12,17 +12,19 @@ import { FormatDocumentProvider } from "./FormatDocumentProvider"; import { Logger } from "./Logger"; export class FormattingService { - constructor(private readonly formatDocumentProvider: FormatDocumentProvider) { - languages.registerDocumentFormattingEditProvider("xml", { - provideDocumentFormattingEdits: this.provideDocumentFormattingEdits, - }); - languages.registerDocumentFormattingEditProvider("csharp", { - provideDocumentFormattingEdits: this.provideDocumentFormattingEdits, - }); + constructor( + private readonly formatDocumentProvider: FormatDocumentProvider, + supportedLanguageIds: string[], + ) { + for (let languageId of supportedLanguageIds) { + languages.registerDocumentFormattingEditProvider(languageId, { + provideDocumentFormattingEdits: this.provideDocumentFormattingEdits, + }); - languages.registerDocumentRangeFormattingEditProvider("csharp", { - provideDocumentRangeFormattingEdits: this.provideDocumentRangeFormattingEdits, - }); + languages.registerDocumentRangeFormattingEditProvider(languageId, { + provideDocumentRangeFormattingEdits: this.provideDocumentRangeFormattingEdits, + }); + } } private provideDocumentRangeFormattingEdits = async ( From 156e40970218c73f4466b104574d0ff6d584df6c Mon Sep 17 00:00:00 2001 From: Bela VanderVoort Date: Tue, 7 Jan 2025 19:17:32 -0600 Subject: [PATCH 7/7] update and pin node --- Src/CSharpier.VSCode/package-lock.json | 796 ++++++++++++++++++++++--- Src/CSharpier.VSCode/package.json | 19 +- 2 files changed, 743 insertions(+), 72 deletions(-) diff --git a/Src/CSharpier.VSCode/package-lock.json b/Src/CSharpier.VSCode/package-lock.json index c66ce31b2..99ebff29c 100644 --- a/Src/CSharpier.VSCode/package-lock.json +++ b/Src/CSharpier.VSCode/package-lock.json @@ -1,12 +1,12 @@ { "name": "csharpier-vscode", - "version": "1.8.0", + "version": "2.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "csharpier-vscode", - "version": "1.8.0", + "version": "2.0.0", "license": "MIT", "dependencies": { "node-fetch": "^2.7.0", @@ -20,7 +20,7 @@ "@types/prettier-linter-helpers": "^1.0.4", "@types/semver": "7.3.9", "@types/vscode": "1.60.0", - "@vscode/vsce": "^2.6.3", + "@vscode/vsce": "3.2.1", "prettier": "2.4.1", "rimraf": "3.0.2", "semver": "7.6.0", @@ -214,6 +214,24 @@ "node": ">=10.0.0" } }, + "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, + "license": "ISC", + "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/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -362,9 +380,9 @@ "dev": true }, "node_modules/@vscode/vsce": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.32.0.tgz", - "integrity": "sha512-3EFJfsgrSftIqt3EtdRcAygy/OJ3hstyI1cDmIgkU9CFZW5C+3djr6mfosndCUqcVYuyjmxOK1xmFp/Bq7+NIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.2.1.tgz", + "integrity": "sha512-AY9vBjwExakK1c0cI/3NN2Ey0EgiKLBye/fxl/ue+o4q6RZ7N+xzd1jAD6eI6eBeMVANi617+V2rxIAkDPco2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -376,17 +394,17 @@ "cockatiel": "^3.1.2", "commander": "^6.2.1", "form-data": "^4.0.0", - "glob": "^7.0.6", + "glob": "^11.0.0", "hosted-git-info": "^4.0.2", "jsonc-parser": "^3.2.0", "leven": "^3.1.0", - "markdown-it": "^12.3.2", + "markdown-it": "^14.1.0", "mime": "^1.3.4", "minimatch": "^3.0.3", "parse-semver": "^1.1.1", "read": "^1.0.7", "semver": "^7.5.2", - "tmp": "^0.2.1", + "tmp": "^0.2.3", "typed-rest-client": "^1.8.4", "url-join": "^4.0.1", "xml2js": "^0.5.0", @@ -397,7 +415,7 @@ "vsce": "vsce" }, "engines": { - "node": ">= 16" + "node": ">= 20" }, "optionalDependencies": { "keytar": "^7.7.0" @@ -572,6 +590,16 @@ "typed-rest-client": "^1.8.4" } }, + "node_modules/@vscode/vsce/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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/@vscode/vsce/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -604,6 +632,46 @@ "dev": true, "license": "MIT" }, + "node_modules/@vscode/vsce/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vscode/vsce/node_modules/glob/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@vscode/vsce/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -903,6 +971,19 @@ "ajv": "^6.9.1" } }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1459,6 +1540,13 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "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, + "license": "MIT" + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -1476,6 +1564,13 @@ "dev": true, "license": "ISC" }, + "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, + "license": "MIT" + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -1727,6 +1822,36 @@ "flat": "cli.js" } }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/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, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -2075,6 +2200,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2137,6 +2272,22 @@ "node": ">=0.10.0" } }, + "node_modules/jackspeak": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -2286,13 +2437,13 @@ } }, "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "license": "MIT", "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "node_modules/loader-runner": { @@ -2378,36 +2529,27 @@ } }, "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true, "license": "MIT" }, @@ -2510,6 +2652,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -2704,6 +2856,13 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", @@ -2780,6 +2939,33 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -2889,6 +3075,16 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.12.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", @@ -3255,6 +3451,110 @@ "safe-buffer": "~5.2.0" } }, + "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, + "license": "MIT", + "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/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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, + "license": "MIT" + }, + "node_modules/string-width-cjs/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -3499,9 +3799,9 @@ } }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, "license": "MIT" }, @@ -3746,6 +4046,101 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, + "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, + "license": "MIT", + "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/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, + "license": "MIT", + "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/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/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, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -3934,6 +4329,20 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@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, + "requires": { + "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" + } + }, "@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -4072,9 +4481,9 @@ "dev": true }, "@vscode/vsce": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.32.0.tgz", - "integrity": "sha512-3EFJfsgrSftIqt3EtdRcAygy/OJ3hstyI1cDmIgkU9CFZW5C+3djr6mfosndCUqcVYuyjmxOK1xmFp/Bq7+NIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.2.1.tgz", + "integrity": "sha512-AY9vBjwExakK1c0cI/3NN2Ey0EgiKLBye/fxl/ue+o4q6RZ7N+xzd1jAD6eI6eBeMVANi617+V2rxIAkDPco2Q==", "dev": true, "requires": { "@azure/identity": "^4.1.0", @@ -4085,18 +4494,18 @@ "cockatiel": "^3.1.2", "commander": "^6.2.1", "form-data": "^4.0.0", - "glob": "^7.0.6", + "glob": "^11.0.0", "hosted-git-info": "^4.0.2", "jsonc-parser": "^3.2.0", "keytar": "^7.7.0", "leven": "^3.1.0", - "markdown-it": "^12.3.2", + "markdown-it": "^14.1.0", "mime": "^1.3.4", "minimatch": "^3.0.3", "parse-semver": "^1.1.1", "read": "^1.0.7", "semver": "^7.5.2", - "tmp": "^0.2.1", + "tmp": "^0.2.3", "typed-rest-client": "^1.8.4", "url-join": "^4.0.1", "xml2js": "^0.5.0", @@ -4123,6 +4532,15 @@ "typed-rest-client": "^1.8.4" } }, + "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, + "requires": { + "balanced-match": "^1.0.0" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -4149,6 +4567,31 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "dependencies": { + "minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -4471,6 +4914,12 @@ "dev": true, "requires": {} }, + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -4836,6 +5285,12 @@ "domhandler": "^5.0.3" } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -4851,6 +5306,12 @@ "integrity": "sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==", "dev": true }, + "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 + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -5036,6 +5497,24 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, + "foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "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 + } + } + }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -5271,6 +5750,12 @@ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "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-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -5313,6 +5798,15 @@ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, + "jackspeak": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2" + } + }, "jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -5439,12 +5933,12 @@ "dev": true }, "linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "requires": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "loader-runner": { @@ -5514,30 +6008,23 @@ } }, "markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "requires": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "dependencies": { - "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true - } + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" } }, "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, "merge-stream": { @@ -5606,6 +6093,12 @@ "dev": true, "optional": true }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + }, "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -5746,6 +6239,12 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, "parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", @@ -5806,6 +6305,24 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "requires": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "dependencies": { + "lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "dev": true + } + } + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -5885,6 +6402,12 @@ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, + "punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true + }, "qs": { "version": "6.12.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", @@ -6129,6 +6652,77 @@ "safe-buffer": "~5.2.0" } }, + "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, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "string-width-cjs": { + "version": "npm:string-width@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, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "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 + }, + "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 + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-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, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "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 + } + } + }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -6295,9 +6889,9 @@ "dev": true }, "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, "underscore": { @@ -6459,6 +7053,70 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, + "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, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "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 + } + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@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-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/Src/CSharpier.VSCode/package.json b/Src/CSharpier.VSCode/package.json index 7c59d83f3..8075117f9 100644 --- a/Src/CSharpier.VSCode/package.json +++ b/Src/CSharpier.VSCode/package.json @@ -51,8 +51,18 @@ }, "csharpier.diagnosticsLevel": { "type": "string", - "enum": ["0", "1", "2", "3"], - "enumItemLabels": ["Error", "Warning", "Information", "Hint"], + "enum": [ + "0", + "1", + "2", + "3" + ], + "enumItemLabels": [ + "Error", + "Warning", + "Information", + "Hint" + ], "default": "1", "description": "Determines the severity level of diagnostics if they are enabled." }, @@ -91,7 +101,7 @@ "@types/prettier-linter-helpers": "^1.0.4", "@types/semver": "7.3.9", "@types/vscode": "1.60.0", - "@vscode/vsce": "^2.6.3", + "@vscode/vsce": "3.2.1", "prettier": "2.4.1", "rimraf": "3.0.2", "semver": "7.6.0", @@ -104,5 +114,8 @@ "dependencies": { "node-fetch": "^2.7.0", "prettier-linter-helpers": "^1.0.0" + }, + "volta": { + "node": "22.13.0" } }