From 8bd8c7c3921efef96208ab757db3847a50970bd6 Mon Sep 17 00:00:00 2001 From: JCWasmx86 Date: Mon, 15 May 2023 06:18:27 +0200 Subject: [PATCH] Add integration for Swift-MesonLSP Co-Authored-By: Tristan Partin --- CHANGELOG.md | 5 + package.json | 41 ++++++- src/extension.ts | 73 ++++++++++-- src/lsp/common.ts | 58 ++++++++++ src/lsp/index.ts | 196 ++++++++++++++++++++++++++++++++ src/lsp/swift-mesonlsp.ts | 71 ++++++++++++ src/storage.ts | 9 ++ src/types.ts | 11 ++ yarn.lock | 227 ++++++++++++++++++++++++++++---------- 9 files changed, 619 insertions(+), 72 deletions(-) create mode 100644 src/lsp/common.ts create mode 100644 src/lsp/index.ts create mode 100644 src/lsp/swift-mesonlsp.ts create mode 100644 src/storage.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index fcde552e..20cabdcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ - Add syntax highlight for `meson.options` files. - Fix listing tests in the Test Explorer on activation - Add support to run executables that are not installed (eg: examples) +- Add integration with + [Swift-MesonLSP](https://github.com/JCWasmx86/Swift-MesonLSP). vscode-meson + will automatically download it on Windows, Linux and MacOS. Linux users can + follow the [docs](https://github.com/JCWasmx86/Swift-MesonLSP/tree/main/Docs) + if they want to have updates delivered using their package manager. ## 1.10.0 diff --git a/package.json b/package.json index 6d857ad1..b9e25f26 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,10 @@ { "command": "mesonbuild.benchmark", "title": "Meson: Run Benchmarks" + }, + { + "command": "mesonbuild.restartLanguageServer", + "title": "Meson: Restart Language Server" } ], "configuration": { @@ -187,6 +191,35 @@ ] }, "description": "Give an object that's merged into the debug configuration provider" + }, + "mesonbuild.languageServer": { + "type": "string", + "default": "Swift-MesonLSP", + "enum": [ + "Swift-MesonLSP", + null + ], + "description": "Select which language server to use" + }, + "mesonbuild.languageServerPath": { + "type": "string", + "description": "Binary name or path to language server", + "default": "" + }, + "mesonbuild.downloadLanguageServer": { + "type": "string", + "default": "ask", + "enum": [ + true, + false, + "ask" + ], + "enumDescriptions": [ + "Download the language server", + "Do not download the language server", + "Ask every time to download the language server" + ], + "description": "Have VSCode download the language server automatically (MacOS/Windows only for Swift-MesonLSP)" } } }, @@ -338,14 +371,20 @@ "watch": "tsc -watch -p ./" }, "devDependencies": { + "@types/adm-zip": "^0.5.1", "@types/node": "^16.11.7", "@types/vscode": "^1.1.59", + "@types/which": "^3.0.0", "husky": "^8.0.3", "lint-staged": "^14.0.1", "prettier": "^3.0.3", "typescript": "^4.4.4" }, - "dependencies": {}, + "dependencies": { + "adm-zip": "0.5.10", + "vscode-languageclient": "8.0.2", + "which": "4.0.0" + }, "prettier": { "proseWrap": "always" } diff --git a/src/extension.ts b/src/extension.ts index 7d73374d..5635a5ad 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -10,12 +10,14 @@ import { useCompileCommands, clearCache, checkMesonIsConfigured, + getOutputChannel, } from "./utils"; import { DebugConfigurationProvider } from "./configprovider"; import { testDebugHandler, testRunHandler, rebuildTests } from "./tests"; import { activateLinters } from "./linters"; import { activateFormatters } from "./formatters"; -import { TaskQuickPickItem } from "./types"; +import { SettingsKey, TaskQuickPickItem } from "./types"; +import { createLanguageServerClient } from "./lsp/common"; export let extensionPath: string; let explorer: MesonProjectExplorer; @@ -34,9 +36,6 @@ export async function activate(ctx: vscode.ExtensionContext) { const root = vscode.workspace.workspaceFolders[0].uri.fsPath; const buildDir = workspaceRelative(extensionConfiguration("buildFolder")); - activateLinters(root, ctx); - activateFormatters(ctx); - explorer = new MesonProjectExplorer(ctx, root, buildDir); ctx.subscriptions.push( @@ -176,8 +175,7 @@ export async function activate(ctx: vscode.ExtensionContext) { ); if (!checkMesonIsConfigured(buildDir)) { - const configureOnOpenKey = "configureOnOpen"; - let configureOnOpen = extensionConfiguration(configureOnOpenKey); + let configureOnOpen = extensionConfiguration(SettingsKey.configureOnOpen); if (configureOnOpen === "ask") { enum Options { yes = "Yes", @@ -196,7 +194,7 @@ export async function activate(ctx: vscode.ExtensionContext) { break; case Options.never: - extensionConfigurationSet(configureOnOpenKey, false, vscode.ConfigurationTarget.Workspace); + extensionConfigurationSet(SettingsKey.configureOnOpen, false, vscode.ConfigurationTarget.Workspace); break; case Options.yes: @@ -204,17 +202,72 @@ export async function activate(ctx: vscode.ExtensionContext) { break; case Options.always: - extensionConfigurationSet(configureOnOpenKey, true, vscode.ConfigurationTarget.Workspace); + extensionConfigurationSet(SettingsKey.configureOnOpen, true, vscode.ConfigurationTarget.Workspace); configureOnOpen = true; break; } } + } - if (configureOnOpen === true) { - runFirstTask("reconfigure"); + const downloadLanguageServer = extensionConfiguration(SettingsKey.downloadLanguageServer); + const server = extensionConfiguration(SettingsKey.languageServer); + const shouldDownload = async (downloadLanguageServer: boolean | "ask"): Promise => { + if (typeof downloadLanguageServer === "boolean") return downloadLanguageServer; + + enum Options { + yes = "Yes", + no = "Not this time", + never = "Never", + } + + const response = await vscode.window.showInformationMessage( + "Should the extension try to download the language server?", + ...Object.values(Options), + ); + + switch (response) { + case Options.yes: + extensionConfigurationSet(SettingsKey.downloadLanguageServer, true, vscode.ConfigurationTarget.Global); + return true; + + case Options.never: + extensionConfigurationSet(SettingsKey.downloadLanguageServer, false, vscode.ConfigurationTarget.Global); + return false; + + case Options.no: + extensionConfigurationSet(SettingsKey.downloadLanguageServer, "ask", vscode.ConfigurationTarget.Global); + return false; } + + return false; + }; + + let client = await createLanguageServerClient(server, await shouldDownload(downloadLanguageServer), ctx); + if (client !== null && server == "Swift-MesonLSP") { + ctx.subscriptions.push(client); + client.start(); + + getOutputChannel().appendLine("Not enabling the muon linter/formatter because Swift-MesonLSP is active."); + } else { + activateLinters(root, ctx); + activateFormatters(ctx); } + ctx.subscriptions.push( + vscode.commands.registerCommand("mesonbuild.restartLanguageServer", async () => { + if (client === null) { + client = await createLanguageServerClient(server, await shouldDownload(downloadLanguageServer), ctx); + if (client !== null) { + ctx.subscriptions.push(client); + client.start(); + // TODO: The output line from above about not enabling muon would be good to have here. + } + } else { + client.restart(); + } + }), + ); + async function pickTask(mode: string) { const picker = vscode.window.createQuickPick(); picker.busy = true; diff --git a/src/lsp/common.ts b/src/lsp/common.ts new file mode 100644 index 00000000..52152dd9 --- /dev/null +++ b/src/lsp/common.ts @@ -0,0 +1,58 @@ +import * as vscode from "vscode"; +import { LanguageServerClient } from "."; +import { LanguageServer } from "../types"; +import { SwiftMesonLspLanguageClient } from "./swift-mesonlsp"; +import { Uri } from "vscode"; + +export async function createLanguageServerClient( + server: LanguageServer, + download: boolean, + context: vscode.ExtensionContext, +): Promise { + const serverToClass = (server: LanguageServer) => { + switch (server) { + case "Swift-MesonLSP": + return SwiftMesonLspLanguageClient; + default: + return null; + } + }; + + const klass = serverToClass(server); + if (klass == null) { + return null; + } + if (!klass.supportsSystem()) { + vscode.window.showErrorMessage("The configured language server does not support the current system."); + return null; + } + + let languageServerPath = LanguageServerClient.resolveLanguageServerPath(server, context); + if (languageServerPath === null) { + if (klass.artifact() == null) { + enum Options { + open = "Open documentation in browser", + } + const response = await vscode.window.showErrorMessage( + "This language server supports your systen, but provides no artifacts for automatic setup", + ...Object.values(Options), + ); + if (response == Options.open) { + vscode.env.openExternal(Uri.parse(klass.setupURL)); + } + return null; + } + if (download) { + languageServerPath = await klass.download(server, klass.version, context); + if (languageServerPath === null) { + vscode.window.showErrorMessage("Failed to download the language server."); + return null; + } + } else { + vscode.window.showErrorMessage("Failed to find a language server on the system."); + return null; + } + } + + return new klass(languageServerPath, context); +} diff --git a/src/lsp/index.ts b/src/lsp/index.ts new file mode 100644 index 00000000..070b302a --- /dev/null +++ b/src/lsp/index.ts @@ -0,0 +1,196 @@ +import * as Admzip from "adm-zip"; +import * as which from "which"; +import * as https from "https"; +import * as crypto from "crypto"; +import * as fs from "fs"; +import * as os from "os"; +import * as path from "path"; +import * as vscode from "vscode"; +import { + Executable, + LanguageClient, + LanguageClientOptions, + ServerOptions, + TransportKind, +} from "vscode-languageclient/node"; +import * as storage from "../storage"; +import { LanguageServer } from "../types"; + +export abstract class LanguageServerClient { + private static readonly clientOptions: LanguageClientOptions = { + documentSelector: ["meson", { scheme: "file", language: "meson" }], + }; + private ls: LanguageClient | null = null; + private readonly context: vscode.ExtensionContext; + + protected languageServerPath: vscode.Uri | null; + readonly server: LanguageServer; + + static readonly repoURL: string; + static readonly setupURL: string; + static readonly version: string; + + protected abstract get debugExe(): Executable; + protected abstract get runExe(): Executable; + + protected constructor(server: LanguageServer, languageServerPath: vscode.Uri, context: vscode.ExtensionContext) { + this.server = server; + this.languageServerPath = languageServerPath; + this.context = context; + } + + private static cachedLanguageServer(server: LanguageServer, context: vscode.ExtensionContext): vscode.Uri | null { + const uri = vscode.Uri.joinPath( + storage.uri(storage.Location.LSP, context), + `${server}${os.platform() === "win32" ? ".exe" : ""}`, + ); + + return fs.existsSync(uri.fsPath) ? uri : null; + } + + private static async computeFileHash(filePath: string): Promise { + return new Promise((resolve, reject) => { + const hash = crypto.createHash("sha256"); + const stream = fs.createReadStream(filePath); + + stream.on("error", reject); + + stream.on("data", (data) => { + hash.update(data); + }); + + stream.on("end", () => { + resolve(hash.digest("hex")); + }); + }); + } + + private static async fetch(url: string, dest: string): Promise { + return new Promise((resolve, reject) => { + const file = fs.createWriteStream(dest); + const request = https.get(url, (response) => { + if (response.statusCode === 302 || response.statusCode === 301 || response.statusCode === 302) { + LanguageServerClient.fetch(response.headers.location!, dest).then(resolve).catch(reject); + } else { + response.pipe(file); + + file.on("finish", () => { + file.close((_) => { + resolve(); + }); + }); + + file.on("error", (err) => { + vscode.window.showErrorMessage(`Error writing to file: ${err}`); + reject(err); + }); + } + }); + + request.on("error", (err) => { + vscode.window.showErrorMessage(`Request error: ${err}`); + reject(err); + }); + }); + } + + static async download( + server: LanguageServer, + version: string, + context: vscode.ExtensionContext, + ): Promise { + const lspDir = storage.uri(storage.Location.LSP, context).fsPath; + const artifact = this.artifact(); + if (artifact === null) return null; + + fs.rmSync(lspDir, { recursive: true, force: true }); + fs.mkdirSync(lspDir, { recursive: true }); + + let uri: vscode.Uri | null = null; + const tmpPath = path.join(os.tmpdir(), `vscode-meson-${server}-${Date.now()}.zip`); + + try { + await LanguageServerClient.fetch(artifact.url, tmpPath); + let hash = await this.computeFileHash(tmpPath); + if (hash !== artifact.hash) { + vscode.window.showErrorMessage(`Invalid hash: Expected ${artifact.hash}, got ${hash}.`); + fs.unlinkSync(tmpPath); + return null; + } + + const zip = new Admzip(tmpPath); + zip.extractAllTo(lspDir); + const binary = path.join(lspDir, server!); + if (os.platform() != "win32") fs.chmodSync(binary, 0o755); + const versionFile = path.join(lspDir, "version"); + fs.writeFileSync(versionFile, version); + + vscode.window.showInformationMessage("Language server was downloaded."); + uri = vscode.Uri.from({ scheme: "file", path: binary }); + fs.unlinkSync(tmpPath); + return uri; + } catch (err) { + vscode.window.showErrorMessage(JSON.stringify(err)); + fs.unlinkSync(tmpPath); + } + return uri; + } + + static resolveLanguageServerPath(server: LanguageServer, context: vscode.ExtensionContext): vscode.Uri | null { + const config = vscode.workspace.getConfiguration("mesonbuild"); + if (config["languageServerPath"] !== null && config["languageServerPath"] != "") + return vscode.Uri.from({ scheme: "file", path: config["languageServerPath"] }); + + const cached = LanguageServerClient.cachedLanguageServer(server, context); + if (cached !== null) return cached; + + const binary = which.sync(server!, { nothrow: true }); + if (binary !== null) return vscode.Uri.from({ scheme: "file", path: binary }); + + return null; + } + + protected static supportsSystem(): boolean { + return true; + } + + protected static artifact(): { url: string; hash: string } | null { + return null; + } + + dispose() { + if (this.ls !== null) { + this.ls.stop(); + this.ls = null; + } + } + + restart(): void { + this.dispose(); + this.languageServerPath = LanguageServerClient.resolveLanguageServerPath(this.server, this.context); + if (this.languageServerPath === null) { + vscode.window.showErrorMessage( + "Failed to restart the language server because a binary was not found and could not be downloaded", + ); + } else { + this.start(); + } + } + + start(): void { + const serverOptions: ServerOptions = { + run: this.runExe, + debug: this.debugExe, + transport: TransportKind.stdio, + }; + + this.ls = new LanguageClient( + this.server!, + `Meson Language Server (${this.server})`, + serverOptions, + LanguageServerClient.clientOptions, + true, + ); + this.ls.start(); + } +} diff --git a/src/lsp/swift-mesonlsp.ts b/src/lsp/swift-mesonlsp.ts new file mode 100644 index 00000000..f612faa3 --- /dev/null +++ b/src/lsp/swift-mesonlsp.ts @@ -0,0 +1,71 @@ +import * as os from "os"; +import * as vscode from "vscode"; + +import { LanguageServerClient } from "../lsp"; +import { Executable } from "vscode-languageclient/node"; + +export class SwiftMesonLspLanguageClient extends LanguageServerClient { + private static artifacts: { [key: string]: { name: string; hash: string } } = { + "win32-x64": { + name: "Swift-MesonLSP-win64.zip", + hash: "58cfb17b1804a17886ff5a6a0db668e74c4622cedae077feca884e20567aec7c", + }, + "darwin-x64": { + name: "Swift-MesonLSP-macos12.zip", + hash: "7f1b51b7bbecc6ba5b569177b39086b5a761e4d34e1bb2d659b97d46c110f078", + }, + "linux-x64": { + name: "Swift-MesonLSP.zip", + hash: "72ee4b630135165159237047d37bafd53bb42107528250ce59cd5e650d387ee0", + }, + }; + + static override repoURL: string = "https://github.com/JCWasmx86/Swift-MesonLSP"; + static override setupURL: string = "https://github.com/JCWasmx86/Swift-MesonLSP/tree/main/Docs"; + static override version: string = "2.4.3"; + + get runExe(): Executable { + return { + command: this.languageServerPath!.fsPath, + args: ["--lsp"], + }; + } + + get debugExe(): Executable { + return { + command: this.languageServerPath!.fsPath, + args: ["--lsp"], + }; + } + + constructor(languageServerPath: vscode.Uri, context: vscode.ExtensionContext) { + super("Swift-MesonLSP", languageServerPath, context); + } + + static override artifact(): { url: string; hash: string } | null { + const arch = os.arch(); + const platform = os.platform(); + if (arch !== "x64") return null; + + const artifact = SwiftMesonLspLanguageClient.artifacts[`${platform}-${arch}`]; + return { + url: `${SwiftMesonLspLanguageClient.repoURL}/releases/download/v${SwiftMesonLspLanguageClient.version}/${artifact.name}`, + hash: artifact.hash, + }; + } + + static override supportsSystem(): boolean { + const arch = os.arch(); + if (arch != "x64") return false; + + const platform = os.platform(); + switch (platform) { + case "darwin": + case "linux": + case "win32": + return true; + default: + return false; + } + } +} diff --git a/src/storage.ts b/src/storage.ts new file mode 100644 index 00000000..e81164d3 --- /dev/null +++ b/src/storage.ts @@ -0,0 +1,9 @@ +import * as vscode from "vscode"; + +export enum Location { + LSP = "lsp", +} + +export function uri(location: Location, context: vscode.ExtensionContext): vscode.Uri { + return vscode.Uri.joinPath(context.globalStorageUri, location); +} diff --git a/src/types.ts b/src/types.ts index d6bba63a..1ce5ce96 100644 --- a/src/types.ts +++ b/src/types.ts @@ -8,6 +8,8 @@ export type LinterConfiguration = { enabled: boolean; }; +export type LanguageServer = "Swift-MesonLSP" | null; + export interface ExtensionConfiguration { configureOnOpen: boolean | "ask"; configureOptions: string[]; @@ -27,6 +29,9 @@ export interface ExtensionConfiguration { muonConfig: string | null; }; debugOptions: object; + languageServer: LanguageServer; + languageServerPath: string; + downloadLanguageServer: boolean | "ask"; } export interface TaskQuickPickItem extends vscode.QuickPickItem { @@ -119,3 +124,9 @@ export type Targets = Target[]; export type BuildOptions = BuildOption[]; export type Dependencies = Dependency[]; export type Tests = Test[]; + +export enum SettingsKey { + downloadLanguageServer = "downloadLanguageServer", + languageServer = "languageServer", + configureOnOpen = "configureOnOpen", +} diff --git a/yarn.lock b/yarn.lock index 1b4c8862..6729d132 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,55 +2,90 @@ # yarn lockfile v1 +"@types/adm-zip@^0.5.1": + version "0.5.1" + resolved "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.1.tgz" + integrity sha512-3+psmbh60N5JXM2LMkujFqnjMf3KB0LZoIQO73NJvkv57q+384nK/A7pP0v+ZkB/Zrfqn+5xtAyt5OsY+GiYLQ== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "20.5.9" + resolved "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz" + integrity sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ== + "@types/node@^16.11.7": version "16.11.7" resolved "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz" integrity sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw== "@types/vscode@^1.1.59": - version "1.64.0" - resolved "https://registry.npmjs.org/@types/vscode/-/vscode-1.64.0.tgz" - integrity sha512-bSlAWz5WtcSL3cO9tAT/KpEH9rv5OBnm93OIIFwdCshaAiqr2bp1AUyEwW9MWeCvZBHEXc3V0fTYVdVyzDNwHA== + version "1.81.0" + resolved "https://registry.npmjs.org/@types/vscode/-/vscode-1.81.0.tgz" + integrity sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w== + +"@types/which@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/which/-/which-3.0.0.tgz" + integrity sha512-ASCxdbsrwNfSMXALlC3Decif9rwDMu+80KGp5zI2RLRotfMsTv7fHL8W8VDp24wymzDyIFudhUeSCugrgRFfHQ== + +adm-zip@0.5.10: + version "0.5.10" + resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz" + integrity sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ== ansi-escapes@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz" integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== dependencies: type-fest "^1.0.2" ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^6.0.0, ansi-styles@^6.1.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + 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" + braces@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" chalk@5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== cli-cursor@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz" integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== dependencies: restore-cursor "^4.0.0" cli-truncate@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz" integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== dependencies: slice-ansi "^5.0.0" @@ -58,17 +93,22 @@ cli-truncate@^3.1.0: colorette@^2.0.20: version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== commander@11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" + resolved "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz" integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -77,29 +117,29 @@ cross-spawn@^7.0.3: debug@4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== eventemitter3@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== execa@7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + resolved "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz" integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== dependencies: cross-spawn "^7.0.3" @@ -114,54 +154,59 @@ execa@7.2.0: fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" get-stream@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== human-signals@^4.3.0: version "4.3.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz" integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== husky@^8.0.3: version "8.0.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + resolved "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== is-fullwidth-code-point@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-stream@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + lilconfig@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lint-staged@^14.0.1: version "14.0.1" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-14.0.1.tgz#57dfa3013a3d60762d9af5d9c83bdb51291a6232" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz" integrity sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw== dependencies: chalk "5.3.0" @@ -177,7 +222,7 @@ lint-staged@^14.0.1: listr2@6.6.1: version "6.6.1" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-6.6.1.tgz#08b2329e7e8ba6298481464937099f4a2cd7f95d" + resolved "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz" integrity sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg== dependencies: cli-truncate "^3.1.0" @@ -189,7 +234,7 @@ listr2@6.6.1: log-update@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-5.0.1.tgz#9e928bf70cb183c1f0c9e91d9e6b7115d597ce09" + resolved "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz" integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== dependencies: ansi-escapes "^5.0.0" @@ -198,14 +243,21 @@ log-update@^5.0.1: strip-ansi "^7.0.1" wrap-ansi "^8.0.1" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== micromatch@4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -213,68 +265,75 @@ micromatch@4.0.5: mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mimic-fn@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== +minimatch@^3.0.4: + 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" + ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== npm-run-path@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz" integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== dependencies: path-key "^4.0.0" onetime@^5.1.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" onetime@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: mimic-fn "^4.0.0" path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-key@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pidtree@0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== prettier@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz" integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== restore-cursor@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz" integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== dependencies: onetime "^5.1.0" @@ -282,29 +341,36 @@ restore-cursor@^4.0.0: rfdc@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== +semver@^7.3.5: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== signal-exit@^3.0.2, signal-exit@^3.0.7: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== slice-ansi@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: ansi-styles "^6.0.0" @@ -312,12 +378,12 @@ slice-ansi@^5.0.0: string-argv@0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== string-width@^5.0.0, string-width@^5.0.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -326,50 +392,89 @@ string-width@^5.0.0, string-width@^5.0.1: strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-final-newline@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" type-fest@^1.0.2: version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== typescript@^4.4.4: - version "4.4.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz" - integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== + version "4.9.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +vscode-jsonrpc@8.0.2: + version "8.0.2" + resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz" + integrity sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ== + +vscode-languageclient@8.0.2: + version "8.0.2" + resolved "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.0.2.tgz" + integrity sha512-lHlthJtphG9gibGb/y72CKqQUxwPsMXijJVpHEC2bvbFqxmkj9LwQ3aGU9dwjBLqsX1S4KjShYppLvg1UJDF/Q== + dependencies: + minimatch "^3.0.4" + semver "^7.3.5" + vscode-languageserver-protocol "3.17.2" + +vscode-languageserver-protocol@3.17.2: + version "3.17.2" + resolved "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz" + integrity sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg== + dependencies: + vscode-jsonrpc "8.0.2" + vscode-languageserver-types "3.17.2" + +vscode-languageserver-types@3.17.2: + version "3.17.2" + resolved "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz" + integrity sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA== which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" +which@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/which/-/which-4.0.0.tgz" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" string-width "^5.0.1" strip-ansi "^7.0.1" +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz" integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==