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(); }