From 4ef46a9f97a57aa1c18ee10ab8ea0d8a26bbd380 Mon Sep 17 00:00:00 2001 From: Princesseuh <3019731+Princesseuh@users.noreply.github.com> Date: Sun, 15 Dec 2024 03:35:13 +0100 Subject: [PATCH] feat(benchmark): Add benchmark for full language server --- .github/workflows/benchmark.yaml | 5 +- justfile | 2 + .../fixture/colors_benchmark.css | 17 ++ .../fixture/folding_benchmark.css | 74 ++++++ .../fixture/hover_benchmark.css | 3 + .../package.json | 8 +- .../src/benchmarks/css/colors.bench.ts | 54 +++++ .../src/benchmarks/css/folding.bench.ts | 32 +++ .../src/benchmarks/css/hover.bench.ts | 38 ++++ .../src}/server.ts | 69 ++++-- .../src}/tests/css/colors.test.ts | 0 .../src}/tests/css/folding.test.ts | 0 .../src}/tests/css/hover.test.ts | 0 .../src}/tests/init.test.ts | 0 .../src/tests/setup.ts | 9 + .../src}/tests/shutdown.test.ts | 1 - .../tsconfig.json | 0 .../vitest.config.bench.ts | 14 ++ .../vitest.config.ts | 4 +- .../language-server-tests/fixture/.gitkeep | 0 packages/language-server-tests/tests/setup.ts | 9 - pnpm-lock.yaml | 214 +++++++++++++++++- 22 files changed, 520 insertions(+), 33 deletions(-) create mode 100644 packages/language-server-tests-benchmarks/fixture/colors_benchmark.css create mode 100644 packages/language-server-tests-benchmarks/fixture/folding_benchmark.css create mode 100644 packages/language-server-tests-benchmarks/fixture/hover_benchmark.css rename packages/{language-server-tests => language-server-tests-benchmarks}/package.json (52%) create mode 100644 packages/language-server-tests-benchmarks/src/benchmarks/css/colors.bench.ts create mode 100644 packages/language-server-tests-benchmarks/src/benchmarks/css/folding.bench.ts create mode 100644 packages/language-server-tests-benchmarks/src/benchmarks/css/hover.bench.ts rename packages/{language-server-tests/tests => language-server-tests-benchmarks/src}/server.ts (90%) rename packages/{language-server-tests => language-server-tests-benchmarks/src}/tests/css/colors.test.ts (100%) rename packages/{language-server-tests => language-server-tests-benchmarks/src}/tests/css/folding.test.ts (100%) rename packages/{language-server-tests => language-server-tests-benchmarks/src}/tests/css/hover.test.ts (100%) rename packages/{language-server-tests => language-server-tests-benchmarks/src}/tests/init.test.ts (100%) create mode 100644 packages/language-server-tests-benchmarks/src/tests/setup.ts rename packages/{language-server-tests => language-server-tests-benchmarks/src}/tests/shutdown.test.ts (82%) rename packages/{language-server-tests => language-server-tests-benchmarks}/tsconfig.json (100%) create mode 100644 packages/language-server-tests-benchmarks/vitest.config.bench.ts rename packages/{language-server-tests => language-server-tests-benchmarks}/vitest.config.ts (92%) delete mode 100644 packages/language-server-tests/fixture/.gitkeep delete mode 100644 packages/language-server-tests/tests/setup.ts diff --git a/.github/workflows/benchmark.yaml b/.github/workflows/benchmark.yaml index b31c7a0..9e18824 100644 --- a/.github/workflows/benchmark.yaml +++ b/.github/workflows/benchmark.yaml @@ -37,6 +37,9 @@ jobs: - name: Install dependencies run: just install + - name: Build (native) + run: just build release + - name: Build (WASM) run: just build-wasm benchmark @@ -46,5 +49,5 @@ jobs: - name: Run the benchmarks uses: CodSpeedHQ/action@v3 with: - run: cargo codspeed run && pnpm -C ./packages/benchmark-wasm run benchmark-codspeed + run: cargo codspeed run && pnpm -C ./packages/benchmark-wasm run benchmark-codspeed && pnpm -C ./packages/language-server-tests-benchmarks run benchmark-codspeed token: ${{ secrets.CODSPEED_TOKEN }} diff --git a/justfile b/justfile index fdd8958..0615d2d 100644 --- a/justfile +++ b/justfile @@ -33,3 +33,5 @@ benchmark: cargo bench echo "Running WASM benchmarks..." pnpm -C ./packages/benchmark-wasm run benchmark --run + echo "Running Language Server benchmarks..." + pnpm -C ./packages/language-server-tests-benchmarks run benchmark --run diff --git a/packages/language-server-tests-benchmarks/fixture/colors_benchmark.css b/packages/language-server-tests-benchmarks/fixture/colors_benchmark.css new file mode 100644 index 0000000..4cbcf04 --- /dev/null +++ b/packages/language-server-tests-benchmarks/fixture/colors_benchmark.css @@ -0,0 +1,17 @@ +.header { + background-color: #333; + color: white; + padding: 15px 20px; + text-align: center; +} + +h1 { + color: red; + background-color: lab(50% 50% 50%); +} + +.header .logo { + font-size: 2rem; + font-weight: bold; + color: lch(50% 50% 50%); +} diff --git a/packages/language-server-tests-benchmarks/fixture/folding_benchmark.css b/packages/language-server-tests-benchmarks/fixture/folding_benchmark.css new file mode 100644 index 0000000..6255c22 --- /dev/null +++ b/packages/language-server-tests-benchmarks/fixture/folding_benchmark.css @@ -0,0 +1,74 @@ +/* General Layout */ +.container { + width: 100%; + padding: 20px; + margin: 0 auto; + max-width: 1200px; +} + +.header { + background-color: #333; + color: white; + padding: 15px 20px; + text-align: center; +} + +.header .logo { + font-size: 2rem; + font-weight: bold; +} + +.sidebar { + flex: 1; + padding: 20px; + background-color: #fff; + border-radius: 8px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +.footer { + margin-top: 40px; + padding: 20px; + background-color: #222; + color: white; + text-align: center; + font-size: 0.9rem; +} + +/* Media Queries */ +@media (max-width: 1024px) { + .content { + flex-direction: column; + align-items: center; + } + .main, + .sidebar { + width: 80%; + margin-bottom: 20px; + } +} + +@media (max-width: 768px) { + .header .logo { + font-size: 1.5rem; + } + .footer { + font-size: 0.8rem; + } +} + +@media (max-width: 480px) { + .container { + padding: 10px; + } + .header { + padding: 10px; + } + .content { + flex-direction: column; + } + .main, + .sidebar { + padding: 10px; + } +} diff --git a/packages/language-server-tests-benchmarks/fixture/hover_benchmark.css b/packages/language-server-tests-benchmarks/fixture/hover_benchmark.css new file mode 100644 index 0000000..d224431 --- /dev/null +++ b/packages/language-server-tests-benchmarks/fixture/hover_benchmark.css @@ -0,0 +1,3 @@ +h1 { + color: red; +} diff --git a/packages/language-server-tests/package.json b/packages/language-server-tests-benchmarks/package.json similarity index 52% rename from packages/language-server-tests/package.json rename to packages/language-server-tests-benchmarks/package.json index a1a3bfb..f359356 100644 --- a/packages/language-server-tests/package.json +++ b/packages/language-server-tests-benchmarks/package.json @@ -1,13 +1,17 @@ { - "name": "language-server-tests", + "name": "language-server-tests-benchmarks", "type": "module", "private": true, "scripts": { - "test": "vitest" + "test": "vitest", + "benchmark": "vitest bench -c vitest.config.bench.ts", + "benchmark-codspeed": "CODSPEED=true pnpm run benchmark" }, "dependencies": { + "@codspeed/vitest-plugin": "^3.1.1", "@types/node": "^22.10.1", "vitest": "^2.1.8", + "vscode-langservers-extracted": "^4.10.0", "vscode-languageclient": "^9.0.1", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.12", diff --git a/packages/language-server-tests-benchmarks/src/benchmarks/css/colors.bench.ts b/packages/language-server-tests-benchmarks/src/benchmarks/css/colors.bench.ts new file mode 100644 index 0000000..1145676 --- /dev/null +++ b/packages/language-server-tests-benchmarks/src/benchmarks/css/colors.bench.ts @@ -0,0 +1,54 @@ +import { afterAll, bench, describe } from "vitest"; +import { startLanguageServer } from "../../server"; +import { fileURLToPath } from "url"; + +const filePath = fileURLToPath( + new URL("../../../fixture/colors_benchmark.css", import.meta.url) +); + +const weblsp = await startLanguageServer(undefined, "weblsp"); +const weblspUri = (await weblsp.openTextDocument(filePath, "css")).uri; +const weblspColors = await weblsp.sendDocumentColorRequest(weblspUri); + +const vscodeLsp = await startLanguageServer(undefined, "vscode-css"); +const vscodeLspUri = (await vscodeLsp.openTextDocument(filePath, "css")).uri; +const vscodeColors = await vscodeLsp.sendDocumentColorRequest(vscodeLspUri); + +describe("Document Colors", async () => { + bench("weblsp - Document Colors", async () => { + await weblsp.sendDocumentColorRequest(weblspUri); + }); + + if (!process.env.CODSPEED) { + bench("vscode-css-languageserver - Document Colors", async () => { + await vscodeLsp.sendDocumentColorRequest(vscodeLspUri); + }); + } +}); + +describe("Color Presentations", async () => { + bench("weblsp - Color Presentation", async () => { + await weblsp.sendColorPresentationRequest( + weblspUri, + weblspColors[0].color, + weblspColors[0].range + ); + }); + + if (!process.env.CODSPEED) { + bench("vscode-css-languageserver - Color Presentation", async () => { + await vscodeLsp.sendColorPresentationRequest( + vscodeLspUri, + vscodeColors[0].color, + vscodeColors[0].range + ); + }); + } + + afterAll(async () => { + await weblsp.shutdown(); + await vscodeLsp.shutdown(); + await weblsp.exit(); + await vscodeLsp.exit(); + }); +}); diff --git a/packages/language-server-tests-benchmarks/src/benchmarks/css/folding.bench.ts b/packages/language-server-tests-benchmarks/src/benchmarks/css/folding.bench.ts new file mode 100644 index 0000000..645e9da --- /dev/null +++ b/packages/language-server-tests-benchmarks/src/benchmarks/css/folding.bench.ts @@ -0,0 +1,32 @@ +import { afterAll, bench, describe } from "vitest"; +import { startLanguageServer } from "../../server"; +import { fileURLToPath } from "url"; + +const filePath = fileURLToPath( + new URL("../../../fixture/folding_benchmark.css", import.meta.url) +); + +const weblsp = await startLanguageServer(undefined, "weblsp"); +const weblspUri = (await weblsp.openTextDocument(filePath, "css")).uri; + +const vscodeLsp = await startLanguageServer(undefined, "vscode-css"); +const vscodeLspUri = (await vscodeLsp.openTextDocument(filePath, "css")).uri; + +describe("Folding Ranges", async () => { + bench("weblsp - Folding Ranges", async () => { + await weblsp.sendFoldingRangesRequest(weblspUri); + }); + + if (!process.env.CODSPEED) { + bench("vscode-css-languageserver - Folding Ranges", async () => { + await vscodeLsp.sendFoldingRangesRequest(vscodeLspUri); + }); + } + + afterAll(async () => { + await weblsp.shutdown(); + await vscodeLsp.shutdown(); + await weblsp.exit(); + await vscodeLsp.exit(); + }); +}); diff --git a/packages/language-server-tests-benchmarks/src/benchmarks/css/hover.bench.ts b/packages/language-server-tests-benchmarks/src/benchmarks/css/hover.bench.ts new file mode 100644 index 0000000..85ccfc7 --- /dev/null +++ b/packages/language-server-tests-benchmarks/src/benchmarks/css/hover.bench.ts @@ -0,0 +1,38 @@ +import { afterAll, bench, describe } from "vitest"; +import { startLanguageServer } from "../../server"; +import { fileURLToPath } from "url"; + +const filePath = fileURLToPath( + new URL("../../../fixture/hover_benchmark.css", import.meta.url) +); + +const weblsp = await startLanguageServer(undefined, "weblsp"); +const weblspUri = (await weblsp.openTextDocument(filePath, "css")).uri; + +const vscodeLsp = await startLanguageServer(undefined, "vscode-css"); +const vscodeLspUri = (await vscodeLsp.openTextDocument(filePath, "css")).uri; + +describe("Hover", async () => { + bench("weblsp - Hover", async () => { + await weblsp.sendHoverRequest(weblspUri, { + line: 1, + character: 6, + }); + }); + + if (!process.env.CODSPEED) { + bench("vscode-css-languageserver - Hover", async () => { + await vscodeLsp.sendHoverRequest(vscodeLspUri, { + line: 1, + character: 6, + }); + }); + } + + afterAll(async () => { + await weblsp.shutdown(); + await vscodeLsp.shutdown(); + await weblsp.exit(); + await vscodeLsp.exit(); + }); +}); diff --git a/packages/language-server-tests/tests/server.ts b/packages/language-server-tests-benchmarks/src/server.ts similarity index 90% rename from packages/language-server-tests/tests/server.ts rename to packages/language-server-tests-benchmarks/src/server.ts index c9a5db8..1fe2732 100644 --- a/packages/language-server-tests/tests/server.ts +++ b/packages/language-server-tests-benchmarks/src/server.ts @@ -8,35 +8,61 @@ import { TextDocument } from "vscode-languageserver-textdocument"; import { URI } from "vscode-uri"; import * as assert from "node:assert/strict"; import { fileURLToPath } from "node:url"; -import { createHash, randomBytes } from "node:crypto"; +import { randomBytes } from "node:crypto"; -const pathToBinary = fileURLToPath( - new URL("../../../target/debug/weblsp", import.meta.url) -); +let pathToBinary: string; +if (process.env.BENCHMARK === "true" || process.env.RELEASE === "true") { + pathToBinary = fileURLToPath( + new URL("../../../target/release/weblsp", import.meta.url) + ); +} else { + pathToBinary = fileURLToPath( + new URL("../../../target/debug/weblsp", import.meta.url) + ); +} export const fixtureDir = URI.file( fileURLToPath(new URL("./fixture", import.meta.url)) ).toString(); -export type LanguageServerHandle = ReturnType; +export type LanguageServerHandle = Awaited< + ReturnType +>; -export async function startLanguageServer(cwd?: string | undefined) { - console.info(`Starting language server at ${pathToBinary}`); - const childProcess = cp.spawn(pathToBinary, [], { - env: process.env, - cwd, - stdio: "pipe", - }); +export async function startLanguageServer( + cwd?: string | undefined, + which: "weblsp" | "vscode-css" = "weblsp" +) { + if (which === "weblsp") + console.info(`Starting language server at ${pathToBinary}`); + + const childProcess = + which === "weblsp" + ? cp.spawn(pathToBinary, [], { + env: process.env, + cwd, + stdio: "pipe", + }) + : cp.fork( + "node_modules/vscode-langservers-extracted/bin/vscode-css-language-server", + ["--stdio", `--clientProcessId=${process.pid.toString()}`], + { + execArgv: ["--nolazy"], + env: process.env, + cwd, + stdio: "pipe", + } + ); if (!childProcess.stdout || !childProcess.stdin) { throw new Error("Bad stdio configuration, should be pipe"); } - if (process.env.DEBUG) { - childProcess.stderr?.on("data", (data) => { + childProcess.stderr?.on("data", (data) => { + if (process.env.DEBUG) { console.error(data.toString()); - }); - } + } + }); const connection = _.createProtocolConnection( childProcess.stdout, @@ -48,7 +74,7 @@ export async function startLanguageServer(cwd?: string | undefined) { connection.onClose((e) => console.log("Closed", e)); connection.onUnhandledNotification((e) => - console.log("Unhandled notificaiton", e) + console.log("Unhandled notification", e) ); connection.onError((e) => console.log("Error:", e)); @@ -149,6 +175,15 @@ export async function startLanguageServer(cwd?: string | undefined) { } ); + // VS Code's CSS language server crashes if this is not set + if (which === "vscode-css") { + Object.assign(settings, { "css.lint.validProperties": [] }); + await connection.sendNotification( + _.DidChangeConfigurationNotification.type, + { settings } satisfies _.DidChangeConfigurationParams + ); + } + return { process: childProcess, connection, diff --git a/packages/language-server-tests/tests/css/colors.test.ts b/packages/language-server-tests-benchmarks/src/tests/css/colors.test.ts similarity index 100% rename from packages/language-server-tests/tests/css/colors.test.ts rename to packages/language-server-tests-benchmarks/src/tests/css/colors.test.ts diff --git a/packages/language-server-tests/tests/css/folding.test.ts b/packages/language-server-tests-benchmarks/src/tests/css/folding.test.ts similarity index 100% rename from packages/language-server-tests/tests/css/folding.test.ts rename to packages/language-server-tests-benchmarks/src/tests/css/folding.test.ts diff --git a/packages/language-server-tests/tests/css/hover.test.ts b/packages/language-server-tests-benchmarks/src/tests/css/hover.test.ts similarity index 100% rename from packages/language-server-tests/tests/css/hover.test.ts rename to packages/language-server-tests-benchmarks/src/tests/css/hover.test.ts diff --git a/packages/language-server-tests/tests/init.test.ts b/packages/language-server-tests-benchmarks/src/tests/init.test.ts similarity index 100% rename from packages/language-server-tests/tests/init.test.ts rename to packages/language-server-tests-benchmarks/src/tests/init.test.ts diff --git a/packages/language-server-tests-benchmarks/src/tests/setup.ts b/packages/language-server-tests-benchmarks/src/tests/setup.ts new file mode 100644 index 0000000..144be3e --- /dev/null +++ b/packages/language-server-tests-benchmarks/src/tests/setup.ts @@ -0,0 +1,9 @@ +import { startLanguageServer } from "../server"; + +declare global { + var languageServer: import("../server").LanguageServerHandle; +} + +if (!globalThis.languageServer) { + globalThis.languageServer = await startLanguageServer(); +} diff --git a/packages/language-server-tests/tests/shutdown.test.ts b/packages/language-server-tests-benchmarks/src/tests/shutdown.test.ts similarity index 82% rename from packages/language-server-tests/tests/shutdown.test.ts rename to packages/language-server-tests-benchmarks/src/tests/shutdown.test.ts index 3790c9d..0c5dabb 100644 --- a/packages/language-server-tests/tests/shutdown.test.ts +++ b/packages/language-server-tests-benchmarks/src/tests/shutdown.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it } from "vitest"; -import { ServerCapabilities } from "vscode-languageserver-protocol/node"; describe("Language server initilization", () => { it("Can shutdown server", async () => { diff --git a/packages/language-server-tests/tsconfig.json b/packages/language-server-tests-benchmarks/tsconfig.json similarity index 100% rename from packages/language-server-tests/tsconfig.json rename to packages/language-server-tests-benchmarks/tsconfig.json diff --git a/packages/language-server-tests-benchmarks/vitest.config.bench.ts b/packages/language-server-tests-benchmarks/vitest.config.bench.ts new file mode 100644 index 0000000..b317fa9 --- /dev/null +++ b/packages/language-server-tests-benchmarks/vitest.config.bench.ts @@ -0,0 +1,14 @@ +import codspeedPlugin from "@codspeed/vitest-plugin"; +import { defineConfig } from "vitest/config"; + +const plugins = process.env.CODSPEED ? [codspeedPlugin()] : []; + +export default defineConfig({ + plugins, + test: { + dir: "src/benchmarks", + env: { + BENCHMARK: "true", + }, + }, +}); diff --git a/packages/language-server-tests/vitest.config.ts b/packages/language-server-tests-benchmarks/vitest.config.ts similarity index 92% rename from packages/language-server-tests/vitest.config.ts rename to packages/language-server-tests-benchmarks/vitest.config.ts index cd3d53b..a776ddf 100644 --- a/packages/language-server-tests/vitest.config.ts +++ b/packages/language-server-tests-benchmarks/vitest.config.ts @@ -18,11 +18,11 @@ class Sequencer extends BaseSequencer { export default defineConfig({ test: { - dir: "tests", + dir: "src/tests", watch: false, isolate: false, fileParallelism: false, - setupFiles: ["./tests/setup.ts"], + setupFiles: ["./src/tests/setup.ts"], sequence: { sequencer: Sequencer, }, diff --git a/packages/language-server-tests/fixture/.gitkeep b/packages/language-server-tests/fixture/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/packages/language-server-tests/tests/setup.ts b/packages/language-server-tests/tests/setup.ts deleted file mode 100644 index 41e934e..0000000 --- a/packages/language-server-tests/tests/setup.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { startLanguageServer } from "./server"; - -declare global { - var languageServer: Awaited; -} - -if (!globalThis.languageServer) { - globalThis.languageServer = await startLanguageServer(); -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8a4a229..b9f6bbb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,14 +50,20 @@ importers: specifier: ^2.1.8 version: 2.1.8(@types/node@22.9.3) - packages/language-server-tests: + packages/language-server-tests-benchmarks: dependencies: + '@codspeed/vitest-plugin': + specifier: ^3.1.1 + version: 3.1.1(vite@5.4.11(@types/node@22.10.1))(vitest@2.1.8(@types/node@22.10.1)) '@types/node': specifier: ^22.10.1 version: 22.10.1 vitest: specifier: ^2.1.8 version: 2.1.8(@types/node@22.10.1) + vscode-langservers-extracted: + specifier: ^4.10.0 + version: 4.10.0 vscode-languageclient: specifier: ^9.0.1 version: 9.0.1 @@ -370,6 +376,9 @@ packages: '@vitest/utils@2.1.8': resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} + '@vscode/l10n@0.0.10': + resolution: {integrity: sha512-E1OCmDcDWa0Ya7vtSjp/XfHFGqYJfh+YPC1RkATU71fTac+j1JjCcB3qwSzmlKAighx2WxhLlfhS0RwAN++PFQ==} + '@vscode/l10n@0.0.18': resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} @@ -389,6 +398,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -408,6 +420,16 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + core-js@3.39.0: + resolution: {integrity: sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -425,6 +447,23 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + es-module-lexer@1.5.4: resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} @@ -462,6 +501,13 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + locate-path@7.2.0: resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -496,6 +542,12 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true + node-html-parser@6.1.13: + resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + p-limit@4.0.0: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -518,6 +570,10 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + postcss@8.4.49: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} @@ -525,6 +581,12 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + rollup@4.28.0: resolution: {integrity: sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -566,6 +628,11 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + typescript@5.7.2: resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} @@ -641,10 +708,24 @@ packages: vscode-css-languageservice@6.3.1: resolution: {integrity: sha512-1BzTBuJfwMc3A0uX4JBdJgoxp74cjj4q2mDJdp49yD/GuAq4X0k5WtK6fNcMYr+FfJ9nqgR6lpfCSZDkARJ5qQ==} + vscode-html-languageservice@5.3.1: + resolution: {integrity: sha512-ysUh4hFeW/WOWz/TO9gm08xigiSsV/FOAZ+DolgJfeLftna54YdmZ4A+lIn46RbdO3/Qv5QHTn1ZGqmrXQhZyA==} + + vscode-json-languageservice@5.4.2: + resolution: {integrity: sha512-2qujUseKRbLEwLXvEOFAxaz3y1ssdNCXXi95LRdG8AFchJHSnmI2qCg9ixoYxbJtSehIrXOmkhV87Y9lIivOgQ==} + vscode-jsonrpc@8.2.0: resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} engines: {node: '>=14.0.0'} + vscode-jsonrpc@9.0.0-next.6: + resolution: {integrity: sha512-KCSvUNsFiVciG9iqjJKBZOd66CN3ZKohDlYRmoOi+pd8l15MFLZ8wRG4c+wuzePGba/8WcCG2TM+C/GVlvuaeA==} + engines: {node: '>=14.0.0'} + + vscode-langservers-extracted@4.10.0: + resolution: {integrity: sha512-EFf9uQI4dAKbzMQFjDvVm1xJq1DXAQvBEuEfPGrK/xzfsL5xWTfIuRr90NgfmqwO+IEt6vLZm9EOj6R66xIifg==} + hasBin: true + vscode-languageclient@9.0.1: resolution: {integrity: sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==} engines: {vscode: ^1.82.0} @@ -652,12 +733,28 @@ packages: vscode-languageserver-protocol@3.17.5: resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + vscode-languageserver-protocol@3.17.6-next.11: + resolution: {integrity: sha512-GeJxEp1TiLsp79f8WG5n10wLViXfgFKb99hU9K8m7KDWM95/QFEqWkm79f9LVm54tUK74I91a9EeiQLCS/FABQ==} + vscode-languageserver-textdocument@1.0.12: resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} vscode-languageserver-types@3.17.5: resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + vscode-languageserver-types@3.17.6-next.5: + resolution: {integrity: sha512-QFmf3Yl1tCgUQfA77N9Me/LXldJXkIVypQbty2rJ1DNHQkC+iwvm4Z2tXg9czSwlhvv0pD4pbF5mT7WhAglolw==} + + vscode-languageserver@10.0.0-next.11: + resolution: {integrity: sha512-cmobSrVDYhlh/t02vz/bV8nNpds8mus5HnILULae2iAvOjoaJPnTAp0jJWoYdUqTpIVzT9JV6JMKqLEvdqpeqg==} + hasBin: true + + vscode-markdown-languageservice@0.5.0-alpha.8: + resolution: {integrity: sha512-b2NgVMZvzI/7hRL32Kcu9neAAPFQzkcf/Fqwlxbz9p1/Q7aIorGACOGGo00s72AJtwjkCJ29eVJwUlFMFbPKqA==} + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} @@ -874,6 +971,8 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 + '@vscode/l10n@0.0.10': {} + '@vscode/l10n@0.0.18': {} '@vscode/web-custom-data@0.4.13': {} @@ -892,6 +991,8 @@ snapshots: balanced-match@1.0.2: {} + boolbase@1.0.0: {} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -912,6 +1013,18 @@ snapshots: dependencies: delayed-stream: 1.0.0 + core-js@3.39.0: {} + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-what@6.1.0: {} + debug@4.3.7: dependencies: ms: 2.1.3 @@ -920,6 +1033,26 @@ snapshots: delayed-stream@1.0.0: {} + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + entities@4.5.0: {} + es-module-lexer@1.5.4: {} esbuild@0.21.5: @@ -970,6 +1103,10 @@ snapshots: fsevents@2.3.3: optional: true + he@1.2.0: {} + + jsonc-parser@3.3.1: {} + locate-path@7.2.0: dependencies: p-locate: 6.0.0 @@ -996,6 +1133,15 @@ snapshots: node-gyp-build@4.8.4: {} + node-html-parser@6.1.13: + dependencies: + css-select: 5.1.0 + he: 1.2.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + p-limit@4.0.0: dependencies: yocto-queue: 1.1.1 @@ -1012,6 +1158,8 @@ snapshots: picocolors@1.1.1: {} + picomatch@2.3.1: {} + postcss@8.4.49: dependencies: nanoid: 3.3.8 @@ -1020,6 +1168,10 @@ snapshots: proxy-from-env@1.1.0: {} + regenerator-runtime@0.13.11: {} + + request-light@0.7.0: {} + rollup@4.28.0: dependencies: '@types/estree': 1.0.6 @@ -1064,6 +1216,8 @@ snapshots: tinyspy@3.0.2: {} + typescript@4.9.5: {} + typescript@5.7.2: {} undici-types@6.19.8: {} @@ -1201,8 +1355,44 @@ snapshots: vscode-languageserver-types: 3.17.5 vscode-uri: 3.0.8 + vscode-html-languageservice@5.3.1: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + vscode-json-languageservice@5.4.2: + dependencies: + '@vscode/l10n': 0.0.18 + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + vscode-jsonrpc@8.2.0: {} + vscode-jsonrpc@9.0.0-next.6: {} + + vscode-langservers-extracted@4.10.0: + dependencies: + '@vscode/l10n': 0.0.18 + core-js: 3.39.0 + jsonc-parser: 3.3.1 + regenerator-runtime: 0.13.11 + request-light: 0.7.0 + semver: 7.6.3 + typescript: 4.9.5 + vscode-css-languageservice: 6.3.1 + vscode-html-languageservice: 5.3.1 + vscode-json-languageservice: 5.4.2 + vscode-languageserver: 10.0.0-next.11 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-markdown-languageservice: 0.5.0-alpha.8 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + vscode-languageclient@9.0.1: dependencies: minimatch: 5.1.6 @@ -1214,10 +1404,32 @@ snapshots: vscode-jsonrpc: 8.2.0 vscode-languageserver-types: 3.17.5 + vscode-languageserver-protocol@3.17.6-next.11: + dependencies: + vscode-jsonrpc: 9.0.0-next.6 + vscode-languageserver-types: 3.17.6-next.5 + vscode-languageserver-textdocument@1.0.12: {} vscode-languageserver-types@3.17.5: {} + vscode-languageserver-types@3.17.6-next.5: {} + + vscode-languageserver@10.0.0-next.11: + dependencies: + vscode-languageserver-protocol: 3.17.6-next.11 + + vscode-markdown-languageservice@0.5.0-alpha.8: + dependencies: + '@vscode/l10n': 0.0.10 + node-html-parser: 6.1.13 + picomatch: 2.3.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + vscode-nls@5.2.0: {} + vscode-uri@3.0.8: {} why-is-node-running@2.3.0: