diff --git a/package-lock.json b/package-lock.json
index aa46c016..e0a9c19d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -31,8 +31,6 @@
     },
     "node_modules/@ampproject/remapping": {
       "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
-      "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
       "license": "Apache-2.0",
       "dependencies": {
         "@jridgewell/gen-mapping": "^0.3.5",
@@ -57,8 +55,6 @@
     },
     "node_modules/@azure/abort-controller": {
       "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz",
-      "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -70,8 +66,6 @@
     },
     "node_modules/@azure/core-auth": {
       "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz",
-      "integrity": "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -85,8 +79,6 @@
     },
     "node_modules/@azure/core-client": {
       "version": "1.9.2",
-      "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz",
-      "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -103,16 +95,14 @@
       }
     },
     "node_modules/@azure/core-rest-pipeline": {
-      "version": "1.18.2",
-      "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.18.2.tgz",
-      "integrity": "sha512-IkTf/DWKyCklEtN/WYW3lqEsIaUDshlzWRlZNNwSYtFcCBQz++OtOjxNpm8rr1VcbMS6RpjybQa3u6B6nG0zNw==",
+      "version": "1.17.0",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@azure/abort-controller": "^2.0.0",
         "@azure/core-auth": "^1.8.0",
         "@azure/core-tracing": "^1.0.1",
-        "@azure/core-util": "^1.11.0",
+        "@azure/core-util": "^1.9.0",
         "@azure/logger": "^1.0.0",
         "http-proxy-agent": "^7.0.0",
         "https-proxy-agent": "^7.0.0",
@@ -124,8 +114,6 @@
     },
     "node_modules/@azure/core-tracing": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz",
-      "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -137,8 +125,6 @@
     },
     "node_modules/@azure/core-util": {
       "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.11.0.tgz",
-      "integrity": "sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -150,9 +136,7 @@
       }
     },
     "node_modules/@azure/identity": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.6.0.tgz",
-      "integrity": "sha512-ANpO1iAvcZmpD4QY7/kaE/P2n66pRXsDp3nMUC6Ow3c9KfXOZF7qMU9VgqPw8m7adP7TVIbVyrCEmD9cth3KQQ==",
+      "version": "4.5.0",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -163,7 +147,7 @@
         "@azure/core-tracing": "^1.0.0",
         "@azure/core-util": "^1.11.0",
         "@azure/logger": "^1.0.0",
-        "@azure/msal-browser": "^4.0.1",
+        "@azure/msal-browser": "^3.26.1",
         "@azure/msal-node": "^2.15.0",
         "events": "^3.0.0",
         "jws": "^4.0.0",
@@ -177,8 +161,6 @@
     },
     "node_modules/@azure/logger": {
       "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz",
-      "integrity": "sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -189,22 +171,18 @@
       }
     },
     "node_modules/@azure/msal-browser": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.0.2.tgz",
-      "integrity": "sha512-bq6PasUpJgBSOSMeSlh8gXh4LZGgAaPoJFNcu5u0zxwueh+I8NpMb9oxlCfS/8CJHyXUhTUAMLSnvThemNdyQw==",
+      "version": "3.26.1",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@azure/msal-common": "15.0.2"
+        "@azure/msal-common": "14.15.0"
       },
       "engines": {
         "node": ">=0.8.0"
       }
     },
     "node_modules/@azure/msal-common": {
-      "version": "15.0.2",
-      "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.0.2.tgz",
-      "integrity": "sha512-RQHmI5vOMYLNSO0ER7d/O9TojWWEn4m0YtWbL8mZthkKGQI7ALn5ONHUVTUSxSVYwGYdHGNrwiHAzQhboqwZzQ==",
+      "version": "14.15.0",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -212,13 +190,11 @@
       }
     },
     "node_modules/@azure/msal-node": {
-      "version": "2.16.2",
-      "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.16.2.tgz",
-      "integrity": "sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==",
+      "version": "2.15.0",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@azure/msal-common": "14.16.0",
+        "@azure/msal-common": "14.15.0",
         "jsonwebtoken": "^9.0.0",
         "uuid": "^8.3.0"
       },
@@ -226,20 +202,8 @@
         "node": ">=16"
       }
     },
-    "node_modules/@azure/msal-node/node_modules/@azure/msal-common": {
-      "version": "14.16.0",
-      "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.0.tgz",
-      "integrity": "sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
     "node_modules/@babel/code-frame": {
       "version": "7.26.2",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
-      "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-validator-identifier": "^7.25.9",
@@ -251,30 +215,26 @@
       }
     },
     "node_modules/@babel/compat-data": {
-      "version": "7.26.5",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz",
-      "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==",
+      "version": "7.26.3",
       "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.26.7",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz",
-      "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==",
+      "version": "7.26.0",
       "license": "MIT",
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.5",
-        "@babel/helper-compilation-targets": "^7.26.5",
+        "@babel/code-frame": "^7.26.0",
+        "@babel/generator": "^7.26.0",
+        "@babel/helper-compilation-targets": "^7.25.9",
         "@babel/helper-module-transforms": "^7.26.0",
-        "@babel/helpers": "^7.26.7",
-        "@babel/parser": "^7.26.7",
+        "@babel/helpers": "^7.26.0",
+        "@babel/parser": "^7.26.0",
         "@babel/template": "^7.25.9",
-        "@babel/traverse": "^7.26.7",
-        "@babel/types": "^7.26.7",
+        "@babel/traverse": "^7.25.9",
+        "@babel/types": "^7.26.0",
         "convert-source-map": "^2.0.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
@@ -291,21 +251,17 @@
     },
     "node_modules/@babel/core/node_modules/semver": {
       "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.26.5",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz",
-      "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==",
+      "version": "7.26.3",
       "license": "MIT",
       "dependencies": {
-        "@babel/parser": "^7.26.5",
-        "@babel/types": "^7.26.5",
+        "@babel/parser": "^7.26.3",
+        "@babel/types": "^7.26.3",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^3.0.2"
@@ -316,8 +272,6 @@
     },
     "node_modules/@babel/helper-annotate-as-pure": {
       "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
-      "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
       "license": "MIT",
       "dependencies": {
         "@babel/types": "^7.25.9"
@@ -327,12 +281,10 @@
       }
     },
     "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.26.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
-      "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
+      "version": "7.25.9",
       "license": "MIT",
       "dependencies": {
-        "@babel/compat-data": "^7.26.5",
+        "@babel/compat-data": "^7.25.9",
         "@babel/helper-validator-option": "^7.25.9",
         "browserslist": "^4.24.0",
         "lru-cache": "^5.1.1",
@@ -344,8 +296,6 @@
     },
     "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
       "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
       "license": "ISC",
       "dependencies": {
         "yallist": "^3.0.2"
@@ -353,8 +303,6 @@
     },
     "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
       "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
@@ -362,8 +310,6 @@
     },
     "node_modules/@babel/helper-create-class-features-plugin": {
       "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
-      "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-annotate-as-pure": "^7.25.9",
@@ -383,8 +329,6 @@
     },
     "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
       "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
@@ -392,8 +336,6 @@
     },
     "node_modules/@babel/helper-member-expression-to-functions": {
       "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
-      "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
       "license": "MIT",
       "dependencies": {
         "@babel/traverse": "^7.25.9",
@@ -405,8 +347,6 @@
     },
     "node_modules/@babel/helper-module-imports": {
       "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
-      "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
       "license": "MIT",
       "dependencies": {
         "@babel/traverse": "^7.25.9",
@@ -418,8 +358,6 @@
     },
     "node_modules/@babel/helper-module-transforms": {
       "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
-      "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-module-imports": "^7.25.9",
@@ -435,8 +373,6 @@
     },
     "node_modules/@babel/helper-optimise-call-expression": {
       "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
-      "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
       "license": "MIT",
       "dependencies": {
         "@babel/types": "^7.25.9"
@@ -446,23 +382,19 @@
       }
     },
     "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.26.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
-      "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
+      "version": "7.25.9",
       "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-replace-supers": {
-      "version": "7.26.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz",
-      "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
+      "version": "7.25.9",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-member-expression-to-functions": "^7.25.9",
         "@babel/helper-optimise-call-expression": "^7.25.9",
-        "@babel/traverse": "^7.26.5"
+        "@babel/traverse": "^7.25.9"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -473,8 +405,6 @@
     },
     "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
       "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
-      "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
       "license": "MIT",
       "dependencies": {
         "@babel/traverse": "^7.25.9",
@@ -486,8 +416,6 @@
     },
     "node_modules/@babel/helper-string-parser": {
       "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
-      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
       "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
@@ -495,8 +423,6 @@
     },
     "node_modules/@babel/helper-validator-identifier": {
       "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
-      "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
       "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
@@ -504,21 +430,17 @@
     },
     "node_modules/@babel/helper-validator-option": {
       "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
-      "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
       "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.26.7",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz",
-      "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==",
+      "version": "7.26.0",
       "license": "MIT",
       "dependencies": {
         "@babel/template": "^7.25.9",
-        "@babel/types": "^7.26.7"
+        "@babel/types": "^7.26.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -541,8 +463,6 @@
     },
     "node_modules/@babel/plugin-syntax-typescript": {
       "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
-      "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.25.9"
@@ -556,8 +476,6 @@
     },
     "node_modules/@babel/plugin-transform-modules-commonjs": {
       "version": "7.26.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz",
-      "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-module-transforms": "^7.26.0",
@@ -571,14 +489,12 @@
       }
     },
     "node_modules/@babel/plugin-transform-typescript": {
-      "version": "7.26.7",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.7.tgz",
-      "integrity": "sha512-5cJurntg+AT+cgelGP9Bt788DKiAw9gIMSMU2NJrLAilnj0m8WZWUNZPSLOmadYsujHutpgElO+50foX+ib/Wg==",
+      "version": "7.26.3",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-annotate-as-pure": "^7.25.9",
         "@babel/helper-create-class-features-plugin": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.26.5",
+        "@babel/helper-plugin-utils": "^7.25.9",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
         "@babel/plugin-syntax-typescript": "^7.25.9"
       },
@@ -590,9 +506,7 @@
       }
     },
     "node_modules/@babel/runtime": {
-      "version": "7.26.7",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz",
-      "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==",
+      "version": "7.26.0",
       "license": "MIT",
       "dependencies": {
         "regenerator-runtime": "^0.14.0"
@@ -603,8 +517,6 @@
     },
     "node_modules/@babel/template": {
       "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
-      "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.25.9",
@@ -616,16 +528,14 @@
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.26.7",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz",
-      "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==",
+      "version": "7.26.4",
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.5",
-        "@babel/parser": "^7.26.7",
+        "@babel/generator": "^7.26.3",
+        "@babel/parser": "^7.26.3",
         "@babel/template": "^7.25.9",
-        "@babel/types": "^7.26.7",
+        "@babel/types": "^7.26.3",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -635,8 +545,6 @@
     },
     "node_modules/@babel/traverse/node_modules/globals": {
       "version": "11.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
       "license": "MIT",
       "engines": {
         "node": ">=4"
@@ -695,8 +603,6 @@
     },
     "node_modules/@changesets/assemble-release-plan": {
       "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.5.tgz",
-      "integrity": "sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -710,8 +616,6 @@
     },
     "node_modules/@changesets/changelog-git": {
       "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.0.tgz",
-      "integrity": "sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -720,8 +624,6 @@
     },
     "node_modules/@changesets/changelog-github": {
       "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/@changesets/changelog-github/-/changelog-github-0.5.0.tgz",
-      "integrity": "sha512-zoeq2LJJVcPJcIotHRJEEA2qCqX0AQIeFE+L21L8sRLPVqDhSXY8ZWAt2sohtBpFZkBwu+LUwMSKRr2lMy3LJA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -772,8 +674,6 @@
     },
     "node_modules/@changesets/config": {
       "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.0.5.tgz",
-      "integrity": "sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -788,8 +688,6 @@
     },
     "node_modules/@changesets/errors": {
       "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz",
-      "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -798,8 +696,6 @@
     },
     "node_modules/@changesets/get-dependents-graph": {
       "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.2.tgz",
-      "integrity": "sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -811,8 +707,6 @@
     },
     "node_modules/@changesets/get-github-info": {
       "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.6.0.tgz",
-      "integrity": "sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -822,8 +716,6 @@
     },
     "node_modules/@changesets/get-release-plan": {
       "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.6.tgz",
-      "integrity": "sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -844,8 +736,6 @@
     },
     "node_modules/@changesets/git": {
       "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.2.tgz",
-      "integrity": "sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -858,8 +748,6 @@
     },
     "node_modules/@changesets/logger": {
       "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz",
-      "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -868,8 +756,6 @@
     },
     "node_modules/@changesets/parse": {
       "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.0.tgz",
-      "integrity": "sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -879,8 +765,6 @@
     },
     "node_modules/@changesets/pre": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.1.tgz",
-      "integrity": "sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -892,8 +776,6 @@
     },
     "node_modules/@changesets/read": {
       "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.2.tgz",
-      "integrity": "sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -908,8 +790,6 @@
     },
     "node_modules/@changesets/should-skip-package": {
       "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.1.tgz",
-      "integrity": "sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -919,15 +799,11 @@
     },
     "node_modules/@changesets/types": {
       "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz",
-      "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/@changesets/write": {
       "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.3.2.tgz",
-      "integrity": "sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -939,8 +815,6 @@
     },
     "node_modules/@changesets/write/node_modules/prettier": {
       "version": "2.8.8",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
-      "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -1063,6 +937,47 @@
         "node": ">=18"
       }
     },
+    "node_modules/@emmetio/abbreviation": {
+      "version": "2.3.3",
+      "license": "MIT",
+      "dependencies": {
+        "@emmetio/scanner": "^1.0.4"
+      }
+    },
+    "node_modules/@emmetio/css-abbreviation": {
+      "version": "2.1.8",
+      "license": "MIT",
+      "dependencies": {
+        "@emmetio/scanner": "^1.0.4"
+      }
+    },
+    "node_modules/@emmetio/css-parser": {
+      "version": "0.4.0",
+      "license": "MIT",
+      "dependencies": {
+        "@emmetio/stream-reader": "^2.2.0",
+        "@emmetio/stream-reader-utils": "^0.1.0"
+      }
+    },
+    "node_modules/@emmetio/html-matcher": {
+      "version": "1.3.0",
+      "license": "ISC",
+      "dependencies": {
+        "@emmetio/scanner": "^1.0.0"
+      }
+    },
+    "node_modules/@emmetio/scanner": {
+      "version": "1.0.4",
+      "license": "MIT"
+    },
+    "node_modules/@emmetio/stream-reader": {
+      "version": "2.2.0",
+      "license": "MIT"
+    },
+    "node_modules/@emmetio/stream-reader-utils": {
+      "version": "0.1.0",
+      "license": "MIT"
+    },
     "node_modules/@esbuild/aix-ppc64": {
       "version": "0.24.2",
       "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz",
@@ -1490,8 +1405,6 @@
     },
     "node_modules/@eslint-community/eslint-utils": {
       "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
-      "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1507,23 +1420,8 @@
         "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
       }
     },
-    "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
-      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
     "node_modules/@eslint-community/regexpp": {
       "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
-      "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -1531,13 +1429,11 @@
       }
     },
     "node_modules/@eslint/config-array": {
-      "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz",
-      "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==",
+      "version": "0.19.0",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@eslint/object-schema": "^2.1.5",
+        "@eslint/object-schema": "^2.1.4",
         "debug": "^4.3.1",
         "minimatch": "^3.1.2"
       },
@@ -1545,6 +1441,26 @@
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
+    "node_modules/@eslint/config-array/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/@eslint/config-array/node_modules/minimatch": {
+      "version": "3.1.2",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/@eslint/core": {
       "version": "0.10.0",
       "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz",
@@ -1560,8 +1476,6 @@
     },
     "node_modules/@eslint/eslintrc": {
       "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
-      "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1584,15 +1498,20 @@
     },
     "node_modules/@eslint/eslintrc/node_modules/argparse": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
       "dev": true,
       "license": "Python-2.0"
     },
+    "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
     "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
       "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1602,6 +1521,17 @@
         "js-yaml": "bin/js-yaml.js"
       }
     },
+    "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+      "version": "3.1.2",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/@eslint/js": {
       "version": "9.19.0",
       "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz",
@@ -1613,9 +1543,7 @@
       }
     },
     "node_modules/@eslint/object-schema": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz",
-      "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==",
+      "version": "2.1.4",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -1638,8 +1566,6 @@
     },
     "node_modules/@humanfs/core": {
       "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
-      "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -1648,8 +1574,6 @@
     },
     "node_modules/@humanfs/node": {
       "version": "0.16.6",
-      "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
-      "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -1662,8 +1586,6 @@
     },
     "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
       "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
-      "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -1676,8 +1598,6 @@
     },
     "node_modules/@humanwhocodes/module-importer": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
-      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -1690,8 +1610,6 @@
     },
     "node_modules/@humanwhocodes/retry": {
       "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
-      "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -1704,8 +1622,6 @@
     },
     "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": {
@@ -1722,8 +1638,6 @@
     },
     "node_modules/@isaacs/cliui/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": {
@@ -1735,8 +1649,6 @@
     },
     "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
       "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
-      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -1748,15 +1660,11 @@
     },
     "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
       "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
-      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/@isaacs/cliui/node_modules/string-width": {
       "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
-      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1773,8 +1681,6 @@
     },
     "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
       "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
-      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1789,8 +1695,6 @@
     },
     "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
       "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
-      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1807,8 +1711,6 @@
     },
     "node_modules/@jridgewell/gen-mapping": {
       "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
-      "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
       "license": "MIT",
       "dependencies": {
         "@jridgewell/set-array": "^1.2.1",
@@ -1821,8 +1723,6 @@
     },
     "node_modules/@jridgewell/resolve-uri": {
       "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
-      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
       "license": "MIT",
       "engines": {
         "node": ">=6.0.0"
@@ -1830,8 +1730,6 @@
     },
     "node_modules/@jridgewell/set-array": {
       "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
-      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
       "license": "MIT",
       "engines": {
         "node": ">=6.0.0"
@@ -1839,14 +1737,10 @@
     },
     "node_modules/@jridgewell/sourcemap-codec": {
       "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
-      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
       "license": "MIT"
     },
     "node_modules/@jridgewell/trace-mapping": {
       "version": "0.3.25",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
-      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
       "license": "MIT",
       "dependencies": {
         "@jridgewell/resolve-uri": "^3.1.0",
@@ -1864,8 +1758,6 @@
     },
     "node_modules/@manypkg/find-root": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz",
-      "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1877,15 +1769,11 @@
     },
     "node_modules/@manypkg/find-root/node_modules/@types/node": {
       "version": "12.20.55",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
-      "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/@manypkg/find-root/node_modules/fs-extra": {
       "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1899,8 +1787,6 @@
     },
     "node_modules/@manypkg/get-packages": {
       "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz",
-      "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1914,15 +1800,11 @@
     },
     "node_modules/@manypkg/get-packages/node_modules/@changesets/types": {
       "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz",
-      "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/@manypkg/get-packages/node_modules/fs-extra": {
       "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1936,8 +1818,6 @@
     },
     "node_modules/@marko/babel-utils": {
       "version": "6.6.3",
-      "resolved": "https://registry.npmjs.org/@marko/babel-utils/-/babel-utils-6.6.3.tgz",
-      "integrity": "sha512-EuH7uzskOfBFV5+EyJPuwMEkG7kHgejX9r+1FulUqsf294hj+BVTBfIfKkKgvzLDbkl8aJULjJOyLKCAP64fcA==",
       "license": "MIT",
       "dependencies": {
         "@babel/parser": "^7.26.3",
@@ -1994,8 +1874,6 @@
     },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2008,8 +1886,6 @@
     },
     "node_modules/@nodelib/fs.stat": {
       "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2018,8 +1894,6 @@
     },
     "node_modules/@nodelib/fs.walk": {
       "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2032,8 +1906,6 @@
     },
     "node_modules/@pkgjs/parseargs": {
       "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
-      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -2043,22 +1915,16 @@
     },
     "node_modules/@types/babel__code-frame": {
       "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/@types/babel__code-frame/-/babel__code-frame-7.0.6.tgz",
-      "integrity": "sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/@types/estree": {
       "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
-      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/@types/jsdom": {
       "version": "21.1.7",
-      "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz",
-      "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2069,22 +1935,18 @@
     },
     "node_modules/@types/json-schema": {
       "version": "7.0.15",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/@types/mocha": {
       "version": "10.0.10",
-      "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz",
-      "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.12.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz",
-      "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==",
+      "version": "22.13.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.0.tgz",
+      "integrity": "sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2093,15 +1955,11 @@
     },
     "node_modules/@types/tough-cookie": {
       "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
-      "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/@types/vscode": {
-      "version": "1.96.0",
-      "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.96.0.tgz",
-      "integrity": "sha512-qvZbSZo+K4ZYmmDuaodMbAa67Pl6VDQzLKFka6rq+3WUTY4Kro7Bwoi0CuZLO/wema0ygcmpwow7zZfPJTs5jg==",
+      "version": "1.95.0",
       "dev": true,
       "license": "MIT"
     },
@@ -2243,32 +2101,6 @@
         "typescript": ">=4.8.4 <5.8.0"
       }
     },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
     "node_modules/@typescript-eslint/utils": {
       "version": "8.22.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.22.0.tgz",
@@ -2311,10 +2143,21 @@
         "url": "https://opencollective.com/typescript-eslint"
       }
     },
+    "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
     "node_modules/@typescript/vfs": {
       "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.0.tgz",
-      "integrity": "sha512-hvJUjNVeBMp77qPINuUvYXj4FyWeeMMKZkxEATEU3hqBAQ7qdTBCUFT7Sp0Zu0faeEtFf+ldXxMEDr/bk73ISg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2324,16 +2167,168 @@
         "typescript": "*"
       }
     },
+    "node_modules/@volar/kit": {
+      "version": "2.4.6",
+      "license": "MIT",
+      "dependencies": {
+        "@volar/language-service": "2.4.6",
+        "@volar/typescript": "2.4.6",
+        "typesafe-path": "^0.2.2",
+        "vscode-languageserver-textdocument": "^1.0.11",
+        "vscode-uri": "^3.0.8"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      }
+    },
+    "node_modules/@volar/language-core": {
+      "version": "2.4.6",
+      "license": "MIT",
+      "dependencies": {
+        "@volar/source-map": "2.4.6"
+      }
+    },
+    "node_modules/@volar/language-server": {
+      "version": "2.4.6",
+      "license": "MIT",
+      "dependencies": {
+        "@volar/language-core": "2.4.6",
+        "@volar/language-service": "2.4.6",
+        "@volar/typescript": "2.4.6",
+        "path-browserify": "^1.0.1",
+        "request-light": "^0.7.0",
+        "vscode-languageserver": "^9.0.1",
+        "vscode-languageserver-protocol": "^3.17.5",
+        "vscode-languageserver-textdocument": "^1.0.11",
+        "vscode-uri": "^3.0.8"
+      }
+    },
+    "node_modules/@volar/language-service": {
+      "version": "2.4.6",
+      "license": "MIT",
+      "dependencies": {
+        "@volar/language-core": "2.4.6",
+        "vscode-languageserver-protocol": "^3.17.5",
+        "vscode-languageserver-textdocument": "^1.0.11",
+        "vscode-uri": "^3.0.8"
+      }
+    },
+    "node_modules/@volar/source-map": {
+      "version": "2.4.6",
+      "license": "MIT"
+    },
+    "node_modules/@volar/test-utils": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/@volar/test-utils/-/test-utils-2.4.11.tgz",
+      "integrity": "sha512-ogkLldPqFa/j9302Ns+nWeyTCQv8d4c7iN4t8ziq7j0XeMKWYsTAjLsx/9z0MTNrecBAcocgzEvCricASSq+Hw==",
+      "license": "MIT",
+      "dependencies": {
+        "@volar/language-core": "2.4.11",
+        "@volar/language-server": "2.4.11",
+        "vscode-languageserver-textdocument": "^1.0.11",
+        "vscode-uri": "^3.0.8"
+      }
+    },
+    "node_modules/@volar/test-utils/node_modules/@volar/language-core": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.11.tgz",
+      "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==",
+      "license": "MIT",
+      "dependencies": {
+        "@volar/source-map": "2.4.11"
+      }
+    },
+    "node_modules/@volar/test-utils/node_modules/@volar/language-server": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.11.tgz",
+      "integrity": "sha512-W9P8glH1M8LGREJ7yHRCANI5vOvTrRO15EMLdmh5WNF9sZYSEbQxiHKckZhvGIkbeR1WAlTl3ORTrJXUghjk7g==",
+      "license": "MIT",
+      "dependencies": {
+        "@volar/language-core": "2.4.11",
+        "@volar/language-service": "2.4.11",
+        "@volar/typescript": "2.4.11",
+        "path-browserify": "^1.0.1",
+        "request-light": "^0.7.0",
+        "vscode-languageserver": "^9.0.1",
+        "vscode-languageserver-protocol": "^3.17.5",
+        "vscode-languageserver-textdocument": "^1.0.11",
+        "vscode-uri": "^3.0.8"
+      }
+    },
+    "node_modules/@volar/test-utils/node_modules/@volar/language-service": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.11.tgz",
+      "integrity": "sha512-KIb6g8gjUkS2LzAJ9bJCLIjfsJjeRtmXlu7b2pDFGD3fNqdbC53cCAKzgWDs64xtQVKYBU13DLWbtSNFtGuMLQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@volar/language-core": "2.4.11",
+        "vscode-languageserver-protocol": "^3.17.5",
+        "vscode-languageserver-textdocument": "^1.0.11",
+        "vscode-uri": "^3.0.8"
+      }
+    },
+    "node_modules/@volar/test-utils/node_modules/@volar/source-map": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.11.tgz",
+      "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==",
+      "license": "MIT"
+    },
+    "node_modules/@volar/test-utils/node_modules/@volar/typescript": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.11.tgz",
+      "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==",
+      "license": "MIT",
+      "dependencies": {
+        "@volar/language-core": "2.4.11",
+        "path-browserify": "^1.0.1",
+        "vscode-uri": "^3.0.8"
+      }
+    },
+    "node_modules/@volar/typescript": {
+      "version": "2.4.6",
+      "license": "MIT",
+      "dependencies": {
+        "@volar/language-core": "2.4.6",
+        "path-browserify": "^1.0.1",
+        "vscode-uri": "^3.0.8"
+      }
+    },
+    "node_modules/@volar/vscode": {
+      "version": "2.4.6",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@volar/language-server": "2.4.6",
+        "path-browserify": "^1.0.1",
+        "vscode-languageclient": "^9.0.1",
+        "vscode-nls": "^5.2.0"
+      }
+    },
+    "node_modules/@vscode/emmet-helper": {
+      "version": "2.9.3",
+      "license": "MIT",
+      "dependencies": {
+        "emmet": "^2.4.3",
+        "jsonc-parser": "^2.3.0",
+        "vscode-languageserver-textdocument": "^1.0.1",
+        "vscode-languageserver-types": "^3.15.1",
+        "vscode-uri": "^2.1.2"
+      }
+    },
+    "node_modules/@vscode/emmet-helper/node_modules/jsonc-parser": {
+      "version": "2.3.1",
+      "license": "MIT"
+    },
+    "node_modules/@vscode/emmet-helper/node_modules/vscode-uri": {
+      "version": "2.1.2",
+      "license": "MIT"
+    },
     "node_modules/@vscode/l10n": {
       "version": "0.0.18",
-      "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz",
-      "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==",
       "license": "MIT"
     },
     "node_modules/@vscode/test-electron": {
       "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.4.1.tgz",
-      "integrity": "sha512-Gc6EdaLANdktQ1t+zozoBVRynfIsMKMc94Svu1QreOBC8y76x4tvaK32TljrLi1LI2+PK58sDVbL7ALdqf3VRQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2391,8 +2386,6 @@
     },
     "node_modules/@vscode/vsce-sign": {
       "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.5.tgz",
-      "integrity": "sha512-GfYWrsT/vypTMDMgWDm75iDmAOMe7F71sZECJ+Ws6/xyIfmB3ELVnVN+LwMFAvmXY+e6eWhR2EzNGF/zAhWY3Q==",
       "dev": true,
       "hasInstallScript": true,
       "license": "SEE LICENSE IN LICENSE.txt",
@@ -2408,136 +2401,8 @@
         "@vscode/vsce-sign-win32-x64": "2.0.2"
       }
     },
-    "node_modules/@vscode/vsce-sign-alpine-arm64": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.2.tgz",
-      "integrity": "sha512-E80YvqhtZCLUv3YAf9+tIbbqoinWLCO/B3j03yQPbjT3ZIHCliKZlsy1peNc4XNZ5uIb87Jn0HWx/ZbPXviuAQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "SEE LICENSE IN LICENSE.txt",
-      "optional": true,
-      "os": [
-        "alpine"
-      ]
-    },
-    "node_modules/@vscode/vsce-sign-alpine-x64": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.2.tgz",
-      "integrity": "sha512-n1WC15MSMvTaeJ5KjWCzo0nzjydwxLyoHiMJHu1Ov0VWTZiddasmOQHekA47tFRycnt4FsQrlkSCTdgHppn6bw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "SEE LICENSE IN LICENSE.txt",
-      "optional": true,
-      "os": [
-        "alpine"
-      ]
-    },
-    "node_modules/@vscode/vsce-sign-darwin-arm64": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.2.tgz",
-      "integrity": "sha512-rz8F4pMcxPj8fjKAJIfkUT8ycG9CjIp888VY/6pq6cuI2qEzQ0+b5p3xb74CJnBbSC0p2eRVoe+WgNCAxCLtzQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "SEE LICENSE IN LICENSE.txt",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@vscode/vsce-sign-darwin-x64": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.2.tgz",
-      "integrity": "sha512-MCjPrQ5MY/QVoZ6n0D92jcRb7eYvxAujG/AH2yM6lI0BspvJQxp0o9s5oiAM9r32r9tkLpiy5s2icsbwefAQIw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "SEE LICENSE IN LICENSE.txt",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@vscode/vsce-sign-linux-arm": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.2.tgz",
-      "integrity": "sha512-Fkb5jpbfhZKVw3xwR6t7WYfwKZktVGNXdg1m08uEx1anO0oUPUkoQRsNm4QniL3hmfw0ijg00YA6TrxCRkPVOQ==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "SEE LICENSE IN LICENSE.txt",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@vscode/vsce-sign-linux-arm64": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.2.tgz",
-      "integrity": "sha512-Ybeu7cA6+/koxszsORXX0OJk9N0GgfHq70Wqi4vv2iJCZvBrOWwcIrxKjvFtwyDgdeQzgPheH5nhLVl5eQy7WA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "SEE LICENSE IN LICENSE.txt",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@vscode/vsce-sign-linux-x64": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.2.tgz",
-      "integrity": "sha512-NsPPFVtLaTlVJKOiTnO8Cl78LZNWy0Q8iAg+LlBiCDEgC12Gt4WXOSs2pmcIjDYzj2kY4NwdeN1mBTaujYZaPg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "SEE LICENSE IN LICENSE.txt",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@vscode/vsce-sign-win32-arm64": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.2.tgz",
-      "integrity": "sha512-wPs848ymZ3Ny+Y1Qlyi7mcT6VSigG89FWQnp2qRYCyMhdJxOpA4lDwxzlpL8fG6xC8GjQjGDkwbkWUcCobvksQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "SEE LICENSE IN LICENSE.txt",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@vscode/vsce-sign-win32-x64": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.2.tgz",
-      "integrity": "sha512-pAiRN6qSAhDM5SVOIxgx+2xnoVUePHbRNC7OD2aOR3WltTKxxF25OfpK8h8UQ7A0BuRkSgREbB59DBlFk4iAeg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "SEE LICENSE IN LICENSE.txt",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
     "node_modules/@vscode/vsce/node_modules/ansi-styles": {
       "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2547,20 +2412,8 @@
         "node": ">=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",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2574,8 +2427,6 @@
     },
     "node_modules/@vscode/vsce/node_modules/color-convert": {
       "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2584,8 +2435,6 @@
     },
     "node_modules/@vscode/vsce/node_modules/color-name": {
       "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
       "dev": true,
       "license": "MIT"
     },
@@ -2601,8 +2450,6 @@
     },
     "node_modules/@vscode/vsce/node_modules/escape-string-regexp": {
       "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2610,9 +2457,7 @@
       }
     },
     "node_modules/@vscode/vsce/node_modules/glob": {
-      "version": "11.0.1",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz",
-      "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==",
+      "version": "11.0.0",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -2635,8 +2480,6 @@
     },
     "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": {
@@ -2651,61 +2494,34 @@
     },
     "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",
-      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
       "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=4"
       }
     },
-    "node_modules/@vscode/vsce/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==",
+    "node_modules/@vscode/vsce/node_modules/minimatch": {
+      "version": "3.1.2",
       "dev": true,
-      "license": "BlueOak-1.0.0",
+      "license": "ISC",
       "dependencies": {
-        "@isaacs/cliui": "^8.0.2"
-      },
-      "engines": {
-        "node": "20 || >=22"
+        "brace-expansion": "^1.1.7"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/@vscode/vsce/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": "*"
       }
     },
-    "node_modules/@vscode/vsce/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==",
+    "node_modules/@vscode/vsce/node_modules/minimatch/node_modules/brace-expansion": {
+      "version": "1.1.11",
       "dev": true,
-      "license": "BlueOak-1.0.0",
+      "license": "MIT",
       "dependencies": {
-        "lru-cache": "^11.0.0",
-        "minipass": "^7.1.2"
-      },
-      "engines": {
-        "node": "20 || >=22"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
     "node_modules/@vscode/vsce/node_modules/supports-color": {
       "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2717,8 +2533,6 @@
     },
     "node_modules/@vscode/vsce/node_modules/tmp": {
       "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
-      "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2727,8 +2541,6 @@
     },
     "node_modules/acorn": {
       "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
-      "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -2740,8 +2552,6 @@
     },
     "node_modules/acorn-jsx": {
       "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
-      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
       "dev": true,
       "license": "MIT",
       "peerDependencies": {
@@ -2759,8 +2569,6 @@
     },
     "node_modules/ajv": {
       "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2776,8 +2584,6 @@
     },
     "node_modules/ansi-colors": {
       "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
-      "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2786,8 +2592,6 @@
     },
     "node_modules/ansi-escapes": {
       "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
-      "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2802,8 +2606,6 @@
     },
     "node_modules/ansi-regex": {
       "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2812,8 +2614,6 @@
     },
     "node_modules/ansi-styles": {
       "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2828,8 +2628,6 @@
     },
     "node_modules/anymatch": {
       "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
-      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -2842,26 +2640,18 @@
     },
     "node_modules/app-module-path": {
       "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz",
-      "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==",
       "license": "BSD-2-Clause"
     },
     "node_modules/arg": {
       "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
-      "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
       "license": "MIT"
     },
     "node_modules/argly": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/argly/-/argly-1.2.0.tgz",
-      "integrity": "sha512-+F3InkcH2XOGK7Jf/ZQis4cwZ4wbfmpBKo5J+SAA9bglT1gVd0e9hroHWarU076pJrAfs8JKuRPwDqwPBOKHnw==",
       "license": "MIT"
     },
     "node_modules/argparse": {
       "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2870,8 +2660,6 @@
     },
     "node_modules/array-union": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2880,8 +2668,6 @@
     },
     "node_modules/assertion-error": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
-      "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
       "license": "MIT",
       "engines": {
         "node": "*"
@@ -2889,14 +2675,10 @@
     },
     "node_modules/asynckit": {
       "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
       "license": "MIT"
     },
     "node_modules/axe-core": {
       "version": "4.10.2",
-      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz",
-      "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==",
       "license": "MPL-2.0",
       "engines": {
         "node": ">=4"
@@ -2904,8 +2686,6 @@
     },
     "node_modules/azure-devops-node-api": {
       "version": "12.5.0",
-      "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz",
-      "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2915,14 +2695,10 @@
     },
     "node_modules/balanced-match": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
       "license": "MIT"
     },
     "node_modules/base64-js": {
       "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
       "dev": true,
       "funding": [
         {
@@ -2942,8 +2718,6 @@
     },
     "node_modules/better-path-resolve": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz",
-      "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2955,8 +2729,6 @@
     },
     "node_modules/binary-extensions": {
       "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
-      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2968,8 +2740,6 @@
     },
     "node_modules/bl": {
       "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz",
-      "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2980,8 +2750,6 @@
     },
     "node_modules/bl/node_modules/readable-stream": {
       "version": "3.6.2",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
-      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2995,26 +2763,18 @@
     },
     "node_modules/boolbase": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
       "dev": true,
       "license": "ISC"
     },
     "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
+      "version": "2.0.1",
       "license": "MIT",
       "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
+        "balanced-match": "^1.0.0"
       }
     },
     "node_modules/braces": {
       "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
-      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3026,21 +2786,15 @@
     },
     "node_modules/browser-refresh-client": {
       "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/browser-refresh-client/-/browser-refresh-client-1.1.4.tgz",
-      "integrity": "sha512-FM/UzMFsG7wJ1ocxCSl6U7qGAIWASEk+tlvfJLP2Pd1JfS4kQ1r4d5f+nNmQI8fB8sXSD8+u/mWErEkAMxUu3w==",
       "license": "MIT"
     },
     "node_modules/browser-stdout": {
       "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
-      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
       "dev": true,
       "license": "ISC"
     },
     "node_modules/browserslist": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
-      "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+      "version": "4.24.3",
       "funding": [
         {
           "type": "opencollective",
@@ -3071,8 +2825,6 @@
     },
     "node_modules/buffer": {
       "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
-      "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
       "dev": true,
       "funding": [
         {
@@ -3096,8 +2848,6 @@
     },
     "node_modules/buffer-crc32": {
       "version": "0.2.13",
-      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
-      "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3106,40 +2856,23 @@
     },
     "node_modules/buffer-equal-constant-time": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
-      "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
       "dev": true,
       "license": "BSD-3-Clause"
     },
     "node_modules/buffer-from": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-      "license": "MIT"
-    },
-    "node_modules/call-bind-apply-helpers": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
-      "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
+      "version": "1.1.2",
+      "license": "MIT"
     },
-    "node_modules/call-bound": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
-      "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+    "node_modules/call-bind": {
+      "version": "1.0.7",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
-        "get-intrinsic": "^1.2.6"
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.1"
       },
       "engines": {
         "node": ">= 0.4"
@@ -3150,8 +2883,6 @@
     },
     "node_modules/callsites": {
       "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3160,8 +2891,6 @@
     },
     "node_modules/camelcase": {
       "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3172,9 +2901,7 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001696",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz",
-      "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==",
+      "version": "1.0.30001690",
       "funding": [
         {
           "type": "opencollective",
@@ -3193,8 +2920,6 @@
     },
     "node_modules/chai": {
       "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
-      "integrity": "sha512-eRYY0vPS2a9zt5w5Z0aCeWbrXTEyvk7u/Xf71EzNObrjSCPgMm1Nku/D/u2tiqHBX5j40wWhj54YJLtgn8g55A==",
       "license": "MIT",
       "dependencies": {
         "assertion-error": "^1.0.1",
@@ -3207,8 +2932,6 @@
     },
     "node_modules/chalk": {
       "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3224,15 +2947,11 @@
     },
     "node_modules/chardet": {
       "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
-      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/cheerio": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz",
-      "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3257,8 +2976,6 @@
     },
     "node_modules/cheerio-select": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
-      "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -3275,8 +2992,6 @@
     },
     "node_modules/chokidar": {
       "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
-      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3300,8 +3015,6 @@
     },
     "node_modules/chokidar/node_modules/glob-parent": {
       "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -3313,16 +3026,12 @@
     },
     "node_modules/chownr": {
       "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
-      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
       "dev": true,
       "license": "ISC",
       "optional": true
     },
     "node_modules/ci-info": {
       "version": "3.9.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
-      "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
       "dev": true,
       "funding": [
         {
@@ -3337,8 +3046,6 @@
     },
     "node_modules/cli-cursor": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
-      "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3353,8 +3060,6 @@
     },
     "node_modules/cli-spinners": {
       "version": "2.9.2",
-      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
-      "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3366,8 +3071,6 @@
     },
     "node_modules/cli-truncate": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
-      "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3448,8 +3151,6 @@
     },
     "node_modules/cockatiel": {
       "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz",
-      "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3458,8 +3159,6 @@
     },
     "node_modules/color-convert": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3471,22 +3170,16 @@
     },
     "node_modules/color-name": {
       "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/colorette": {
       "version": "2.0.20",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
-      "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/combined-stream": {
       "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
       "license": "MIT",
       "dependencies": {
         "delayed-stream": "~1.0.0"
@@ -3507,8 +3200,6 @@
     },
     "node_modules/complain": {
       "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/complain/-/complain-1.6.1.tgz",
-      "integrity": "sha512-WsiVAbAPcPSwyC5k8g/PLceaW0MXJUw61KqBd9uiyDOSuDIC6Ho/EbyhdFjeV6wq44R2g/b8IFpvV/1ZyXiqUQ==",
       "license": "MIT",
       "dependencies": {
         "error-stack-parser": "^2.0.1"
@@ -3516,28 +3207,20 @@
     },
     "node_modules/concat-map": {
       "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/convert-source-map": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
-      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
       "license": "MIT"
     },
     "node_modules/core-util-is": {
       "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/cross-spawn": {
       "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
-      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3551,8 +3234,6 @@
     },
     "node_modules/css-select": {
       "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
-      "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -3568,8 +3249,6 @@
     },
     "node_modules/css-what": {
       "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
-      "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
       "dev": true,
       "license": "BSD-2-Clause",
       "engines": {
@@ -3594,14 +3273,10 @@
     },
     "node_modules/csstype": {
       "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
-      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
       "license": "MIT"
     },
     "node_modules/data-urls": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz",
-      "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==",
       "license": "MIT",
       "dependencies": {
         "whatwg-mimetype": "^4.0.0",
@@ -3611,51 +3286,13 @@
         "node": ">=18"
       }
     },
-    "node_modules/data-urls/node_modules/tr46": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz",
-      "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==",
-      "license": "MIT",
-      "dependencies": {
-        "punycode": "^2.3.1"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/data-urls/node_modules/webidl-conversions": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
-      "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/data-urls/node_modules/whatwg-url": {
-      "version": "14.1.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz",
-      "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==",
-      "license": "MIT",
-      "dependencies": {
-        "tr46": "^5.0.0",
-        "webidl-conversions": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
     "node_modules/dataloader": {
       "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz",
-      "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==",
       "dev": true,
       "license": "BSD-3-Clause"
     },
     "node_modules/debug": {
       "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
-      "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
       "license": "MIT",
       "dependencies": {
         "ms": "^2.1.3"
@@ -3671,8 +3308,6 @@
     },
     "node_modules/decamelize": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
-      "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3683,15 +3318,11 @@
       }
     },
     "node_modules/decimal.js": {
-      "version": "10.5.0",
-      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz",
-      "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==",
+      "version": "10.4.3",
       "license": "MIT"
     },
     "node_modules/decompress-response": {
       "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
-      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -3707,8 +3338,6 @@
     },
     "node_modules/deep-eql": {
       "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
-      "integrity": "sha512-6sEotTRGBFiNcqVoeHwnfopbSpi5NbH1VWJmYCVkmxMmaVTT0bUTrNaGyBwhgP4MZL012W/mkzIn3Da+iDYweg==",
       "license": "MIT",
       "dependencies": {
         "type-detect": "0.1.1"
@@ -3719,8 +3348,6 @@
     },
     "node_modules/deep-eql/node_modules/type-detect": {
       "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
-      "integrity": "sha512-5rqszGVwYgBoDkIm2oUtvkfZMQ0vk29iDMU0W2qCa3rG0vPDNczCMT4hV/bLBgLg8k8ri6+u3Zbt+S/14eMzlA==",
       "license": "MIT",
       "engines": {
         "node": "*"
@@ -3728,8 +3355,6 @@
     },
     "node_modules/deep-extend": {
       "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -3739,15 +3364,27 @@
     },
     "node_modules/deep-is": {
       "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
-      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/define-data-property": {
+      "version": "1.1.4",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/define-lazy-prop": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
-      "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3756,8 +3393,6 @@
     },
     "node_modules/delayed-stream": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
       "license": "MIT",
       "engines": {
         "node": ">=0.4.0"
@@ -3775,8 +3410,6 @@
     },
     "node_modules/detect-libc": {
       "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
-      "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
       "dev": true,
       "license": "Apache-2.0",
       "optional": true,
@@ -3786,8 +3419,6 @@
     },
     "node_modules/diff": {
       "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
-      "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
       "dev": true,
       "license": "BSD-3-Clause",
       "engines": {
@@ -3796,8 +3427,6 @@
     },
     "node_modules/dir-glob": {
       "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3809,8 +3438,6 @@
     },
     "node_modules/dom-serializer": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
-      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3824,8 +3451,6 @@
     },
     "node_modules/domelementtype": {
       "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
-      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
       "dev": true,
       "funding": [
         {
@@ -3837,8 +3462,6 @@
     },
     "node_modules/domhandler": {
       "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -3852,9 +3475,7 @@
       }
     },
     "node_modules/domutils": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
-      "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+      "version": "3.1.0",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -3868,40 +3489,19 @@
     },
     "node_modules/dotenv": {
       "version": "8.6.0",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
-      "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
       "dev": true,
       "license": "BSD-2-Clause",
       "engines": {
         "node": ">=10"
       }
     },
-    "node_modules/dunder-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
-      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
-        "es-errors": "^1.3.0",
-        "gopd": "^1.2.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
     "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",
-      "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -3909,22 +3509,30 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.5.90",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz",
-      "integrity": "sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==",
+      "version": "1.5.76",
       "license": "ISC"
     },
+    "node_modules/emmet": {
+      "version": "2.4.11",
+      "license": "MIT",
+      "workspaces": [
+        "./packages/scanner",
+        "./packages/abbreviation",
+        "./packages/css-abbreviation",
+        "./"
+      ],
+      "dependencies": {
+        "@emmetio/abbreviation": "^2.3.3",
+        "@emmetio/css-abbreviation": "^2.1.8"
+      }
+    },
     "node_modules/emoji-regex": {
       "version": "10.4.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
-      "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/encoding-sniffer": {
       "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz",
-      "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3937,8 +3545,6 @@
     },
     "node_modules/encoding-sniffer/node_modules/iconv-lite": {
       "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3950,8 +3556,6 @@
     },
     "node_modules/end-of-stream": {
       "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -3961,8 +3565,6 @@
     },
     "node_modules/enquirer": {
       "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
-      "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3975,8 +3577,6 @@
     },
     "node_modules/entities": {
       "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
-      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
       "license": "BSD-2-Clause",
       "engines": {
         "node": ">=0.12"
@@ -3987,8 +3587,6 @@
     },
     "node_modules/environment": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
-      "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -4000,42 +3598,26 @@
     },
     "node_modules/error-stack-parser": {
       "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
-      "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
       "license": "MIT",
       "dependencies": {
         "stackframe": "^1.3.4"
       }
     },
     "node_modules/es-define-property": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
-      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "version": "1.0.0",
       "dev": true,
       "license": "MIT",
+      "dependencies": {
+        "get-intrinsic": "^1.2.4"
+      },
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/es-errors": {
       "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
-      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-object-atoms": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
-      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
       "dev": true,
       "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0"
-      },
       "engines": {
         "node": ">= 0.4"
       }
@@ -4083,8 +3665,6 @@
     },
     "node_modules/escalade": {
       "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
-      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
       "license": "MIT",
       "engines": {
         "node": ">=6"
@@ -4092,8 +3672,6 @@
     },
     "node_modules/escape-string-regexp": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -4165,8 +3743,6 @@
     },
     "node_modules/eslint-formatter-unix": {
       "version": "8.40.0",
-      "resolved": "https://registry.npmjs.org/eslint-formatter-unix/-/eslint-formatter-unix-8.40.0.tgz",
-      "integrity": "sha512-gfsmFZ/cb1MobrMfYl2IPFLZEz2tWQVO/tnmziNQdhWJMN85GfZD64dcPsEgaEoeVKgAtK6W9LWLlOxhJWZvDw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -4175,8 +3751,6 @@
     },
     "node_modules/eslint-plugin-simple-import-sort": {
       "version": "12.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz",
-      "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==",
       "dev": true,
       "license": "MIT",
       "peerDependencies": {
@@ -4185,8 +3759,6 @@
     },
     "node_modules/eslint-scope": {
       "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
-      "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -4201,9 +3773,27 @@
       }
     },
     "node_modules/eslint-visitor-keys": {
+      "version": "3.4.3",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/eslint/node_modules/eslint-visitor-keys": {
       "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -4215,8 +3805,6 @@
     },
     "node_modules/eslint/node_modules/find-up": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4232,8 +3820,6 @@
     },
     "node_modules/eslint/node_modules/locate-path": {
       "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4246,10 +3832,19 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/eslint/node_modules/minimatch": {
+      "version": "3.1.2",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/eslint/node_modules/p-limit": {
       "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4264,8 +3859,6 @@
     },
     "node_modules/eslint/node_modules/p-locate": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4280,8 +3873,6 @@
     },
     "node_modules/espree": {
       "version": "10.3.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
-      "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -4296,10 +3887,19 @@
         "url": "https://opencollective.com/eslint"
       }
     },
+    "node_modules/espree/node_modules/eslint-visitor-keys": {
+      "version": "4.2.0",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
     "node_modules/esprima": {
       "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
       "dev": true,
       "license": "BSD-2-Clause",
       "bin": {
@@ -4312,8 +3912,6 @@
     },
     "node_modules/esquery": {
       "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
-      "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
       "dev": true,
       "license": "BSD-3-Clause",
       "dependencies": {
@@ -4325,8 +3923,6 @@
     },
     "node_modules/esrecurse": {
       "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -4338,8 +3934,6 @@
     },
     "node_modules/estraverse": {
       "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
       "dev": true,
       "license": "BSD-2-Clause",
       "engines": {
@@ -4348,8 +3942,6 @@
     },
     "node_modules/esutils": {
       "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
       "dev": true,
       "license": "BSD-2-Clause",
       "engines": {
@@ -4358,15 +3950,11 @@
     },
     "node_modules/eventemitter3": {
       "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
-      "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/events": {
       "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
-      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -4375,8 +3963,6 @@
     },
     "node_modules/events-light": {
       "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/events-light/-/events-light-1.0.5.tgz",
-      "integrity": "sha512-jF51LJzg5W+tkJgfZbjlbFCLcyVFEtOjU+xMCBylrXG13X5XHvfp6lNGfyBLF9u1mRTpUsMVYqSDukvpZff1mQ==",
       "license": "MIT",
       "dependencies": {
         "chai": "^3.5.0"
@@ -4384,8 +3970,6 @@
     },
     "node_modules/execa": {
       "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
-      "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4408,8 +3992,6 @@
     },
     "node_modules/expand-template": {
       "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
-      "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
       "dev": true,
       "license": "(MIT OR WTFPL)",
       "optional": true,
@@ -4419,15 +4001,11 @@
     },
     "node_modules/extendable-error": {
       "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz",
-      "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/external-editor": {
       "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
-      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4441,8 +4019,6 @@
     },
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
       "dev": true,
       "license": "MIT"
     },
@@ -4465,8 +4041,6 @@
     },
     "node_modules/fast-glob/node_modules/glob-parent": {
       "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -4478,22 +4052,16 @@
     },
     "node_modules/fast-json-stable-stringify": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/fast-levenshtein": {
       "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/fastq": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz",
-      "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==",
+      "version": "1.17.1",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -4502,8 +4070,6 @@
     },
     "node_modules/fd-slicer": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
-      "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4512,8 +4078,6 @@
     },
     "node_modules/file-entry-cache": {
       "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
-      "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4525,8 +4089,6 @@
     },
     "node_modules/fill-range": {
       "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
-      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4538,8 +4100,6 @@
     },
     "node_modules/find-up": {
       "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4552,8 +4112,6 @@
     },
     "node_modules/flat": {
       "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
-      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
       "dev": true,
       "license": "BSD-3-Clause",
       "bin": {
@@ -4562,8 +4120,6 @@
     },
     "node_modules/flat-cache": {
       "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
-      "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4576,15 +4132,11 @@
     },
     "node_modules/flatted": {
       "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
-      "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
       "dev": true,
       "license": "ISC"
     },
     "node_modules/follow-redirects": {
       "version": "1.15.9",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
-      "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
       "dev": true,
       "funding": [
         {
@@ -4604,8 +4156,6 @@
     },
     "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": {
@@ -4621,8 +4171,6 @@
     },
     "node_modules/form-data": {
       "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
-      "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
       "license": "MIT",
       "dependencies": {
         "asynckit": "^0.4.0",
@@ -4635,16 +4183,12 @@
     },
     "node_modules/fs-constants": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
-      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
       "dev": true,
       "license": "MIT",
       "optional": true
     },
     "node_modules/fs-extra": {
       "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
-      "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4656,25 +4200,8 @@
         "node": ">=6 <7 || >=8"
       }
     },
-    "node_modules/fsevents": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
-      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
-      "dev": true,
-      "hasInstallScript": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
     "node_modules/function-bind": {
       "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
       "dev": true,
       "license": "MIT",
       "funding": {
@@ -4683,8 +4210,6 @@
     },
     "node_modules/gensync": {
       "version": "1.0.0-beta.2",
-      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
       "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
@@ -4702,8 +4227,6 @@
     },
     "node_modules/get-east-asian-width": {
       "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
-      "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -4714,22 +4237,15 @@
       }
     },
     "node_modules/get-intrinsic": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
-      "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
+      "version": "1.2.4",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
-        "es-define-property": "^1.0.1",
         "es-errors": "^1.3.0",
-        "es-object-atoms": "^1.0.0",
         "function-bind": "^1.1.2",
-        "get-proto": "^1.0.0",
-        "gopd": "^1.2.0",
-        "has-symbols": "^1.1.0",
-        "hasown": "^2.0.2",
-        "math-intrinsics": "^1.1.0"
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -4738,24 +4254,8 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/get-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
-      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "dunder-proto": "^1.0.1",
-        "es-object-atoms": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
     "node_modules/get-stream": {
       "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
-      "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -4766,9 +4266,7 @@
       }
     },
     "node_modules/get-tsconfig": {
-      "version": "4.10.0",
-      "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz",
-      "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==",
+      "version": "4.8.1",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4780,16 +4278,12 @@
     },
     "node_modules/github-from-package": {
       "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
-      "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
       "dev": true,
       "license": "MIT",
       "optional": true
     },
     "node_modules/glob": {
       "version": "10.4.5",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
-      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -4809,8 +4303,6 @@
     },
     "node_modules/glob-parent": {
       "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
-      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -4820,27 +4312,30 @@
         "node": ">=10.13.0"
       }
     },
-    "node_modules/glob/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+    "node_modules/glob/node_modules/jackspeak": {
+      "version": "3.4.3",
       "dev": true,
-      "license": "MIT",
+      "license": "BlueOak-1.0.0",
       "dependencies": {
-        "balanced-match": "^1.0.0"
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
       }
     },
-    "node_modules/glob/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+    "node_modules/glob/node_modules/path-scurry": {
+      "version": "1.11.1",
       "dev": true,
-      "license": "ISC",
+      "license": "BlueOak-1.0.0",
       "dependencies": {
-        "brace-expansion": "^2.0.1"
+        "lru-cache": "^10.2.0",
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
       },
       "engines": {
-        "node": ">=16 || 14 >=14.17"
+        "node": ">=16 || 14 >=14.18"
       },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
@@ -4848,8 +4343,6 @@
     },
     "node_modules/globals": {
       "version": "14.0.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
-      "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -4861,8 +4354,6 @@
     },
     "node_modules/globby": {
       "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
-      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4881,13 +4372,11 @@
       }
     },
     "node_modules/gopd": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
-      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "version": "1.0.1",
       "dev": true,
       "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
+      "dependencies": {
+        "get-intrinsic": "^1.1.3"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -4895,8 +4384,6 @@
     },
     "node_modules/graceful-fs": {
       "version": "4.2.11",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
-      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
       "dev": true,
       "license": "ISC"
     },
@@ -4909,18 +4396,36 @@
     },
     "node_modules/has-flag": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es-define-property": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-proto": {
+      "version": "1.0.3",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/has-symbols": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
-      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "version": "1.0.3",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -4932,8 +4437,6 @@
     },
     "node_modules/hasown": {
       "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
-      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4945,8 +4448,6 @@
     },
     "node_modules/he": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
-      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
       "license": "MIT",
       "bin": {
         "he": "bin/he"
@@ -4954,8 +4455,6 @@
     },
     "node_modules/hosted-git-info": {
       "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
-      "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -4967,8 +4466,6 @@
     },
     "node_modules/hosted-git-info/node_modules/lru-cache": {
       "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -4980,15 +4477,11 @@
     },
     "node_modules/hosted-git-info/node_modules/yallist": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "dev": true,
       "license": "ISC"
     },
     "node_modules/html-encoding-sniffer": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz",
-      "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==",
       "license": "MIT",
       "dependencies": {
         "whatwg-encoding": "^3.1.1"
@@ -4999,14 +4492,10 @@
     },
     "node_modules/htmljs-parser": {
       "version": "5.5.3",
-      "resolved": "https://registry.npmjs.org/htmljs-parser/-/htmljs-parser-5.5.3.tgz",
-      "integrity": "sha512-uX5BWkdIJV2qfxTVMcFJGPSqx9EYZGfZQv7THtNfA3cIr2zfwlzjojqO7jHDntO3cJUQauRSjBETBkiaCi3wtA==",
       "license": "MIT"
     },
     "node_modules/htmlparser2": {
       "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz",
-      "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==",
       "dev": true,
       "funding": [
         "https://github.com/fb55/htmlparser2?sponsor=1",
@@ -5025,8 +4514,6 @@
     },
     "node_modules/http-proxy-agent": {
       "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
-      "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
       "license": "MIT",
       "dependencies": {
         "agent-base": "^7.1.0",
@@ -5051,15 +4538,11 @@
     },
     "node_modules/human-id": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz",
-      "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/human-signals": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
-      "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -5068,8 +4551,6 @@
     },
     "node_modules/husky": {
       "version": "9.1.7",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
-      "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -5084,8 +4565,6 @@
     },
     "node_modules/iconv-lite": {
       "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5097,8 +4576,6 @@
     },
     "node_modules/ieee754": {
       "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
       "dev": true,
       "funding": [
         {
@@ -5118,8 +4595,6 @@
     },
     "node_modules/ignore": {
       "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
-      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -5128,15 +4603,11 @@
     },
     "node_modules/immediate": {
       "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
-      "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/import-fresh": {
       "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5152,8 +4623,6 @@
     },
     "node_modules/import-fresh/node_modules/resolve-from": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -5162,8 +4631,6 @@
     },
     "node_modules/imurmurhash": {
       "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -5172,23 +4639,17 @@
     },
     "node_modules/inherits": {
       "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
       "dev": true,
       "license": "ISC"
     },
     "node_modules/ini": {
       "version": "1.3.8",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
-      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
       "dev": true,
       "license": "ISC",
       "optional": true
     },
     "node_modules/is-binary-path": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
-      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5200,8 +4661,6 @@
     },
     "node_modules/is-ci": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
-      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5213,15 +4672,11 @@
     },
     "node_modules/is-ci/node_modules/ci-info": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/is-docker": {
       "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
-      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -5236,8 +4691,6 @@
     },
     "node_modules/is-extglob": {
       "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -5246,8 +4699,6 @@
     },
     "node_modules/is-fullwidth-code-point": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
-      "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -5259,8 +4710,6 @@
     },
     "node_modules/is-glob": {
       "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5272,8 +4721,6 @@
     },
     "node_modules/is-interactive": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
-      "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -5285,8 +4732,6 @@
     },
     "node_modules/is-number": {
       "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -5295,8 +4740,6 @@
     },
     "node_modules/is-plain-obj": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
-      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -5305,14 +4748,10 @@
     },
     "node_modules/is-potential-custom-element-name": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
-      "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
       "license": "MIT"
     },
     "node_modules/is-stream": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
-      "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -5324,8 +4763,6 @@
     },
     "node_modules/is-subdir": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz",
-      "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5337,8 +4774,6 @@
     },
     "node_modules/is-unicode-supported": {
       "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
-      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -5350,8 +4785,6 @@
     },
     "node_modules/is-windows": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
-      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -5360,8 +4793,6 @@
     },
     "node_modules/is-wsl": {
       "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
-      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5371,46 +4802,31 @@
         "node": ">=8"
       }
     },
-    "node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/isexe": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
       "dev": true,
       "license": "ISC"
     },
     "node_modules/jackspeak": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
-      "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+      "version": "4.0.2",
       "dev": true,
       "license": "BlueOak-1.0.0",
       "dependencies": {
         "@isaacs/cliui": "^8.0.2"
       },
+      "engines": {
+        "node": "20 || >=22"
+      },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
-      },
-      "optionalDependencies": {
-        "@pkgjs/parseargs": "^0.11.0"
       }
     },
     "node_modules/js-tokens": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
       "license": "MIT"
     },
     "node_modules/js-yaml": {
       "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5461,44 +4877,8 @@
         }
       }
     },
-    "node_modules/jsdom/node_modules/tr46": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz",
-      "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==",
-      "license": "MIT",
-      "dependencies": {
-        "punycode": "^2.3.1"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/jsdom/node_modules/webidl-conversions": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
-      "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/jsdom/node_modules/whatwg-url": {
-      "version": "14.1.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz",
-      "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==",
-      "license": "MIT",
-      "dependencies": {
-        "tr46": "^5.0.0",
-        "webidl-conversions": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
     "node_modules/jsesc": {
       "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
-      "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
       "license": "MIT",
       "bin": {
         "jsesc": "bin/jsesc"
@@ -5509,29 +4889,21 @@
     },
     "node_modules/json-buffer": {
       "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
-      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/json-schema-traverse": {
       "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/json-stable-stringify-without-jsonify": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/json5": {
       "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
-      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
       "license": "MIT",
       "bin": {
         "json5": "lib/cli.js"
@@ -5542,15 +4914,11 @@
     },
     "node_modules/jsonc-parser": {
       "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
-      "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/jsonfile": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
       "dev": true,
       "license": "MIT",
       "optionalDependencies": {
@@ -5559,8 +4927,6 @@
     },
     "node_modules/jsonwebtoken": {
       "version": "9.0.2",
-      "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
-      "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5582,8 +4948,6 @@
     },
     "node_modules/jsonwebtoken/node_modules/jwa": {
       "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
-      "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5594,8 +4958,6 @@
     },
     "node_modules/jsonwebtoken/node_modules/jws": {
       "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
-      "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5605,8 +4967,6 @@
     },
     "node_modules/jszip": {
       "version": "3.10.1",
-      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
-      "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
       "dev": true,
       "license": "(MIT OR GPL-3.0-or-later)",
       "dependencies": {
@@ -5618,8 +4978,6 @@
     },
     "node_modules/jwa": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
-      "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5630,8 +4988,6 @@
     },
     "node_modules/jws": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
-      "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5641,8 +4997,6 @@
     },
     "node_modules/keytar": {
       "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz",
-      "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==",
       "dev": true,
       "hasInstallScript": true,
       "license": "MIT",
@@ -5654,8 +5008,6 @@
     },
     "node_modules/keyv": {
       "version": "4.5.4",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
-      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5664,8 +5016,6 @@
     },
     "node_modules/kleur": {
       "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
-      "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
       "license": "MIT",
       "engines": {
         "node": ">=6"
@@ -5673,8 +5023,6 @@
     },
     "node_modules/lasso-caching-fs": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/lasso-caching-fs/-/lasso-caching-fs-1.0.2.tgz",
-      "integrity": "sha512-mudop0s8U3tLm3Fn9lhiZsiELpLeJToEo6RlDLdph7vWRxL9Sz0o+9WUw1IwlpCYXv/P0CLsMYWFgPwIKWEYvg==",
       "license": "Apache-2.0",
       "dependencies": {
         "raptor-async": "^1.1.2"
@@ -5682,8 +5030,6 @@
     },
     "node_modules/lasso-package-root": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/lasso-package-root/-/lasso-package-root-1.0.1.tgz",
-      "integrity": "sha512-j6LnauNCldqSDvOxoKpD6sTzudPGMiwcZQbySoF9KvJ0lD9Dp2t6QZF8kC0jbUDHuQPiAo5RuQ/mC3AGXscUYA==",
       "license": "Apache-2.0",
       "dependencies": {
         "lasso-caching-fs": "^1.0.0"
@@ -5691,8 +5037,6 @@
     },
     "node_modules/leven": {
       "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
-      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -5701,8 +5045,6 @@
     },
     "node_modules/levn": {
       "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
-      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5715,8 +5057,6 @@
     },
     "node_modules/lie": {
       "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
-      "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5725,8 +5065,6 @@
     },
     "node_modules/lilconfig": {
       "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
-      "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -5738,8 +5076,6 @@
     },
     "node_modules/linkify-it": {
       "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": {
@@ -5789,14 +5125,10 @@
     },
     "node_modules/listener-tracker": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/listener-tracker/-/listener-tracker-2.0.0.tgz",
-      "integrity": "sha512-U6NLzBRyrAsJs9AAjuBYifXtNYnAIDPIp81rNpxNoypXBR7qi/LhsuUWX5399zuTg1sBEQyOnWDYFrBQ28vk/w==",
       "license": "Apache-2.0"
     },
     "node_modules/listr2": {
       "version": "8.2.5",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz",
-      "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5813,8 +5145,6 @@
     },
     "node_modules/locate-path": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5826,57 +5156,41 @@
     },
     "node_modules/lodash.includes": {
       "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
-      "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/lodash.isboolean": {
       "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
-      "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/lodash.isinteger": {
       "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
-      "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/lodash.isnumber": {
       "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
-      "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/lodash.isplainobject": {
       "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
-      "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/lodash.isstring": {
       "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
-      "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/lodash.merge": {
       "version": "4.6.2",
-      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
-      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/lodash.once": {
       "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
-      "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
       "dev": true,
       "license": "MIT"
     },
@@ -5889,8 +5203,6 @@
     },
     "node_modules/log-symbols": {
       "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
-      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5906,8 +5218,6 @@
     },
     "node_modules/log-update": {
       "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
-      "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5926,8 +5236,6 @@
     },
     "node_modules/log-update/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": {
@@ -5939,8 +5247,6 @@
     },
     "node_modules/log-update/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": {
@@ -5952,8 +5258,6 @@
     },
     "node_modules/log-update/node_modules/is-fullwidth-code-point": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
-      "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5968,8 +5272,6 @@
     },
     "node_modules/log-update/node_modules/slice-ansi": {
       "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
-      "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5985,8 +5287,6 @@
     },
     "node_modules/log-update/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": {
@@ -6001,14 +5301,10 @@
     },
     "node_modules/lru-cache": {
       "version": "10.4.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
-      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
       "license": "ISC"
     },
     "node_modules/magic-string": {
       "version": "0.30.17",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
-      "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
       "license": "MIT",
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.5.0"
@@ -6016,8 +5312,6 @@
     },
     "node_modules/markdown-it": {
       "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": {
@@ -6034,8 +5328,6 @@
     },
     "node_modules/markdown-it/node_modules/argparse": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
       "dev": true,
       "license": "Python-2.0"
     },
@@ -6072,58 +5364,18 @@
       "resolved": "packages/vscode",
       "link": true
     },
-    "node_modules/marko/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==",
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/marko/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/math-intrinsics": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
-      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
     "node_modules/mdurl": {
       "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"
     },
     "node_modules/merge-stream": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/merge2": {
       "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6132,8 +5384,6 @@
     },
     "node_modules/micromatch": {
       "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
-      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6146,8 +5396,6 @@
     },
     "node_modules/mime": {
       "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -6159,8 +5407,6 @@
     },
     "node_modules/mime-db": {
       "version": "1.52.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
       "license": "MIT",
       "engines": {
         "node": ">= 0.6"
@@ -6168,8 +5414,6 @@
     },
     "node_modules/mime-types": {
       "version": "2.1.35",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
       "license": "MIT",
       "dependencies": {
         "mime-db": "1.52.0"
@@ -6180,8 +5424,6 @@
     },
     "node_modules/mimic-fn": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
-      "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6193,8 +5435,6 @@
     },
     "node_modules/mimic-function": {
       "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
-      "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6206,8 +5446,6 @@
     },
     "node_modules/mimic-response": {
       "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
-      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -6219,22 +5457,20 @@
       }
     },
     "node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
+      "version": "9.0.5",
       "license": "ISC",
       "dependencies": {
-        "brace-expansion": "^1.1.7"
+        "brace-expansion": "^2.0.1"
       },
       "engines": {
-        "node": "*"
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
     "node_modules/minimist": {
       "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
-      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -6244,8 +5480,6 @@
     },
     "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": {
@@ -6261,8 +5495,6 @@
     },
     "node_modules/mkdirp-classic": {
       "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
-      "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
       "dev": true,
       "license": "MIT",
       "optional": true
@@ -6305,8 +5537,6 @@
     },
     "node_modules/mocha-snap": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/mocha-snap/-/mocha-snap-5.0.0.tgz",
-      "integrity": "sha512-tl0iQb2zkN1pE1vzQSSnuEyR8GkB/uECMdvK5dcXPEjC316K4bzNd36TgLEXadMyQDhy0ny6FZxChm6rJAs9+Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6315,25 +5545,11 @@
     },
     "node_modules/mocha/node_modules/argparse": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
       "dev": true,
       "license": "Python-2.0"
     },
-    "node_modules/mocha/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/mocha/node_modules/find-up": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6349,8 +5565,6 @@
     },
     "node_modules/mocha/node_modules/js-yaml": {
       "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6362,8 +5576,6 @@
     },
     "node_modules/mocha/node_modules/locate-path": {
       "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6378,8 +5590,6 @@
     },
     "node_modules/mocha/node_modules/minimatch": {
       "version": "5.1.6",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
-      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -6391,8 +5601,6 @@
     },
     "node_modules/mocha/node_modules/p-limit": {
       "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6407,8 +5615,6 @@
     },
     "node_modules/mocha/node_modules/p-locate": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6423,8 +5629,6 @@
     },
     "node_modules/mocha/node_modules/supports-color": {
       "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6439,8 +5643,6 @@
     },
     "node_modules/mri": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
-      "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6449,36 +5651,26 @@
     },
     "node_modules/ms": {
       "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
       "license": "MIT"
     },
     "node_modules/mute-stream": {
       "version": "0.0.8",
-      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
-      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
       "dev": true,
       "license": "ISC"
     },
     "node_modules/napi-build-utils": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
-      "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
+      "version": "1.0.2",
       "dev": true,
       "license": "MIT",
       "optional": true
     },
     "node_modules/natural-compare": {
       "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/node-abi": {
-      "version": "3.73.0",
-      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.73.0.tgz",
-      "integrity": "sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==",
+      "version": "3.71.0",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -6491,16 +5683,12 @@
     },
     "node_modules/node-addon-api": {
       "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
-      "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==",
       "dev": true,
       "license": "MIT",
       "optional": true
     },
     "node_modules/node-fetch": {
       "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
-      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6518,16 +5706,31 @@
         }
       }
     },
+    "node_modules/node-fetch/node_modules/tr46": {
+      "version": "0.0.3",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/node-fetch/node_modules/webidl-conversions": {
+      "version": "3.0.1",
+      "dev": true,
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/node-fetch/node_modules/whatwg-url": {
+      "version": "5.0.0",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
     "node_modules/node-releases": {
       "version": "2.0.19",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
-      "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
       "license": "MIT"
     },
     "node_modules/normalize-path": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6536,8 +5739,6 @@
     },
     "node_modules/npm-run-path": {
       "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
-      "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6552,8 +5753,6 @@
     },
     "node_modules/npm-run-path/node_modules/path-key": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
-      "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6565,8 +5764,6 @@
     },
     "node_modules/nth-check": {
       "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
-      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -6583,9 +5780,7 @@
       "license": "MIT"
     },
     "node_modules/object-inspect": {
-      "version": "1.13.3",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
-      "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
+      "version": "1.13.2",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6597,8 +5792,6 @@
     },
     "node_modules/once": {
       "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
       "dev": true,
       "license": "ISC",
       "optional": true,
@@ -6608,8 +5801,6 @@
     },
     "node_modules/onetime": {
       "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
-      "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6624,8 +5815,6 @@
     },
     "node_modules/open": {
       "version": "8.4.2",
-      "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
-      "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6642,8 +5831,6 @@
     },
     "node_modules/optionator": {
       "version": "0.9.4",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
-      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6660,8 +5847,6 @@
     },
     "node_modules/ora": {
       "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz",
-      "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6684,8 +5869,6 @@
     },
     "node_modules/ora/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": {
@@ -6696,9 +5879,7 @@
       }
     },
     "node_modules/ora/node_modules/chalk": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
-      "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+      "version": "5.3.0",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6710,8 +5891,6 @@
     },
     "node_modules/ora/node_modules/cli-cursor": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
-      "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6726,8 +5905,6 @@
     },
     "node_modules/ora/node_modules/is-unicode-supported": {
       "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
-      "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6739,8 +5916,6 @@
     },
     "node_modules/ora/node_modules/log-symbols": {
       "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz",
-      "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6756,8 +5931,6 @@
     },
     "node_modules/ora/node_modules/mimic-fn": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6766,8 +5939,6 @@
     },
     "node_modules/ora/node_modules/onetime": {
       "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6782,8 +5953,6 @@
     },
     "node_modules/ora/node_modules/restore-cursor": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
-      "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6799,15 +5968,11 @@
     },
     "node_modules/ora/node_modules/signal-exit": {
       "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
       "dev": true,
       "license": "ISC"
     },
     "node_modules/ora/node_modules/string-width": {
       "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz",
-      "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6824,8 +5989,6 @@
     },
     "node_modules/ora/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": {
@@ -6840,8 +6003,6 @@
     },
     "node_modules/os-tmpdir": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6857,8 +6018,6 @@
     },
     "node_modules/ovsx": {
       "version": "0.10.1",
-      "resolved": "https://registry.npmjs.org/ovsx/-/ovsx-0.10.1.tgz",
-      "integrity": "sha512-8i7+MJMMeq73m1zPEIClSFe17SNuuzU5br7G77ZIfOC24elB4pGQs0N1qRd+gnnbyhL5Qu96G21nFOVOBa2OBg==",
       "dev": true,
       "license": "EPL-2.0",
       "dependencies": {
@@ -6880,8 +6039,6 @@
     },
     "node_modules/ovsx/node_modules/commander": {
       "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
-      "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6890,8 +6047,6 @@
     },
     "node_modules/ovsx/node_modules/tmp": {
       "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
-      "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6899,9 +6054,7 @@
       }
     },
     "node_modules/ovsx/node_modules/yauzl": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz",
-      "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==",
+      "version": "3.1.3",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6914,8 +6067,6 @@
     },
     "node_modules/p-filter": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz",
-      "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6927,8 +6078,6 @@
     },
     "node_modules/p-limit": {
       "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6943,8 +6092,6 @@
     },
     "node_modules/p-locate": {
       "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6956,8 +6103,6 @@
     },
     "node_modules/p-map": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
-      "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6966,8 +6111,6 @@
     },
     "node_modules/p-try": {
       "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -6976,29 +6119,21 @@
     },
     "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/package-manager-detector": {
-      "version": "0.2.9",
-      "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.9.tgz",
-      "integrity": "sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==",
+      "version": "0.2.2",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/pako": {
       "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
-      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
       "dev": true,
       "license": "(MIT AND Zlib)"
     },
     "node_modules/parent-module": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7010,8 +6145,6 @@
     },
     "node_modules/parse-semver": {
       "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz",
-      "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7020,8 +6153,6 @@
     },
     "node_modules/parse-semver/node_modules/semver": {
       "version": "5.7.2",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
-      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
       "dev": true,
       "license": "ISC",
       "bin": {
@@ -7030,8 +6161,6 @@
     },
     "node_modules/parse5": {
       "version": "7.2.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz",
-      "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==",
       "license": "MIT",
       "dependencies": {
         "entities": "^4.5.0"
@@ -7042,8 +6171,6 @@
     },
     "node_modules/parse5-htmlparser2-tree-adapter": {
       "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
-      "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7056,8 +6183,6 @@
     },
     "node_modules/parse5-parser-stream": {
       "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
-      "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7067,10 +6192,12 @@
         "url": "https://github.com/inikulin/parse5?sponsor=1"
       }
     },
+    "node_modules/path-browserify": {
+      "version": "1.0.1",
+      "license": "MIT"
+    },
     "node_modules/path-exists": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -7079,8 +6206,6 @@
     },
     "node_modules/path-key": {
       "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -7088,26 +6213,30 @@
       }
     },
     "node_modules/path-scurry": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
-      "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+      "version": "2.0.0",
       "dev": true,
       "license": "BlueOak-1.0.0",
       "dependencies": {
-        "lru-cache": "^10.2.0",
-        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+        "lru-cache": "^11.0.0",
+        "minipass": "^7.1.2"
       },
       "engines": {
-        "node": ">=16 || 14 >=14.18"
+        "node": "20 || >=22"
       },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/path-scurry/node_modules/lru-cache": {
+      "version": "11.0.1",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": "20 || >=22"
+      }
+    },
     "node_modules/path-type": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -7116,21 +6245,15 @@
     },
     "node_modules/pend": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/picocolors": {
       "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
-      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
       "license": "ISC"
     },
     "node_modules/picomatch": {
       "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -7142,8 +6265,6 @@
     },
     "node_modules/pidtree": {
       "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
-      "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -7155,8 +6276,6 @@
     },
     "node_modules/pify": {
       "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -7164,9 +6283,7 @@
       }
     },
     "node_modules/prebuild-install": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
-      "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
+      "version": "7.1.2",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -7176,7 +6293,7 @@
         "github-from-package": "0.0.0",
         "minimist": "^1.2.3",
         "mkdirp-classic": "^0.5.3",
-        "napi-build-utils": "^2.0.0",
+        "napi-build-utils": "^1.0.1",
         "node-abi": "^3.3.0",
         "pump": "^3.0.0",
         "rc": "^1.2.7",
@@ -7193,8 +6310,6 @@
     },
     "node_modules/prelude-ls": {
       "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -7203,8 +6318,6 @@
     },
     "node_modules/prettier": {
       "version": "3.4.2",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
-      "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
       "license": "MIT",
       "bin": {
         "prettier": "bin/prettier.cjs"
@@ -7218,8 +6331,6 @@
     },
     "node_modules/prettier-plugin-marko": {
       "version": "3.1.12",
-      "resolved": "https://registry.npmjs.org/prettier-plugin-marko/-/prettier-plugin-marko-3.1.12.tgz",
-      "integrity": "sha512-hTC8s+mzvR91TmtAIUe94LkIwcyjCxyoNNN7PzHHLpFOG3zo2zbN2U6KgkI3/BaUEliH/vCRnwK1BKwuNpDmpg==",
       "license": "MIT",
       "peerDependencies": {
         "@marko/compiler": "^5",
@@ -7228,15 +6339,11 @@
     },
     "node_modules/process-nextick-args": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/pump": {
       "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
-      "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -7247,8 +6354,6 @@
     },
     "node_modules/punycode": {
       "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
-      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
       "license": "MIT",
       "engines": {
         "node": ">=6"
@@ -7256,8 +6361,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": {
@@ -7265,13 +6368,11 @@
       }
     },
     "node_modules/qs": {
-      "version": "6.14.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
-      "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+      "version": "6.13.0",
       "dev": true,
       "license": "BSD-3-Clause",
       "dependencies": {
-        "side-channel": "^1.1.0"
+        "side-channel": "^1.0.6"
       },
       "engines": {
         "node": ">=0.6"
@@ -7282,8 +6383,6 @@
     },
     "node_modules/queue-microtask": {
       "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
       "dev": true,
       "funding": [
         {
@@ -7303,8 +6402,6 @@
     },
     "node_modules/randombytes": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7313,26 +6410,18 @@
     },
     "node_modules/raptor-async": {
       "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/raptor-async/-/raptor-async-1.1.3.tgz",
-      "integrity": "sha512-VZCxygWMjW9lKqnApK9D2QbfyzRn7ehiTqnXWwMCLBXANSy+xbnYfbX/5f8YX3bZXu+g+JESmqWPchIQrZj2ig==",
       "license": "Apache License v2.0"
     },
     "node_modules/raptor-regexp": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/raptor-regexp/-/raptor-regexp-1.0.1.tgz",
-      "integrity": "sha512-DqC7ViHJUs3jLIxJI1/HVvCu3yPJaP8CM7PGsHvjimg7yJ3lLOdCBxlPE0G2Q8OJgUA8Pe7nvhm6lcQ3hZepow==",
       "license": "Apache License v2.0"
     },
     "node_modules/raptor-util": {
       "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-3.2.0.tgz",
-      "integrity": "sha512-uEDMMkBCJvjTqYMBnJNxn+neiS6a0rhybQNA9RaexGor1uvKjwyHA5VcbZMZEuqXhKUWbL+WNS7PhuZVZNB7pw==",
       "license": "Apache-2.0"
     },
     "node_modules/rc": {
       "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
-      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
       "dev": true,
       "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
       "optional": true,
@@ -7348,8 +6437,6 @@
     },
     "node_modules/rc/node_modules/strip-json-comments": {
       "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -7359,8 +6446,6 @@
     },
     "node_modules/read": {
       "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
-      "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -7372,8 +6457,6 @@
     },
     "node_modules/read-yaml-file": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz",
-      "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7388,8 +6471,6 @@
     },
     "node_modules/readable-stream": {
       "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
-      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7402,17 +6483,18 @@
         "util-deprecate": "~1.0.1"
       }
     },
+    "node_modules/readable-stream/node_modules/isarray": {
+      "version": "1.0.0",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/readable-stream/node_modules/safe-buffer": {
       "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/readdirp": {
       "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7424,14 +6506,14 @@
     },
     "node_modules/regenerator-runtime": {
       "version": "0.14.1",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
-      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
       "license": "MIT"
     },
     "node_modules/relative-import-path": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/relative-import-path/-/relative-import-path-1.0.0.tgz",
-      "integrity": "sha512-ZvbtoduKQmD4PZeJPfH6Ql21qUWhaMxiHkIsH+FUnZqKDwNIXBtGg5zRZyHWomiGYk8n5+KMBPK7Mi4D0XWfNg==",
+      "license": "MIT"
+    },
+    "node_modules/request-light": {
+      "version": "0.7.0",
       "license": "MIT"
     },
     "node_modules/require-directory": {
@@ -7446,8 +6528,6 @@
     },
     "node_modules/resolve-from": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
       "license": "MIT",
       "engines": {
         "node": ">=8"
@@ -7455,8 +6535,6 @@
     },
     "node_modules/resolve-pkg-maps": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
-      "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
       "dev": true,
       "license": "MIT",
       "funding": {
@@ -7465,8 +6543,6 @@
     },
     "node_modules/restore-cursor": {
       "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
-      "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7482,8 +6558,6 @@
     },
     "node_modules/restore-cursor/node_modules/onetime": {
       "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
-      "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7498,8 +6572,6 @@
     },
     "node_modules/reusify": {
       "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -7509,8 +6581,6 @@
     },
     "node_modules/rfdc": {
       "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
-      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
       "dev": true,
       "license": "MIT"
     },
@@ -7522,8 +6592,6 @@
     },
     "node_modules/run-parallel": {
       "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
-      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
       "dev": true,
       "funding": [
         {
@@ -7546,8 +6614,6 @@
     },
     "node_modules/safe-buffer": {
       "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
       "dev": true,
       "funding": [
         {
@@ -7567,21 +6633,15 @@
     },
     "node_modules/safer-buffer": {
       "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
       "license": "MIT"
     },
     "node_modules/sax": {
       "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
-      "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
       "dev": true,
       "license": "ISC"
     },
     "node_modules/saxes": {
       "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
-      "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
       "license": "ISC",
       "dependencies": {
         "xmlchars": "^2.2.0"
@@ -7592,18 +6652,13 @@
     },
     "node_modules/self-closing-tags": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/self-closing-tags/-/self-closing-tags-1.0.1.tgz",
-      "integrity": "sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA==",
       "license": "MIT",
       "engines": {
         "node": ">=0.12.0"
       }
     },
     "node_modules/semver": {
-      "version": "7.7.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz",
-      "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==",
-      "dev": true,
+      "version": "7.6.3",
       "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
@@ -7614,25 +6669,35 @@
     },
     "node_modules/serialize-javascript": {
       "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
-      "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
       "dev": true,
       "license": "BSD-3-Clause",
       "dependencies": {
         "randombytes": "^2.1.0"
       }
     },
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/setimmediate": {
       "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
-      "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/shebang-command": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7644,8 +6709,6 @@
     },
     "node_modules/shebang-regex": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -7653,73 +6716,14 @@
       }
     },
     "node_modules/side-channel": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
-      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "object-inspect": "^1.13.3",
-        "side-channel-list": "^1.0.0",
-        "side-channel-map": "^1.0.1",
-        "side-channel-weakmap": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-list": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
-      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "object-inspect": "^1.13.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-map": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
-      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "call-bound": "^1.0.2",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.5",
-        "object-inspect": "^1.13.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-weakmap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
-      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+      "version": "1.0.6",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "call-bound": "^1.0.2",
+        "call-bind": "^1.0.7",
         "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.5",
-        "object-inspect": "^1.13.3",
-        "side-channel-map": "^1.0.1"
+        "get-intrinsic": "^1.2.4",
+        "object-inspect": "^1.13.1"
       },
       "engines": {
         "node": ">= 0.4"
@@ -7730,8 +6734,6 @@
     },
     "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": {
@@ -7743,8 +6745,6 @@
     },
     "node_modules/simple-concat": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
-      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
       "dev": true,
       "funding": [
         {
@@ -7765,8 +6765,6 @@
     },
     "node_modules/simple-get": {
       "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
-      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
       "dev": true,
       "funding": [
         {
@@ -7792,8 +6790,6 @@
     },
     "node_modules/slash": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -7802,8 +6798,6 @@
     },
     "node_modules/slice-ansi": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
-      "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7819,8 +6813,6 @@
     },
     "node_modules/slice-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": {
@@ -7832,8 +6824,6 @@
     },
     "node_modules/source-map": {
       "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
       "license": "BSD-3-Clause",
       "engines": {
         "node": ">=0.10.0"
@@ -7841,8 +6831,6 @@
     },
     "node_modules/source-map-support": {
       "version": "0.5.21",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
-      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
       "license": "MIT",
       "dependencies": {
         "buffer-from": "^1.0.0",
@@ -7851,8 +6839,6 @@
     },
     "node_modules/spawndamnit": {
       "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz",
-      "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==",
       "dev": true,
       "license": "SEE LICENSE IN LICENSE",
       "dependencies": {
@@ -7862,21 +6848,15 @@
     },
     "node_modules/sprintf-js": {
       "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
       "dev": true,
       "license": "BSD-3-Clause"
     },
     "node_modules/stackframe": {
       "version": "1.3.4",
-      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
-      "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
       "license": "MIT"
     },
     "node_modules/stdin-discarder": {
       "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz",
-      "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7891,8 +6871,6 @@
     },
     "node_modules/stoppable": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz",
-      "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -7902,8 +6880,6 @@
     },
     "node_modules/string_decoder": {
       "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7912,15 +6888,11 @@
     },
     "node_modules/string_decoder/node_modules/safe-buffer": {
       "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/string-argv": {
       "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
-      "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -7929,8 +6901,6 @@
     },
     "node_modules/string-width": {
       "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
-      "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7948,8 +6918,6 @@
     "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": {
@@ -7963,15 +6931,11 @@
     },
     "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/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": {
@@ -7980,8 +6944,6 @@
     },
     "node_modules/string-width/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": {
@@ -7993,8 +6955,6 @@
     },
     "node_modules/string-width/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": {
@@ -8009,8 +6969,6 @@
     },
     "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": {
@@ -8023,8 +6981,6 @@
     "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": {
@@ -8036,8 +6992,6 @@
     },
     "node_modules/strip-bom": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -8046,8 +7000,6 @@
     },
     "node_modules/strip-final-newline": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
-      "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -8059,8 +7011,6 @@
     },
     "node_modules/strip-json-comments": {
       "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -8072,8 +7022,6 @@
     },
     "node_modules/supports-color": {
       "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8085,14 +7033,10 @@
     },
     "node_modules/symbol-tree": {
       "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
-      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
       "license": "MIT"
     },
     "node_modules/tar-fs": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz",
-      "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==",
+      "version": "2.1.1",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -8105,8 +7049,6 @@
     },
     "node_modules/tar-stream": {
       "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
-      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -8123,8 +7065,6 @@
     },
     "node_modules/tar-stream/node_modules/bl": {
       "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
-      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -8136,8 +7076,6 @@
     },
     "node_modules/tar-stream/node_modules/buffer": {
       "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
-      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
       "dev": true,
       "funding": [
         {
@@ -8162,8 +7100,6 @@
     },
     "node_modules/tar-stream/node_modules/readable-stream": {
       "version": "3.6.2",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
-      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
       "dev": true,
       "license": "MIT",
       "optional": true,
@@ -8178,8 +7114,6 @@
     },
     "node_modules/term-size": {
       "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
-      "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -8190,27 +7124,21 @@
       }
     },
     "node_modules/tldts": {
-      "version": "6.1.75",
-      "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.75.tgz",
-      "integrity": "sha512-+lFzEXhpl7JXgWYaXcB6DqTYXbUArvrWAE/5ioq/X3CdWLbDjpPP4XTrQBmEJ91y3xbe4Fkw7Lxv4P3GWeJaNg==",
+      "version": "6.1.57",
       "license": "MIT",
       "dependencies": {
-        "tldts-core": "^6.1.75"
+        "tldts-core": "^6.1.57"
       },
       "bin": {
         "tldts": "bin/cli.js"
       }
     },
     "node_modules/tldts-core": {
-      "version": "6.1.75",
-      "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.75.tgz",
-      "integrity": "sha512-AOvV5YYIAFFBfransBzSTyztkc3IMfz5Eq3YluaRiEu55nn43Fzaufx70UqEKYr8BoLCach4q8g/bg6e5+/aFw==",
+      "version": "6.1.57",
       "license": "MIT"
     },
     "node_modules/tmp": {
       "version": "0.0.33",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
-      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8222,8 +7150,6 @@
     },
     "node_modules/to-regex-range": {
       "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8234,9 +7160,7 @@
       }
     },
     "node_modules/tough-cookie": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.0.tgz",
-      "integrity": "sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==",
+      "version": "5.0.0",
       "license": "BSD-3-Clause",
       "dependencies": {
         "tldts": "^6.1.32"
@@ -8246,11 +7170,14 @@
       }
     },
     "node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
-      "dev": true,
-      "license": "MIT"
+      "version": "5.0.0",
+      "license": "MIT",
+      "dependencies": {
+        "punycode": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=18"
+      }
     },
     "node_modules/ts-api-utils": {
       "version": "2.0.0",
@@ -8266,16 +7193,12 @@
       }
     },
     "node_modules/tslib": {
-      "version": "2.8.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
-      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "version": "2.8.0",
       "dev": true,
       "license": "0BSD"
     },
     "node_modules/tsx": {
       "version": "4.19.2",
-      "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz",
-      "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8702,8 +7625,6 @@
     },
     "node_modules/tsx/node_modules/esbuild": {
       "version": "0.23.1",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz",
-      "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==",
       "dev": true,
       "hasInstallScript": true,
       "license": "MIT",
@@ -8742,8 +7663,6 @@
     },
     "node_modules/tunnel": {
       "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
-      "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -8752,8 +7671,6 @@
     },
     "node_modules/tunnel-agent": {
       "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
       "dev": true,
       "license": "Apache-2.0",
       "optional": true,
@@ -8766,8 +7683,6 @@
     },
     "node_modules/type-check": {
       "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
-      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8779,8 +7694,6 @@
     },
     "node_modules/type-detect": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
-      "integrity": "sha512-f9Uv6ezcpvCQjJU0Zqbg+65qdcszv3qUQsZfjdRbWiZ7AMenrX1u0lNk9EoWWX6e1F+NULyg27mtdeZ5WhpljA==",
       "license": "MIT",
       "engines": {
         "node": "*"
@@ -8788,8 +7701,6 @@
     },
     "node_modules/typed-rest-client": {
       "version": "1.8.11",
-      "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz",
-      "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8798,6 +7709,10 @@
         "underscore": "^1.12.1"
       }
     },
+    "node_modules/typesafe-path": {
+      "version": "0.2.2",
+      "license": "MIT"
+    },
     "node_modules/typescript": {
       "version": "5.7.3",
       "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
@@ -8811,6 +7726,13 @@
         "node": ">=14.17"
       }
     },
+    "node_modules/typescript-auto-import-cache": {
+      "version": "0.3.3",
+      "license": "MIT",
+      "dependencies": {
+        "semver": "^7.3.8"
+      }
+    },
     "node_modules/typescript-eslint": {
       "version": "8.22.0",
       "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.22.0.tgz",
@@ -8836,22 +7758,16 @@
     },
     "node_modules/uc.micro": {
       "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"
     },
     "node_modules/underscore": {
       "version": "1.13.7",
-      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz",
-      "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/undici": {
-      "version": "6.21.1",
-      "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.1.tgz",
-      "integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==",
+      "version": "6.20.1",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -8860,15 +7776,11 @@
     },
     "node_modules/undici-types": {
       "version": "6.20.0",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
-      "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/universalify": {
       "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -8876,9 +7788,7 @@
       }
     },
     "node_modules/update-browserslist-db": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
-      "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+      "version": "1.1.1",
       "funding": [
         {
           "type": "opencollective",
@@ -8896,7 +7806,7 @@
       "license": "MIT",
       "dependencies": {
         "escalade": "^3.2.0",
-        "picocolors": "^1.1.1"
+        "picocolors": "^1.1.0"
       },
       "bin": {
         "update-browserslist-db": "cli.js"
@@ -8907,8 +7817,6 @@
     },
     "node_modules/uri-js": {
       "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -8917,32 +7825,130 @@
     },
     "node_modules/url-join": {
       "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
-      "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/util-deprecate": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/uuid": {
       "version": "8.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
       "dev": true,
       "license": "MIT",
       "bin": {
         "uuid": "dist/bin/uuid"
       }
     },
+    "node_modules/volar-service-css": {
+      "version": "0.0.62",
+      "license": "MIT",
+      "dependencies": {
+        "vscode-css-languageservice": "^6.3.0",
+        "vscode-languageserver-textdocument": "^1.0.11",
+        "vscode-uri": "^3.0.8"
+      },
+      "peerDependencies": {
+        "@volar/language-service": "~2.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@volar/language-service": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/volar-service-emmet": {
+      "version": "0.0.62",
+      "license": "MIT",
+      "dependencies": {
+        "@emmetio/css-parser": "^0.4.0",
+        "@emmetio/html-matcher": "^1.3.0",
+        "@vscode/emmet-helper": "^2.9.3",
+        "vscode-uri": "^3.0.8"
+      },
+      "peerDependencies": {
+        "@volar/language-service": "~2.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@volar/language-service": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/volar-service-html": {
+      "version": "0.0.62",
+      "license": "MIT",
+      "dependencies": {
+        "vscode-html-languageservice": "^5.3.0",
+        "vscode-languageserver-textdocument": "^1.0.11",
+        "vscode-uri": "^3.0.8"
+      },
+      "peerDependencies": {
+        "@volar/language-service": "~2.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@volar/language-service": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/volar-service-prettier": {
+      "version": "0.0.62",
+      "license": "MIT",
+      "dependencies": {
+        "vscode-uri": "^3.0.8"
+      },
+      "peerDependencies": {
+        "@volar/language-service": "~2.4.0",
+        "prettier": "^2.2 || ^3.0"
+      },
+      "peerDependenciesMeta": {
+        "@volar/language-service": {
+          "optional": true
+        },
+        "prettier": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/volar-service-typescript": {
+      "version": "0.0.62",
+      "license": "MIT",
+      "dependencies": {
+        "path-browserify": "^1.0.1",
+        "semver": "^7.6.2",
+        "typescript-auto-import-cache": "^0.3.3",
+        "vscode-languageserver-textdocument": "^1.0.11",
+        "vscode-nls": "^5.2.0",
+        "vscode-uri": "^3.0.8"
+      },
+      "peerDependencies": {
+        "@volar/language-service": "~2.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@volar/language-service": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/volar-service-typescript-twoslash-queries": {
+      "version": "0.0.62",
+      "license": "MIT",
+      "dependencies": {
+        "vscode-uri": "^3.0.8"
+      },
+      "peerDependencies": {
+        "@volar/language-service": "~2.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@volar/language-service": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/vscode-css-languageservice": {
       "version": "6.3.2",
-      "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.2.tgz",
-      "integrity": "sha512-GEpPxrUTAeXWdZWHev1OJU9lz2Q2/PPBxQ2TIRmLGvQiH3WZbqaNoute0n0ewxlgtjzTW3AKZT+NHySk5Rf4Eg==",
       "license": "MIT",
       "dependencies": {
         "@vscode/l10n": "^0.0.18",
@@ -8951,10 +7957,18 @@
         "vscode-uri": "^3.0.8"
       }
     },
+    "node_modules/vscode-html-languageservice": {
+      "version": "5.3.1",
+      "license": "MIT",
+      "dependencies": {
+        "@vscode/l10n": "^0.0.18",
+        "vscode-languageserver-textdocument": "^1.0.12",
+        "vscode-languageserver-types": "^3.17.5",
+        "vscode-uri": "^3.0.8"
+      }
+    },
     "node_modules/vscode-jsonrpc": {
       "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
-      "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==",
       "license": "MIT",
       "engines": {
         "node": ">=14.0.0"
@@ -8962,8 +7976,6 @@
     },
     "node_modules/vscode-languageclient": {
       "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz",
-      "integrity": "sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8975,20 +7987,8 @@
         "vscode": "^1.82.0"
       }
     },
-    "node_modules/vscode-languageclient/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-languageclient/node_modules/minimatch": {
       "version": "5.1.6",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
-      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -9000,8 +8000,6 @@
     },
     "node_modules/vscode-languageserver": {
       "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz",
-      "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==",
       "license": "MIT",
       "dependencies": {
         "vscode-languageserver-protocol": "3.17.5"
@@ -9012,8 +8010,6 @@
     },
     "node_modules/vscode-languageserver-protocol": {
       "version": "3.17.5",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz",
-      "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",
       "license": "MIT",
       "dependencies": {
         "vscode-jsonrpc": "8.2.0",
@@ -9022,26 +8018,22 @@
     },
     "node_modules/vscode-languageserver-textdocument": {
       "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz",
-      "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==",
       "license": "MIT"
     },
     "node_modules/vscode-languageserver-types": {
       "version": "3.17.5",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
-      "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==",
+      "license": "MIT"
+    },
+    "node_modules/vscode-nls": {
+      "version": "5.2.0",
       "license": "MIT"
     },
     "node_modules/vscode-uri": {
       "version": "3.0.8",
-      "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz",
-      "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==",
       "license": "MIT"
     },
     "node_modules/w3c-xmlserializer": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
-      "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
       "license": "MIT",
       "dependencies": {
         "xml-name-validator": "^5.0.0"
@@ -9052,21 +8044,17 @@
     },
     "node_modules/warp10": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/warp10/-/warp10-2.1.0.tgz",
-      "integrity": "sha512-krhkqzJdUxAZv2Cx0Gz6dN1r7TTrG9RDewkDHBbJQIqbNTCdB5ZUHVh7VkA4DgrKW4ZXPPUQKCwmI/3btDse9A==",
       "license": "MIT"
     },
     "node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
-      "dev": true,
-      "license": "BSD-2-Clause"
+      "version": "7.0.0",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=12"
+      }
     },
     "node_modules/whatwg-encoding": {
       "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
-      "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
       "license": "MIT",
       "dependencies": {
         "iconv-lite": "0.6.3"
@@ -9077,8 +8065,6 @@
     },
     "node_modules/whatwg-encoding/node_modules/iconv-lite": {
       "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
       "license": "MIT",
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3.0.0"
@@ -9089,28 +8075,26 @@
     },
     "node_modules/whatwg-mimetype": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
-      "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
       "license": "MIT",
       "engines": {
         "node": ">=18"
       }
     },
     "node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-      "dev": true,
+      "version": "14.1.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz",
+      "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==",
       "license": "MIT",
       "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
+        "tr46": "^5.0.0",
+        "webidl-conversions": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=18"
       }
     },
     "node_modules/which": {
       "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -9125,8 +8109,6 @@
     },
     "node_modules/word-wrap": {
       "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
-      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -9135,15 +8117,11 @@
     },
     "node_modules/workerpool": {
       "version": "6.5.1",
-      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz",
-      "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==",
       "dev": true,
       "license": "Apache-2.0"
     },
     "node_modules/wrap-ansi": {
       "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
-      "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -9161,8 +8139,6 @@
     "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": {
@@ -9179,15 +8155,11 @@
     },
     "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/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": {
@@ -9196,8 +8168,6 @@
     },
     "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": {
@@ -9211,8 +8181,6 @@
     },
     "node_modules/wrap-ansi/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": {
@@ -9224,8 +8192,6 @@
     },
     "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": {
@@ -9237,8 +8203,6 @@
     },
     "node_modules/wrap-ansi/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": {
@@ -9253,16 +8217,12 @@
     },
     "node_modules/wrappy": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
       "dev": true,
       "license": "ISC",
       "optional": true
     },
     "node_modules/ws": {
       "version": "8.18.0",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
-      "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
       "license": "MIT",
       "engines": {
         "node": ">=10.0.0"
@@ -9282,8 +8242,6 @@
     },
     "node_modules/xml-name-validator": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
-      "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
       "license": "Apache-2.0",
       "engines": {
         "node": ">=18"
@@ -9291,8 +8249,6 @@
     },
     "node_modules/xml2js": {
       "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
-      "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -9305,8 +8261,6 @@
     },
     "node_modules/xmlbuilder": {
       "version": "11.0.1",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
-      "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -9315,8 +8269,6 @@
     },
     "node_modules/xmlchars": {
       "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
-      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
       "license": "MIT"
     },
     "node_modules/y18n": {
@@ -9331,8 +8283,6 @@
     },
     "node_modules/yallist": {
       "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
       "license": "ISC"
     },
     "node_modules/yaml": {
@@ -9379,8 +8329,6 @@
     },
     "node_modules/yargs-unparser": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
-      "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -9427,8 +8375,6 @@
     },
     "node_modules/yauzl": {
       "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
-      "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -9438,8 +8384,6 @@
     },
     "node_modules/yazl": {
       "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz",
-      "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -9448,8 +8392,6 @@
     },
     "node_modules/yocto-queue": {
       "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
-      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -9468,6 +8410,12 @@
         "@marko/babel-utils": "^6.6.3",
         "@marko/compiler": "^5.39.11",
         "@marko/language-tools": "^2.5.14",
+        "@volar/kit": "^2.4.5",
+        "@volar/language-core": "^2.4.5",
+        "@volar/language-server": "^2.4.5",
+        "@volar/language-service": "^2.4.5",
+        "@volar/test-utils": "^2.4.5",
+        "@volar/typescript": "^2.4.5",
         "axe-core": "^4.10.2",
         "htmljs-parser": "^5.5.3",
         "jsdom": "^26.0.0",
@@ -9476,6 +8424,12 @@
         "prettier-plugin-marko": "^3.1.12",
         "relative-import-path": "^1.0.0",
         "typescript": "^5.7.3",
+        "volar-service-css": "^0.0.62",
+        "volar-service-emmet": "^0.0.62",
+        "volar-service-html": "^0.0.62",
+        "volar-service-prettier": "^0.0.62",
+        "volar-service-typescript": "^0.0.62",
+        "volar-service-typescript-twoslash-queries": "^0.0.62",
         "vscode-css-languageservice": "^6.3.2",
         "vscode-languageserver": "^9.0.1",
         "vscode-languageserver-textdocument": "^1.0.12",
@@ -9539,6 +8493,8 @@
       "devDependencies": {
         "@marko/language-server": "^1.4.15",
         "@types/vscode": "^1.80.0",
+        "@volar/language-server": "^2.4.5",
+        "@volar/vscode": "^2.4.5",
         "@vscode/test-electron": "^2.4.1",
         "@vscode/vsce": "^3.2.2",
         "ovsx": "^0.10.1",
diff --git a/packages/language-server/package.json b/packages/language-server/package.json
index 44af6878..61d76300 100644
--- a/packages/language-server/package.json
+++ b/packages/language-server/package.json
@@ -17,6 +17,18 @@
     "prettier-plugin-marko": "^3.1.12",
     "relative-import-path": "^1.0.0",
     "typescript": "^5.7.3",
+    "@volar/kit": "^2.4.5",
+    "@volar/language-core": "^2.4.5",
+    "@volar/language-server": "^2.4.5",
+    "@volar/language-service": "^2.4.5",
+    "@volar/typescript": "^2.4.5",
+    "@volar/test-utils": "^2.4.5",
+    "volar-service-css": "^0.0.62",
+    "volar-service-emmet": "^0.0.62",
+    "volar-service-html": "^0.0.62",
+    "volar-service-prettier": "^0.0.62",
+    "volar-service-typescript": "^0.0.62",
+    "volar-service-typescript-twoslash-queries": "^0.0.62",
     "vscode-css-languageservice": "^6.3.2",
     "vscode-languageserver": "^9.0.1",
     "vscode-languageserver-textdocument": "^1.0.12",
diff --git a/packages/language-server/src/__tests__/index.test.ts b/packages/language-server/src/__tests__/index.test.ts
index 43b7180a..8c6bfdf8 100644
--- a/packages/language-server/src/__tests__/index.test.ts
+++ b/packages/language-server/src/__tests__/index.test.ts
@@ -2,13 +2,12 @@ import { Project } from "@marko/language-tools";
 import fs from "fs";
 import snapshot from "mocha-snap";
 import path from "path";
-import { CancellationToken, Position } from "vscode-languageserver";
-import { TextDocument } from "vscode-languageserver-textdocument";
+import { Position } from "vscode-languageserver";
 // import { bench, run } from "mitata";
-import { URI } from "vscode-uri";
+import { TextDocument } from "vscode-languageserver-textdocument";
 
-import MarkoLangaugeService, { documents } from "../service";
 import { codeFrame } from "./util/code-frame";
+import { getLanguageServer } from "./util/language-service";
 
 Project.setDefaultTypePaths({
   internalTypesFile: require.resolve(
@@ -21,38 +20,33 @@ Project.setDefaultTypePaths({
 // const BENCHED = new Set<string>();
 const FIXTURE_DIR = path.join(__dirname, "fixtures");
 
+after(async () => {
+  const handle = await getLanguageServer();
+  await handle.shutdown();
+});
+
 for (const subdir of fs.readdirSync(FIXTURE_DIR)) {
   const fixtureSubdir = path.join(FIXTURE_DIR, subdir);
 
   if (!fs.statSync(fixtureSubdir).isDirectory()) continue;
   for (const entry of fs.readdirSync(fixtureSubdir)) {
     it(entry, async () => {
+      const serverHandle = await getLanguageServer();
+
       const fixtureDir = path.join(fixtureSubdir, entry);
 
       for (const filename of loadMarkoFiles(fixtureDir)) {
-        const doc = documents.get(URI.file(filename).toString())!;
+        const doc = await serverHandle.openTextDocument(filename, "marko");
         const code = doc.getText();
-        const params = {
-          textDocument: {
-            uri: doc.uri,
-            languageId: doc.languageId,
-            version: doc.version,
-            text: code,
-          },
-        } as const;
-        documents.doOpen(params);
 
         let results = "";
 
         for (const position of getHovers(doc)) {
-          const hoverInfo = await MarkoLangaugeService.doHover(
-            doc,
-            {
-              position,
-              textDocument: doc,
-            },
-            CancellationToken.None,
+          const hoverInfo = await serverHandle.sendHoverRequest(
+            doc.uri,
+            position,
           );
+
           const loc = { start: position, end: position };
 
           let message = "";
@@ -87,9 +81,9 @@ for (const subdir of fs.readdirSync(FIXTURE_DIR)) {
               language: string;
               content: string;
             }
-          | undefined = await MarkoLangaugeService.commands[
-          "$/showScriptOutput"
-        ](doc.uri);
+          | undefined = await serverHandle.sendExecuteCommandRequest(
+          "marko.debug.showScriptOutput",
+        );
         if (scriptOutput) {
           await snapshot(scriptOutput.content, {
             file: path.relative(
@@ -108,8 +102,8 @@ for (const subdir of fs.readdirSync(FIXTURE_DIR)) {
               language: string;
               content: string;
             }
-          | undefined = await MarkoLangaugeService.commands["$/showHtmlOutput"](
-          doc.uri,
+          | undefined = await serverHandle.sendExecuteCommandRequest(
+          "marko.debug.showHtmlOutput",
         );
         if (htmlOutput) {
           await snapshot(htmlOutput.content, {
@@ -121,12 +115,23 @@ for (const subdir of fs.readdirSync(FIXTURE_DIR)) {
           });
         }
 
-        const errors = await MarkoLangaugeService.doValidate(doc);
-
-        if (errors && errors.length) {
+        const diagnosticReport =
+          await serverHandle.sendDocumentDiagnosticRequest(doc.uri);
+        if (
+          diagnosticReport.kind === "full" &&
+          diagnosticReport.items &&
+          diagnosticReport.items.length
+        ) {
           results += "## Diagnostics\n";
 
-          for (const error of errors) {
+          diagnosticReport.items.sort((a, b) => {
+            const lineDiff = a.range.start.line - b.range.start.line;
+            if (lineDiff === 0) {
+              return a.range.start.character - b.range.start.character;
+            }
+            return lineDiff;
+          });
+          for (const error of diagnosticReport.items) {
             const loc = {
               start: error.range.start,
               end: error.range.end,
@@ -137,7 +142,7 @@ for (const subdir of fs.readdirSync(FIXTURE_DIR)) {
           }
         }
 
-        documents.doClose(params);
+        await serverHandle.closeTextDocument(doc.uri);
 
         await snapshot(results, {
           file: path.relative(fixtureDir, filename.replace(/\.marko$/, ".md")),
diff --git a/packages/language-server/src/__tests__/util/language-service.ts b/packages/language-server/src/__tests__/util/language-service.ts
index b8c5fc4a..44bcec2b 100644
--- a/packages/language-server/src/__tests__/util/language-service.ts
+++ b/packages/language-server/src/__tests__/util/language-service.ts
@@ -1,34 +1,22 @@
-import type { Extracted } from "@marko/language-tools";
-import { getExt } from "@marko/language-tools";
-import {
-  createFSBackedSystem,
-  createVirtualLanguageServiceHost,
-} from "@typescript/vfs";
+import { Project } from "@marko/language-tools";
+import { LanguageServerHandle, startLanguageServer } from "@volar/test-utils";
 import fs from "fs";
 import path from "path";
 import ts from "typescript";
+import * as protocol from "vscode-languageserver-protocol/node";
 
 const rootDir = process.cwd();
-const startPosition: ts.LineAndCharacter = {
-  line: 0,
-  character: 0,
-};
 
-export type Processors = Record<
-  string,
-  {
-    ext: ts.Extension;
-    kind: ts.ScriptKind;
-    extract(filename: string, code: string): Extracted;
-  }
->;
+let serverHandle: LanguageServerHandle | undefined;
+
+Project.setDefaultTypePaths({
+  internalTypesFile: require.resolve(
+    "@marko/language-tools/marko.internal.d.ts",
+  ),
+  markoTypesFile: require.resolve("marko/index.d.ts"),
+});
 
-export function createLanguageService(
-  fsMap: Map<string, string>,
-  processors: Processors,
-) {
-  const getProcessor = (filename: string) =>
-    processors[getExt(filename)?.slice(1) || ""];
+export async function getLanguageServer() {
   const compilerOptions: ts.CompilerOptions = {
     ...ts.getDefaultCompilerOptions(),
     rootDir,
@@ -41,132 +29,37 @@ export function createLanguageService(
     allowNonTsExtensions: true,
     module: ts.ModuleKind.ESNext,
     target: ts.ScriptTarget.ESNext,
-    moduleResolution: ts.ModuleResolutionKind.NodeJs,
-  };
-  const rootFiles = [...fsMap.keys()];
-  const sys = createFSBackedSystem(fsMap, rootDir, ts);
-
-  const { languageServiceHost: lsh } = createVirtualLanguageServiceHost(
-    sys,
-    rootFiles,
-    compilerOptions,
-    ts,
-  );
-
-  const ls = ts.createLanguageService(lsh);
-  const snapshotCache = new Map<string, [Extracted, ts.IScriptSnapshot]>();
-
-  /**
-   * Trick TypeScript into thinking Marko files are TS/JS files.
-   */
-  lsh.getScriptKind = (filename: string) => {
-    const processor = getProcessor(filename);
-    return processor ? processor.kind : ts.ScriptKind.TS;
+    moduleResolution: ts.ModuleResolutionKind.NodeNext,
   };
 
-  /**
-   * A script snapshot is an immutable string of text representing the contents of a file.
-   * We patch it so that Marko files instead return their extracted ts code.
-   */
-  const getScriptSnapshot = lsh.getScriptSnapshot!.bind(lsh);
-  lsh.getScriptSnapshot = (filename: string) => {
-    const processor = getProcessor(filename);
-    if (processor) {
-      let cached = snapshotCache.get(filename);
-      if (!cached) {
-        const extracted = processor.extract(
-          filename,
-          lsh.readFile(filename, "utf-8") || "",
-        );
-        snapshotCache.set(
-          filename,
-          (cached = [
-            extracted,
-            ts.ScriptSnapshot.fromString(extracted.toString()),
-          ]),
-        );
-      }
-
-      return cached[1];
-    }
-
-    return getScriptSnapshot(filename);
-  };
-
-  /**
-   * This ensures that any directory reads with specific file extensions also include Marko.
-   * It is used for example when completing the `from` property of the `import` statement.
-   */
-  const readDirectory = lsh.readDirectory!.bind(lsh);
-  const additionalExts = Object.keys(processors);
-  lsh.readDirectory = (path, extensions, exclude, include, depth) => {
-    return readDirectory(
-      path,
-      extensions?.concat(additionalExts),
-      exclude,
-      include,
-      depth,
+  if (!serverHandle) {
+    console.log("Starting language server");
+    console.log(" - bin, ", path.resolve("./bin.js"));
+    console.log(
+      " - Working Dir",
+      path.resolve(rootDir, "./__tests__/fixtures/"),
     );
-  };
+    serverHandle = startLanguageServer(path.resolve("./bin.js"));
 
-  /**
-   * TypeScript doesn't know how to resolve `.marko` files.
-   * Below we first try to use TypeScripts normal resolution, and then fallback
-   * to seeing if a `.marko` file exists at the same location.
-   */
-  lsh.resolveModuleNames = (moduleNames, containingFile) => {
-    const resolvedModules: (
-      | ts.ResolvedModuleFull
-      | ts.ResolvedModule
-      | undefined
-    )[] = moduleNames.map<ts.ResolvedModule | undefined>(
-      (moduleName) =>
-        ts.resolveModuleName(moduleName, containingFile, compilerOptions, sys)
-          .resolvedModule,
+    const tsdkPath = path.dirname(
+      require.resolve("typescript/lib/typescript.js"),
     );
+    console.log(" - tsdkPath", tsdkPath);
+    await serverHandle.initialize(path.resolve("./"), {
+      typescript: {
+        tsdk: tsdkPath,
+        compilerOptions,
+      },
+    });
+
+    // Ensure that our first test does not suffer from a TypeScript overhead
+    await serverHandle.sendCompletionRequest(
+      "file://doesnt-exists",
+      protocol.Position.create(0, 0),
+    );
+  }
 
-    for (let i = resolvedModules.length; i--; ) {
-      if (!resolvedModules[i]) {
-        const moduleName = moduleNames[i];
-        const processor = moduleName[0] !== "*" && getProcessor(moduleName);
-        if (processor && moduleName[0] === ".") {
-          // For relative paths just see if it exists on disk.
-          const resolvedFileName = path.resolve(
-            containingFile,
-            "..",
-            moduleName,
-          );
-          if (lsh.fileExists(resolvedFileName)) {
-            resolvedModules[i] = {
-              resolvedFileName,
-              extension: processor.ext,
-              isExternalLibraryImport: false,
-            };
-          }
-        }
-      }
-    }
-
-    return resolvedModules;
-  };
-
-  /**
-   * Whenever TypeScript requests line/character info we return with the source
-   * file line/character if it exists.
-   */
-  const toLineColumnOffset = ls.toLineColumnOffset!;
-  ls.toLineColumnOffset = (fileName, pos) => {
-    if (pos === 0) return startPosition;
-
-    const extracted = snapshotCache.get(fileName)?.[0];
-    if (extracted) {
-      return extracted.sourcePositionAt(pos) || startPosition;
-    }
-
-    return toLineColumnOffset(fileName, pos);
-  };
-
-  return ls;
+  return serverHandle;
 }
 
 export function loadMarkoFiles(dir: string, all = new Set<string>()) {
diff --git a/packages/language-server/src/index.ts b/packages/language-server/src/index.ts
index 2472ee42..5361925f 100644
--- a/packages/language-server/src/index.ts
+++ b/packages/language-server/src/index.ts
@@ -1,280 +1,61 @@
-import "./utils/project-defaults";
-
-import { Project } from "@marko/language-tools";
-import { inspect, isDeepStrictEqual } from "util";
 import {
   createConnection,
-  DefinitionLink,
-  Diagnostic,
-  ProposedFeatures,
-  TextDocumentSyncKind,
-} from "vscode-languageserver/node";
-import type { TextDocument } from "vscode-languageserver-textdocument";
-
-import service from "./service";
-import { clearMarkoCacheForFile } from "./utils/file";
-import setupMessages from "./utils/messages";
-import * as documents from "./utils/text-documents";
-import * as workspace from "./utils/workspace";
-
-if (
-  typeof require !== "undefined" &&
-  require.extensions &&
-  !(".ts" in require.extensions)
-) {
-  // Prevent compiler hooks written in typescript to explode the language server.
-  require.extensions[".ts"] = undefined;
-}
-const connection = createConnection(ProposedFeatures.all);
-const prevDiags = new WeakMap<TextDocument, Diagnostic[]>();
-let diagnosticTimeout: ReturnType<typeof setTimeout> | undefined;
-
-console.log = (...args: unknown[]) => {
-  connection.console.log(args.map((v) => inspect(v)).join(" "));
-};
-console.error = (...args: unknown[]) => {
-  connection.console.error(args.map((v) => inspect(v)).join(" "));
-};
-process.on("uncaughtException", console.error);
-process.on("unhandledRejection", console.error);
+  createServer,
+  createTypeScriptProject,
+  loadTsdkByPath,
+} from "@volar/language-server/node";
+import { URI } from "vscode-uri";
+import { getLanguageServicePlugins } from "./plugins";
+import { addMarkoTypes, createMarkoLanguagePlugin } from "./language";
 
-connection.onInitialize(async (params) => {
-  setupMessages(connection);
-  await service.initialize(params);
-
-  return {
-    capabilities: {
-      textDocumentSync: TextDocumentSyncKind.Incremental,
-      documentFormattingProvider: true,
-      definitionProvider: true,
-      hoverProvider: true,
-      renameProvider: true,
-      codeActionProvider: true,
-      referencesProvider: true,
-      documentLinkProvider: { resolveProvider: false },
-      colorProvider: true,
-      documentHighlightProvider: true,
-      documentSymbolProvider: true,
-      completionProvider: {
-        resolveProvider: true,
-        triggerCharacters: [
-          ".",
-          ":",
-          "<",
-          ">",
-          "@",
-          "/",
-          '"',
-          "'",
-          "`",
-          " ",
-          "=",
-          "*",
-          "#",
-          "$",
-          "+",
-          "^",
-          "(",
-          "[",
-          "-",
-        ],
-      },
-    },
-  };
-});
+const connection = createConnection();
+const server = createServer(connection);
 
-workspace.setup(connection);
-workspace.onConfigChange(validateDocs);
-
-connection.onDidOpenTextDocument(async (params) => {
-  documents.doOpen(params);
+connection.listen();
 
-  const doc = documents.get(params.textDocument.uri);
-  if (doc) {
-    const diagnostics = (await service.doValidate(doc)) || [];
-    prevDiags.set(doc, diagnostics);
-    connection.sendDiagnostics({
-      uri: doc.uri,
-      diagnostics,
-    });
-  }
-});
-connection.onDidChangeTextDocument(documents.doChange);
-connection.onDidCloseTextDocument(documents.doClose);
-connection.onDidChangeWatchedFiles(documents.doChangeWatchedFiles);
+connection.onInitialize((params) => {
+  const tsdk = params.initializationOptions?.typescript?.tsdk;
 
-documents.onFileChange((changeDoc) => {
-  if (changeDoc) {
-    queueDiagnostic();
-    clearMarkoCacheForFile(changeDoc);
-  } else {
-    validateDocs();
+  if (!tsdk) {
+    throw new Error(
+      "The `typescript.tsdk` init option is required. It should point to a directory containing a `typescript.js` or `tsserverlibrary.js` file, such as `node_modules/typescript/lib`.",
+    );
   }
-});
-
-connection.onCompletion(async (params, cancel) => {
-  return (
-    (await service.doComplete(
-      documents.get(params.textDocument.uri)!,
-      params,
-      cancel,
-    )) || null
-  );
-});
-
-connection.onCompletionResolve(async (item, cancel) => {
-  return (await service.doCompletionResolve(item, cancel)) || item;
-});
-
-connection.onDefinition(async (params, cancel) => {
-  return (
-    ((await service.findDefinition(
-      documents.get(params.textDocument.uri)!,
-      params,
-      cancel,
-    )) as DefinitionLink[]) || null
-  );
-});
-
-connection.onReferences(async (params, cancel) => {
-  return (
-    (await service.findReferences(
-      documents.get(params.textDocument.uri)!,
-      params,
-      cancel,
-    )) || null
-  );
-});
-
-connection.onDocumentLinks(async (params, cancel) => {
-  return (
-    (await service.findDocumentLinks(
-      documents.get(params.textDocument.uri)!,
-      params,
-      cancel,
-    )) || null
-  );
-});
 
-connection.onDocumentSymbol(async (params, cancel) => {
-  return (
-    (await service.findDocumentSymbols(
-      documents.get(params.textDocument.uri)!,
-      params,
-      cancel,
-    )) || null
+  const { typescript, diagnosticMessages } = loadTsdkByPath(
+    tsdk,
+    params.locale,
   );
-});
 
-connection.onDocumentHighlight(async (params, cancel) => {
-  return (
-    (await service.findDocumentHighlights(
-      documents.get(params.textDocument.uri)!,
-      params,
-      cancel,
-    )) || null
-  );
-});
-
-connection.onDocumentColor(async (params, cancel) => {
-  return (
-    (await service.findDocumentColors(
-      documents.get(params.textDocument.uri)!,
-      params,
-      cancel,
-    )) || null
-  );
-});
-
-connection.onColorPresentation(async (params, cancel) => {
-  return (
-    (await service.getColorPresentations(
-      documents.get(params.textDocument.uri)!,
-      params,
-      cancel,
-    )) || null
-  );
-});
-
-connection.onHover(async (params, cancel) => {
-  return (
-    (await service.doHover(
-      documents.get(params.textDocument.uri)!,
-      params,
-      cancel,
-    )) || null
-  );
-});
+  return server.initialize(
+    params,
+    createTypeScriptProject(typescript, diagnosticMessages, ({ env }) => {
+      return {
+        languagePlugins: [
+          createMarkoLanguagePlugin(typescript, (uri: URI) =>
+            uri.fsPath.replace(/\\/g, "/"),
+          ),
+        ],
+        setup({ project }) {
+          const { languageServiceHost, configFileName } = project.typescript!;
 
-connection.onRenameRequest(async (params, cancel) => {
-  return (
-    (await service.doRename(
-      documents.get(params.textDocument.uri)!,
-      params,
-      cancel,
-    )) || null
-  );
-});
+          const rootPath = configFileName
+            ? configFileName.split("/").slice(0, -1).join("/")
+            : env.workspaceFolders[0]!.fsPath;
 
-connection.onCodeAction(async (params, cancel) => {
-  return (
-    (await service.doCodeActions(
-      documents.get(params.textDocument.uri)!,
-      params,
-      cancel,
-    )) || null
+          addMarkoTypes(rootPath, typescript, languageServiceHost);
+        },
+      };
+    }),
+    getLanguageServicePlugins(connection, typescript),
   );
 });
 
-connection.onDocumentFormatting(async (params, cancel) => {
-  return (
-    (await service.format(
-      documents.get(params.textDocument.uri)!,
-      params,
-      cancel,
-    )) || null
-  );
+connection.onInitialized(() => {
+  server.initialized();
+  server.fileWatcher.watchFiles([
+    `**/*.{${["js", "cjs", "mjs", "ts", "cts", "mts", "json", "marko"].join(
+      ",",
+    )}}`,
+  ]);
 });
-
-for (const command in service.commands) {
-  connection.onRequest(command, service.commands[command]);
-}
-
-function validateDocs() {
-  queueDiagnostic();
-  Project.clearCaches();
-}
-
-function queueDiagnostic() {
-  clearTimeout(diagnosticTimeout);
-  const id = (diagnosticTimeout = setTimeout(async () => {
-    const results = await Promise.all(
-      Array.from(documents.getAllOpen()).map(async (doc) => {
-        if (!documents.isOpen(doc)) {
-          prevDiags.delete(doc);
-          return;
-        }
-        const prevDiag = prevDiags.get(doc) || [];
-        const nextDiag = (await service.doValidate(doc)) || [];
-        if (isDeepStrictEqual(prevDiag, nextDiag)) return;
-        return [doc, nextDiag] as const;
-      }),
-    );
-
-    // Check that it wasn't canceled.
-    if (id === diagnosticTimeout) {
-      for (const result of results) {
-        if (result) {
-          const [doc, diag] = result;
-          prevDiags.set(doc, diag);
-          connection.sendDiagnostics({
-            uri: doc.uri,
-            diagnostics: diag,
-          });
-        }
-      }
-    }
-  }, 400));
-}
-
-connection.listen();
diff --git a/packages/language-server/src/language/index.ts b/packages/language-server/src/language/index.ts
new file mode 100644
index 00000000..88937463
--- /dev/null
+++ b/packages/language-server/src/language/index.ts
@@ -0,0 +1,145 @@
+import "../utils/project-defaults";
+
+import { TaglibLookup } from "@marko/babel-utils";
+import { extractHTML, parse, Project } from "@marko/language-tools";
+import { Meta } from "@marko/language-tools/src/util/project";
+import {
+  type CodeMapping,
+  forEachEmbeddedCode,
+  type LanguagePlugin,
+  type VirtualCode,
+} from "@volar/language-core";
+import path from "path";
+import type ts from "typescript";
+
+import { parseHtml } from "./parseHtml";
+import { parseScripts } from "./parseScript";
+import { parseStyles } from "./parseStyles";
+
+const decoratedHosts = new WeakSet<ts.LanguageServiceHost>();
+
+export function addMarkoTypes(
+  rootDir: string,
+  ts: typeof import("typescript"),
+  host: ts.LanguageServiceHost,
+) {
+  if (decoratedHosts.has(host)) {
+    return;
+  }
+  decoratedHosts.add(host);
+
+  const getScriptFileNames = host.getScriptFileNames.bind(host);
+
+  host.getScriptFileNames = () => {
+    const addedFileNames = [];
+    const typeLibs = Project.getTypeLibs(rootDir, ts, host);
+
+    addedFileNames.push(typeLibs.internalTypesFile);
+    if (typeLibs.markoRunTypesFile) {
+      addedFileNames.push(typeLibs.markoRunTypesFile);
+    }
+    if (typeLibs.markoRunGeneratedTypesFile) {
+      addedFileNames.push(typeLibs.markoRunGeneratedTypesFile);
+    }
+    addedFileNames.push(typeLibs.markoTypesFile);
+
+    return [...getScriptFileNames(), ...addedFileNames];
+  };
+}
+
+export function createMarkoLanguagePlugin<T>(
+  ts: typeof import("typescript"),
+  asFileName: (scriptId: T) => string,
+): LanguagePlugin<T, MarkoVirtualCode> {
+  return {
+    getLanguageId(scriptId) {
+      const fileName = asFileName(scriptId);
+
+      if (fileName.endsWith(".marko")) {
+        return "marko";
+      }
+    },
+    createVirtualCode(scriptId, languageId, snapshot) {
+      if (languageId === "marko") {
+        const fileName = asFileName(scriptId);
+        return new MarkoVirtualCode(fileName, snapshot, ts);
+      }
+    },
+    typescript: {
+      extraFileExtensions: [
+        { extension: "marko", isMixedContent: true, scriptKind: 7 },
+      ],
+      getServiceScript(markoCode) {
+        for (const code of forEachEmbeddedCode(markoCode)) {
+          if (code.id === "script") {
+            return {
+              code,
+              extension: ".ts",
+              scriptKind: 3 satisfies ts.ScriptKind.TS,
+            };
+          }
+        }
+      },
+    },
+  };
+}
+
+export class MarkoVirtualCode implements VirtualCode {
+  id = "root";
+  languageId = "marko";
+  mappings!: CodeMapping[];
+  embeddedCodes!: VirtualCode[];
+  markoAst: ReturnType<typeof parse>;
+  tagLookup: TaglibLookup;
+  htmlAst: ReturnType<typeof extractHTML>;
+  compiler: typeof import("@marko/compiler");
+  code: string;
+  project: Meta["config"];
+
+  constructor(
+    public fileName: string,
+    public snapshot: ts.IScriptSnapshot,
+    public ts: typeof import("typescript"),
+  ) {
+    this.mappings = [
+      {
+        sourceOffsets: [0],
+        generatedOffsets: [0],
+        lengths: [this.snapshot.getLength()],
+        data: {
+          verification: true,
+          completion: true,
+          semantic: true,
+          navigation: true,
+          structure: true,
+          format: true,
+        },
+      },
+    ];
+
+    this.embeddedCodes = [];
+    const dirname = path.dirname(fileName);
+    this.project = Project.getConfig(dirname);
+
+    this.code = this.snapshot.getText(0, this.snapshot.getLength());
+    this.markoAst = parse(this.code, this.fileName);
+
+    this.tagLookup = Project.getTagLookup(dirname);
+    this.compiler = Project.getCompiler(path.dirname(this.fileName));
+
+    const scripts = parseScripts(
+      this.markoAst,
+      this.ts,
+      this.tagLookup,
+      this.project,
+    );
+    this.embeddedCodes.push(...scripts);
+
+    const styles = parseStyles(this.markoAst, this.tagLookup);
+    this.embeddedCodes.push(...styles);
+
+    this.htmlAst = extractHTML(this.markoAst);
+    const html = parseHtml(this.htmlAst);
+    this.embeddedCodes.push(...html);
+  }
+}
diff --git a/packages/language-server/src/language/parseHtml.ts b/packages/language-server/src/language/parseHtml.ts
new file mode 100644
index 00000000..e8a7824f
--- /dev/null
+++ b/packages/language-server/src/language/parseHtml.ts
@@ -0,0 +1,47 @@
+import { Extracted, extractHTML } from "@marko/language-tools";
+import type { CodeMapping, VirtualCode } from "@volar/language-core";
+
+export function parseHtml(
+  parsed: ReturnType<typeof extractHTML>,
+): VirtualCode[] {
+  const scriptText = parsed.extracted.toString();
+  const mappings: CodeMapping[] = generateMappingsFromExtracted(
+    parsed.extracted,
+  );
+
+  if (mappings.length > 0) {
+    return [
+      {
+        id: "html",
+        languageId: "html",
+        snapshot: {
+          getText: (start, end) => scriptText.substring(start, end),
+          getLength: () => scriptText.length,
+          getChangeRange: () => undefined,
+        },
+        mappings: mappings,
+        embeddedCodes: [],
+      },
+    ];
+  }
+
+  return [];
+}
+
+function generateMappingsFromExtracted(extracted: Extracted): CodeMapping[] {
+  return extracted.tokens.map((it) => {
+    return {
+      sourceOffsets: [it.sourceStart],
+      generatedOffsets: [it.generatedStart],
+      lengths: [it.length],
+      data: {
+        completion: true,
+        format: false,
+        navigation: true,
+        semantic: true,
+        structure: true,
+        verification: true,
+      },
+    };
+  });
+}
diff --git a/packages/language-server/src/language/parseScript.ts b/packages/language-server/src/language/parseScript.ts
new file mode 100644
index 00000000..0e59c777
--- /dev/null
+++ b/packages/language-server/src/language/parseScript.ts
@@ -0,0 +1,54 @@
+import { TaglibLookup } from "@marko/babel-utils";
+import { extractScript, parse, ScriptLang } from "@marko/language-tools";
+import { Meta } from "@marko/language-tools/src/util/project";
+import type { CodeMapping, VirtualCode } from "@volar/language-core";
+
+export function parseScripts(
+  parsed: ReturnType<typeof parse>,
+  ts: typeof import("typescript"),
+  tagLookup: TaglibLookup,
+  translator: Meta["config"]["translator"],
+): VirtualCode[] {
+  const script = extractScript({
+    parsed,
+    scriptLang: ScriptLang.ts,
+    lookup: tagLookup,
+    ts: ts,
+    translator,
+  });
+  const scriptText = script.toString();
+  const mappings: CodeMapping[] = [];
+  for (const token of script.tokens) {
+    mappings.push({
+      sourceOffsets: [token.sourceStart],
+      generatedOffsets: [token.generatedStart],
+      lengths: [token.length],
+      data: {
+        completion: true,
+        format: false,
+        navigation: true,
+        semantic: true,
+        structure: true,
+        verification: true,
+      },
+    });
+  }
+
+  if (mappings.length > 0) {
+    return [
+      {
+        id: "script",
+        languageId: "ts",
+        snapshot: {
+          getText: (start, end) => scriptText.substring(start, end),
+          getLength: () => scriptText.length,
+          getChangeRange: () => undefined,
+        },
+        mappings: mappings,
+        embeddedCodes: [],
+      },
+    ];
+  }
+
+  return [];
+}
diff --git a/packages/language-server/src/language/parseStyles.ts b/packages/language-server/src/language/parseStyles.ts
new file mode 100644
index 00000000..fb2b74f5
--- /dev/null
+++ b/packages/language-server/src/language/parseStyles.ts
@@ -0,0 +1,51 @@
+import { Extracted, extractStyle, parse } from "@marko/language-tools";
+import type { CodeMapping, VirtualCode } from "@volar/language-core";
+
+export function parseStyles(
+  parsed: ReturnType<typeof parse>,
+  taglib: any,
+): VirtualCode[] {
+  const styles = extractStyle({ parsed, lookup: taglib });
+
+  const result = [];
+  for (const [key, style] of styles.entries()) {
+    const styleText = style.toString();
+    const stylesheetKey = key.slice(1);
+
+    const languageId =
+      stylesheetKey === "scss" || stylesheetKey === "less"
+        ? stylesheetKey
+        : "css";
+    result.push({
+      id: `style_${key.slice(1)}`,
+      languageId,
+      snapshot: {
+        getText: (start, end) => styleText.substring(start, end),
+        getLength: () => styleText.length,
+        getChangeRange: () => undefined,
+      },
+      mappings: generateMappingsFromExtracted(style),
+      embeddedCodes: [],
+    } satisfies VirtualCode);
+  }
+
+  return result;
+}
+
+function generateMappingsFromExtracted(extracted: Extracted): CodeMapping[] {
+  return extracted.tokens.map((it) => {
+    return {
+      sourceOffsets: [it.sourceStart],
+      generatedOffsets: [it.generatedStart],
+      lengths: [it.length],
+      data: {
+        completion: true,
+        format: false,
+        navigation: true,
+        semantic: true,
+        structure: true,
+        verification: true,
+      },
+    };
+  });
+}
diff --git a/packages/language-server/src/plugins/html/index.ts b/packages/language-server/src/plugins/html/index.ts
new file mode 100644
index 00000000..f81cc22f
--- /dev/null
+++ b/packages/language-server/src/plugins/html/index.ts
@@ -0,0 +1,24 @@
+import type { LanguageServicePlugin } from "@volar/language-server";
+import { create as createHtmlService } from "volar-service-html";
+
+export const create = (): LanguageServicePlugin => {
+  // We currently opt-in to specific features of the HTML service because not all
+  // of them are useful given the virtual HTML template we generate.
+  const baseService = createHtmlService({});
+  return {
+    name: "marko-html",
+    capabilities: {
+      documentLinkProvider: baseService.capabilities.documentLinkProvider,
+    },
+    create(context) {
+      const baseServiceInstance = baseService.create(context);
+      return {
+        provideDocumentLinks(document, token) {
+          // Defer to the HTML service to provide links for us.
+          // This is used for things like src attributes that link to local files.
+          return baseServiceInstance.provideDocumentLinks?.(document, token);
+        },
+      };
+    },
+  };
+};
diff --git a/packages/language-server/src/plugins/index.ts b/packages/language-server/src/plugins/index.ts
new file mode 100644
index 00000000..7f7b2740
--- /dev/null
+++ b/packages/language-server/src/plugins/index.ts
@@ -0,0 +1,28 @@
+import { create as createCssService } from "volar-service-css";
+import { create as createTypeScriptTwoSlashService } from "volar-service-typescript-twoslash-queries";
+import { create as createTypeScriptServices } from "volar-service-typescript";
+import type { Connection } from "@volar/language-server";
+import { create as createAccessibilityService } from "./marko-accessibility";
+import { create as createMarkoService } from "./marko";
+import { createMarkoPrettierService } from "./prettier";
+import { create as createMarkoDebugService } from "./marko-debug";
+import { create as createMarkoFormatActionService } from "./marko-action-format";
+import { create as createMarkoHtmlService } from "./html";
+
+export function getLanguageServicePlugins(
+  connection: Connection,
+  ts: typeof import("typescript"),
+) {
+  const result = [
+    createMarkoService(ts),
+    createMarkoHtmlService(),
+    createCssService(),
+    ...createTypeScriptServices(ts),
+    createTypeScriptTwoSlashService(ts),
+    createMarkoPrettierService(connection),
+    createAccessibilityService(),
+    createMarkoDebugService(),
+    createMarkoFormatActionService(),
+  ];
+  return result;
+}
diff --git a/packages/language-server/src/service/html/axe-rules/axe-rules.ts b/packages/language-server/src/plugins/marko-accessibility/axe-rules/axe-rules.ts
similarity index 100%
rename from packages/language-server/src/service/html/axe-rules/axe-rules.ts
rename to packages/language-server/src/plugins/marko-accessibility/axe-rules/axe-rules.ts
diff --git a/packages/language-server/src/service/html/axe-rules/generate-axe-rules.ts b/packages/language-server/src/plugins/marko-accessibility/axe-rules/generate-axe-rules.ts
similarity index 100%
rename from packages/language-server/src/service/html/axe-rules/generate-axe-rules.ts
rename to packages/language-server/src/plugins/marko-accessibility/axe-rules/generate-axe-rules.ts
diff --git a/packages/language-server/src/service/html/axe-rules/rule-exceptions.ts b/packages/language-server/src/plugins/marko-accessibility/axe-rules/rule-exceptions.ts
similarity index 100%
rename from packages/language-server/src/service/html/axe-rules/rule-exceptions.ts
rename to packages/language-server/src/plugins/marko-accessibility/axe-rules/rule-exceptions.ts
diff --git a/packages/language-server/src/plugins/marko-accessibility/index.ts b/packages/language-server/src/plugins/marko-accessibility/index.ts
new file mode 100644
index 00000000..8f060290
--- /dev/null
+++ b/packages/language-server/src/plugins/marko-accessibility/index.ts
@@ -0,0 +1,126 @@
+import type { TextDocument } from "vscode-languageserver-textdocument";
+import axe from "axe-core";
+import { JSDOM } from "jsdom";
+import type { Diagnostic, LanguageServicePlugin } from "@volar/language-server";
+import { URI } from "vscode-uri";
+import { MarkoVirtualCode } from "../../language";
+import { ruleExceptions } from "./axe-rules/rule-exceptions";
+
+// This plugin provides accessibility diagnostics for Marko templates.
+export const create = (): LanguageServicePlugin => {
+  return {
+    name: "marko-accessibility",
+    capabilities: {
+      diagnosticProvider: {
+        interFileDependencies: false,
+        workspaceDiagnostics: false,
+      },
+    },
+    create(context) {
+      return {
+        async provideDiagnostics(document, token) {
+          if (token.isCancellationRequested) return;
+
+          return await worker(document, async (virtualCode) => {
+            const htmlAst = virtualCode.htmlAst;
+            if (!htmlAst) {
+              return [];
+            }
+
+            const htmlText = htmlAst.extracted.toString();
+            const jsdom = new JSDOM(htmlText, {
+              includeNodeLocations: true,
+            });
+            const { documentElement } = jsdom.window.document;
+
+            const getViolationNodes = async (runOnly: string[]) =>
+              (
+                await axe.run(documentElement, {
+                  runOnly,
+                  rules: {
+                    "color-contrast": { enabled: false },
+                  },
+                  resultTypes: ["violations"],
+                  elementRef: true,
+                })
+              ).violations.flatMap(({ nodes, id }) =>
+                nodes.map((node) => ({ ...node, ruleId: id })),
+              );
+
+            const release = await acquireMutexLock();
+            const violations = await getViolationNodes(
+              Object.keys(ruleExceptions),
+            );
+            release();
+
+            return violations.flatMap((result) => {
+              const { element } = result;
+              if (!element) return [];
+              const ruleId = result.ruleId as keyof typeof ruleExceptions;
+
+              if (element.dataset.markoNodeId) {
+                const details =
+                  htmlAst.nodeDetails[element.dataset.markoNodeId];
+                if (
+                  (ruleExceptions[ruleId].attrSpread &&
+                    details.hasDynamicAttrs) ||
+                  (ruleExceptions[ruleId].unknownBody &&
+                    details.hasDynamicBody) ||
+                  ruleExceptions[ruleId].dynamicAttrs?.some(
+                    (attr) => element.getAttribute(attr) === "dynamic",
+                  )
+                ) {
+                  return [];
+                }
+              }
+
+              const generatedLoc = jsdom.nodeLocation(element);
+              if (!generatedLoc) return [];
+
+              const sourceRange = htmlAst.extracted.sourceLocationAt(
+                generatedLoc.startOffset + 1,
+                generatedLoc.startOffset + 1 + element.tagName.length,
+              );
+              if (!sourceRange) return [];
+
+              return [
+                {
+                  range: sourceRange,
+                  severity: 3,
+                  source: `axe-core(${ruleId})`,
+                  message:
+                    result.failureSummary ?? "unknown accessibility issue",
+                } satisfies Diagnostic,
+              ];
+            });
+          });
+        },
+      };
+
+      async function worker<T>(
+        document: TextDocument,
+        callback: (markoDocument: MarkoVirtualCode) => T,
+      ): Promise<Awaited<T> | undefined> {
+        const decoded = context.decodeEmbeddedDocumentUri(
+          URI.parse(document.uri),
+        );
+        const sourceScript =
+          decoded && context.language.scripts.get(decoded[0]);
+        const virtualCode =
+          decoded && sourceScript?.generated?.embeddedCodes.get(decoded[1]);
+        if (!(virtualCode instanceof MarkoVirtualCode)) return;
+
+        return await callback(virtualCode);
+      }
+    },
+  };
+};
+
+let lock: Promise<void> | undefined;
+async function acquireMutexLock() {
+  const currLock = lock;
+  let resolve!: () => void;
+  lock = new Promise((_) => (resolve = _));
+  await currLock;
+  return resolve;
+}
diff --git a/packages/language-server/src/plugins/marko-action-format/index.ts b/packages/language-server/src/plugins/marko-action-format/index.ts
new file mode 100644
index 00000000..32ce74cb
--- /dev/null
+++ b/packages/language-server/src/plugins/marko-action-format/index.ts
@@ -0,0 +1,70 @@
+import { LanguageServicePlugin } from "@volar/language-service";
+import { URI } from "vscode-uri";
+import { MarkoVirtualCode } from "../../language";
+import { getFormattingOptions, getPrettierInstance } from "../prettier";
+
+export const create = (): LanguageServicePlugin => {
+  return {
+    name: "marko-action-format",
+    capabilities: {
+      executeCommandProvider: {
+        commands: ["marko.formatWithSyntax"],
+      },
+    },
+    create(context) {
+      return {
+        async executeCommand(_command: string, [fileUri, options]: any[]) {
+          const uri = URI.parse(fileUri);
+
+          const sourceFile = context.language.scripts.get(uri);
+          if (!sourceFile) {
+            return;
+          }
+
+          const rootCode = sourceFile?.generated?.root;
+          if (!(rootCode instanceof MarkoVirtualCode)) {
+            return;
+          }
+
+          const { prettierInstance, prettierPluginMarko } =
+            getPrettierInstance(context);
+          if (!prettierInstance || !prettierPluginMarko) {
+            return;
+          }
+
+          const prettierOptions = await getFormattingOptions(
+            prettierInstance,
+            prettierPluginMarko,
+            fileUri,
+            options,
+            context,
+          );
+
+          // Override the configured options with the options passed in.
+          const prettierConfig = { ...prettierOptions, ...options };
+          const oldText = rootCode.code;
+          const newText = await prettierInstance.format(
+            oldText,
+            prettierConfig,
+          );
+
+          // TODO: Is there another way to do positionAt that doesn't involve getting the document?
+          const document = context.documents.get(
+            fileUri,
+            "marko",
+            rootCode.snapshot,
+          );
+          return [
+            {
+              newText,
+              range: {
+                start: { line: 0, character: 0 },
+                end: document.positionAt(oldText.length),
+              },
+            },
+          ];
+        },
+      };
+    },
+  };
+};
diff --git a/packages/language-server/src/plugins/marko-debug/index.ts b/packages/language-server/src/plugins/marko-debug/index.ts
new file mode 100644
index 00000000..95ac1159
--- /dev/null
+++ b/packages/language-server/src/plugins/marko-debug/index.ts
@@ -0,0 +1,54 @@
+import { LanguageServicePlugin } from "@volar/language-service";
+import { URI } from "vscode-uri";
+import { MarkoVirtualCode } from "../../language";
+
+export const create = (): LanguageServicePlugin => {
+  return {
+    name: "marko-debug",
+    capabilities: {
+      executeCommandProvider: {
+        commands: ["marko.extractScript", "marko.extractHtml"],
+      },
+    },
+    create(context) {
+      return {
+        executeCommand(command: string, [fileUri]: any[]) {
+          const uri = URI.parse(fileUri);
+
+          const sourceFile = context.language.scripts.get(uri);
+          if (!sourceFile) {
+            return;
+          }
+
+          const rootCode = sourceFile?.generated?.root;
+          if (!(rootCode instanceof MarkoVirtualCode)) {
+            return;
+          }
+
+          switch (command) {
+            case "marko.extractScript": {
+              const code = rootCode.embeddedCodes.find((code) => {
+                return code.id === "script";
+              });
+              const content = code?.snapshot.getText(
+                0,
+                code.snapshot.getLength(),
+              );
+              return { content, language: "typescript" };
+            }
+            case "marko.extractHtml": {
+              const code = rootCode.embeddedCodes.find((code) => {
+                return code.id === "html";
+              });
+              const content = code?.snapshot.getText(
+                0,
+                code.snapshot.getLength(),
+              );
+              return { content, language: "html" };
+            }
+          }
+        },
+      };
+    },
+  };
+};
diff --git a/packages/language-server/src/service/marko/complete/AttrName.ts b/packages/language-server/src/plugins/marko/complete/AttrName.ts
similarity index 89%
rename from packages/language-server/src/service/marko/complete/AttrName.ts
rename to packages/language-server/src/plugins/marko/complete/AttrName.ts
index d983050d..30e3966d 100644
--- a/packages/language-server/src/service/marko/complete/AttrName.ts
+++ b/packages/language-server/src/plugins/marko/complete/AttrName.ts
@@ -8,14 +8,14 @@ import {
   TextEdit,
 } from "vscode-languageserver";
 
-import type { CompletionMeta, CompletionResult } from ".";
-
-export function AttrName({
-  offset,
-  node,
-  file: { parsed, lookup },
-}: CompletionMeta<Node.AttrName>): CompletionResult {
-  let name = parsed.read(node);
+import { MarkoVirtualCode } from "../../../language";
+
+export function AttrName(
+  node: Node.AttrName,
+  file: MarkoVirtualCode,
+  offset: number,
+): CompletionItem[] | undefined {
+  let name = file.markoAst.read(node);
   const modifierIndex = name.indexOf(":");
   const hasModifier = modifierIndex !== -1;
 
@@ -39,7 +39,7 @@ export function AttrName({
   }
 
   const completions: CompletionItem[] = [];
-  const attrNameLoc = parsed.locationAt(
+  const attrNameLoc = file.markoAst.locationAt(
     hasModifier
       ? {
           start: node.start,
@@ -49,7 +49,7 @@ export function AttrName({
   );
 
   const tagName = node.parent.parent.nameText || "";
-  const tagDef = tagName && lookup.getTag(tagName);
+  const tagDef = tagName && file.tagLookup.getTag(tagName);
   const nestedTagAttrs: { [x: string]: boolean } = {};
 
   if (tagDef && tagDef.nestedTags) {
@@ -59,7 +59,7 @@ export function AttrName({
     }
   }
 
-  lookup.forEachAttribute(tagName, (attr, parent) => {
+  file.tagLookup.forEachAttribute(tagName, (attr, parent) => {
     if (
       attr.deprecated ||
       nestedTagAttrs[attr.name] ||
diff --git a/packages/language-server/src/service/marko/complete/Import.ts b/packages/language-server/src/plugins/marko/complete/Import.ts
similarity index 77%
rename from packages/language-server/src/service/marko/complete/Import.ts
rename to packages/language-server/src/plugins/marko/complete/Import.ts
index e2dc10d6..d48d93ef 100644
--- a/packages/language-server/src/service/marko/complete/Import.ts
+++ b/packages/language-server/src/plugins/marko/complete/Import.ts
@@ -1,29 +1,29 @@
 import type { Node } from "@marko/language-tools";
 import { CompletionItem, TextEdit } from "vscode-languageserver";
 
+import { MarkoVirtualCode } from "../../../language";
 import getTagNameCompletion from "../util/get-tag-name-completion";
-import type { CompletionMeta, CompletionResult } from ".";
 
 const importTagReg = /(['"])<((?:[^'"\\>]|\\.)*)>?\1/;
 
-export function Import({
-  node,
-  file: { parsed, filename, lookup },
-}: CompletionMeta<Node.Import>): CompletionResult {
+export function Import(
+  node: Node.Import,
+  file: MarkoVirtualCode,
+): CompletionItem[] | undefined {
   // check for import statement
-  const value = parsed.read(node);
+  const value = file.markoAst.read(node);
   const match = importTagReg.exec(value);
   if (match) {
     const [{ length }] = match;
     const fromStart = node.start + match.index;
-    const range = parsed.locationAt({
+    const range = file.markoAst.locationAt({
       start: fromStart + 1,
       end: fromStart + length - 1,
     });
 
     const result: CompletionItem[] = [];
 
-    for (const tag of lookup.getTagsSorted()) {
+    for (const tag of file.tagLookup.getTagsSorted()) {
       if (
         (tag.template || tag.renderer) &&
         !(
@@ -39,7 +39,7 @@ export function Import({
       ) {
         const completion = getTagNameCompletion({
           tag,
-          importer: filename,
+          importer: file.fileName,
         });
 
         completion.label = `<${completion.label}>`;
diff --git a/packages/language-server/src/service/marko/complete/OpenTagName.ts b/packages/language-server/src/plugins/marko/complete/OpenTagName.ts
similarity index 72%
rename from packages/language-server/src/service/marko/complete/OpenTagName.ts
rename to packages/language-server/src/plugins/marko/complete/OpenTagName.ts
index a513cf64..9c88d5b5 100644
--- a/packages/language-server/src/service/marko/complete/OpenTagName.ts
+++ b/packages/language-server/src/plugins/marko/complete/OpenTagName.ts
@@ -1,21 +1,23 @@
 import { type Node, NodeType } from "@marko/language-tools";
-import type { CompletionItem } from "vscode-languageserver";
+import { CompletionItem } from "vscode-languageserver";
 
+import { MarkoVirtualCode } from "../../../language";
 import getTagNameCompletion from "../util/get-tag-name-completion";
-import type { CompletionMeta, CompletionResult } from ".";
 
-export function OpenTagName({
-  node,
-  file: { parsed, filename, lookup },
-}: CompletionMeta<Node.OpenTagName>): CompletionResult {
+export function OpenTagName(
+  node: Node.OpenTagName,
+  file: MarkoVirtualCode,
+): CompletionItem[] | undefined {
   const tag = node.parent;
-  const range = parsed.locationAt(node);
+  const range = file.markoAst.locationAt(node);
   const isAttrTag = tag.type === NodeType.AttrTag;
   const result: CompletionItem[] = [];
 
   if (isAttrTag) {
     const ownerTagDef =
-      tag.owner && tag.owner.nameText && lookup.getTag(tag.owner.nameText);
+      tag.owner &&
+      tag.owner.nameText &&
+      file.tagLookup.getTag(tag.owner.nameText);
 
     if (ownerTagDef) {
       const { nestedTags } = ownerTagDef;
@@ -26,7 +28,7 @@ export function OpenTagName({
             getTagNameCompletion({
               tag,
               range,
-              importer: filename,
+              importer: file.fileName,
               showAutoComplete: true,
             }),
           );
@@ -37,7 +39,7 @@ export function OpenTagName({
     const skipStatements = !(
       tag.concise && tag.parent.type === NodeType.Program
     );
-    for (const tag of lookup.getTagsSorted()) {
+    for (const tag of file.tagLookup.getTagsSorted()) {
       if (
         !(
           tag.name === "*" ||
@@ -50,7 +52,7 @@ export function OpenTagName({
         const completion = getTagNameCompletion({
           tag,
           range,
-          importer: filename,
+          importer: file.fileName,
           showAutoComplete: true,
         });
         completion.sortText = `0${completion.label}`; // Ensure higher priority than typescript.
diff --git a/packages/language-server/src/service/marko/complete/Tag.ts b/packages/language-server/src/plugins/marko/complete/Tag.ts
similarity index 81%
rename from packages/language-server/src/service/marko/complete/Tag.ts
rename to packages/language-server/src/plugins/marko/complete/Tag.ts
index 1816f38a..c59fdd4c 100644
--- a/packages/language-server/src/service/marko/complete/Tag.ts
+++ b/packages/language-server/src/plugins/marko/complete/Tag.ts
@@ -1,22 +1,23 @@
 import { type Node, UNFINISHED } from "@marko/language-tools";
 import {
+  CompletionItem,
   CompletionItemKind,
   InsertTextFormat,
   TextEdit,
 } from "vscode-languageserver";
 
-import type { CompletionMeta, CompletionResult } from ".";
+import { MarkoVirtualCode } from "../../../language";
 
 const partialCloseTagReg = /<\/(?:[^><]*>)?/iy;
 
 /**
  * Provide completion for the closing tag.
  */
-export function Tag({
-  node,
-  offset,
-  file: { parsed, code },
-}: CompletionMeta<Node.Tag>): CompletionResult {
+export function Tag(
+  node: Node.Tag,
+  file: MarkoVirtualCode,
+  offset: number,
+): CompletionItem[] | undefined {
   const isClosed = node.end !== UNFINISHED;
   if (isClosed || node.concise) return;
 
@@ -36,6 +37,7 @@ export function Tag({
     // We have an unfinished closing tag.
     const start = node.close.start;
     partialCloseTagReg.lastIndex = start;
+    const code = file.snapshot.getText(0, file.snapshot.getLength());
     const [{ length }] = partialCloseTagReg.exec(code)!;
     const end = start + length;
 
@@ -45,7 +47,7 @@ export function Tag({
         kind: CompletionItemKind.Class,
         insertTextFormat: InsertTextFormat.Snippet,
         textEdit: TextEdit.replace(
-          parsed.locationAt({
+          file.markoAst.locationAt({
             start,
             end,
           }),
diff --git a/packages/language-server/src/plugins/marko/complete/index.ts b/packages/language-server/src/plugins/marko/complete/index.ts
new file mode 100644
index 00000000..4dc87cfa
--- /dev/null
+++ b/packages/language-server/src/plugins/marko/complete/index.ts
@@ -0,0 +1,27 @@
+import { NodeType } from "@marko/language-tools";
+import { CompletionItem } from "vscode-languageserver";
+import { MarkoVirtualCode } from "../../../language";
+import { AttrName } from "./AttrName";
+import { Import } from "./Import";
+import { OpenTagName } from "./OpenTagName";
+import { Tag } from "./Tag";
+
+export function provideCompletions(
+  doc: MarkoVirtualCode,
+  offset: number,
+): CompletionItem[] | undefined {
+  const node = doc.markoAst.nodeAt(offset);
+
+  switch (node?.type) {
+    case NodeType.AttrName:
+      return AttrName(node, doc, offset);
+    case NodeType.Import:
+      return Import(node, doc);
+    case NodeType.Tag:
+      return Tag(node, doc, offset);
+    case NodeType.OpenTagName:
+      return OpenTagName(node, doc);
+    default:
+      return;
+  }
+}
diff --git a/packages/language-server/src/service/marko/definition/AttrName.ts b/packages/language-server/src/plugins/marko/definition/AttrName.ts
similarity index 68%
rename from packages/language-server/src/service/marko/definition/AttrName.ts
rename to packages/language-server/src/plugins/marko/definition/AttrName.ts
index 4cf71e3d..5871b549 100644
--- a/packages/language-server/src/service/marko/definition/AttrName.ts
+++ b/packages/language-server/src/plugins/marko/definition/AttrName.ts
@@ -1,19 +1,20 @@
 import { getLines, getLocation, type Node } from "@marko/language-tools";
+import { LocationLink } from "@volar/language-service";
 import fs from "fs";
 import { URI } from "vscode-uri";
 
+import { MarkoVirtualCode } from "../../../language";
 import { START_LOCATION } from "../../../utils/constants";
 import RegExpBuilder from "../../../utils/regexp-builder";
-import type { DefinitionMeta, DefinitionResult } from ".";
 
-export function AttrName({
-  node,
-  file: { parsed, lookup },
-}: DefinitionMeta<Node.AttrName>): DefinitionResult {
+export function AttrName(
+  node: Node.AttrName,
+  file: MarkoVirtualCode,
+): LocationLink[] | undefined {
   const tagName = node.parent.parent.nameText;
-  const attrName = parsed.read(node);
-  const tagDef = tagName ? lookup.getTag(tagName) : undefined;
-  const attrDef = lookup.getAttribute(tagName || "", attrName);
+  const attrName = file.markoAst.read(node);
+  const tagDef = tagName ? file.tagLookup.getTag(tagName) : undefined;
+  const attrDef = file.tagLookup.getAttribute(tagName || "", attrName);
   let range = START_LOCATION;
 
   if (!attrDef) {
@@ -44,7 +45,7 @@ export function AttrName({
         targetUri: URI.file(attrEntryFile).toString(),
         targetRange: range,
         targetSelectionRange: range,
-        originSelectionRange: parsed.locationAt(node),
+        originSelectionRange: file.markoAst.locationAt(node),
       },
     ];
   }
diff --git a/packages/language-server/src/service/marko/definition/OpenTagName.ts b/packages/language-server/src/plugins/marko/definition/OpenTagName.ts
similarity index 76%
rename from packages/language-server/src/service/marko/definition/OpenTagName.ts
rename to packages/language-server/src/plugins/marko/definition/OpenTagName.ts
index 3fa10abc..f2b66c4e 100644
--- a/packages/language-server/src/service/marko/definition/OpenTagName.ts
+++ b/packages/language-server/src/plugins/marko/definition/OpenTagName.ts
@@ -5,18 +5,19 @@ import {
   type Node,
   NodeType,
 } from "@marko/language-tools";
+import { LocationLink } from "@volar/language-service";
 import fs from "fs";
 import path from "path";
 import { URI } from "vscode-uri";
 
+import { MarkoVirtualCode } from "../../../language";
 import { START_LOCATION } from "../../../utils/constants";
 import RegExpBuilder from "../../../utils/regexp-builder";
-import type { DefinitionMeta, DefinitionResult } from ".";
 
-export function OpenTagName({
-  node,
-  file: { parsed, lookup },
-}: DefinitionMeta<Node.OpenTagName>): DefinitionResult {
+export function OpenTagName(
+  node: Node.OpenTagName,
+  file: MarkoVirtualCode,
+): LocationLink[] | undefined {
   const tag = node.parent;
   let tagDef: TagDefinition | null | undefined;
   let range = START_LOCATION;
@@ -24,10 +25,10 @@ export function OpenTagName({
   if (tag.type === NodeType.AttrTag) {
     tagDef =
       tag.owner && tag.owner.nameText
-        ? lookup.getTag(tag.owner.nameText)
+        ? file.tagLookup.getTag(tag.owner.nameText)
         : undefined;
   } else {
-    tagDef = tag.nameText ? lookup.getTag(tag.nameText) : undefined;
+    tagDef = tag.nameText ? file.tagLookup.getTag(tag.nameText) : undefined;
   }
 
   if (!tagDef) {
@@ -61,7 +62,7 @@ export function OpenTagName({
       targetUri: URI.file(tagEntryFile).toString(),
       targetRange: range,
       targetSelectionRange: range,
-      originSelectionRange: parsed.locationAt(node),
+      originSelectionRange: file.markoAst.locationAt(node),
     },
   ];
 }
diff --git a/packages/language-server/src/plugins/marko/definition/index.ts b/packages/language-server/src/plugins/marko/definition/index.ts
new file mode 100644
index 00000000..558f3282
--- /dev/null
+++ b/packages/language-server/src/plugins/marko/definition/index.ts
@@ -0,0 +1,21 @@
+import { NodeType } from "@marko/language-tools";
+import { LocationLink } from "vscode-languageserver";
+import { MarkoVirtualCode } from "../../../language";
+import { AttrName } from "./AttrName";
+import { OpenTagName } from "./OpenTagName";
+
+export function provideDefinitions(
+  doc: MarkoVirtualCode,
+  offset: number,
+): LocationLink[] | undefined {
+  const node = doc.markoAst.nodeAt(offset);
+
+  switch (node?.type) {
+    case NodeType.AttrName:
+      return AttrName(node, doc);
+    case NodeType.OpenTagName:
+      return OpenTagName(node, doc);
+    default:
+      return;
+  }
+}
diff --git a/packages/language-server/src/service/marko/hover/OpenTagName.ts b/packages/language-server/src/plugins/marko/hover/OpenTagName.ts
similarity index 56%
rename from packages/language-server/src/service/marko/hover/OpenTagName.ts
rename to packages/language-server/src/plugins/marko/hover/OpenTagName.ts
index 520ce6d1..1b700a4f 100644
--- a/packages/language-server/src/service/marko/hover/OpenTagName.ts
+++ b/packages/language-server/src/plugins/marko/hover/OpenTagName.ts
@@ -1,22 +1,22 @@
 import type { Node } from "@marko/language-tools";
-
-import { START_LOCATION } from "../../../utils/constants";
+import { Hover } from "vscode-languageserver";
 import getTagNameCompletion from "../util/get-tag-name-completion";
-import type { HoverMeta, HoverResult } from ".";
+import { START_LOCATION } from "../../../utils/constants";
+import { MarkoVirtualCode } from "../../../language";
 
-export function OpenTagName({
-  node,
-  file: { parsed, filename, lookup },
-}: HoverMeta<Node.OpenTagName>): HoverResult {
+export function OpenTagName(
+  node: Node.OpenTagName,
+  file: MarkoVirtualCode,
+): Hover | undefined {
   const tag = node.parent;
-  const range = parsed.locationAt(node);
-  const tagDef = tag.nameText && lookup.getTag(tag.nameText);
+  const range = file.markoAst.locationAt(node);
+  const tagDef = tag.nameText && file.tagLookup.getTag(tag.nameText);
 
   if (tagDef) {
     const completion = getTagNameCompletion({
       tag: tagDef,
       range: START_LOCATION,
-      importer: filename,
+      importer: file.fileName,
     });
 
     if (completion.documentation) {
diff --git a/packages/language-server/src/plugins/marko/hover/index.ts b/packages/language-server/src/plugins/marko/hover/index.ts
new file mode 100644
index 00000000..a2342bf2
--- /dev/null
+++ b/packages/language-server/src/plugins/marko/hover/index.ts
@@ -0,0 +1,18 @@
+import { NodeType } from "@marko/language-tools";
+import { Hover } from "vscode-languageserver";
+import { MarkoVirtualCode } from "../../../language";
+import { OpenTagName } from "./OpenTagName";
+
+export function provideHover(
+  doc: MarkoVirtualCode,
+  offset: number,
+): Hover | undefined {
+  const node = doc.markoAst.nodeAt(offset);
+
+  switch (node?.type) {
+    case NodeType.OpenTagName:
+      return OpenTagName(node, doc);
+    default:
+      return;
+  }
+}
diff --git a/packages/language-server/src/plugins/marko/index.ts b/packages/language-server/src/plugins/marko/index.ts
new file mode 100644
index 00000000..8c211b98
--- /dev/null
+++ b/packages/language-server/src/plugins/marko/index.ts
@@ -0,0 +1,120 @@
+import {
+  LanguageServicePlugin,
+  LanguageServicePluginInstance,
+} from "@volar/language-service";
+import { TextDocument } from "vscode-languageserver-textdocument";
+import { URI } from "vscode-uri";
+import { MarkoVirtualCode } from "../../language";
+import { provideCompletions } from "./complete";
+import { provideHover } from "./hover";
+import { provideValidations } from "./validate";
+import { provideDefinitions } from "./definition";
+// import { provideDocumentSymbols } from "./document-symbols";
+
+export const create = (
+  _: typeof import("typescript"),
+): LanguageServicePlugin => {
+  return {
+    name: "marko",
+    capabilities: {
+      hoverProvider: true,
+      definitionProvider: true,
+      diagnosticProvider: {
+        interFileDependencies: false,
+        workspaceDiagnostics: false,
+      },
+      completionProvider: {
+        triggerCharacters: [
+          ".",
+          ":",
+          "<",
+          ">",
+          "@",
+          "/",
+          '"',
+          "'",
+          "`",
+          " ",
+          "=",
+          "*",
+          "#",
+          "$",
+          "+",
+          "^",
+          "(",
+          "[",
+          "-",
+        ],
+      },
+    },
+    create(context): LanguageServicePluginInstance {
+      return {
+        // TODO: Is this necessary?
+        // provideDocumentSymbols(document, token) {
+        //   if (token.isCancellationRequested) return;
+        //   return worker(document, (virtualCode) => {
+        //     return provideDocumentSymbols(virtualCode);
+        //   });
+        // },
+        provideDefinition(document, position, token) {
+          if (token.isCancellationRequested) return;
+          return worker(document, (virtualCode) => {
+            const offset = document.offsetAt(position);
+            return provideDefinitions(virtualCode, offset);
+          });
+        },
+        provideDiagnostics(document, token) {
+          if (token.isCancellationRequested) return;
+          return worker(document, async (virtualCode) => {
+            return await provideValidations(virtualCode);
+          });
+        },
+        provideHover(document, position, token) {
+          if (token.isCancellationRequested) return;
+          return worker(document, (virtualCode) => {
+            const offset = document.offsetAt(position);
+            return provideHover(virtualCode, offset);
+          });
+        },
+        provideCompletionItems(document, position, _, token) {
+          if (token.isCancellationRequested) return;
+          return worker(document, (virtualCode) => {
+            const offset = document.offsetAt(position);
+            const completions = provideCompletions(virtualCode, offset);
+
+            if (completions) {
+              return {
+                isIncomplete: false,
+                items: completions.map((it) => {
+                  it.data = { source: "marko" };
+                  return it;
+                }),
+              };
+            }
+
+            return {
+              items: [],
+              isIncomplete: true,
+            };
+          });
+        },
+      };
+
+      function worker<T>(
+        document: TextDocument,
+        callback: (markoDocument: MarkoVirtualCode) => T,
+      ): T | undefined {
+        const decoded = context.decodeEmbeddedDocumentUri(
+          URI.parse(document.uri),
+        );
+        const sourceScript =
+          decoded && context.language.scripts.get(decoded[0]);
+        const virtualCode =
+          decoded && sourceScript?.generated?.embeddedCodes.get(decoded[1]);
+        if (!(virtualCode instanceof MarkoVirtualCode)) return;
+
+        return callback(virtualCode);
+      }
+    },
+  };
+};
diff --git a/packages/language-server/src/service/marko/util/get-tag-name-completion.ts b/packages/language-server/src/plugins/marko/util/get-tag-name-completion.ts
similarity index 100%
rename from packages/language-server/src/service/marko/util/get-tag-name-completion.ts
rename to packages/language-server/src/plugins/marko/util/get-tag-name-completion.ts
diff --git a/packages/language-server/src/service/marko/util/is-document-link-attr.ts b/packages/language-server/src/plugins/marko/util/is-document-link-attr.ts
similarity index 100%
rename from packages/language-server/src/service/marko/util/is-document-link-attr.ts
rename to packages/language-server/src/plugins/marko/util/is-document-link-attr.ts
diff --git a/packages/language-server/src/service/marko/validate.ts b/packages/language-server/src/plugins/marko/validate.ts
similarity index 65%
rename from packages/language-server/src/service/marko/validate.ts
rename to packages/language-server/src/plugins/marko/validate.ts
index edaeabe0..6a428208 100644
--- a/packages/language-server/src/service/marko/validate.ts
+++ b/packages/language-server/src/plugins/marko/validate.ts
@@ -1,83 +1,67 @@
+import { Diagnostic, DiagnosticSeverity } from "vscode-languageserver-protocol";
 import { DiagnosticType } from "@marko/babel-utils";
-import type { Config } from "@marko/compiler";
-import { Project } from "@marko/language-tools";
-import path from "path";
-import { Diagnostic, DiagnosticSeverity } from "vscode-languageserver";
-
-import { getFSPath } from "../../utils/file";
-import type { Plugin } from "../types";
+import { Config } from "@marko/compiler";
+import { MarkoVirtualCode } from "../../language";
 
 const markoErrorRegExp =
   /^(.+?)\.marko(?:\((\d+)(?:\s*,\s*(\d+))?\))?: (.*)$/gm;
-const compilerConfig: Config = {
-  code: false,
-  output: "migrate",
-  sourceMaps: false,
-  errorRecovery: true,
-  babelConfig: {
-    babelrc: false,
-    configFile: false,
-    browserslistConfigFile: false,
-    caller: {
-      name: "@marko/language-server",
-      supportsStaticESM: true,
-      supportsDynamicImport: true,
-      supportsTopLevelAwait: true,
-      supportsExportNamespaceFrom: true,
-    },
-  },
-};
 
-export const doValidate: Plugin["doValidate"] = (doc) => {
-  const filename = getFSPath(doc);
+export async function provideValidations(
+  file: MarkoVirtualCode,
+): Promise<Diagnostic[]> {
   const diagnostics: Diagnostic[] = [];
-
   try {
-    const { meta } = Project.getCompiler(
-      filename && path.dirname(filename),
-    ).compileSync(doc.getText(), filename || "untitled.marko", compilerConfig);
+    // Instead of compiling in the virtual code, we compile the code as part of the diagnostics
+    // callback to avoid blocking other more urgent requests like completions or hovers.
+    const compilerResult = await file.compiler.compile(
+      file.code,
+      file.fileName,
+      compilerConfig,
+    );
 
-    if (meta.diagnostics) {
-      for (const diag of meta.diagnostics) {
-        const range = diag.loc
-          ? {
-              start: {
-                line: diag.loc.start.line - 1,
-                character: diag.loc.start.column,
-              },
-              end: {
-                line: diag.loc.end.line - 1,
-                character: diag.loc.end.column,
-              },
-            }
-          : {
-              start: { line: 0, character: 0 },
-              end: { line: 0, character: 0 },
-            };
+    if (compilerResult) {
+      if (compilerResult.meta.diagnostics) {
+        for (const diag of compilerResult.meta.diagnostics) {
+          const range = diag.loc
+            ? {
+                start: {
+                  line: diag.loc.start.line - 1,
+                  character: diag.loc.start.column,
+                },
+                end: {
+                  line: diag.loc.end.line - 1,
+                  character: diag.loc.end.column,
+                },
+              }
+            : {
+                start: { line: 0, character: 0 },
+                end: { line: 0, character: 0 },
+              };
 
-        let severity: DiagnosticSeverity | undefined;
+          let severity: DiagnosticSeverity | undefined;
 
-        switch (diag.type) {
-          case DiagnosticType.Warning:
-          case DiagnosticType.Deprecation:
-            severity = DiagnosticSeverity.Warning;
-            break;
-          case DiagnosticType.Suggestion:
-            severity = DiagnosticSeverity.Hint;
-            break;
-          default:
-            severity = DiagnosticSeverity.Error;
-            break;
-        }
+          switch (diag.type) {
+            case DiagnosticType.Warning:
+            case DiagnosticType.Deprecation:
+              severity = DiagnosticSeverity.Warning;
+              break;
+            case DiagnosticType.Suggestion:
+              severity = DiagnosticSeverity.Hint;
+              break;
+            default:
+              severity = DiagnosticSeverity.Error;
+              break;
+          }
 
-        diagnostics.push({
-          range,
-          source: "marko",
-          code: undefined,
-          tags: undefined,
-          severity,
-          message: diag.label,
-        });
+          diagnostics.push({
+            range,
+            source: "marko",
+            code: undefined,
+            tags: undefined,
+            severity,
+            message: diag.label,
+          });
+        }
       }
     }
   } catch (err) {
@@ -85,7 +69,7 @@ export const doValidate: Plugin["doValidate"] = (doc) => {
   }
 
   return diagnostics;
-};
+}
 
 function addDiagnosticsForError(err: unknown, diagnostics: Diagnostic[]) {
   if (!isError(err)) {
@@ -178,3 +162,22 @@ function isErrorWithLoc(err: unknown): err is Error & {
     typeof (loc as { end: { column: unknown } }).end.column === "number"
   );
 }
+
+const compilerConfig: Config = {
+  code: false,
+  output: "migrate",
+  sourceMaps: false,
+  errorRecovery: true,
+  babelConfig: {
+    babelrc: false,
+    configFile: false,
+    browserslistConfigFile: false,
+    caller: {
+      name: "@marko/language-server",
+      supportsStaticESM: true,
+      supportsDynamicImport: true,
+      supportsTopLevelAwait: true,
+      supportsExportNamespaceFrom: true,
+    },
+  },
+};
diff --git a/packages/language-server/src/plugins/prettier/index.ts b/packages/language-server/src/plugins/prettier/index.ts
new file mode 100644
index 00000000..a3e23a84
--- /dev/null
+++ b/packages/language-server/src/plugins/prettier/index.ts
@@ -0,0 +1,175 @@
+import { Project } from "@marko/language-tools";
+import { Connection, ShowMessageNotification } from "@volar/language-server";
+import { MessageType } from "@volar/language-server";
+import type {
+  FormattingOptions,
+  LanguageServiceContext,
+  LanguageServicePlugin,
+} from "@volar/language-service";
+import { dirname } from "path";
+import type { Options } from "prettier";
+import * as prettierBuiltIn from "prettier";
+import * as markoPrettier from "prettier-plugin-marko";
+import { create as createPrettierService } from "volar-service-prettier";
+import { URI } from "vscode-uri";
+
+import { importMarkoPrettierPlugin, importPrettier } from "./package";
+
+export function createMarkoPrettierService(
+  connection: Connection,
+): LanguageServicePlugin {
+  let prettier: typeof import("prettier") | undefined;
+  let prettierPlugin: typeof markoPrettier | undefined;
+  let hasShownNotification = false;
+
+  return createPrettierService(
+    (context) => {
+      const { prettierInstance, prettierPluginMarko } =
+        getPrettierInstance(context);
+
+      prettier = prettierInstance;
+      prettierPlugin = prettierPluginMarko;
+
+      // Show a warning notification if Prettier or the Marko plugin isn't installed.
+      if ((!prettier || !prettierPlugin) && !hasShownNotification) {
+        connection.sendNotification(ShowMessageNotification.type, {
+          message:
+            "Couldn't load `prettier` or `prettier-plugin-marko`. Falling back to built-in versions.",
+          type: MessageType.Warning,
+        });
+        hasShownNotification = true;
+      }
+
+      if (!prettier) {
+        // Fallback to the built-in version of prettier.
+        prettier = prettierBuiltIn;
+      }
+
+      if (!prettierPlugin) {
+        // Fallback to the built-in version of prettier-plugin-marko.
+        prettierPlugin = markoPrettier;
+      }
+
+      return prettier;
+    },
+    {
+      documentSelector: [{ language: "marko" }],
+      isFormattingEnabled: async (prettier, document, _) => {
+        const uri = URI.parse(document.uri);
+        if (uri.scheme === "file") {
+          const fileInfo = await prettier.getFileInfo(uri.fsPath, {
+            ignorePath: ".prettierignore",
+            resolveConfig: false,
+          });
+          if (fileInfo.ignored) {
+            return false;
+          }
+        }
+        return true;
+      },
+      getFormattingOptions: async (
+        prettierInstance,
+        document,
+        formatOptions,
+        context,
+      ) => {
+        return getFormattingOptions(
+          prettierInstance,
+          prettierPlugin!,
+          document.uri,
+          formatOptions,
+          context,
+          (message) => {
+            connection.sendNotification(ShowMessageNotification.type, {
+              message,
+              type: MessageType.Warning,
+            });
+          },
+        );
+      },
+    },
+  );
+}
+
+export function getPrettierInstance(context: LanguageServiceContext): {
+  prettierInstance?: typeof import("prettier");
+  prettierPluginMarko?: typeof import("prettier-plugin-marko");
+} {
+  for (const workspaceFolder of context.env.workspaceFolders) {
+    if (workspaceFolder.scheme === "file") {
+      const prettierInstance = importPrettier(workspaceFolder.fsPath);
+      const prettierPluginMarko = importMarkoPrettierPlugin(
+        workspaceFolder.fsPath,
+      );
+
+      return { prettierInstance, prettierPluginMarko };
+    }
+  }
+  return {};
+}
+
+export async function getFormattingOptions(
+  prettierInstance: typeof import("prettier"),
+  prettierPlugin: typeof markoPrettier,
+  documentUriString: string,
+  formatOptions: FormattingOptions,
+  context: LanguageServiceContext,
+  onError?: (message: string) => void,
+): Promise<Options> {
+  const uri = URI.parse(documentUriString);
+  const documentUri = context.decodeEmbeddedDocumentUri(uri)?.[0] ?? uri;
+  const filePath = documentUri.fsPath;
+
+  if (!filePath) {
+    return {};
+  }
+
+  const fileDir = dirname(filePath);
+  let configOptions = null;
+  try {
+    configOptions = await prettierInstance.resolveConfig(filePath, {
+      useCache: false,
+      editorconfig: true,
+    });
+  } catch (e) {
+    onError && onError(`Failed to load Prettier config.\n\nError:\n${e}`);
+    console.error("Failed to load Prettier config.", e);
+  }
+
+  const editorOptions = await context.env.getConfiguration<object>?.(
+    "prettier",
+    documentUriString,
+  );
+
+  // Return a config with the following cascade:
+  // - Prettier config file should always win if it exists, if it doesn't:
+  // - Prettier config from the VS Code extension is used, if it doesn't exist:
+  // - Use the editor's basic configuration settings
+  const resolvedConfig = {
+    filepath: filePath,
+    tabWidth: formatOptions.tabSize,
+    useTabs: !formatOptions.insertSpaces,
+    ...editorOptions,
+    ...configOptions,
+  };
+
+  try {
+    prettierPlugin.setCompiler(
+      Project.getCompiler(fileDir),
+      Project.getConfig(fileDir),
+    );
+
+    return {
+      ...resolvedConfig,
+      plugins: [prettierPlugin, ...(resolvedConfig.plugins ?? [])],
+      parser: "marko",
+    };
+  } catch (e) {
+    onError &&
+      onError(`Failed to configure marko-prettier-plugin.\n\nError:\n${e}`);
+    console.error("Failed to load Prettier config.", e);
+    return {
+      ...resolvedConfig,
+    };
+  }
+}
diff --git a/packages/language-server/src/plugins/prettier/package.ts b/packages/language-server/src/plugins/prettier/package.ts
new file mode 100644
index 00000000..f7f230d5
--- /dev/null
+++ b/packages/language-server/src/plugins/prettier/package.ts
@@ -0,0 +1,32 @@
+import type * as prettier from "prettier";
+import type * as prettierPluginMarko from "prettier-plugin-marko";
+
+export function importPrettier(fromPath: string): typeof prettier | undefined {
+  try {
+    const packagePath = require.resolve("prettier", {
+      paths: [fromPath, __dirname],
+    });
+    console.log("Found Prettier", packagePath);
+    return require(packagePath);
+  } catch (error) {
+    console.error(error);
+  }
+
+  return undefined;
+}
+
+export function importMarkoPrettierPlugin(
+  fromPath: string,
+): typeof prettierPluginMarko | undefined {
+  try {
+    const packagePath = require.resolve("prettier-plugin-marko", {
+      paths: [fromPath, __dirname],
+    });
+    console.log("prettier-plugin-marko", packagePath);
+    return require(packagePath);
+  } catch (error) {
+    console.error(error);
+  }
+
+  return undefined;
+}
diff --git a/packages/language-server/src/service/html/index.ts b/packages/language-server/src/service/html/index.ts
deleted file mode 100644
index 43f6ce77..00000000
--- a/packages/language-server/src/service/html/index.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-import { extractHTML, type Parsed } from "@marko/language-tools";
-import axe from "axe-core";
-import { JSDOM } from "jsdom";
-import type { TextDocument } from "vscode-languageserver-textdocument";
-
-import { getMarkoFile } from "../../utils/file";
-import { get } from "../../utils/text-documents";
-import type { Plugin } from "../types";
-import { ruleExceptions } from "./axe-rules/rule-exceptions";
-
-const extractCache = new WeakMap<Parsed, ReturnType<typeof extractHTML>>();
-
-// const axeViolationImpact: {
-//   [impact in NonNullable<axe.ImpactValue>]: DiagnosticSeverity;
-// } = {
-//   minor: 1,
-//   moderate: 2,
-//   serious: 3,
-//   critical: 4,
-// };
-
-const HTMLService: Partial<Plugin> = {
-  commands: {
-    "$/showHtmlOutput": async (uri: string) => {
-      const doc = get(uri);
-      if (!doc) return;
-
-      const { extracted } = extract(doc);
-
-      return {
-        language: "html",
-        content: extracted.toString(),
-      };
-    },
-  },
-  async doValidate(doc) {
-    const { extracted, nodeDetails } = extract(doc);
-
-    const jsdom = new JSDOM(extracted.toString(), {
-      includeNodeLocations: true,
-    });
-    const { documentElement } = jsdom.window.document;
-
-    const getViolationNodes = async (runOnly: string[]) =>
-      (
-        await axe.run(documentElement, {
-          runOnly,
-          rules: {
-            "color-contrast": { enabled: false },
-          },
-          resultTypes: ["violations"],
-          elementRef: true,
-        })
-      ).violations.flatMap(({ nodes, id }) =>
-        nodes.map((node) => ({ ...node, ruleId: id })),
-      );
-
-    const release = await acquireMutexLock();
-    const violations = await getViolationNodes(Object.keys(ruleExceptions));
-    release();
-
-    return violations.flatMap((result) => {
-      const { element } = result;
-      if (!element) return [];
-      const ruleId = result.ruleId as keyof typeof ruleExceptions;
-
-      if (element.dataset.markoNodeId) {
-        const details = nodeDetails[element.dataset.markoNodeId];
-        if (
-          (ruleExceptions[ruleId].attrSpread && details.hasDynamicAttrs) ||
-          (ruleExceptions[ruleId].unknownBody && details.hasDynamicBody) ||
-          ruleExceptions[ruleId].dynamicAttrs?.some(
-            (attr) => element.getAttribute(attr) === "dynamic",
-          )
-        ) {
-          return [];
-        }
-      }
-
-      const generatedLoc = jsdom.nodeLocation(element);
-      if (!generatedLoc) return [];
-
-      const sourceRange = extracted.sourceLocationAt(
-        generatedLoc.startOffset + 1,
-        generatedLoc.startOffset + 1 + element.tagName.length,
-      );
-      if (!sourceRange) return [];
-
-      return [
-        {
-          range: sourceRange,
-          severity: 3,
-          source: `axe-core(${ruleId})`,
-          message: result.failureSummary ?? "unknown accessibility issue",
-        },
-      ];
-    });
-  },
-};
-
-function extract(doc: TextDocument) {
-  const { parsed } = getMarkoFile(doc);
-  let cached = extractCache.get(parsed);
-
-  if (!cached) {
-    cached = extractHTML(parsed);
-    extractCache.set(parsed, cached);
-  }
-
-  return cached;
-}
-
-let lock: Promise<void> | undefined;
-async function acquireMutexLock() {
-  const currLock = lock;
-  let resolve!: () => void;
-  lock = new Promise((_) => (resolve = _));
-  await currLock;
-  return resolve;
-}
-
-export default HTMLService;
diff --git a/packages/language-server/src/service/index.ts b/packages/language-server/src/service/index.ts
deleted file mode 100644
index ea661c2c..00000000
--- a/packages/language-server/src/service/index.ts
+++ /dev/null
@@ -1,382 +0,0 @@
-import type {
-  CodeAction,
-  ColorInformation,
-  ColorPresentation,
-  Command,
-  CompletionItem,
-  DefinitionLink,
-  Diagnostic,
-  DocumentHighlight,
-  DocumentLink,
-  Hover,
-  Location,
-  MarkedString,
-  Range,
-  SymbolInformation,
-  WorkspaceEdit,
-} from "vscode-languageserver";
-import { MarkupContent, MarkupKind } from "vscode-languageserver";
-
-import {
-  doChange,
-  doChangeWatchedFiles,
-  doClose,
-  doOpen,
-  get,
-} from "../utils/text-documents";
-export const documents = {
-  get,
-  doChange,
-  doOpen,
-  doClose,
-  doChangeWatchedFiles,
-};
-
-import HtmlPlugin from "./html";
-import MarkoPlugin from "./marko";
-import ScriptPlugin from "./script";
-import StylePlugin from "./style";
-import type { Plugin } from "./types";
-
-const REG_MARKDOWN_CHARS = /[\\`*_{}[\]<>()#+.!|-]/g;
-const plugins = [MarkoPlugin, ScriptPlugin, StylePlugin, HtmlPlugin];
-
-/**
- * Facade to all embedded plugins, eg css, typescript and our own.
- */
-const service: Plugin = {
-  commands: Object.assign({}, ...plugins.map(({ commands }) => commands)),
-  async initialize(params) {
-    await Promise.allSettled(
-      plugins.map((plugin) => plugin.initialize?.(params)),
-    );
-  },
-  async doComplete(doc, params, cancel) {
-    // TODO: this should handle CompletionList.itemDefaults.
-    // If there is a single responding plugin, pass through, otherwise need to apply the defaults to the completion items for the plugin.
-
-    // Used to filter out duplicate labels (highest sortText wins).
-    const results = await Promise.allSettled(
-      plugins.map((plugin) => plugin.doComplete?.(doc, params, cancel)),
-    );
-
-    if (cancel.isCancellationRequested) return;
-
-    const itemsByLabel = new Map<string, CompletionItem>();
-    for (const result of results) {
-      if (result.status !== "fulfilled" || !result.value) continue;
-
-      for (const item of Array.isArray(result.value)
-        ? result.value
-        : result.value.items) {
-        const { label } = item;
-        const existingItem = itemsByLabel.get(label);
-        if (existingItem) {
-          if ((existingItem.sortText || label) < (item.sortText || label)) {
-            itemsByLabel.set(label, item);
-          }
-        } else {
-          itemsByLabel.set(label, item);
-        }
-      }
-    }
-
-    return { items: [...itemsByLabel.values()], isIncomplete: true };
-  },
-  async doCompletionResolve(item, cancel) {
-    for (const plugin of plugins) {
-      try {
-        const result = await plugin.doCompletionResolve?.(item, cancel);
-        if (cancel.isCancellationRequested) return;
-        if (result) return result;
-      } catch {
-        // ignore
-      }
-    }
-  },
-  async findDefinition(doc, params, cancel) {
-    const results = await Promise.allSettled(
-      plugins.map((plugin) => plugin.findDefinition?.(doc, params, cancel)),
-    );
-
-    if (cancel.isCancellationRequested) return;
-
-    let links: (Location | DefinitionLink)[] | undefined;
-    for (const result of results) {
-      if (result.status !== "fulfilled" || !result.value) continue;
-      links = (links || []).concat(result.value);
-    }
-
-    return links;
-  },
-  async findReferences(doc, params, cancel) {
-    const results = await Promise.allSettled(
-      plugins.map((plugin) => plugin.findReferences?.(doc, params, cancel)),
-    );
-
-    if (cancel.isCancellationRequested) return;
-
-    let references: Location[] | undefined;
-    for (const result of results) {
-      if (result.status !== "fulfilled" || !result.value) continue;
-      references = (references || []).concat(result.value);
-    }
-
-    return references;
-  },
-  async findDocumentSymbols(doc, params, cancel) {
-    const results = await Promise.allSettled(
-      plugins.map((plugin) =>
-        plugin.findDocumentSymbols?.(doc, params, cancel),
-      ),
-    );
-
-    if (cancel.isCancellationRequested) return;
-
-    let symbols: SymbolInformation[] | undefined;
-    for (const result of results) {
-      if (result.status !== "fulfilled" || !result.value) continue;
-      symbols = (symbols || []).concat(result.value);
-    }
-
-    return symbols;
-  },
-  async findDocumentLinks(doc, params, cancel) {
-    const results = await Promise.allSettled(
-      plugins.map((plugin) => plugin.findDocumentLinks?.(doc, params, cancel)),
-    );
-
-    if (cancel.isCancellationRequested) return;
-
-    let links: DocumentLink[] | undefined;
-    for (const result of results) {
-      if (result.status !== "fulfilled" || !result.value) continue;
-      links = (links || []).concat(result.value);
-    }
-
-    return links;
-  },
-  async findDocumentHighlights(doc, params, cancel) {
-    const results = await Promise.allSettled(
-      plugins.map((plugin) =>
-        plugin.findDocumentHighlights?.(doc, params, cancel),
-      ),
-    );
-
-    if (cancel.isCancellationRequested) return;
-
-    let highlights: DocumentHighlight[] | undefined;
-    for (const result of results) {
-      if (result.status !== "fulfilled" || !result.value) continue;
-      highlights = (highlights || []).concat(result.value);
-    }
-
-    return highlights;
-  },
-  async findDocumentColors(doc, params, cancel) {
-    const results = await Promise.allSettled(
-      plugins.map((plugin) => plugin.findDocumentColors?.(doc, params, cancel)),
-    );
-
-    if (cancel.isCancellationRequested) return;
-
-    let colors: ColorInformation[] | undefined;
-    for (const result of results) {
-      if (result.status !== "fulfilled" || !result.value) continue;
-      colors = (colors || []).concat(result.value);
-    }
-
-    return colors;
-  },
-  async getColorPresentations(doc, params, cancel) {
-    const results = await Promise.allSettled(
-      plugins.map((plugin) =>
-        plugin.getColorPresentations?.(doc, params, cancel),
-      ),
-    );
-
-    if (cancel.isCancellationRequested) return;
-
-    let presentations: ColorPresentation[] | undefined;
-    for (const result of results) {
-      if (result.status !== "fulfilled" || !result.value) continue;
-      presentations = (presentations || []).concat(result.value);
-    }
-
-    return presentations;
-  },
-  async doHover(doc, params, cancel) {
-    const results = await Promise.allSettled(
-      plugins.map((plugin) => plugin.doHover?.(doc, params, cancel)),
-    );
-
-    if (cancel.isCancellationRequested) return;
-
-    let hovers: Hover | undefined;
-    for (const result of results) {
-      if (result.status !== "fulfilled" || !result.value) continue;
-      if (hovers) {
-        hovers.range = maxRange(hovers.range, result.value.range);
-        hovers.contents = mergeHoverContents(
-          hovers.contents,
-          result.value.contents,
-        );
-      } else {
-        hovers = result.value;
-      }
-    }
-
-    return hovers;
-  },
-  async doRename(doc, params, cancel) {
-    const results = await Promise.allSettled(
-      plugins.map((plugin) => plugin.doRename?.(doc, params, cancel)),
-    );
-
-    if (cancel.isCancellationRequested) return;
-
-    let changes: WorkspaceEdit["changes"];
-    let changeAnnotations: WorkspaceEdit["changeAnnotations"];
-    let documentChanges: WorkspaceEdit["documentChanges"];
-    for (const result of results) {
-      if (result.status !== "fulfilled" || !result.value) continue;
-      const { value } = result;
-      if (value.changes) {
-        if (changes) {
-          changes = { ...changes };
-
-          for (const uri in value.changes) {
-            changes[uri] = changes[uri]
-              ? changes[uri].concat(value.changes[uri])
-              : value.changes[uri];
-          }
-        } else {
-          changes = value.changes;
-        }
-      }
-
-      if (value.changeAnnotations) {
-        changeAnnotations = changeAnnotations
-          ? {
-              ...changeAnnotations,
-              ...value.changeAnnotations,
-            }
-          : value.changeAnnotations;
-      }
-
-      if (value.documentChanges) {
-        documentChanges = documentChanges
-          ? documentChanges.concat(value.documentChanges)
-          : value.documentChanges;
-      }
-    }
-
-    if (changes || changeAnnotations || documentChanges) {
-      return {
-        changes,
-        changeAnnotations,
-        documentChanges,
-      };
-    }
-  },
-  async doCodeActions(doc, params, cancel) {
-    const results = await Promise.allSettled(
-      plugins.map((plugin) => plugin.doCodeActions?.(doc, params, cancel)),
-    );
-
-    if (cancel.isCancellationRequested) return;
-
-    let actions: (Command | CodeAction)[] | undefined;
-    for (const result of results) {
-      if (result.status !== "fulfilled" || !result.value) continue;
-      actions = (actions || []).concat(result.value);
-    }
-
-    return actions;
-  },
-  async doValidate(doc) {
-    const results = await Promise.allSettled(
-      plugins.map((plugin) => plugin.doValidate?.(doc)),
-    );
-
-    let diagnostics: Diagnostic[] | undefined;
-    for (const result of results) {
-      if (result.status !== "fulfilled" || !result.value) continue;
-      diagnostics = (diagnostics || []).concat(result.value);
-    }
-
-    return diagnostics;
-  },
-  format: MarkoPlugin.format!,
-};
-
-function maxRange(a: Range | undefined, b: Range | undefined) {
-  if (!a) return b;
-  if (!b) return a;
-  return {
-    start: {
-      line: Math.min(a.start.line, b.start.line),
-      character: Math.min(a.start.character, b.start.character),
-    },
-    end: {
-      line: Math.max(a.end.line, b.end.line),
-      character: Math.max(a.end.character, b.end.character),
-    },
-  };
-}
-
-function mergeHoverContents(a: Hover["contents"], b: Hover["contents"]) {
-  if (!a) return b;
-  if (!b) return a;
-
-  if (!MarkupContent.is(a)) {
-    a = markedStringToMarkupContent(a);
-  }
-
-  if (!MarkupContent.is(b)) {
-    b = markedStringToMarkupContent(b);
-  }
-
-  if (a.kind === b.kind) {
-    return {
-      kind: a.kind,
-      value: `${a.value}\n${b.value}`,
-    };
-  }
-
-  return {
-    kind: MarkupKind.Markdown,
-    value: `${markupContentToMarkdown(a)}\n${markupContentToMarkdown(b)}`,
-  };
-}
-
-function markedStringToMarkupContent(
-  markedString: MarkedString | MarkedString[],
-): MarkupContent {
-  return {
-    kind: MarkupKind.Markdown,
-    value: Array.isArray(markedString)
-      ? markedString.map((it) => markedStringToString(it)).join("\n")
-      : markedStringToString(markedString),
-  };
-}
-
-function markedStringToString(markedString: MarkedString) {
-  if (typeof markedString === "string") {
-    return markedString;
-  }
-
-  return `\`\`\`${markedString.language}\n${markedString.value}\n\`\`\``;
-}
-
-function markupContentToMarkdown(content: MarkupContent): string {
-  return content.kind === MarkupKind.Markdown
-    ? content.value
-    : escapeMarkdown(content.value);
-}
-
-function escapeMarkdown(str: string) {
-  return str.replace(REG_MARKDOWN_CHARS, "$1");
-}
-
-export { service as default };
diff --git a/packages/language-server/src/service/marko/complete/AttrValue.ts b/packages/language-server/src/service/marko/complete/AttrValue.ts
deleted file mode 100644
index 844346c7..00000000
--- a/packages/language-server/src/service/marko/complete/AttrValue.ts
+++ /dev/null
@@ -1,70 +0,0 @@
-import type { Node } from "@marko/language-tools";
-import path from "path";
-import {
-  CompletionItem,
-  CompletionItemKind,
-  TextEdit,
-} from "vscode-languageserver";
-
-import fileSystem, { FileType } from "../../../utils/file-system";
-import resolveUrl from "../../../utils/resolve-url";
-import isDocumentLinkAttr from "../util/is-document-link-attr";
-import type { CompletionMeta } from ".";
-
-export async function AttrValue({
-  offset,
-  node,
-  file: { uri, parsed, code },
-}: CompletionMeta<Node.AttrValue>): Promise<void | CompletionItem[]> {
-  const attr = node.parent;
-  if (isDocumentLinkAttr(code, attr.parent, attr)) {
-    const start = node.value.start + 1;
-    if (code[start] !== ".") return; // only resolve relative paths
-
-    const end = node.value.end - 1;
-    const relativeOffset = offset - start;
-    const rawValue = parsed.read({
-      start,
-      end,
-    });
-
-    const segmentStart = rawValue.lastIndexOf("/", relativeOffset);
-    if (segmentStart === -1) return; // only resolve after a slash.
-
-    const req = rawValue.slice(0, segmentStart);
-    const resolved = resolveUrl(req, uri);
-
-    if (resolved) {
-      const result: CompletionItem[] = [];
-      const curFile = req === "." ? path.basename(uri) : undefined;
-      const replaceRange = parsed.locationAt({
-        start: start + segmentStart + 1,
-        end: start + rawValue.length,
-      });
-
-      for (const [entry, type] of await fileSystem.readDirectory(resolved)) {
-        if (entry[0] !== "." && entry !== curFile) {
-          result.push(
-            type === FileType.Directory
-              ? {
-                  label: `${entry}/`,
-                  kind: CompletionItemKind.Folder,
-                  textEdit: TextEdit.replace(replaceRange, `${entry}/`),
-                  command: {
-                    title: "Suggest",
-                    command: "editor.action.triggerSuggest",
-                  },
-                }
-              : {
-                  label: entry,
-                  kind: CompletionItemKind.File,
-                  textEdit: TextEdit.replace(replaceRange, entry),
-                },
-          );
-        }
-      }
-
-      return result;
-    }
-  }
-}
diff --git a/packages/language-server/src/service/marko/complete/index.ts b/packages/language-server/src/service/marko/complete/index.ts
deleted file mode 100644
index 9f1e65b0..00000000
--- a/packages/language-server/src/service/marko/complete/index.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { NodeType } from "@marko/language-tools";
-import type { CompletionItem, CompletionParams } from "vscode-languageserver";
-
-import { getMarkoFile, MarkoFile } from "../../../utils/file";
-import type { Plugin, Result } from "../../types";
-import { AttrName } from "./AttrName";
-import { AttrValue } from "./AttrValue";
-import { Import } from "./Import";
-import { OpenTagName } from "./OpenTagName";
-import { Tag } from "./Tag";
-
-export type CompletionResult = Result<CompletionItem[]>;
-export interface CompletionMeta<N = unknown> {
-  file: MarkoFile;
-  params: CompletionParams;
-  offset: number;
-  node: N;
-}
-
-const handlers: Record<
-  string,
-  (data: CompletionMeta<any>) => CompletionResult
-> = {
-  Tag,
-  OpenTagName,
-  AttrName,
-  AttrValue,
-  Import,
-};
-
-export const doComplete: Plugin["doComplete"] = async (doc, params) => {
-  const file = getMarkoFile(doc);
-  const offset = doc.offsetAt(params.position);
-  const node = file.parsed.nodeAt(offset);
-  return {
-    items:
-      (await handlers[NodeType[node.type]]?.({
-        file,
-        params,
-        offset,
-        node,
-      })) || [],
-    isIncomplete: true,
-  };
-};
diff --git a/packages/language-server/src/service/marko/definition/index.ts b/packages/language-server/src/service/marko/definition/index.ts
deleted file mode 100644
index 9baf4b0b..00000000
--- a/packages/language-server/src/service/marko/definition/index.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { NodeType } from "@marko/language-tools";
-import type { DefinitionLink, DefinitionParams } from "vscode-languageserver";
-
-import { getMarkoFile, MarkoFile } from "../../../utils/file";
-import type { Plugin, Result } from "../../types";
-import { AttrName } from "./AttrName";
-import { OpenTagName } from "./OpenTagName";
-
-export type DefinitionResult = Result<DefinitionLink[]>;
-export interface DefinitionMeta<N = unknown> {
-  file: MarkoFile;
-  params: DefinitionParams;
-  offset: number;
-  node: N;
-}
-
-const handlers: Record<
-  string,
-  (data: DefinitionMeta<any>) => DefinitionResult
-> = {
-  OpenTagName,
-  AttrName,
-};
-
-export const findDefinition: Plugin["findDefinition"] = async (doc, params) => {
-  const file = getMarkoFile(doc);
-  const offset = doc.offsetAt(params.position);
-  const node = file.parsed.nodeAt(offset);
-  return (
-    (await handlers[NodeType[node.type]]?.({
-      file,
-      params,
-      offset,
-      node,
-    })) || []
-  );
-};
diff --git a/packages/language-server/src/service/marko/document-links.ts b/packages/language-server/src/service/marko/document-links.ts
deleted file mode 100644
index 800c44c0..00000000
--- a/packages/language-server/src/service/marko/document-links.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-import { type Node, NodeType } from "@marko/language-tools";
-import type { DocumentLink } from "vscode-languageserver";
-
-import { MarkoFile, processDoc } from "../../utils/file";
-import resolveUrl from "../../utils/resolve-url";
-import type { Plugin } from "../types";
-import isDocumentLinkAttr from "./util/is-document-link-attr";
-
-const importTagReg = /(['"])<((?:[^'"\\>]|\\.)*)>?\1/g;
-
-export const findDocumentLinks: Plugin["findDocumentLinks"] = async (doc) => {
-  return processDoc(doc, extractDocumentLinks);
-};
-
-/**
- * Iterate over the Marko CST and extract all the file links in the document.
- */
-function extractDocumentLinks({
-  uri,
-  scheme,
-  parsed,
-  code,
-  lookup,
-}: MarkoFile): DocumentLink[] {
-  if (scheme !== "file") {
-    return [];
-  }
-
-  const links: DocumentLink[] = [];
-  const { program, read } = parsed;
-  const visit = (node: Node.ChildNode) => {
-    switch (node.type) {
-      case NodeType.AttrTag:
-        if (node.body) {
-          for (const child of node.body) {
-            visit(child);
-          }
-        }
-        break;
-      case NodeType.Tag:
-        if (node.attrs && node.nameText) {
-          for (const attr of node.attrs) {
-            if (isDocumentLinkAttr(code, node, attr)) {
-              const resolved = resolveUrl(
-                read(attr.value.value).slice(1, -1),
-                uri,
-              );
-              if (resolved) {
-                links.push({
-                  range: parsed.locationAt(attr.value.value),
-                  target: resolveUrl(read(attr.value.value).slice(1, -1), uri),
-                });
-              }
-            }
-          }
-        }
-        if (node.body) {
-          for (const child of node.body) {
-            visit(child);
-          }
-        }
-
-        break;
-    }
-  };
-
-  for (const node of program.static) {
-    // check for import statement (this currently only support the tag import shorthand).
-    if (node.type === NodeType.Import) {
-      importTagReg.lastIndex = 0;
-      const value = parsed.read(node);
-      const match = importTagReg.exec(value);
-      if (match) {
-        const [{ length }, , tagName] = match;
-        const tagDef = lookup.getTag(tagName);
-        const fileForTag = tagDef && (tagDef.template || tagDef.renderer);
-
-        if (fileForTag) {
-          links.push({
-            range: parsed.locationAt({
-              start: node.start + match.index,
-              end: node.start + match.index + length,
-            }),
-            target: fileForTag,
-          });
-        }
-      }
-    }
-  }
-
-  for (const node of program.body) {
-    visit(node);
-  }
-
-  return links;
-}
diff --git a/packages/language-server/src/service/marko/document-symbols.ts b/packages/language-server/src/service/marko/document-symbols.ts
deleted file mode 100644
index 85f78fca..00000000
--- a/packages/language-server/src/service/marko/document-symbols.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import { type Node, NodeType } from "@marko/language-tools";
-import { SymbolInformation, SymbolKind } from "vscode-languageserver";
-
-import { MarkoFile, processDoc } from "../../utils/file";
-import type { Plugin } from "../types";
-
-export const findDocumentSymbols: Plugin["findDocumentSymbols"] = async (doc) =>
-  processDoc(doc, extractDocumentSymbols);
-
-/**
- * Iterate over the Marko CST and extract all the symbols (mostly tags) in the document.
- */
-function extractDocumentSymbols({
-  uri,
-  scheme,
-  parsed,
-  lookup,
-}: MarkoFile): SymbolInformation[] {
-  if (scheme !== "file") {
-    return [];
-  }
-
-  const symbols: SymbolInformation[] = [];
-  const { program } = parsed;
-  const visit = (node: Node.ChildNode) => {
-    switch (node.type) {
-      case NodeType.Tag:
-      case NodeType.AttrTag:
-        symbols.push({
-          name:
-            (node.type === NodeType.AttrTag
-              ? node.nameText?.slice(node.nameText.indexOf("@"))
-              : node.nameText) || "<${...}>",
-          kind:
-            (node.nameText &&
-              lookup.getTag(node.nameText)?.html &&
-              SymbolKind.Property) ||
-            SymbolKind.Class,
-          location: {
-            uri,
-            range: parsed.locationAt(node),
-          },
-        });
-
-        if (node.body) {
-          for (const child of node.body) {
-            visit(child);
-          }
-        }
-
-        break;
-    }
-  };
-
-  for (const item of program.body) {
-    visit(item);
-  }
-
-  return symbols;
-}
diff --git a/packages/language-server/src/service/marko/format.ts b/packages/language-server/src/service/marko/format.ts
deleted file mode 100644
index de42d20b..00000000
--- a/packages/language-server/src/service/marko/format.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { Project } from "@marko/language-tools";
-import * as prettier from "prettier";
-import * as markoPrettier from "prettier-plugin-marko";
-import { CancellationToken, TextEdit } from "vscode-languageserver";
-import { TextDocument } from "vscode-languageserver-textdocument";
-
-import { START_POSITION } from "../../utils/constants";
-import { getFSDir, getFSPath } from "../../utils/file";
-import { displayError } from "../../utils/messages";
-import type { Plugin } from "../types";
-
-export interface FormatOptions {
-  tabSize: number;
-  insertSpaces: boolean;
-  mode?: "concise" | "html";
-}
-
-export async function formatDocument(
-  doc: TextDocument,
-  formatOptions: FormatOptions,
-  cancel?: CancellationToken,
-) {
-  try {
-    const dir = getFSDir(doc);
-    const filepath = getFSPath(doc);
-    const text = doc.getText();
-    const options: prettier.Options = {
-      parser: "marko",
-      filepath,
-      plugins: [markoPrettier],
-      tabWidth: formatOptions.tabSize,
-      useTabs: formatOptions.insertSpaces === false,
-      markoSyntax: formatOptions.mode ?? "auto",
-      ...(filepath
-        ? await prettier
-            .resolveConfig(filepath, {
-              editorconfig: true,
-            })
-            .catch(() => null)
-        : null),
-    };
-
-    markoPrettier.setCompiler(Project.getCompiler(dir), Project.getConfig(dir));
-
-    if (cancel?.isCancellationRequested) return;
-
-    // TODO: format selection
-    return [
-      TextEdit.replace(
-        {
-          start: START_POSITION,
-          end: doc.positionAt(text.length),
-        },
-        await prettier.format(text, options),
-      ),
-    ];
-  } catch (e) {
-    displayError(e);
-  }
-}
-
-export const format: Plugin["format"] = async (doc, params, cancel) => {
-  return formatDocument(doc, params.options, cancel);
-};
diff --git a/packages/language-server/src/service/marko/hover/index.ts b/packages/language-server/src/service/marko/hover/index.ts
deleted file mode 100644
index 89a80775..00000000
--- a/packages/language-server/src/service/marko/hover/index.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { NodeType } from "@marko/language-tools";
-import type { Hover, HoverParams } from "vscode-languageserver";
-
-import { getMarkoFile, MarkoFile } from "../../../utils/file";
-import type { Plugin, Result } from "../../types";
-import { OpenTagName } from "./OpenTagName";
-
-export type HoverResult = Result<Hover>;
-export interface HoverMeta<N = unknown> {
-  file: MarkoFile;
-  params: HoverParams;
-  offset: number;
-  node: N;
-}
-
-const handlers: Record<string, (data: HoverMeta<any>) => HoverResult> = {
-  OpenTagName,
-};
-
-export const doHover: Plugin["doHover"] = async (doc, params) => {
-  const file = getMarkoFile(doc);
-  const offset = doc.offsetAt(params.position);
-  const node = file.parsed.nodeAt(offset);
-  return await handlers[NodeType[node.type]]?.({
-    file,
-    params,
-    offset,
-    node,
-  });
-};
diff --git a/packages/language-server/src/service/marko/index.ts b/packages/language-server/src/service/marko/index.ts
deleted file mode 100644
index 886f5944..00000000
--- a/packages/language-server/src/service/marko/index.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import * as documents from "../../utils/text-documents";
-import type { Plugin } from "../types";
-import { doComplete } from "./complete";
-import { findDefinition } from "./definition";
-import { findDocumentLinks } from "./document-links";
-import { findDocumentSymbols } from "./document-symbols";
-import { format, formatDocument, FormatOptions } from "./format";
-import { doHover } from "./hover";
-import { doValidate } from "./validate";
-
-export default {
-  doComplete,
-  doValidate,
-  doHover,
-  findDefinition,
-  findDocumentLinks,
-  findDocumentSymbols,
-  format,
-  commands: {
-    "$/formatWithMode": async ({
-      doc: docURI,
-      options,
-    }: {
-      doc: string;
-      options: FormatOptions;
-    }) => {
-      const doc = documents.get(docURI)!;
-      const formatted = await formatDocument(doc, options);
-      return formatted;
-    },
-  },
-} as Partial<Plugin>;
diff --git a/packages/language-server/src/service/script/index.ts b/packages/language-server/src/service/script/index.ts
deleted file mode 100644
index 238758b0..00000000
--- a/packages/language-server/src/service/script/index.ts
+++ /dev/null
@@ -1,1017 +0,0 @@
-import {
-  type Extracted,
-  extractScript,
-  type Location,
-  Node,
-  NodeType,
-  type Parsed,
-  Project,
-  ScriptLang,
-} from "@marko/language-tools";
-import path from "path";
-import * as prettier from "prettier";
-import { relativeImportPath } from "relative-import-path";
-import ts from "typescript/lib/tsserverlibrary";
-import {
-  CompletionItem,
-  CompletionItemKind,
-  CompletionItemTag,
-  DefinitionLink,
-  Diagnostic,
-  DiagnosticSeverity,
-  DiagnosticTag,
-  InsertTextFormat,
-  type Range,
-  TextEdit,
-} from "vscode-languageserver";
-import type { TextDocument } from "vscode-languageserver-textdocument";
-import { URI } from "vscode-uri";
-
-import { ExtractedSnapshot, patch } from "../../ts-plugin/host";
-import { START_LOCATION } from "../../utils/constants";
-import { getFSPath, getMarkoFile, processDoc } from "../../utils/file";
-import * as documents from "../../utils/text-documents";
-import * as workspace from "../../utils/workspace";
-import type { Plugin } from "../types";
-import printJSDocTag from "./util/print-jsdoc-tag";
-
-// Filter out some syntax errors from the TS compiler which will be surfaced from the marko compiler.
-const IGNORE_DIAG_REG =
-  /^(?:(?:Expression|Identifier|['"][^\w]['"]) expected|Invalid character)\b/i;
-
-interface TSProject {
-  rootDir: string;
-  host: ts.LanguageServiceHost;
-  service: ts.LanguageService;
-  markoScriptLang: ScriptLang;
-}
-
-const extractCache = new Map<string, ExtractedSnapshot>();
-const snapshotCache = new Map<string, ts.IScriptSnapshot>();
-const insertModuleStatementLocCache = new WeakMap<Extracted, Location>();
-const markoFileReg = /\.marko$/;
-const tsTriggerChars = new Set([".", '"', "'", "`", "/", "@", "<", "#", " "]);
-const optionalModifierReg = /\boptional\b/;
-const deprecatedModifierReg = /\bdeprecated\b/;
-const colorModifierReg = /\bcolor\b/;
-const localInternalsPrefix = "__marko_internal_";
-const requiredTSCompilerOptions: ts.CompilerOptions = {
-  module: ts.ModuleKind.ESNext,
-  moduleResolution: ts.ModuleResolutionKind.Bundler,
-  noEmit: true,
-  allowJs: true,
-  composite: false,
-  declaration: false,
-  skipLibCheck: true,
-  importHelpers: false,
-  isolatedModules: true,
-  resolveJsonModule: true,
-  skipDefaultLibCheck: true,
-  emitDeclarationOnly: false,
-  allowNonTsExtensions: true,
-  emitDecoratorMetadata: false,
-};
-const defaultTSConfig = {
-  include: [],
-  compilerOptions: {
-    lib: ["dom", "node", "esnext"],
-  } satisfies ts.CompilerOptions,
-};
-const extraTSCompilerExtensions: readonly ts.FileExtensionInfo[] = [
-  {
-    extension: ".marko",
-    isMixedContent: false,
-    scriptKind: ts.ScriptKind.Deferred,
-  },
-];
-
-const ScriptService: Partial<Plugin> = {
-  commands: {
-    "$/showScriptOutput": async (uri: string) => {
-      const doc = documents.get(uri);
-      if (doc?.languageId !== "marko") return;
-      const filename = getFSPath(doc);
-      if (!filename) return;
-      const tsProject = getTSProject(filename);
-      const extracted = processScript(doc, tsProject);
-      const lang = Project.getScriptLang(
-        filename,
-        tsProject.markoScriptLang,
-        ts,
-        tsProject.host,
-      );
-      const generated = extracted.toString();
-      const content = await prettier
-        .format(generated, {
-          parser: lang === ScriptLang.ts ? "typescript" : "babel",
-        })
-        .catch(() => generated);
-      return {
-        language: lang === ScriptLang.ts ? "typescript" : "javascript",
-        content,
-      };
-    },
-  },
-  async initialize() {
-    workspace.onConfigChange(() => {
-      snapshotCache.clear();
-    });
-
-    documents.onFileChange((doc) => {
-      if (doc) {
-        const filename = getFSPath(doc)!;
-        extractCache.delete(filename);
-        snapshotCache.delete(filename);
-      } else {
-        extractCache.clear();
-        snapshotCache.clear();
-      }
-    });
-  },
-  async doComplete(doc, params) {
-    const fileName = getFSPath(doc);
-    if (!fileName) return;
-
-    const project = getTSProject(fileName);
-    const extracted = processScript(doc, project);
-    const sourceOffset = doc.offsetAt(params.position);
-    const generatedOffset = extracted.generatedOffsetAt(sourceOffset);
-    if (generatedOffset === undefined) return;
-
-    const completions = project.service.getCompletionsAtPosition(
-      fileName,
-      generatedOffset,
-      {
-        ...(await getPreferences(project.markoScriptLang)),
-        ...params.context,
-        triggerCharacter: getTSTriggerChar(params.context?.triggerCharacter),
-      },
-    );
-    if (!completions?.entries.length) return;
-
-    const result: CompletionItem[] = [];
-
-    for (const completion of completions.entries) {
-      let { name: label, insertText, sortText } = completion;
-      if (label.startsWith(localInternalsPrefix)) continue;
-
-      const { replacementSpan } = completion;
-      let textEdit: CompletionItem["textEdit"];
-      let detail: CompletionItem["detail"];
-      let kind: CompletionItem["kind"];
-      let tags: CompletionItem["tags"];
-      let labelDetails: CompletionItem["labelDetails"];
-      let source = completion.source;
-
-      if (source && completion.hasAction) {
-        if (source[0] === ".") {
-          source = path.resolve(fileName, "..", source);
-        }
-        detail = relativeImportPath(fileName, source);
-        // De-prioritize auto-imported completions.
-        sortText = `\uffff${sortText}`;
-      } else if (completion.sourceDisplay) {
-        const description = ts.displayPartsToString(completion.sourceDisplay);
-        if (description !== label) {
-          labelDetails = { description };
-        }
-      }
-
-      if (completion.kindModifiers) {
-        if (optionalModifierReg.test(completion.kindModifiers)) {
-          insertText = label;
-          label += "?";
-        }
-
-        if (deprecatedModifierReg.test(completion.kindModifiers)) {
-          tags = [CompletionItemTag.Deprecated];
-        }
-
-        if (colorModifierReg.test(completion.kindModifiers)) {
-          kind = CompletionItemKind.Color;
-        }
-      }
-
-      if (replacementSpan) {
-        const sourceRange = sourceLocationAtTextSpan(
-          extracted,
-          replacementSpan,
-        );
-
-        if (sourceRange) {
-          textEdit = {
-            range: sourceRange,
-            newText: insertText || label,
-          };
-        } else {
-          continue;
-        }
-      }
-
-      result.push({
-        tags,
-        label,
-        detail,
-        textEdit,
-        sortText,
-        insertText,
-        labelDetails,
-        filterText: insertText,
-        preselect: completion.isRecommended || undefined,
-        kind: kind || convertCompletionItemKind(completion.kind),
-        insertTextFormat: completion.isSnippet
-          ? InsertTextFormat.Snippet
-          : undefined,
-        data: completion.data && {
-          originalData: completion.data,
-          originalName: completion.name,
-          originalSource: source,
-          generatedOffset,
-          fileName,
-        },
-      });
-    }
-
-    return {
-      isIncomplete: true,
-      items: result,
-    };
-  },
-  async doCompletionResolve(item) {
-    const { data } = item;
-    if (!data) return;
-    const { fileName } = data;
-    if (!fileName) return;
-    const doc = documents.get(filenameToURI(fileName));
-    if (!doc) return;
-
-    const project = getTSProject(fileName);
-    const detail = project.service.getCompletionEntryDetails(
-      fileName,
-      data.generatedOffset,
-      data.originalName,
-      {},
-      data.originalSource,
-      await getPreferences(project.markoScriptLang),
-      data.originalData,
-    );
-
-    if (!detail?.codeActions) return;
-
-    const extracted = processScript(doc, project);
-    const textEdits: CompletionItem["additionalTextEdits"] =
-      (item.additionalTextEdits = item.additionalTextEdits || []);
-
-    for (const action of detail.codeActions) {
-      for (const change of action.changes) {
-        if (change.fileName !== fileName) continue;
-        for (const { span, newText: rawText } of change.textChanges) {
-          let range: Range | undefined;
-          let newText = rawText;
-
-          if (span.length === 0 && /^\s*(?:import|export) /.test(newText)) {
-            const cached = insertModuleStatementLocCache.get(extracted);
-            newText = newText.replace(/\n\s*$/, "\n");
-
-            if (cached) {
-              range = cached;
-            } else {
-              const { parsed } = getMarkoFile(doc);
-              const offset = getInsertModuleStatementOffset(parsed);
-              const start = parsed.positionAt(offset);
-              range = {
-                start,
-                end: start,
-              };
-              insertModuleStatementLocCache.set(extracted, range);
-            }
-          } else {
-            range = sourceLocationAtTextSpan(extracted, span);
-          }
-
-          if (range) {
-            textEdits.push({ newText, range });
-          }
-        }
-      }
-    }
-
-    return item;
-  },
-  findDefinition(doc, params) {
-    const fileName = getFSPath(doc);
-    if (!fileName) return;
-
-    const project = getTSProject(fileName);
-    const extracted = processScript(doc, project);
-    const sourceOffset = doc.offsetAt(params.position);
-    const generatedOffset = extracted.generatedOffsetAt(sourceOffset);
-    if (generatedOffset === undefined) return;
-
-    const boundary = project.service.getDefinitionAndBoundSpan(
-      fileName,
-      generatedOffset,
-    );
-    if (!boundary?.definitions) return;
-
-    const originSelectionRange = sourceLocationAtTextSpan(
-      extracted,
-      boundary.textSpan,
-    );
-    let result: DefinitionLink[] | DefinitionLink | undefined;
-
-    for (const def of boundary.definitions) {
-      const targetUri = filenameToURI(def.fileName);
-      const defDoc = documents.get(targetUri);
-      if (!defDoc) continue;
-
-      let link: DefinitionLink | undefined;
-
-      if (markoFileReg.test(targetUri)) {
-        const extracted = processScript(defDoc, project);
-        const targetSelectionRange =
-          sourceLocationAtTextSpan(extracted, def.textSpan) || START_LOCATION;
-        const targetRange =
-          (def.contextSpan &&
-            sourceLocationAtTextSpan(extracted, def.contextSpan)) ||
-          START_LOCATION;
-        link = {
-          targetUri,
-          targetRange,
-          targetSelectionRange,
-          originSelectionRange,
-        };
-      } else {
-        link = {
-          targetUri,
-          targetRange: def.contextSpan
-            ? docLocationAtTextSpan(defDoc, def.contextSpan)
-            : START_LOCATION,
-          targetSelectionRange: docLocationAtTextSpan(defDoc, def.textSpan),
-          originSelectionRange,
-        };
-      }
-
-      if (link) {
-        if (result) {
-          if (Array.isArray(result)) {
-            result.push(link);
-          } else {
-            result = [result, link];
-          }
-        } else {
-          result = link;
-        }
-      }
-    }
-
-    return result;
-  },
-  doHover(doc, params) {
-    const fileName = getFSPath(doc);
-    if (!fileName) return;
-
-    const project = getTSProject(fileName);
-    const extracted = processScript(doc, project);
-    const sourceOffset = doc.offsetAt(params.position);
-    const generatedOffset = extracted.generatedOffsetAt(sourceOffset);
-    if (generatedOffset === undefined) return;
-
-    const quickInfo = project.service.getQuickInfoAtPosition(
-      fileName,
-      generatedOffset,
-    );
-    if (!quickInfo) return;
-
-    const sourceRange = sourceLocationAtTextSpan(extracted, quickInfo.textSpan);
-    if (!sourceRange) return;
-
-    let contents = "";
-
-    const displayParts = ts.displayPartsToString(quickInfo.displayParts);
-    if (displayParts) {
-      contents += `\`\`\`typescript\n${displayParts}\n\`\`\``;
-    }
-
-    const documentation = printDocumentation(
-      quickInfo.documentation,
-      quickInfo.tags,
-    );
-    if (documentation) {
-      contents += `\n---\n${documentation}`;
-    }
-
-    return {
-      range: sourceRange,
-      contents,
-    };
-  },
-  doRename(doc, params) {
-    const fileName = getFSPath(doc);
-    if (!fileName) return;
-
-    const project = getTSProject(fileName);
-    const extracted = processScript(doc, project);
-    const sourceOffset = doc.offsetAt(params.position);
-    const generatedOffset = extracted.generatedOffsetAt(sourceOffset);
-    if (generatedOffset === undefined) return;
-
-    const renameLocations = project.service.findRenameLocations(
-      fileName,
-      generatedOffset,
-      false,
-      false,
-      false,
-    );
-
-    if (!renameLocations) return;
-
-    const changes: { [uri: string]: TextEdit[] } = {};
-
-    for (const rename of renameLocations) {
-      const renameURI = filenameToURI(rename.fileName);
-      const renameDoc = documents.get(renameURI);
-      let edit: TextEdit | undefined;
-      if (!renameDoc) continue;
-      if (markoFileReg.test(renameURI)) {
-        const extracted = processScript(renameDoc, project);
-        const sourceRange = sourceLocationAtTextSpan(
-          extracted,
-          rename.textSpan,
-        );
-        if (sourceRange) {
-          edit = {
-            newText: params.newName,
-            range: sourceRange,
-          };
-        }
-      } else {
-        edit = {
-          newText: params.newName,
-          range: docLocationAtTextSpan(renameDoc, rename.textSpan),
-        };
-      }
-
-      if (edit) {
-        if (changes[renameURI]) {
-          changes[renameURI].push(edit);
-        } else {
-          changes[renameURI] = [edit];
-        }
-      }
-    }
-
-    return {
-      changes,
-    };
-  },
-  doValidate(doc) {
-    const fileName = getFSPath(doc);
-    if (!fileName) return;
-
-    const project = getTSProject(fileName);
-    const extracted = processScript(doc, project);
-
-    let results: Diagnostic[] | undefined;
-    for (const tsDiag of project.service.getSuggestionDiagnostics(fileName)) {
-      addDiag(tsDiag);
-    }
-
-    for (const tsDiag of project.service.getSyntacticDiagnostics(fileName)) {
-      addDiag(tsDiag);
-    }
-
-    for (const tsDiag of project.service.getSemanticDiagnostics(fileName)) {
-      addDiag(tsDiag);
-    }
-
-    return results;
-
-    function addDiag(tsDiag: ts.Diagnostic) {
-      const diag = convertDiag(extracted, tsDiag);
-      if (diag && !IGNORE_DIAG_REG.test(diag.message)) {
-        if (results) {
-          results.push(diag);
-        } else {
-          results = [diag];
-        }
-      }
-    }
-  },
-};
-
-function processScript(doc: TextDocument, tsProject: TSProject) {
-  return processDoc(doc, ({ filename, parsed, lookup, dirname }) => {
-    const { host, markoScriptLang } = tsProject;
-    return extractScript({
-      ts,
-      parsed,
-      lookup,
-      translator: Project.getConfig(dirname).translator,
-      scriptLang: filename
-        ? Project.getScriptLang(filename, markoScriptLang, ts, host)
-        : markoScriptLang,
-      runtimeTypesCode: Project.getTypeLibs(tsProject.rootDir, ts, host)
-        ?.markoTypesCode,
-    });
-  });
-}
-
-function getInsertModuleStatementOffset(parsed: Parsed) {
-  const { program } = parsed;
-  let firstNode: Node.AnyNode | undefined;
-
-  if (program.static.length) {
-    // Prefer before the first export, or after the last import.
-    let lastImport: Node.Import | undefined;
-    for (const node of program.static) {
-      switch (node.type) {
-        case NodeType.Export:
-          return node.start;
-        case NodeType.Import:
-          lastImport = node;
-          break;
-      }
-    }
-
-    if (lastImport) {
-      return lastImport.end + 1;
-    }
-
-    firstNode = program.static[0];
-  }
-
-  if (program.body.length) {
-    if (!firstNode || firstNode.start > program.body[0].start) {
-      firstNode = program.body[0];
-    }
-  }
-
-  // Fall back to after the comments of the first node,
-  // or the start of the document.
-  if (firstNode) {
-    return getOffsetAfterComments(firstNode);
-  }
-
-  return 0;
-}
-
-function getOffsetAfterComments(node: Node.AnyNode) {
-  const { comments } = node as Node.Commentable;
-  if (comments) {
-    return comments.at(-1)!.end + 1;
-  }
-
-  return Math.max(0, node.start - 1);
-}
-
-function sourceLocationAtTextSpan(
-  extracted: Extracted,
-  { start, length }: ts.TextSpan,
-) {
-  if (start === 0 && length === 0) return START_LOCATION;
-  return extracted.sourceLocationAt(start, start + length);
-}
-
-function docLocationAtTextSpan(
-  doc: TextDocument,
-  { start, length }: ts.TextSpan,
-) {
-  return {
-    start: doc.positionAt(start),
-    end: doc.positionAt(start + length),
-  };
-}
-
-function getTSConfigFile(fileName: string) {
-  let configFile: string | undefined;
-  const docFsDir = path.dirname(fileName);
-  const cache = Project.getCache(docFsDir);
-  let configFileCache = cache.get(getTSConfigFile) as
-    | Map<string, string | undefined>
-    | undefined;
-
-  if (configFileCache) {
-    configFile = configFileCache.get(docFsDir);
-  } else {
-    configFileCache = new Map();
-    cache.set(getTSConfigFile, configFileCache);
-  }
-
-  if (!configFile) {
-    configFile =
-      ts.findConfigFile(fileName, ts.sys.fileExists, "tsconfig.json") ||
-      ts.findConfigFile(fileName, ts.sys.fileExists, "jsconfig.json");
-  }
-
-  configFileCache.set(docFsDir, configFile);
-
-  return configFile;
-}
-
-function getTSProject(docFsPath: string): TSProject {
-  let configFile: string | undefined;
-  let markoScriptLang = ScriptLang.js;
-
-  if (docFsPath) {
-    configFile = getTSConfigFile(docFsPath);
-    if (configFile?.endsWith("tsconfig.json")) {
-      markoScriptLang = ScriptLang.ts;
-    }
-  }
-
-  const basePath = (configFile && path.dirname(configFile)) || process.cwd();
-  const cache = Project.getCache(configFile && basePath);
-  let projectCache = cache.get(getTSProject) as
-    | Map<string, TSProject>
-    | undefined;
-  let cached: TSProject | undefined;
-
-  // The typescript project and it's language service is
-  // cached with the Marko compiler cache.
-  // This causes the cache to be properly cleared when files change.
-  if (projectCache) {
-    cached = projectCache.get(basePath);
-    if (cached) return cached;
-  } else {
-    // Within the compiler cache we store a map
-    // of project paths to project info.
-    projectCache = new Map();
-    cache.set(getTSProject, projectCache);
-  }
-
-  const { fileNames, options, projectReferences } =
-    ts.parseJsonConfigFileContent(
-      (configFile && ts.readConfigFile(configFile, ts.sys.readFile).config) ||
-        defaultTSConfig,
-      ts.sys,
-      basePath,
-      requiredTSCompilerOptions,
-      configFile,
-      undefined,
-      extraTSCompilerExtensions,
-    );
-
-  options.rootDir = basePath;
-
-  // Only ts like files can inject globals into the project, so we filter out everything else.
-  const potentialGlobalFiles = new Set<string>(
-    fileNames.filter((file) => /\.[cm]?ts$/.test(file)),
-  );
-
-  const tsPkgFile =
-    configFile &&
-    ts.resolveModuleName("typescript/package.json", configFile, options, ts.sys)
-      .resolvedModule?.resolvedFileName;
-  const defaultLibFile = path.join(
-    tsPkgFile ? path.join(tsPkgFile, "../lib") : __dirname,
-    ts.getDefaultLibFileName(options),
-  );
-
-  const resolutionCache = ts.createModuleResolutionCache(
-    basePath,
-    getCanonicalFileName,
-    options,
-  );
-
-  const host: ts.LanguageServiceHost = patch(
-    ts,
-    configFile,
-    extractCache,
-    resolutionCache,
-    {
-      getNewLine() {
-        return ts.sys.newLine;
-      },
-
-      useCaseSensitiveFileNames() {
-        return ts.sys.useCaseSensitiveFileNames;
-      },
-
-      getCompilationSettings() {
-        return options;
-      },
-
-      getCurrentDirectory() {
-        return options.rootDir!;
-      },
-
-      getProjectVersion() {
-        return documents.projectVersion.toString(32);
-      },
-
-      getDefaultLibFileName() {
-        return defaultLibFile;
-      },
-
-      getProjectReferences() {
-        return projectReferences;
-      },
-
-      resolveModuleNameLiterals(
-        moduleLiterals,
-        containingFile,
-        redirectedReference,
-        options,
-        _containingSourceFile,
-        _reusedNames,
-      ) {
-        return moduleLiterals.map((moduleLiteral) => {
-          return ts.bundlerModuleNameResolver(
-            moduleLiteral.text,
-            containingFile,
-            options,
-            host,
-            resolutionCache,
-            redirectedReference,
-          );
-        });
-      },
-
-      readDirectory: ts.sys.readDirectory,
-
-      readFile: (filename) => documents.get(filenameToURI(filename))?.getText(),
-
-      fileExists: (filename) => documents.exists(filenameToURI(filename)),
-
-      getScriptFileNames() {
-        const result = new Set(potentialGlobalFiles);
-        for (const doc of documents.getAllOpen()) {
-          const { scheme, fsPath } = URI.parse(doc.uri);
-          if (scheme === "file") {
-            const projectForFile = getTSProject(fsPath);
-            if (projectForFile === tsProject) {
-              result.add(fsPath);
-            }
-          }
-        }
-
-        return [...result];
-      },
-
-      getScriptVersion(filename) {
-        return `${documents.get(filenameToURI(filename))?.version ?? -1}`;
-      },
-
-      getScriptKind(filename) {
-        switch (path.extname(filename)) {
-          case ts.Extension.Js:
-          case ts.Extension.Cjs:
-          case ts.Extension.Mjs:
-            return ts.ScriptKind.JS;
-          case ts.Extension.Jsx:
-            return ts.ScriptKind.JSX;
-          case ts.Extension.Ts:
-          case ts.Extension.Cts:
-          case ts.Extension.Mts:
-            return ts.ScriptKind.TS;
-          case ts.Extension.Tsx:
-            return ts.ScriptKind.TSX;
-          case ts.Extension.Json:
-            return ts.ScriptKind.JSON;
-          default:
-            return ts.ScriptKind.Unknown;
-        }
-      },
-
-      getScriptSnapshot(filename) {
-        let snapshot = snapshotCache.get(filename);
-        if (!snapshot) {
-          const doc = documents.get(filenameToURI(filename));
-          if (!doc) return;
-          snapshot = ts.ScriptSnapshot.fromString(doc.getText());
-          snapshotCache.set(filename, snapshot);
-        }
-
-        return snapshot;
-      },
-    },
-  );
-
-  const tsProject: TSProject = {
-    host,
-    rootDir: options.rootDir!,
-    service: ts.createLanguageService(host),
-    markoScriptLang,
-  };
-
-  projectCache.set(basePath, tsProject);
-  return tsProject;
-}
-
-function filenameToURI(filename: string) {
-  return URI.file(filename).toString();
-}
-
-async function getPreferences(
-  scriptLang: ScriptLang,
-): Promise<ts.UserPreferences> {
-  const configName = scriptLang === ScriptLang.js ? "javascript" : "typescript";
-  const [preferencesConfig, suggestConfig, inlayHintsConfig] =
-    await Promise.all([
-      workspace.getConfig(`${configName}.preferences`),
-      workspace.getConfig(`${configName}.suggest`),
-      workspace.getConfig(`${configName}.inlayHints`),
-    ]);
-
-  return {
-    disableSuggestions: suggestConfig.enabled === false,
-    quotePreference: preferencesConfig.quoteStyle || "auto",
-    includeCompletionsForModuleExports: suggestConfig.autoImports ?? true,
-    includeCompletionsForImportStatements:
-      suggestConfig.includeCompletionsForImportStatements ?? true,
-    includeCompletionsWithSnippetText:
-      suggestConfig.includeCompletionsWithSnippetText ?? true,
-    includeAutomaticOptionalChainCompletions:
-      suggestConfig.includeAutomaticOptionalChainCompletions ?? true,
-    includeCompletionsWithInsertText: true,
-    includeCompletionsWithClassMemberSnippets:
-      suggestConfig.classMemberSnippets?.enabled ?? true,
-    includeCompletionsWithObjectLiteralMethodSnippets:
-      suggestConfig.objectLiteralMethodSnippets?.enabled ?? true,
-    useLabelDetailsInCompletionEntries: true,
-    allowIncompleteCompletions: true,
-    importModuleSpecifierPreference:
-      preferencesConfig.importModuleSpecifierPreference,
-    importModuleSpecifierEnding:
-      preferencesConfig.importModuleSpecifierEnding || "auto",
-    allowTextChangesInNewFiles: true,
-    providePrefixAndSuffixTextForRename: true,
-    includePackageJsonAutoImports:
-      preferencesConfig.includePackageJsonAutoImports ?? true,
-    provideRefactorNotApplicableReason: true,
-    jsxAttributeCompletionStyle:
-      preferencesConfig.jsxAttributeCompletionStyle ?? "auto",
-    includeInlayParameterNameHints:
-      inlayHintsConfig.parameterNames?.enabled ?? "none",
-    includeInlayParameterNameHintsWhenArgumentMatchesName:
-      !inlayHintsConfig.parameterNames?.suppressWhenArgumentMatchesName,
-    includeInlayFunctionParameterTypeHints:
-      inlayHintsConfig.parameterTypes?.enabled ?? true,
-    includeInlayVariableTypeHints:
-      inlayHintsConfig.variableTypes?.enabled ?? true,
-    includeInlayPropertyDeclarationTypeHints:
-      inlayHintsConfig.propertyDeclarationTypes?.enabled ?? true,
-    includeInlayFunctionLikeReturnTypeHints:
-      inlayHintsConfig.functionLikeReturnTypes?.enabled ?? true,
-    includeInlayEnumMemberValueHints:
-      inlayHintsConfig.enumMemberValues?.enabled ?? true,
-  };
-}
-
-function printDocumentation(
-  docs: ts.SymbolDisplayPart[] | undefined,
-  tags: ts.JSDocTagInfo[] | undefined,
-) {
-  let result = "";
-  let sep = "";
-  if (docs) {
-    result += ts.displayPartsToString(docs);
-    sep = "  \n\n";
-  }
-
-  if (tags) {
-    for (const tag of tags) {
-      result += sep + printJSDocTag(tag);
-      sep = "  \n\n";
-    }
-  }
-
-  return result;
-}
-
-function convertDiag(
-  extracted: Extracted,
-  tsDiag: ts.Diagnostic,
-): Diagnostic | undefined {
-  const sourceRange =
-    tsDiag.start === undefined
-      ? START_LOCATION
-      : sourceLocationAtTextSpan(extracted, tsDiag as ts.TextSpan);
-
-  if (sourceRange) {
-    return {
-      range: sourceRange,
-      source: "script",
-      code: tsDiag.code,
-      tags: convertDiagTags(tsDiag),
-      severity: convertDiagSeverity(tsDiag),
-      message: ts.flattenDiagnosticMessageText(tsDiag.messageText, "\n"),
-    };
-  }
-}
-
-function convertDiagSeverity(tsDiag: ts.Diagnostic) {
-  switch (tsDiag.category) {
-    case ts.DiagnosticCategory.Error:
-      return DiagnosticSeverity.Error;
-    case ts.DiagnosticCategory.Warning:
-      return DiagnosticSeverity.Warning;
-    case ts.DiagnosticCategory.Suggestion:
-      return DiagnosticSeverity.Hint;
-    default:
-      return DiagnosticSeverity.Information;
-  }
-}
-
-function convertDiagTags(tsDiag: ts.Diagnostic) {
-  let tags: DiagnosticTag[] | undefined;
-
-  if (tsDiag.reportsDeprecated) {
-    tags = [DiagnosticTag.Deprecated];
-  }
-
-  if (tsDiag.reportsUnnecessary) {
-    if (tags) tags.push(DiagnosticTag.Unnecessary);
-    else tags = [DiagnosticTag.Unnecessary];
-  }
-
-  return tags;
-}
-
-function convertCompletionItemKind(kind: ts.ScriptElementKind) {
-  switch (kind) {
-    case ts.ScriptElementKind.warning:
-    case ts.ScriptElementKind.linkText:
-      return CompletionItemKind.Text;
-
-    case ts.ScriptElementKind.keyword:
-    case ts.ScriptElementKind.primitiveType:
-      return CompletionItemKind.Keyword;
-
-    case ts.ScriptElementKind.scriptElement:
-      return CompletionItemKind.File;
-
-    case ts.ScriptElementKind.directory:
-      return CompletionItemKind.Folder;
-
-    case ts.ScriptElementKind.label:
-    case ts.ScriptElementKind.string:
-      return CompletionItemKind.Constant;
-
-    case ts.ScriptElementKind.moduleElement:
-    case ts.ScriptElementKind.externalModuleName:
-      return CompletionItemKind.Module;
-
-    case ts.ScriptElementKind.typeElement:
-    case ts.ScriptElementKind.classElement:
-    case ts.ScriptElementKind.localClassElement:
-      return CompletionItemKind.Class;
-
-    case ts.ScriptElementKind.interfaceElement:
-      return CompletionItemKind.Interface;
-
-    case ts.ScriptElementKind.enumElement:
-      return CompletionItemKind.Enum;
-
-    case ts.ScriptElementKind.enumMemberElement:
-      return CompletionItemKind.EnumMember;
-
-    case ts.ScriptElementKind.alias:
-    case ts.ScriptElementKind.letElement:
-    case ts.ScriptElementKind.constElement:
-    case ts.ScriptElementKind.variableElement:
-    case ts.ScriptElementKind.parameterElement:
-    case ts.ScriptElementKind.localVariableElement:
-      return CompletionItemKind.Variable;
-
-    case ts.ScriptElementKind.functionElement:
-    case ts.ScriptElementKind.localFunctionElement:
-      return CompletionItemKind.Function;
-
-    case ts.ScriptElementKind.callSignatureElement:
-    case ts.ScriptElementKind.memberFunctionElement:
-    case ts.ScriptElementKind.indexSignatureElement:
-    case ts.ScriptElementKind.constructSignatureElement:
-      return CompletionItemKind.Method;
-
-    case ts.ScriptElementKind.memberGetAccessorElement:
-    case ts.ScriptElementKind.memberSetAccessorElement:
-    case ts.ScriptElementKind.memberVariableElement:
-      return CompletionItemKind.Field;
-
-    case ts.ScriptElementKind.constructorImplementationElement:
-      return CompletionItemKind.Constructor;
-
-    case ts.ScriptElementKind.typeParameterElement:
-      return CompletionItemKind.TypeParameter;
-
-    case ts.ScriptElementKind.link:
-    case ts.ScriptElementKind.linkName:
-      return CompletionItemKind.Reference;
-
-    default:
-      return CompletionItemKind.Property;
-  }
-}
-
-function getTSTriggerChar(char: string | undefined) {
-  if (char && tsTriggerChars.has(char))
-    return char as ts.CompletionsTriggerCharacter;
-}
-
-function getCanonicalFileName(fileName: string) {
-  return ts.sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
-}
-
-export { ScriptService as default };
diff --git a/packages/language-server/src/service/script/util/print-jsdoc-tag.ts b/packages/language-server/src/service/script/util/print-jsdoc-tag.ts
deleted file mode 100644
index eef298bb..00000000
--- a/packages/language-server/src/service/script/util/print-jsdoc-tag.ts
+++ /dev/null
@@ -1,192 +0,0 @@
-/*---------------------------------------------------------------------------------------------
- *  Copyright (c) Microsoft Corporation. All rights reserved.
- *  Licensed under the MIT License. See "Notice" file in this package for license information.
- *--------------------------------------------------------------------------------------------*/
-
-/**
- * adopted from https://github.com/microsoft/vscode/blob/b9202b64081bb1267792a8d2d023e4c746ed0f73/extensions/typescript-language-features/src/languageFeatures/util/textRendering.ts
- */
-
-import type ts from "typescript/lib/tsserverlibrary";
-
-const REG_BACK_TICK = /`/g;
-const REG_LINE = /\r\n|\n/;
-const REG_CODE_BLOCK = /^\s*[~`]{3}/m;
-const REG_CAPTION = /^<caption>(.*?)<\/caption>\s*(\r\n|\n)/;
-
-export default function printJSDocTag(
-  tag: ts.JSDocTagInfo,
-): string | undefined {
-  switch (tag.name) {
-    case "augments":
-    case "extends":
-    case "param":
-    case "template": {
-      const body = getTagBodyParts(tag);
-      if (body?.length === 3) {
-        const [, param, text] = body;
-        return `${printTagName(tag.name)} \`${param}\`${printTagBody(
-          replaceLinks(text),
-        )}`;
-      }
-      break;
-    }
-
-    case "return":
-    case "returns": {
-      if (!tag.text?.length) return undefined;
-      break;
-    }
-  }
-
-  return printTagName(tag.name) + printTagBody(getTagBodyText(tag));
-}
-
-function getTagBodyParts(tag: ts.JSDocTagInfo): Array<string> | undefined {
-  if (tag.name === "template") {
-    const parts = tag.text;
-    if (parts) {
-      const params = parts
-        .filter((p) => p.kind === "typeParameterName")
-        .map((p) => p.text)
-        .join(", ");
-      const docs = parts
-        .filter((p) => p.kind === "text")
-        .map((p) => convertLinkTags(p.text.replace(/^\s*-?\s*/, "")))
-        .join(" ");
-      return params ? ["", params, docs] : undefined;
-    }
-  }
-  return convertLinkTags(tag.text).split(/^(\S+)\s*-?\s*/);
-}
-
-function getTagBodyText(tag: ts.JSDocTagInfo): string {
-  if (!tag.text) return "";
-
-  const text = convertLinkTags(tag.text);
-  switch (tag.name) {
-    case "example": {
-      const captionTagMatches = REG_CAPTION.exec(text);
-      if (captionTagMatches) {
-        const [captionMatch, captionText] = captionTagMatches;
-        return `${captionText}\n${ensureCodeblock(
-          captionText.slice(captionMatch.length),
-        )}`;
-      } else {
-        return ensureCodeblock(text);
-      }
-    }
-    case "author": {
-      const emailMatch = text.match(/(.+)\s<([-.\w]+@[-.\w]+)>/);
-
-      if (emailMatch) {
-        return `${emailMatch[1]} ${emailMatch[2]}`;
-      }
-
-      return text;
-    }
-    case "default":
-      return ensureCodeblock(text);
-  }
-
-  return replaceLinks(text);
-}
-
-function convertLinkTags(
-  parts: readonly ts.SymbolDisplayPart[] | string | undefined,
-): string {
-  if (!parts) return "";
-  if (typeof parts === "string") return parts;
-
-  let result = "";
-  let currentLink:
-    | { name?: string; target?: any; text?: string; readonly linkcode: boolean }
-    | undefined;
-
-  for (const part of parts) {
-    switch (part.kind) {
-      case "link":
-        if (currentLink) {
-          if (currentLink.target) {
-            const linkText = currentLink.text
-              ? currentLink.text
-              : escapeBackTicks(currentLink.name ?? "");
-            result += `[${
-              currentLink.linkcode ? "`" + linkText + "`" : linkText
-            }](${currentLink.target.file})`;
-          } else {
-            const text = currentLink.text ?? currentLink.name;
-            if (text) {
-              if (/^https?:/.test(text)) {
-                const parts = text.split(" ");
-                if (parts.length === 1) {
-                  result += parts[0];
-                } else if (parts.length > 1) {
-                  const linkText = escapeBackTicks(parts.slice(1).join(" "));
-                  result += `[${
-                    currentLink.linkcode ? "`" + linkText + "`" : linkText
-                  }](${parts[0]})`;
-                }
-              } else {
-                result += escapeBackTicks(text);
-              }
-            }
-          }
-          currentLink = undefined;
-        } else {
-          currentLink = {
-            linkcode: part.text === "{@linkcode ",
-          };
-        }
-        break;
-
-      case "linkName":
-        if (currentLink) {
-          currentLink.name = part.text;
-          currentLink.target = (part as ts.JSDocLinkDisplayPart).target;
-        }
-        break;
-
-      case "linkText":
-        if (currentLink) {
-          currentLink.text = part.text;
-        }
-        break;
-
-      default:
-        result += part.text;
-        break;
-    }
-  }
-  return replaceLinks(result);
-}
-
-function replaceLinks(text: string): string {
-  return text.replace(
-    /\{@(link|linkplain|linkcode) (https?:\/\/[^ |}]+?)(?:[| ]([^{}\n]+?))?\}/gi,
-    (_, tag: string, link: string, text?: string) => {
-      const alt = text ? text.trim() : link;
-      return `[${tag === "linkcode" ? `\`${alt}\`` : alt}](${link})`;
-    },
-  );
-}
-
-function printTagBody(text: string | undefined) {
-  if (text) {
-    return (REG_LINE.test(text) ? "  \n" : " — ") + text;
-  }
-
-  return "";
-}
-
-function printTagName(name: string) {
-  return `*@${name}*`;
-}
-
-function ensureCodeblock(text: string): string {
-  return REG_CODE_BLOCK.test(text) ? text : "```\n" + text + "\n```";
-}
-
-function escapeBackTicks(text: string): string {
-  return text.replace(REG_BACK_TICK, "\\$&");
-}
diff --git a/packages/language-server/src/service/style/index.ts b/packages/language-server/src/service/style/index.ts
deleted file mode 100644
index 43dfd456..00000000
--- a/packages/language-server/src/service/style/index.ts
+++ /dev/null
@@ -1,487 +0,0 @@
-import { type Extracted, extractStyle } from "@marko/language-tools";
-import {
-  getCSSLanguageService,
-  getLESSLanguageService,
-  getSCSSLanguageService,
-  type LanguageService,
-  type LanguageServiceOptions,
-  type Stylesheet,
-} from "vscode-css-languageservice";
-import {
-  ColorInformation,
-  ColorPresentation,
-  Diagnostic,
-  DocumentHighlight,
-  DocumentLink,
-  InitializeParams,
-  InsertReplaceEdit,
-  Location,
-  Range,
-  SymbolInformation,
-  TextDocumentEdit,
-  TextEdit,
-} from "vscode-languageserver";
-import { TextDocument } from "vscode-languageserver-textdocument";
-
-import { processDoc } from "../../utils/file";
-import fileSystemProvider from "../../utils/file-system";
-import resolveReference from "../../utils/resolve-url";
-import type { Plugin } from "../types";
-
-interface ProcessedStyle {
-  parsed: Stylesheet;
-  extracted: Extracted;
-  virtualDoc: TextDocument;
-  service: LanguageService;
-}
-
-const services: Record<
-  string,
-  (options: LanguageServiceOptions) => LanguageService
-> = {
-  ".css": getCSSLanguageService,
-  ".less": getLESSLanguageService,
-  ".scss": getSCSSLanguageService,
-};
-let clientCapabilities: InitializeParams["capabilities"] | undefined;
-
-const StyleSheetService: Partial<Plugin> = {
-  initialize(params) {
-    clientCapabilities = params.capabilities;
-  },
-  async doComplete(doc, params) {
-    const sourceOffset = doc.offsetAt(params.position);
-    for (const style of processStyle(doc)) {
-      // Find the first stylesheet data that contains the offset.
-      const generatedPos = style.extracted.generatedPositionAt(sourceOffset);
-      if (generatedPos === undefined) continue;
-
-      const result = await style.service.doComplete2(
-        style.virtualDoc,
-        generatedPos,
-        style.parsed,
-        { resolveReference },
-      );
-
-      if (result.itemDefaults) {
-        const { editRange } = result.itemDefaults;
-        if (editRange) {
-          if ("start" in editRange) {
-            result.itemDefaults.editRange = getSourceRange(style, editRange);
-          } else {
-            editRange.insert = getSourceRange(style, editRange.insert)!;
-            editRange.replace = getSourceRange(style, editRange.replace)!;
-          }
-        }
-      }
-
-      for (const item of result.items) {
-        if (item.textEdit) {
-          item.textEdit = getSourceInsertReplaceEdit(style, item.textEdit);
-        }
-
-        if (item.additionalTextEdits) {
-          item.additionalTextEdits = getSourceEdits(
-            style,
-            item.additionalTextEdits,
-          );
-        }
-      }
-
-      return result;
-    }
-  },
-  findDefinition(doc, params) {
-    const sourceOffset = doc.offsetAt(params.position);
-    for (const style of processStyle(doc)) {
-      // Find the first stylesheet data that contains the offset.
-      const generatedPos = style.extracted.generatedPositionAt(sourceOffset);
-      if (generatedPos === undefined) continue;
-
-      const result = style.service.findDefinition(
-        style.virtualDoc,
-        generatedPos,
-        style.parsed,
-      );
-
-      if (result) {
-        const sourceRange = getSourceRange(style, result.range);
-        if (sourceRange) {
-          return {
-            range: sourceRange,
-            uri: doc.uri,
-          };
-        }
-      }
-
-      break;
-    }
-  },
-  findReferences(doc, params) {
-    const sourceOffset = doc.offsetAt(params.position);
-    for (const style of processStyle(doc)) {
-      // Find the first stylesheet data that contains the offset.
-      const generatedPos = style.extracted.generatedPositionAt(sourceOffset);
-      if (generatedPos === undefined) continue;
-
-      const result: Location[] = [];
-      for (const location of style.service.findReferences(
-        style.virtualDoc,
-        generatedPos,
-        style.parsed,
-      )) {
-        const sourceRange = getSourceRange(style, location.range);
-        if (sourceRange) {
-          result.push({
-            range: sourceRange,
-            uri: location.uri,
-          });
-        }
-      }
-
-      return result.length ? result : undefined;
-    }
-  },
-  findDocumentSymbols(doc) {
-    const result: SymbolInformation[] = [];
-    for (const extracted of processStyle(doc)) {
-      for (const symbol of extracted.service.findDocumentSymbols(
-        extracted.virtualDoc,
-        extracted.parsed,
-      )) {
-        if (symbol.location.uri === doc.uri) {
-          const sourceRange = getSourceRange(extracted, symbol.location.range);
-          if (sourceRange) {
-            result.push({
-              kind: symbol.kind,
-              name: symbol.name,
-              tags: symbol.tags,
-              deprecated: symbol.deprecated,
-              containerName: symbol.containerName,
-              location: { uri: doc.uri, range: sourceRange },
-            });
-          }
-        } else {
-          result.push(symbol);
-        }
-      }
-    }
-
-    return result.length ? result : undefined;
-  },
-  async findDocumentLinks(doc) {
-    const result: DocumentLink[] = [];
-    for (const extracted of processStyle(doc)) {
-      for (const link of await extracted.service.findDocumentLinks2(
-        extracted.virtualDoc,
-        extracted.parsed,
-        { resolveReference },
-      )) {
-        const sourceRange = getSourceRange(extracted, link.range);
-        if (sourceRange) {
-          result.push({
-            range: sourceRange,
-            target: link.target,
-            tooltip: link.tooltip,
-            data: link.data,
-          });
-        }
-      }
-    }
-
-    return result.length ? result : undefined;
-  },
-  findDocumentHighlights(doc, params) {
-    const sourceOffset = doc.offsetAt(params.position);
-    for (const style of processStyle(doc)) {
-      // Find the first stylesheet data that contains the offset.
-      const generatedPos = style.extracted.generatedPositionAt(sourceOffset);
-      if (generatedPos === undefined) continue;
-
-      const result: DocumentHighlight[] = [];
-      for (const highlight of style.service.findDocumentHighlights(
-        style.virtualDoc,
-        generatedPos,
-        style.parsed,
-      )) {
-        const sourceRange = getSourceRange(style, highlight.range);
-        if (sourceRange) {
-          result.push({
-            range: sourceRange,
-            kind: highlight.kind,
-          });
-        }
-      }
-
-      return result.length ? result : undefined;
-    }
-  },
-  findDocumentColors(doc) {
-    const result: ColorInformation[] = [];
-    for (const extracted of processStyle(doc)) {
-      for (const colorInfo of extracted.service.findDocumentColors(
-        extracted.virtualDoc,
-        extracted.parsed,
-      )) {
-        const sourceRange = getSourceRange(extracted, colorInfo.range);
-        if (sourceRange) {
-          result.push({
-            range: sourceRange,
-            color: colorInfo.color,
-          });
-        }
-      }
-    }
-
-    return result.length ? result : undefined;
-  },
-  getColorPresentations(doc, params) {
-    for (const extracted of processStyle(doc)) {
-      const generatedRange = getGeneratedRange(doc, extracted, params.range);
-      // Find the first stylesheet data that contains the offset.
-      if (generatedRange === undefined) continue;
-
-      const result: ColorPresentation[] = [];
-      for (const colorPresentation of extracted.service.getColorPresentations(
-        extracted.virtualDoc,
-        extracted.parsed,
-        params.color,
-        generatedRange,
-      )) {
-        const textEdit =
-          colorPresentation.textEdit &&
-          getSourceEdit(extracted, colorPresentation.textEdit);
-        const additionalTextEdits =
-          colorPresentation.additionalTextEdits &&
-          getSourceEdits(extracted, colorPresentation.additionalTextEdits);
-
-        if (textEdit || additionalTextEdits) {
-          result.push({
-            label: colorPresentation.label,
-            textEdit,
-            additionalTextEdits,
-          });
-        }
-      }
-
-      return result.length ? result : undefined;
-    }
-  },
-  doHover(doc, params) {
-    const sourceOffset = doc.offsetAt(params.position);
-    for (const style of processStyle(doc)) {
-      // Find the first stylesheet data that contains the offset.
-      const generatedPos = style.extracted.generatedPositionAt(sourceOffset);
-      if (generatedPos === undefined) continue;
-
-      const result = style.service.doHover(
-        style.virtualDoc,
-        generatedPos,
-        style.parsed,
-      );
-
-      if (result) {
-        if (result.range) {
-          const sourceRange = getSourceRange(style, result.range);
-          if (sourceRange) {
-            return {
-              range: sourceRange,
-              contents: result.contents,
-            };
-          }
-        } else {
-          return result;
-        }
-      }
-    }
-  },
-  async doRename(doc, params) {
-    const sourceOffset = doc.offsetAt(params.position);
-    for (const style of processStyle(doc)) {
-      // Find the first stylesheet data that contains the offset.
-      const generatedOffset = style.extracted.generatedOffsetAt(sourceOffset);
-      if (generatedOffset === undefined) continue;
-
-      const result = style.service.doRename(
-        style.virtualDoc,
-        style.virtualDoc.positionAt(generatedOffset),
-        params.newName,
-        style.parsed,
-      );
-
-      if (result.changes) {
-        for (const uri in result.changes) {
-          if (uri === doc.uri) {
-            result.changes[uri] =
-              getSourceEdits(style, result.changes[uri]) || [];
-          }
-        }
-      }
-
-      if (result.documentChanges) {
-        for (const change of result.documentChanges) {
-          if (TextDocumentEdit.is(change)) {
-            if (change.textDocument.uri === doc.uri) {
-              change.edits = getSourceEdits(style, change.edits) || [];
-            }
-          }
-        }
-      }
-
-      return result;
-    }
-  },
-  doCodeActions(doc, params) {
-    for (const extracted of processStyle(doc)) {
-      // Find the first stylesheet data that contains the offset.
-      const generatedRange = getGeneratedRange(doc, extracted, params.range);
-      if (generatedRange === undefined) continue;
-
-      const result = extracted.service.doCodeActions(
-        extracted.virtualDoc,
-        generatedRange,
-        params.context,
-        extracted.parsed,
-      );
-
-      for (const command of result) {
-        const edits = command.arguments?.[2];
-        if (edits && Array.isArray(edits) && isTextEdit(edits[0])) {
-          command.arguments![2] = getSourceEdits(extracted, edits);
-        }
-      }
-
-      return result;
-    }
-  },
-  doValidate(doc) {
-    const result: Diagnostic[] = [];
-    for (const extracted of processStyle(doc)) {
-      for (const diag of extracted.service.doValidation(
-        extracted.virtualDoc,
-        extracted.parsed,
-      )) {
-        const sourceRange = getSourceRange(extracted, diag.range);
-        if (sourceRange) {
-          diag.source = "style";
-          diag.range = sourceRange;
-          result.push(diag);
-        }
-      }
-    }
-
-    return result.length ? result : undefined;
-  },
-};
-
-export { StyleSheetService as default };
-
-function processStyle(doc: TextDocument) {
-  return processDoc(doc, ({ uri, version, parsed, lookup }) => {
-    const result: ProcessedStyle[] = [];
-    for (const [ext, extracted] of extractStyle({
-      parsed,
-      lookup,
-    })) {
-      const service = services[ext]?.({
-        fileSystemProvider,
-        clientCapabilities,
-      });
-      if (service) {
-        const virtualDoc = TextDocument.create(
-          uri,
-          "css",
-          version,
-          extracted.toString(),
-        );
-        result.push({
-          service,
-          extracted,
-          virtualDoc,
-          parsed: service.parseStylesheet(virtualDoc),
-        });
-      }
-    }
-
-    return result;
-  });
-}
-
-function getSourceEdits(
-  extracted: ProcessedStyle,
-  edits: TextEdit[],
-): TextEdit[] | undefined {
-  const result: TextEdit[] = [];
-
-  for (const edit of edits) {
-    const sourceEdit = getSourceEdit(extracted, edit);
-    if (sourceEdit) {
-      result.push(sourceEdit);
-    }
-  }
-
-  return result.length ? result : undefined;
-}
-
-function getSourceEdit(
-  extracted: ProcessedStyle,
-  textEdit: TextEdit,
-): TextEdit | undefined {
-  const sourceRange = getSourceRange(extracted, textEdit.range);
-  if (sourceRange) {
-    return {
-      newText: textEdit.newText,
-      range: sourceRange,
-    };
-  }
-}
-
-function getSourceInsertReplaceEdit(
-  extracted: ProcessedStyle,
-  textEdit: TextEdit | InsertReplaceEdit,
-): TextEdit | InsertReplaceEdit | undefined {
-  if (isTextEdit(textEdit)) {
-    return getSourceEdit(extracted, textEdit);
-  } else if (textEdit.replace) {
-    const sourceRange = getSourceRange(extracted, textEdit.replace);
-    if (sourceRange) {
-      return {
-        newText: textEdit.newText,
-        replace: sourceRange,
-      } as InsertReplaceEdit;
-    }
-  } else {
-    const sourceRange = getSourceRange(extracted, textEdit.insert);
-    if (sourceRange) {
-      return {
-        newText: textEdit.newText,
-        insert: sourceRange,
-      } as InsertReplaceEdit;
-    }
-  }
-}
-
-function getSourceRange(
-  style: ProcessedStyle,
-  range: Range,
-): Range | undefined {
-  return style.extracted.sourceLocationAt(
-    style.virtualDoc.offsetAt(range.start),
-    style.virtualDoc.offsetAt(range.end),
-  );
-}
-
-function getGeneratedRange(
-  doc: TextDocument,
-  style: ProcessedStyle,
-  range: Range,
-): Range | undefined {
-  return style.extracted.generatedLocationAt(
-    doc.offsetAt(range.start),
-    doc.offsetAt(range.end),
-  );
-}
-
-function isTextEdit(edit: TextEdit | InsertReplaceEdit): edit is TextEdit {
-  return (edit as TextEdit).range !== undefined;
-}
diff --git a/packages/language-server/src/service/types.ts b/packages/language-server/src/service/types.ts
deleted file mode 100644
index 65c4753e..00000000
--- a/packages/language-server/src/service/types.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import type {
-  CancellationToken,
-  CodeAction,
-  CodeActionParams,
-  ColorInformation,
-  ColorPresentation,
-  ColorPresentationParams,
-  Command,
-  CompletionItem,
-  CompletionList,
-  CompletionParams,
-  DefinitionParams,
-  Diagnostic,
-  DocumentColorParams,
-  DocumentFormattingParams,
-  DocumentHighlight,
-  DocumentHighlightParams,
-  DocumentLink,
-  DocumentLinkParams,
-  DocumentSymbolParams,
-  GenericRequestHandler,
-  Hover,
-  HoverParams,
-  InitializeParams,
-  Location,
-  LocationLink,
-  ReferenceParams,
-  RenameParams,
-  SymbolInformation,
-  TextEdit,
-  WorkspaceEdit,
-} from "vscode-languageserver";
-import type { TextDocument } from "vscode-languageserver-textdocument";
-
-export type Result<V> = Promise<V | void> | V | void;
-type Handler<P, R> = (
-  doc: TextDocument,
-  params: P extends null ? CancellationToken : P,
-  token: P extends null ? never : CancellationToken,
-) => Result<R>;
-
-export type Plugin = {
-  commands: Record<string, GenericRequestHandler<any, any>>;
-  initialize: (params: InitializeParams) => Promise<void> | void;
-  doComplete: Handler<CompletionParams, CompletionItem[] | CompletionList>;
-  doCompletionResolve: (
-    item: CompletionItem,
-    token: CancellationToken,
-  ) => Result<CompletionItem>;
-  doValidate: (doc: TextDocument) => Result<Diagnostic[]>;
-  doHover: Handler<HoverParams, Hover>;
-  doRename: Handler<RenameParams, WorkspaceEdit>;
-  doCodeActions: Handler<CodeActionParams, (Command | CodeAction)[]>;
-  findDefinition: Handler<
-    DefinitionParams,
-    Location | LocationLink | (Location | LocationLink)[]
-  >;
-  findReferences: Handler<ReferenceParams, Location[]>;
-  findDocumentSymbols: Handler<DocumentSymbolParams, SymbolInformation[]>;
-  findDocumentLinks: Handler<DocumentLinkParams, DocumentLink[]>;
-  findDocumentHighlights: Handler<DocumentHighlightParams, DocumentHighlight[]>;
-  findDocumentColors: Handler<DocumentColorParams, ColorInformation[]>;
-  getColorPresentations: Handler<ColorPresentationParams, ColorPresentation[]>;
-  format: Handler<DocumentFormattingParams, TextEdit[]>;
-};
diff --git a/packages/language-server/src/ts-plugin/host.ts b/packages/language-server/src/ts-plugin/host.ts
deleted file mode 100644
index 9120dc8f..00000000
--- a/packages/language-server/src/ts-plugin/host.ts
+++ /dev/null
@@ -1,261 +0,0 @@
-import {
-  type Extracted,
-  getExt,
-  isDefinitionFile,
-  Processors,
-} from "@marko/language-tools";
-import path from "path";
-import type ts from "typescript/lib/tsserverlibrary";
-
-const fsPathReg = /^(?:[./\\]|[A-Z]:)/i;
-const modulePartsReg = /^((?:@(?:[^/]+)\/)?(?:[^/]+))(.*)$/;
-
-export interface ExtractedSnapshot extends Extracted {
-  snapshot: ts.IScriptSnapshot;
-}
-
-export function patch(
-  ts: typeof import("typescript/lib/tsserverlibrary"),
-  configFile: string | undefined,
-  extractCache: Map<
-    string,
-    ExtractedSnapshot | { snapshot: ts.IScriptSnapshot }
-  >,
-  resolutionCache: ts.ModuleResolutionCache | undefined,
-  host: ts.LanguageServiceHost,
-  ps?: InstanceType<typeof ts.server.ProjectService>,
-) {
-  const processors = Processors.create({
-    ts,
-    host,
-    configFile,
-  });
-  const rootNames = Object.values(processors)
-    .map((processor) => processor.getRootNames?.())
-    .flat()
-    .filter(Boolean) as string[];
-
-  const trackFile = ps
-    ? (fileName: string) => {
-        // Ensure the project service knows about the file.
-        // Without this the project never registers a `ScriptInfo`.
-        // TODO: maybe we should patch readFile instead of getScriptSnapshot?
-
-        ps.getOrCreateScriptInfoForNormalizedPath(
-          fileName as any,
-          true,
-          undefined,
-          ts.ScriptKind.Deferred,
-          false,
-          host,
-        );
-      }
-    : () => {};
-
-  /**
-   * Ensure the processor runtime definitions are always loaded.
-   */
-  const getScriptFileNames = host.getScriptFileNames.bind(host);
-  host.getScriptFileNames = () => [
-    ...new Set(rootNames.concat(getScriptFileNames())),
-  ];
-
-  /**
-   * Trick TypeScript into thinking Marko files are TS/JS files.
-   */
-  const getScriptKind = host.getScriptKind?.bind(host);
-  if (getScriptKind) {
-    host.getScriptKind = (fileName: string) => {
-      const processor = getProcessor(fileName);
-      if (processor) return processor.getScriptKind(fileName);
-      return getScriptKind(fileName);
-    };
-  }
-
-  /**
-   * A script snapshot is an immutable string of text representing the contents of a file.
-   * We patch it so that Marko files instead return their extracted ts code.
-   */
-  const getScriptSnapshot = host.getScriptSnapshot.bind(host);
-  host.getScriptSnapshot = (fileName: string) => {
-    const processor = getProcessor(fileName);
-    if (processor) {
-      let cached = extractCache.get(fileName);
-
-      if (!cached) {
-        const code = host.readFile(fileName, "utf-8") || "";
-
-        try {
-          cached = processor.extract(fileName, code) as ExtractedSnapshot;
-          cached.snapshot = ts.ScriptSnapshot.fromString(cached.toString());
-        } catch {
-          cached = { snapshot: ts.ScriptSnapshot.fromString("") };
-        }
-
-        trackFile(fileName);
-        extractCache.set(fileName, cached);
-      }
-
-      return cached.snapshot;
-    }
-
-    return getScriptSnapshot(fileName);
-  };
-
-  if (host.getProjectVersion) {
-    const getScriptVersion = host.getScriptVersion.bind(host);
-    host.getScriptVersion = (fileName: string) => {
-      const processor = getProcessor(fileName);
-      if (processor) return host.getProjectVersion!();
-      return getScriptVersion(fileName);
-    };
-  }
-
-  /**
-   * This ensures that any directory reads with specific file extensions also include Marko.
-   * It is used for example when completing the `from` property of the `import` statement.
-   */
-  const readDirectory = host.readDirectory?.bind(host);
-  if (readDirectory) {
-    host.readDirectory = (path, extensions, exclude, include, depth) => {
-      return readDirectory(
-        path,
-        extensions?.concat(Processors.extensions),
-        exclude,
-        include,
-        depth,
-      );
-    };
-  }
-
-  /**
-   * TypeScript doesn't know how to resolve `.marko` files.
-   * Below we first try to use TypeScripts normal resolution, and then fallback
-   * to seeing if a `.marko` file exists at the same location.
-   */
-  const resolveModuleNameLiterals = host.resolveModuleNameLiterals?.bind(host);
-
-  if (resolveModuleNameLiterals) {
-    host.resolveModuleNameLiterals = (
-      moduleLiterals,
-      containingFile,
-      redirectedReference,
-      options,
-      containingSourceFile,
-      reusedNames,
-    ) => {
-      let normalModuleLiterals = moduleLiterals as ts.StringLiteralLike[];
-      let resolvedModules:
-        | undefined
-        | (ts.ResolvedModuleWithFailedLookupLocations | undefined)[];
-
-      for (let i = 0; i < moduleLiterals.length; i++) {
-        const moduleLiteral = moduleLiterals[i];
-        const moduleName = moduleLiteral.text;
-        const processor =
-          moduleName[0] !== "*" ? getProcessor(moduleName) : undefined;
-        if (processor) {
-          let resolvedFileName: string | undefined;
-          if (fsPathReg.test(moduleName)) {
-            // For fs paths just see if it exists on disk.
-            resolvedFileName = path.resolve(containingFile, "..", moduleName);
-          } else {
-            // For other paths we treat it as a node_module and try resolving
-            // that modules `marko.json`. If the `marko.json` exists then we'll
-            // try resolving the `.marko` file relative to that.
-            const [, nodeModuleName, relativeModulePath] =
-              modulePartsReg.exec(moduleName)!;
-            const { resolvedModule } = ts.nodeModuleNameResolver(
-              `${nodeModuleName}/package.json`,
-              containingFile,
-              options,
-              host,
-              resolutionCache,
-              redirectedReference,
-            );
-
-            if (resolvedModule) {
-              resolvedFileName = path.join(
-                resolvedModule.resolvedFileName,
-                "..",
-                relativeModulePath,
-              );
-            }
-          }
-
-          if (!resolvedModules) {
-            resolvedModules = [];
-            normalModuleLiterals = [];
-            for (let j = 0; j < i; j++) {
-              resolvedModules.push(undefined);
-              normalModuleLiterals.push(moduleLiterals[j]);
-            }
-          }
-
-          if (resolvedFileName) {
-            if (isDefinitionFile(resolvedFileName)) {
-              if (!host.fileExists(resolvedFileName)) {
-                resolvedFileName = undefined;
-              }
-            } else {
-              const ext = getExt(resolvedFileName)!;
-              const definitionFile = `${resolvedFileName.slice(
-                0,
-                -ext.length,
-              )}.d${ext}`;
-              if (host.fileExists(definitionFile)) {
-                resolvedFileName = definitionFile;
-              } else if (!host.fileExists(resolvedFileName)) {
-                resolvedFileName = undefined;
-              }
-            }
-          }
-
-          resolvedModules.push({
-            resolvedModule: resolvedFileName
-              ? {
-                  resolvedFileName,
-                  extension: processor.getScriptExtension(resolvedFileName),
-                  isExternalLibraryImport: false,
-                }
-              : undefined,
-          });
-        } else if (resolvedModules) {
-          resolvedModules.push(undefined);
-          normalModuleLiterals.push(moduleLiteral);
-        }
-      }
-
-      const normalResolvedModules = normalModuleLiterals.length
-        ? resolveModuleNameLiterals(
-            normalModuleLiterals,
-            containingFile,
-            redirectedReference,
-            options,
-            containingSourceFile,
-            reusedNames,
-          )
-        : undefined;
-
-      if (resolvedModules) {
-        if (normalResolvedModules) {
-          for (let i = 0, j = 0; i < resolvedModules.length; i++) {
-            if (!resolvedModules[i]) {
-              resolvedModules[i] = normalResolvedModules[j++];
-            }
-          }
-        }
-        return resolvedModules as readonly ts.ResolvedModuleWithFailedLookupLocations[];
-      } else {
-        return normalResolvedModules!;
-      }
-    };
-  }
-
-  return host;
-
-  function getProcessor(fileName: string) {
-    const ext = getExt(fileName);
-    return ext ? processors[ext] : undefined;
-  }
-}
diff --git a/packages/language-server/src/ts-plugin/index.ts b/packages/language-server/src/ts-plugin/index.ts
index 685835cb..dbf1361e 100644
--- a/packages/language-server/src/ts-plugin/index.ts
+++ b/packages/language-server/src/ts-plugin/index.ts
@@ -1,207 +1,14 @@
-import "../utils/project-defaults";
+import { createLanguageServicePlugin } from "@volar/typescript/lib/quickstart/createLanguageServicePlugin.js";
 
-import { Extracted, Processors, Project } from "@marko/language-tools";
-import type ts from "typescript/lib/tsserverlibrary";
+import { addMarkoTypes, createMarkoLanguagePlugin } from "../language";
 
-import { START_POSITION } from "../utils/constants";
-import { ExtractedSnapshot, patch } from "./host";
-
-const markoTaglibFilesReg = /[\\/]marko(?:-tag)\.json$/;
-const getStartLineCharacter = () => START_POSITION;
-// TODO: improve the import name for Marko components.
-
-export interface InitOptions {
-  typescript: typeof ts;
-}
-
-export function init({ typescript: ts }: InitOptions): ts.server.PluginModule {
+export const init = createLanguageServicePlugin((ts, info) => {
   return {
-    getExternalFiles(project) {
-      return project
-        .getFileNames(false, true)
-        .filter((it) => Processors.has(it));
-    },
-    create(info) {
-      const {
-        project: tsProject,
-        languageService: ls,
-        languageServiceHost: lsh,
-      } = info;
-
-      try {
-        const { projectService: ps } = tsProject;
-        const extraExtensions = (ps as any)?.hostConfiguration
-          ?.extraFileExtensions;
-
-        if (extraExtensions) {
-          let processedExtCount = 0;
-          for (const { extension } of extraExtensions) {
-            if (Processors.extensions.includes(extension)) processedExtCount++;
-          }
-
-          if (processedExtCount !== Processors.extensions.length) {
-            // The first time we install the plugin we update the config to allow our processed extensions.
-            // This will cause the plugin to be called again, so we check that the extension is not already added.
-            ps.setHostConfiguration({
-              extraFileExtensions: extraExtensions.concat(
-                Processors.extensions.map((extension) => ({
-                  extension,
-                  isMixedContent: false,
-                  scriptKind: ts.ScriptKind.Deferred,
-                })),
-              ),
-            });
-          }
-        }
-
-        const extractCache = new Map<string, ExtractedSnapshot>();
-        patch(
-          ts,
-          (tsProject as ts.server.ConfiguredProject).canonicalConfigFilePath,
-          extractCache,
-          (tsProject as any).getModuleResolutionCache(),
-          lsh,
-          ps,
-        );
-
-        /**
-         * Here we invalidate our snapshot cache when TypeScript invalidates the file.
-         */
-        const onSourceFileChanged = (ps as any).onSourceFileChanged?.bind(ps);
-
-        if (onSourceFileChanged) {
-          (ps as any).onSourceFileChanged = (
-            info: ts.server.ScriptInfo,
-            eventKind: ts.FileWatcherEventKind,
-          ) => {
-            if (markoTaglibFilesReg.test(info.fileName)) {
-              Project.clearCaches();
-            }
-
-            extractCache.delete(info.fileName);
-            return onSourceFileChanged(info, eventKind);
-          };
-        }
-
-        /**
-         * Whenever TypeScript requests line/character info we return with the source
-         * file line/character if it exists.
-         */
-        const toLineColumnOffset = (
-          ls.toLineColumnOffset || getStartLineCharacter
-        ).bind(ls);
-        ls.toLineColumnOffset = (fileName, pos) => {
-          if (pos === 0) return START_POSITION;
-
-          const extracted = extractCache.get(fileName);
-          if (extracted) {
-            return extracted.sourcePositionAt(pos) || START_POSITION;
-          }
-
-          return toLineColumnOffset(fileName, pos);
-        };
-
-        const findReferences = ls.findReferences.bind(ls);
-        ls.findReferences = (fileName, position) => {
-          const symbols = findReferences(fileName, position);
-          if (!symbols) return;
-
-          const result: ts.ReferencedSymbol[] = [];
-          for (const symbol of symbols) {
-            let definition: ts.ReferencedSymbolDefinitionInfo | undefined =
-              symbol.definition;
-            const defExtracted = extractCache.get(definition.fileName);
-
-            if (defExtracted) {
-              definition = mapTextSpans(defExtracted, definition);
-              if (!definition) continue;
-            }
-
-            const references: ts.ReferencedSymbolEntry[] = [];
-            for (const reference of symbol.references) {
-              const refExtracted = extractCache.get(reference.fileName);
-              if (refExtracted) {
-                const updated = mapTextSpans(refExtracted, reference);
-                if (updated) references.push(updated);
-              } else {
-                references.push(reference);
-              }
-            }
-
-            result.push({
-              definition,
-              references,
-            });
-          }
-
-          return result;
-        };
-
-        const findRenameLocations = ls.findRenameLocations.bind(ls);
-        ls.findRenameLocations = (
-          fileName,
-          position,
-          findInStrings,
-          findInComments,
-          preferences,
-        ) => {
-          const renames = findRenameLocations(
-            fileName,
-            position,
-            findInStrings,
-            findInComments,
-            preferences as any,
-          );
-          if (!renames) return;
-
-          const result: ts.RenameLocation[] = [];
-          for (const rename of renames) {
-            const extracted = extractCache.get(rename.fileName);
-            if (extracted) {
-              const updated = mapTextSpans(extracted, rename);
-              if (updated) result.push(updated);
-            } else {
-              result.push(rename);
-            }
-          }
-
-          return result;
-        };
-      } catch (err) {
-        console.error(err);
-      }
-
-      return ls;
+    languagePlugins: [createMarkoLanguagePlugin(ts, (id) => id)],
+    setup(_language) {
+      const { languageServiceHost } = info;
+      const rootPath = languageServiceHost.getCurrentDirectory();
+      addMarkoTypes(rootPath, ts, languageServiceHost);
     },
   };
-}
-
-function mapTextSpans<
-  T extends {
-    textSpan: ts.TextSpan;
-    contextSpan?: ts.TextSpan;
-  },
->(extracted: ExtractedSnapshot, data: T) {
-  const textSpan = sourceTextSpan(extracted, data.textSpan);
-  if (textSpan) {
-    return {
-      ...data,
-      textSpan,
-      contextSpan:
-        data.contextSpan && sourceTextSpan(extracted, data.contextSpan),
-    };
-  }
-}
-
-function sourceTextSpan(
-  extracted: Extracted,
-  { start, length }: ts.TextSpan,
-): ts.TextSpan | undefined {
-  const sourceStart = extracted.sourceOffsetAt(start);
-  if (sourceStart !== undefined) {
-    return {
-      start: sourceStart,
-      length,
-    };
-  }
-}
+});
diff --git a/packages/language-server/src/utils/file-system.ts b/packages/language-server/src/utils/file-system.ts
deleted file mode 100644
index d5b26bee..00000000
--- a/packages/language-server/src/utils/file-system.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import fs from "fs/promises";
-import { fileURLToPath } from "url";
-import { type FileStat, FileType } from "vscode-css-languageservice";
-
-export { FileStat, FileType };
-export default {
-  stat,
-  readDirectory,
-};
-
-async function stat(uri: string): Promise<FileStat> {
-  let type = FileType.Unknown;
-  let ctime = -1;
-  let mtime = -1;
-  let size = -1;
-
-  try {
-    const stat = await fs.stat(fileURLToPath(uri));
-    if (stat.isDirectory()) type = FileType.Directory;
-    else if (stat.isFile()) type = FileType.File;
-    ctime = stat.ctimeMs;
-    mtime = stat.mtimeMs;
-    size = stat.size;
-  } catch {
-    // ignore
-  }
-
-  return {
-    type,
-    ctime,
-    mtime,
-    size,
-  };
-}
-
-async function readDirectory(uri: string): Promise<[string, FileType][]> {
-  const result: [string, FileType][] = [];
-
-  try {
-    for await (const entry of await fs.opendir(fileURLToPath(uri))) {
-      if (entry.isFile()) {
-        result.push([entry.name, FileType.File]);
-      } else if (entry.isDirectory()) {
-        result.push([entry.name, FileType.Directory]);
-      }
-    }
-  } catch {
-    // ignore
-  }
-  return result;
-}
diff --git a/packages/language-server/src/utils/file.ts b/packages/language-server/src/utils/file.ts
deleted file mode 100644
index 4362f8ca..00000000
--- a/packages/language-server/src/utils/file.ts
+++ /dev/null
@@ -1,90 +0,0 @@
-import type { TaglibLookup } from "@marko/babel-utils";
-import { parse, type Parsed, Project } from "@marko/language-tools";
-import path from "path";
-import type { TextDocument } from "vscode-languageserver-textdocument";
-import { URI } from "vscode-uri";
-
-const processorCaches = new WeakMap<Parsed, Map<unknown, unknown>>();
-
-export interface MarkoFile {
-  uri: string;
-  scheme: string;
-  version: number;
-  lookup: TaglibLookup;
-  filename: string | undefined;
-  dirname: string | undefined;
-  parsed: Parsed;
-  code: string;
-}
-
-export function getFSDir(doc: TextDocument): string | undefined {
-  const filename = getFSPath(doc);
-  return filename && path.dirname(filename);
-}
-
-export function getFSPath(doc: TextDocument): string | undefined {
-  const parsed = URI.parse(doc.uri);
-  return parsed.scheme === "file" ? parsed.fsPath : undefined;
-}
-
-export function getMarkoFile(doc: TextDocument): MarkoFile {
-  const { uri } = doc;
-  const { fsPath, scheme } = URI.parse(uri);
-  const filename = scheme === "file" ? fsPath : undefined;
-  const dirname = filename ? path.dirname(filename) : process.cwd();
-  const cache = Project.getCache(dirname) as Map<TextDocument, MarkoFile>;
-  let file = cache.get(doc);
-  if (!file) {
-    const { version } = doc;
-    const code = doc.getText();
-    const parsed = parse(code, filename);
-    const lookup = Project.getTagLookup(dirname);
-    cache.set(
-      doc,
-      (file = {
-        uri,
-        scheme,
-        version,
-        lookup,
-        filename,
-        dirname,
-        parsed,
-        code,
-      }),
-    );
-  }
-
-  return file;
-}
-
-export function clearMarkoCacheForFile(doc: TextDocument) {
-  (Project.getCache(getFSDir(doc)) as Map<TextDocument, MarkoFile>).delete(doc);
-}
-
-/**
- * Run some processing against a parsed document and cache the result.
- * Anytime the document changes, the cache is cleared.
- */
-export function processDoc<T>(
-  doc: TextDocument,
-  process: (file: MarkoFile) => T,
-): T {
-  const file = getMarkoFile(doc);
-  const cache = processorCaches.get(file.parsed) as
-    | Map<typeof process, T>
-    | undefined;
-  let result: T | undefined;
-
-  if (cache) {
-    result = cache.get(process);
-    if (!result) {
-      result = process(file);
-      cache.set(process, result);
-    }
-  } else {
-    result = process(file);
-    processorCaches.set(file.parsed, new Map([[process, result]]));
-  }
-
-  return result;
-}
diff --git a/packages/language-server/src/utils/messages.ts b/packages/language-server/src/utils/messages.ts
deleted file mode 100644
index cb076a69..00000000
--- a/packages/language-server/src/utils/messages.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { inspect } from "util";
-import type { Connection } from "vscode-languageserver";
-
-let connection!: Connection;
-const previousMessagesByType = new Map<string, string[]>();
-export default function setup(_: Connection) {
-  connection = _;
-}
-
-export function displayInformation(data: unknown) {
-  display("showInformation", data);
-}
-
-export function displayWarning(data: unknown) {
-  display("showWarning", data);
-}
-
-export function displayError(data: unknown) {
-  display("showError", data);
-}
-
-function display(type: string, data: unknown) {
-  const msg =
-    typeof data === "string" ? data : inspect(data, { colors: false });
-
-  const previousMessages = previousMessagesByType.get(type);
-  if (previousMessages) {
-    if (previousMessages.includes(msg)) return;
-
-    previousMessages.push(msg);
-
-    // Only keep the last 3 messages.
-    if (previousMessages.length > 3) {
-      previousMessages.unshift();
-    }
-  } else {
-    previousMessagesByType.set(type, [msg]);
-  }
-
-  setImmediate(() => connection.sendNotification(type, msg));
-}
diff --git a/packages/language-server/src/utils/resolve-url.ts b/packages/language-server/src/utils/resolve-url.ts
deleted file mode 100644
index 82fd79dd..00000000
--- a/packages/language-server/src/utils/resolve-url.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export default function resolveUrl(to: string, base: string) {
-  try {
-    const url = new URL(to, base);
-    if (url.protocol === "file:") return url.toString();
-  } catch {
-    return undefined;
-  }
-}
diff --git a/packages/language-server/src/utils/text-documents.ts b/packages/language-server/src/utils/text-documents.ts
deleted file mode 100644
index 2c6899c1..00000000
--- a/packages/language-server/src/utils/text-documents.ts
+++ /dev/null
@@ -1,171 +0,0 @@
-import fs from "fs";
-import {
-  DidChangeTextDocumentParams,
-  DidChangeWatchedFilesParams,
-  DidCloseTextDocumentParams,
-  DidOpenTextDocumentParams,
-  FileChangeType,
-} from "vscode-languageserver";
-import { TextDocument } from "vscode-languageserver-textdocument";
-import { URI } from "vscode-uri";
-
-export type FileChangeHandler = (document: TextDocument | undefined) => void;
-
-const docs = new Map<string, TextDocument>();
-const openDocs = new Set<TextDocument>();
-const fileExists = new Map<string, boolean>();
-const fileChangeHandlers: Set<FileChangeHandler> = new Set();
-
-export let projectVersion = 0;
-
-export function onFileChange(handler: FileChangeHandler) {
-  fileChangeHandlers.add(handler);
-}
-
-export function getAllOpen() {
-  return openDocs;
-}
-
-export function get(uri: string) {
-  const doc = docs.get(uri);
-  if (doc) return doc;
-
-  const { fsPath, scheme } = URI.parse(uri);
-  if (scheme === "file") {
-    if (fileExists.get(uri) === false) return undefined;
-    try {
-      const newDoc = TextDocument.create(
-        uri,
-        getLanguageId(uri),
-        fs.statSync(fsPath).mtimeMs,
-        fs.readFileSync(fsPath, "utf-8"),
-      );
-
-      docs.set(uri, newDoc);
-      fileExists.set(uri, true);
-      return newDoc;
-    } catch {
-      fileExists.set(uri, false);
-    }
-  }
-}
-
-export function exists(uri: string) {
-  const cached = fileExists.get(uri);
-  if (cached !== undefined) return cached;
-
-  const { fsPath, scheme } = URI.parse(uri);
-  if (scheme === "file") {
-    try {
-      fs.accessSync(fsPath);
-      fileExists.set(uri, true);
-      return true;
-    } catch {
-      fileExists.set(uri, false);
-      return false;
-    }
-  }
-
-  return false;
-}
-
-export function isOpen(doc: TextDocument) {
-  return openDocs.has(doc);
-}
-
-export function doOpen(params: DidOpenTextDocumentParams) {
-  const ref = params.textDocument;
-  const existingDoc = docs.get(ref.uri);
-  projectVersion++;
-
-  if (existingDoc) {
-    if (existingDoc.version === ref.version) {
-      openDocs.add(existingDoc);
-      return;
-    }
-
-    openDocs.delete(existingDoc);
-    docs.delete(ref.uri);
-  }
-
-  const newDoc = TextDocument.create(
-    ref.uri,
-    ref.languageId,
-    ref.version,
-    ref.text,
-  );
-
-  openDocs.add(newDoc);
-  fileExists.set(ref.uri, true);
-  docs.set(ref.uri, newDoc);
-}
-
-export function doChange(params: DidChangeTextDocumentParams) {
-  const ref = params.textDocument;
-  const changes = params.contentChanges;
-  const doc = docs.get(ref.uri);
-  if (changes.length > 0 && ref.version != null && doc) {
-    TextDocument.update(doc, changes, ref.version);
-    emitFileChange(doc);
-  }
-}
-
-export function doClose(params: DidCloseTextDocumentParams) {
-  const ref = params.textDocument;
-  const doc = docs.get(ref.uri);
-  if (doc) {
-    projectVersion++;
-    openDocs.delete(doc);
-
-    if (URI.parse(ref.uri).scheme !== "file") {
-      docs.delete(ref.uri);
-    }
-  }
-}
-
-export function doChangeWatchedFiles(params: DidChangeWatchedFilesParams) {
-  for (const change of params.changes) {
-    switch (change.type) {
-      case FileChangeType.Created:
-        fileExists.set(change.uri, true);
-        break;
-      case FileChangeType.Deleted:
-      case FileChangeType.Changed: {
-        fileExists.set(change.uri, change.type === FileChangeType.Changed);
-
-        // When a file that's in our cache is changed or deleted and not in an open editor
-        // we clear the file from the cache since it will be reloaded when read.
-        const doc = docs.get(change.uri);
-        if (doc && !openDocs.has(doc)) {
-          docs.delete(change.uri);
-        }
-      }
-    }
-  }
-
-  emitFileChange(undefined);
-}
-
-function getLanguageId(uri: string) {
-  const ext = uri.slice(uri.lastIndexOf(".") + 1);
-  switch (ext) {
-    case "cjs":
-    case "mjs":
-    case "js":
-      return "javascript";
-    case "cts":
-    case "mts":
-    case "ts":
-      return "typescript";
-    default:
-      return ext;
-  }
-}
-
-function emitFileChange(doc: TextDocument | undefined) {
-  projectVersion++;
-
-  for (const handler of fileChangeHandlers) {
-    handler(doc);
-  }
-}
diff --git a/packages/language-server/src/utils/workspace.ts b/packages/language-server/src/utils/workspace.ts
deleted file mode 100644
index 240de662..00000000
--- a/packages/language-server/src/utils/workspace.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import type { Connection } from "vscode-languageserver";
-
-let isInitialized = false;
-let connection!: Connection;
-const configChangeHandlers: Set<ConfigChangeHandler> = new Set();
-const settingsCache = new Map<string, any>();
-
-export async function getConfig<T = any>(section: string): Promise<T> {
-  let cached = settingsCache.get(section);
-  if (!cached) {
-    try {
-      cached = (await connection.workspace.getConfiguration(section)) || {};
-      settingsCache.set(section, cached);
-    } catch {
-      // ignore
-    }
-  }
-
-  return cached;
-}
-
-export type ConfigChangeHandler = () => void;
-export function onConfigChange(handler: ConfigChangeHandler) {
-  configChangeHandlers.add(handler);
-}
-
-export function setup(_: Connection) {
-  connection = _;
-  connection.onDidChangeConfiguration(() => {
-    if (isInitialized) {
-      settingsCache.clear();
-      emitConfigChange();
-    } else {
-      isInitialized = true;
-    }
-  });
-}
-
-function emitConfigChange() {
-  for (const handler of configChangeHandlers) {
-    handler();
-  }
-}
diff --git a/packages/language-tools/src/extractors/html/index.ts b/packages/language-tools/src/extractors/html/index.ts
index fc091aee..9c26bb42 100644
--- a/packages/language-tools/src/extractors/html/index.ts
+++ b/packages/language-tools/src/extractors/html/index.ts
@@ -135,7 +135,6 @@ class HTMLExtractor {
     const valueString = this.#read(attr.value);
     const valueType = getAttributeValueType(valueString);
     if (valueType === undefined) return;
-
     switch (valueType) {
       case AttributeValueType.True:
         break;
diff --git a/packages/language-tools/src/util/extractor.ts b/packages/language-tools/src/util/extractor.ts
index 9fdb2423..0be5e1ee 100644
--- a/packages/language-tools/src/util/extractor.ts
+++ b/packages/language-tools/src/util/extractor.ts
@@ -32,7 +32,7 @@ const emptyView = {
 export class Extractor {
   #parsed: Parsed;
   #generated = "";
-  #tokens: Token[] = [];
+  tokens: Token[] = [];
   constructor(parsed: Parsed) {
     this.#parsed = parsed;
   }
@@ -47,7 +47,7 @@ export class Extractor {
       if (typeof range === "string") {
         this.#generated += range;
       } else {
-        this.#tokens.push({
+        this.tokens.push({
           generatedStart: this.#generated.length,
           sourceStart: range.start,
           length: Math.min(this.#parsed.code.length, range.end) - range.start,
@@ -60,7 +60,7 @@ export class Extractor {
   }
 
   end() {
-    return new Extracted(this.#parsed, this.#generated, this.#tokens);
+    return new Extracted(this.#parsed, this.#generated, this.tokens);
   }
 }
 
@@ -69,11 +69,13 @@ export class Extracted {
   #sourceToGenerated: SourceToGeneratedView | typeof emptyView;
   #generatedToSource: GeneratedToSourceView | typeof emptyView;
   #cachedGeneratedLines: number[] | undefined;
+  tokens: Token[];
   constructor(
     public parsed: Parsed,
     generated: string,
     tokens: Token[],
   ) {
+    this.tokens = tokens;
     this.#generated = generated;
 
     if (tokens.length === 0) {
@@ -159,12 +161,12 @@ export class Extracted {
  * on the view type.
  */
 abstract class TokenView {
-  #tokens: Token[];
+  tokens: Token[];
   #last: number;
   abstract inStart(token: Token): number;
   abstract outStart(token: Token): number;
   constructor(tokens: Token[]) {
-    this.#tokens = tokens;
+    this.tokens = tokens;
     this.#last = tokens.length - 1;
   }
 
@@ -175,14 +177,14 @@ abstract class TokenView {
     while (min < max) {
       const mid = (1 + min + max) >>> 1;
 
-      if (this.inStart(this.#tokens[mid]) <= offset) {
+      if (this.inStart(this.tokens[mid]) <= offset) {
         min = mid;
       } else {
         max = mid - 1;
       }
     }
 
-    const token = this.#tokens[min];
+    const token = this.tokens[min];
     const index = offset - this.inStart(token);
     if (index >= 0 && index <= token.length) {
       return this.outStart(token) + index;
@@ -195,7 +197,7 @@ abstract class TokenView {
 
     while (min < max) {
       const mid = (min + max) >> 1;
-      const token = this.#tokens[mid];
+      const token = this.tokens[mid];
       const tokenInEnd = this.inStart(token) + token.length;
 
       if (tokenInEnd > inStart) {
@@ -205,7 +207,7 @@ abstract class TokenView {
       }
     }
 
-    const startToken = this.#tokens[max];
+    const startToken = this.tokens[max];
     const startTokenInStart = this.inStart(startToken);
     if (startTokenInStart >= inEnd) return;
 
@@ -213,7 +215,7 @@ abstract class TokenView {
 
     while (min < max) {
       const mid = (1 + min + max) >>> 1;
-      const token = this.#tokens[mid];
+      const token = this.tokens[mid];
       const tokenEnd = this.inStart(token) + token.length;
 
       if (tokenEnd <= inEnd) {
@@ -223,7 +225,7 @@ abstract class TokenView {
       }
     }
 
-    const endToken = this.#tokens[min];
+    const endToken = this.tokens[min];
     const endTokenInStart = this.inStart(endToken);
     const endTokenInEnd = endTokenInStart + endToken.length;
     if (endTokenInEnd < inStart) return;
diff --git a/packages/vscode/build.mts b/packages/vscode/build.mts
index 6cd132fe..096d51b4 100644
--- a/packages/vscode/build.mts
+++ b/packages/vscode/build.mts
@@ -14,7 +14,7 @@ await Promise.all([
     // since we're bundling typescript and it will look for them relative to the `__dirname` of the script.
     const tsLibDir = path.join(
       require.resolve("typescript/package.json"),
-      "../lib"
+      "../lib",
     );
     const [dir] = await Promise.all([
       fs.opendir(tsLibDir),
@@ -24,18 +24,18 @@ await Promise.all([
       if (entry.isFile() && /^lib\..*\.d\.ts$/.test(entry.name)) {
         await fs.copyFile(
           path.join(tsLibDir, entry.name),
-          path.join(distDir, entry.name)
+          path.join(distDir, entry.name),
         );
       }
     }
   })(),
   fs.copyFile(
     path.join(thisDir, "../language-tools/marko.internal.d.ts"),
-    path.join(distDir, "marko.internal.d.ts")
+    path.join(distDir, "marko.internal.d.ts"),
   ),
   fs.copyFile(
     path.join(require.resolve("marko/package.json"), "../index.d.ts"),
-    path.join(distDir, "marko.runtime.d.ts")
+    path.join(distDir, "marko.runtime.d.ts"),
   ),
   build({
     bundle: true,
@@ -65,10 +65,10 @@ await Promise.all([
       "@babel/preset-typescript",
     ],
     define: {
-      "import.meta.url": "_importMetaUrl"
+      "import.meta.url": "_importMetaUrl",
     },
     banner: {
-      js: "const _importMetaUrl = require('url').pathToFileURL(__filename);"
+      js: "const _importMetaUrl = require('url').pathToFileURL(__filename);",
     },
     plugins: [
       {
@@ -82,7 +82,17 @@ await Promise.all([
             path: path.join(
               require.resolve(pkg),
               "..",
-              require(pkg).module as string
+              require(pkg).module as string,
+            ),
+          }));
+
+          const htmlPkg = "vscode-html-languageservice/package.json";
+
+          build.onResolve({ filter: /^vscode-html-languageservice$/ }, () => ({
+            path: path.join(
+              require.resolve(htmlPkg),
+              "..",
+              require(htmlPkg).module as string,
             ),
           }));
         },
@@ -105,10 +115,10 @@ await Promise.all([
                 loader: "js",
                 contents: (await fs.readFile(args.path, "utf8")).replace(
                   'require.resolve ? require.resolve("./xhr-sync-worker.js") :',
-                  ""
+                  "",
                 ),
               };
-            }
+            },
           );
         },
       },
diff --git a/packages/vscode/package.json b/packages/vscode/package.json
index 37170125..4be77c07 100644
--- a/packages/vscode/package.json
+++ b/packages/vscode/package.json
@@ -25,20 +25,24 @@
     ],
     "commands": [
       {
-        "command": "marko.showScriptOutput",
-        "title": "Marko: Debug: Show Extracted Script Output"
+        "command": "marko.debug.showScriptOutput",
+        "title": "Show Extracted Script Output",
+        "category": "Marko (Debug)"
       },
       {
-        "command": "marko.showHtmlOutput",
-        "title": "Marko: Debug: Show Extracted Static HTML Output"
+        "command": "marko.debug.showHtmlOutput",
+        "title": "Show Extracted Static HTML Output",
+        "category": "Marko (Debug)"
       },
       {
-        "command": "marko.formatToConciseMode",
-        "title": "Marko: Format: Force Concise Mode"
+        "command": "marko.actions.formatToConciseSyntax",
+        "title": "Format in Concise Mode",
+        "category": "Marko"
       },
       {
-        "command": "marko.formatToHtmlMode",
-        "title": "Marko: Format: Force Html Mode"
+        "command": "marko.actions.formatToHtmlSyntax",
+        "title": "Format in Html Mode",
+        "category": "Marko"
       }
     ],
     "typescriptServerPlugins": [
@@ -107,6 +111,8 @@
     "@types/vscode": "^1.80.0",
     "@vscode/test-electron": "^2.4.1",
     "@vscode/vsce": "^3.2.2",
+    "@volar/language-server": "^2.4.5",
+    "@volar/vscode": "^2.4.5",
     "ovsx": "^0.10.1",
     "tsx": "^4.19.2",
     "vscode-languageclient": "^9.0.1"
diff --git a/packages/vscode/release.mts b/packages/vscode/release.mts
index 17170df7..83509cd5 100644
--- a/packages/vscode/release.mts
+++ b/packages/vscode/release.mts
@@ -15,8 +15,8 @@ await fs.rename(workspacePkg, workspacePkgTmp);
 
 try {
   await exec(
-    "vsce package -o $dist && vsce publish --packagePath $dist && ovsx publish $dist",
-    { env: { ...process.env, dist } }
+    "vsce package -o $dist", // && vsce publish --packagePath $dist && ovsx publish $dist",
+    { env: { ...process.env, dist } },
   );
 } finally {
   await fs.rename(workspacePkgTmp, workspacePkg);
diff --git a/packages/vscode/src/features/debug.ts b/packages/vscode/src/features/debug.ts
new file mode 100644
index 00000000..e4a95ab7
--- /dev/null
+++ b/packages/vscode/src/features/debug.ts
@@ -0,0 +1,83 @@
+import {
+  type BaseLanguageClient,
+  ExecuteCommandParams,
+  ExecuteCommandRequest,
+} from "@volar/vscode";
+import * as vscode from "vscode";
+
+/**
+ * Registers the debug commands for the Marko extension. This is useful if you don't have the Volar Labs
+ * extension installed. Prefer using the Volar Labs extension if you have it installed because it's more
+ * feature-rich.
+ */
+export function register(
+  context: vscode.ExtensionContext,
+  client: BaseLanguageClient,
+) {
+  context.subscriptions.push(
+    vscode.commands.registerCommand(
+      "marko.debug.showScriptOutput",
+      async () => {
+        const editor = vscode.window.activeTextEditor;
+
+        if (!editor) {
+          vscode.window.showErrorMessage(
+            "You must have an open Marko file to view the script output for.",
+          );
+          return;
+        }
+
+        const response = await client.sendRequest(ExecuteCommandRequest.type, {
+          command: "marko.extractScript",
+          arguments: [client.code2ProtocolConverter.asUri(editor.document.uri)],
+        } satisfies ExecuteCommandParams);
+
+        if (response) {
+          await vscode.window.showTextDocument(
+            await vscode.workspace.openTextDocument(response),
+            {
+              preview: true,
+              viewColumn: vscode.ViewColumn.Beside,
+            },
+          );
+        } else {
+          vscode.window.showErrorMessage(
+            "Unable to extract script for Marko document.",
+          );
+        }
+      },
+    ),
+  );
+
+  context.subscriptions.push(
+    vscode.commands.registerCommand("marko.debug.showHtmlOutput", async () => {
+      const editor = vscode.window.activeTextEditor;
+
+      if (!editor) {
+        vscode.window.showErrorMessage(
+          "You must have an open Marko file to view the HTML output for.",
+        );
+        return;
+      }
+
+      const response = await client.sendRequest(ExecuteCommandRequest.type, {
+        command: "marko.extractHtml",
+        arguments: [client.code2ProtocolConverter.asUri(editor.document.uri)],
+      } satisfies ExecuteCommandParams);
+
+      if (response) {
+        await vscode.window.showTextDocument(
+          await vscode.workspace.openTextDocument(response),
+          {
+            preview: true,
+            viewColumn: vscode.ViewColumn.Beside,
+          },
+        );
+      } else {
+        vscode.window.showErrorMessage(
+          "Unable to extract HTML for Marko document.",
+        );
+      }
+    }),
+  );
+}
diff --git a/packages/vscode/src/features/syntax.ts b/packages/vscode/src/features/syntax.ts
new file mode 100644
index 00000000..004025a6
--- /dev/null
+++ b/packages/vscode/src/features/syntax.ts
@@ -0,0 +1,65 @@
+import {
+  type BaseLanguageClient,
+  ExecuteCommandParams,
+  ExecuteCommandRequest,
+  TextEdit,
+} from "@volar/vscode";
+import * as vscode from "vscode";
+
+export function register(
+  context: vscode.ExtensionContext,
+  client: BaseLanguageClient,
+) {
+  context.subscriptions.push(
+    vscode.commands.registerCommand(
+      "marko.actions.formatToConciseSyntax",
+      formatWithSyntax("concise"),
+    ),
+  );
+
+  context.subscriptions.push(
+    vscode.commands.registerCommand(
+      "marko.actions.formatToHtmlSyntax",
+      formatWithSyntax("html"),
+    ),
+  );
+
+  function formatWithSyntax(mode: "concise" | "html") {
+    return async () => {
+      const { activeTextEditor } = vscode.window;
+      if (!activeTextEditor) {
+        vscode.window.showErrorMessage(
+          "No open Marko file detected for formatting",
+        );
+        return;
+      }
+
+      const response: TextEdit[] = await client.sendRequest(
+        ExecuteCommandRequest.type,
+        {
+          command: "marko.formatWithSyntax",
+          arguments: [
+            client.code2ProtocolConverter.asUri(activeTextEditor.document.uri),
+            {
+              markoSyntax: mode,
+            },
+          ],
+        } satisfies ExecuteCommandParams,
+      );
+
+      const edits = await client.protocol2CodeConverter.asTextEdits(response);
+
+      if (edits) {
+        activeTextEditor.edit((editBuilder) => {
+          for (const edit of edits) {
+            editBuilder.replace(edit.range, edit.newText);
+          }
+        });
+      } else {
+        vscode.window.showInformationMessage(
+          "No changes were made to the document",
+        );
+      }
+    };
+  }
+}
diff --git a/packages/vscode/src/index.ts b/packages/vscode/src/index.ts
index 9cdf315b..7709a7ed 100644
--- a/packages/vscode/src/index.ts
+++ b/packages/vscode/src/index.ts
@@ -1,172 +1,73 @@
+import * as serverProtocol from "@volar/language-server/protocol";
 import {
-  commands,
-  type ExtensionContext,
-  Position,
-  Range,
-  TextEdit,
-  ViewColumn,
-  window,
-  workspace,
-  WorkspaceEdit,
-} from "vscode";
-import {
-  LanguageClient,
-  LanguageClientOptions,
-  ServerOptions,
-  TransportKind,
-} from "vscode-languageclient/node";
-
-let client: LanguageClient;
-
-export async function activate(ctx: ExtensionContext) {
-  const module = ctx.asAbsolutePath("dist/server");
-  const transport = TransportKind.ipc;
-  const serverOptions: ServerOptions = {
-    run: { module, transport },
+  LabsInfo,
+  activateAutoInsertion,
+  activateWriteVirtualFiles,
+  createLabsInfo,
+  getTsdk,
+} from "@volar/vscode";
+import * as vscode from "vscode";
+import * as lsp from "vscode-languageclient/node";
+import * as debug from "./features/debug";
+import * as syntax from "./features/syntax";
+
+let client: lsp.BaseLanguageClient;
+
+export async function activate(
+  context: vscode.ExtensionContext,
+): Promise<LabsInfo> {
+  const serverModule = vscode.Uri.joinPath(
+    context.extensionUri,
+    "dist",
+    "server.js",
+  );
+  const runOptions = { execArgv: <string[]>[] };
+  const debugOptions = { execArgv: ["--nolazy", "--inspect=" + 6009] };
+  const serverOptions: lsp.ServerOptions = {
+    run: {
+      module: serverModule.fsPath,
+      transport: lsp.TransportKind.ipc,
+      options: runOptions,
+    },
     debug: {
-      module,
-      transport,
-      options: {
-        execArgv: ["--inspect-brk=6009", "--enable-source-maps"],
-        env: { DEBUG: true },
-      },
+      module: serverModule.fsPath,
+      transport: lsp.TransportKind.ipc,
+      options: debugOptions,
     },
   };
-
-  // Options to control the language client
-  const clientOptions: LanguageClientOptions = {
-    // Register the server for marko text documents
-    documentSelector: [
-      { scheme: "file", language: "marko" },
-      { scheme: "untitled", language: "marko" },
-    ],
-    synchronize: {
-      // Synchronize the setting section 'marko' to the server
-      configurationSection: "marko",
-      fileEvents: workspace.createFileSystemWatcher(
-        "**/{*.ts,*.mts,*.cts,*.js,*.mjs,*.cts,*.marko,marko.json,marko-tag.json,tsconfig.json,jsconfig.json,package.json,package-lock.json,pnpm-lock.yaml,yarn.lock}",
-        false,
-        false,
-        false,
-      ),
+  const tssdk = await getTsdk(context);
+  const initializationOptions = {
+    typescript: {
+      tsdk: tssdk!.tsdk,
     },
   };
-
-  // Create the language client and start the client.
-  client = new LanguageClient("marko", "Marko", serverOptions, clientOptions);
-
-  client.onNotification("showError", window.showErrorMessage);
-  client.onNotification("showWarning", window.showWarningMessage);
-  client.onNotification("showInformation", window.showInformationMessage);
-  client.onNotification("executeCommand", commands.executeCommand);
-
-  ctx.subscriptions.push(
-    commands.registerCommand("marko.showScriptOutput", async () => {
-      if (!window.activeTextEditor) {
-        window.showErrorMessage(
-          "You must have an open Marko file to view the script output for.",
-        );
-        return;
-      }
-
-      const result = await client.sendRequest<
-        { language: string; content: string } | undefined
-      >("$/showScriptOutput", window.activeTextEditor.document.uri.toString());
-
-      if (result) {
-        await window.showTextDocument(
-          await workspace.openTextDocument(result),
-          {
-            preview: true,
-            viewColumn: ViewColumn.Beside,
-          },
-        );
-      } else {
-        window.showErrorMessage("Unable to extract script for Marko document.");
-      }
-    }),
-  );
-
-  ctx.subscriptions.push(
-    commands.registerCommand("marko.showHtmlOutput", async () => {
-      if (!window.activeTextEditor) {
-        window.showErrorMessage(
-          "You must have an open Marko file to view the static HTML output for.",
-        );
-        return;
-      }
-
-      const result = await client.sendRequest<
-        { language: string; content: string } | undefined
-      >("$/showHtmlOutput", window.activeTextEditor.document.uri.toString());
-
-      if (result) {
-        await window.showTextDocument(
-          await workspace.openTextDocument(result),
-          {
-            preview: true,
-            viewColumn: ViewColumn.Beside,
-          },
-        );
-      } else {
-        window.showErrorMessage(
-          "Unable to extract static HTML for Marko document.",
-        );
-      }
-    }),
-  );
-
-  ctx.subscriptions.push(
-    commands.registerCommand("marko.formatToConciseMode", async () => {
-      formatForced("concise");
-    }),
-  );
-
-  ctx.subscriptions.push(
-    commands.registerCommand("marko.formatToHtmlMode", async () => {
-      formatForced("html");
-    }),
+  const clientOptions: lsp.LanguageClientOptions = {
+    documentSelector: [{ language: "marko" }],
+    initializationOptions,
+  };
+  client = new lsp.LanguageClient(
+    "marko",
+    "Marko Language Server",
+    serverOptions,
+    clientOptions,
   );
-
-  // Start the client. This will also launch the server
   await client.start();
-}
-
-export function deactivate(): Thenable<void> | void {
-  if (!client) {
-    return undefined;
-  }
-
-  return client.stop();
-}
 
-async function formatForced(mode: "concise" | "html") {
-  const { activeTextEditor } = window;
-  if (!activeTextEditor) {
-    window.showErrorMessage("No open Marko file detected for formatting");
-    return;
-  }
-  const edits: TextEdit[] = await client.sendRequest("$/formatWithMode", {
-    doc: activeTextEditor.document.uri.toString(),
-    options: {
-      tabSize: activeTextEditor.options.tabSize,
-      insertSpaces: activeTextEditor.options.insertSpaces,
-      mode,
-    },
-  });
+  // support for auto close tag
+  activateAutoInsertion("marko", client);
+  activateWriteVirtualFiles("marko.action.writeVirtualFiles", client);
 
-  const workspaceEdit = new WorkspaceEdit();
+  // Register VSCode features.
+  debug.register(context, client);
+  syntax.register(context, client);
 
-  for (const edit of edits) {
-    workspaceEdit.replace(
-      activeTextEditor.document.uri,
-      new Range(
-        new Position(edit.range.start.line, edit.range.start.character),
-        new Position(edit.range.end.line, edit.range.end.character),
-      ),
-      edit.newText,
-    );
-  }
+  // support for https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volarjs-labs
+  // ref: https://twitter.com/johnsoncodehk/status/1656126976774791168
+  const labsInfo = createLabsInfo(serverProtocol);
+  labsInfo.addLanguageClient(client);
+  return labsInfo.extensionExports;
+}
 
-  await workspace.applyEdit(workspaceEdit);
+export function deactivate(): Thenable<any> | undefined {
+  return client?.stop();
 }