diff --git a/package-lock.json b/package-lock.json index f01407a..8182d01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,23 +10,18 @@ "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7", "@socketsecurity/config": "^2.0.0", "@socketsecurity/registry": "^1.0.66", - "@vscode/vsce": "^2.20.1", - "acorn-walk": "^8.2.0", - "antlr4": "^4.13.0", - "ast-types": "^0.14.2", - "form-data-encoder": "^3.0.0", - "formdata-node": "^5.0.1", + "@vscode/python-extension": "^1.0.5", + "@vscode/vsce": "^3.6.0", "ini": "^3.0.1", "json-to-ast": "^2.1.0", - "micromatch": "^4.0.8", - "octokit": "^3.1.2", - "safe-stable-stringify": "^2.4.1", - "semver": "^7.5.2", - "yaml": "^2.2.2" + "octokit": "^3.1.2" }, "devDependencies": { + "@types/babel__traverse": "^7.20.7", "@types/ini": "^1.3.31", "@types/json-to-ast": "^2.1.2", "@types/micromatch": "^4.0.2", @@ -53,38 +48,41 @@ "grapheme-splitter": "^1.0.4" } }, - "node_modules/@azure/abort-controller": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", - "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", - "license": "MIT", + "node_modules/@azu/format-text": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz", + "integrity": "sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==", + "license": "BSD-3-Clause" + }, + "node_modules/@azu/style-format": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azu/style-format/-/style-format-1.0.1.tgz", + "integrity": "sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==", + "license": "WTFPL", "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" + "@azu/format-text": "^1.0.1" } }, - "node_modules/@azure/core-auth": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.8.0.tgz", - "integrity": "sha512-YvFMowkXzLbXNM11yZtVLhUCmuG0ex7JKOH366ipjmHBhL3vpDcPAeWF+jf0X+jVXwFqo3UhsWUq4kH0ZPdu/g==", + "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==", "license": "MIT", "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-util": "^1.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@azure/core-auth/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==", + "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==", "license": "MIT", "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-util": "^1.11.0", "tslib": "^2.6.2" }, "engines": { @@ -92,14 +90,14 @@ } }, "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==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.4.tgz", + "integrity": "sha512-f7IxTD15Qdux30s2qFARH+JxgwxWLG2Rlr4oSkPGuLWm+1p5y1+C04XGLA0vmX6EtqfutmjvpNmAfgwVIS5hpw==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.4.0", - "@azure/core-rest-pipeline": "^1.9.1", + "@azure/core-rest-pipeline": "^1.20.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", @@ -109,43 +107,18 @@ "node": ">=18.0.0" } }, - "node_modules/@azure/core-client/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==", - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.17.0.tgz", - "integrity": "sha512-62Vv8nC+uPId3j86XJ0WI+sBf0jlqTqPUFCBNrGtlaUeQUIXWV/D8GE5A1d+Qx8H7OQojn2WguC8kChD6v0shA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.21.0.tgz", + "integrity": "sha512-a4MBwe/5WKbq9MIxikzgxLBbruC5qlkFYlBdI7Ev50Y7ib5Vo/Jvt5jnJo7NaWeJ908LCHL0S1Us4UMf1VoTfg==", "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.9.0", + "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline/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==", - "license": "MIT", - "dependencies": { + "@typespec/ts-http-runtime": "^0.2.3", "tslib": "^2.6.2" }, "engines": { @@ -153,9 +126,9 @@ } }, "node_modules/@azure/core-tracing": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.2.tgz", - "integrity": "sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz", + "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", "license": "MIT", "dependencies": { "tslib": "^2.6.2" @@ -165,24 +138,13 @@ } }, "node_modules/@azure/core-util": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.10.0.tgz", - "integrity": "sha512-dqLWQsh9Nro1YQU+405POVtXnwrIVqPyfUzc4zXCbThTg7+vNNaiMkwbX9AMXKyoFYFClxmB3s25ZFr3+jZkww==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.12.0.tgz", + "integrity": "sha512-13IyjTQgABPARvG90+N2dXpC+hwp466XCdQXPCRlbWHgd3SJd5Q1VvaBGv6k1BIa4MQm6hAF1UBU1m8QUxV8sQ==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-util/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==", - "license": "MIT", - "dependencies": { + "@typespec/ts-http-runtime": "^0.2.2", "tslib": "^2.6.2" }, "engines": { @@ -190,24 +152,21 @@ } }, "node_modules/@azure/identity": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.4.1.tgz", - "integrity": "sha512-DwnG4cKFEM7S3T+9u05NstXU/HN0dk45kPOinUyNKsn5VWwpXd9sbPKEg6kgJzGbm1lMuhx9o31PVbCtM5sfBA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.10.1.tgz", + "integrity": "sha512-YM/z6RxRtFlXUH2egAYF/FDPes+MUE6ZoknjEdaq7ebJMMNUzn9zCJ3bd2ZZZlkP0r1xKa88kolhFH/FGV7JnA==", "license": "MIT", "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.5.0", + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", "@azure/core-client": "^1.9.2", - "@azure/core-rest-pipeline": "^1.1.0", + "@azure/core-rest-pipeline": "^1.17.0", "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.3.0", + "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^3.14.0", - "@azure/msal-node": "^2.9.2", - "events": "^3.0.0", - "jws": "^4.0.0", - "open": "^8.0.0", - "stoppable": "^1.1.0", + "@azure/msal-browser": "^4.2.0", + "@azure/msal-node": "^3.5.0", + "open": "^10.1.0", "tslib": "^2.2.0" }, "engines": { @@ -215,11 +174,12 @@ } }, "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==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.2.0.tgz", + "integrity": "sha512-0hKEzLhpw+ZTAfNJyRrn6s+V0nDWzXk9OjBr2TiGIu0OfMr5s2V4FpKLTAK3Ca5r5OKLbf4hkOGDPyiRjie/jA==", "license": "MIT", "dependencies": { + "@typespec/ts-http-runtime": "^0.2.2", "tslib": "^2.6.2" }, "engines": { @@ -227,33 +187,33 @@ } }, "node_modules/@azure/msal-browser": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.24.0.tgz", - "integrity": "sha512-JGNV9hTYAa7lsum9IMIibn2kKczAojNihGo1hi7pG0kNrcKej530Fl6jxwM05A44/6I079CSn6WxYxbVhKUmWg==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.13.2.tgz", + "integrity": "sha512-lS75bF6FYZRwsacKLXc8UYu/jb+gOB7dtZq5938chCvV/zKTFDnzuXxCXhsSUh0p8s/P8ztgbfdueD9lFARQlQ==", "license": "MIT", "dependencies": { - "@azure/msal-common": "14.15.0" + "@azure/msal-common": "15.7.1" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "14.15.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.15.0.tgz", - "integrity": "sha512-ImAQHxmpMneJ/4S8BRFhjt1MZ3bppmpRPYYNyzeQPeFN288YKbb8TmmISQEbtfkQ1BPASvYZU5doIZOPBAqENQ==", + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.7.1.tgz", + "integrity": "sha512-a0eowoYfRfKZEjbiCoA5bPT3IlWRAdGSvi63OU23Hv+X6EI8gbvXCoeqokUceFMoT9NfRUWTJSx5FiuzruqT8g==", "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.14.0.tgz", - "integrity": "sha512-rrfzIpG3Q1rHjVYZmHAEDidWAZZ2cgkxlIcMQ8dHebRISaZ2KCV33Q8Vs+uaV6lxweROabNxKFlR2lIKagZqYg==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.6.1.tgz", + "integrity": "sha512-ctcVz4xS+st5KxOlQqgpvA+uDFAa59CvkmumnuhlD2XmNczloKBdCiMQG7/TigSlaeHe01qoOlDjz3TyUAmKUg==", "license": "MIT", "dependencies": { - "@azure/msal-common": "14.15.0", + "@azure/msal-common": "15.7.1", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, @@ -261,31 +221,61 @@ "node": ">=16" } }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -294,15 +284,46 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -683,25 +704,28 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "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": { @@ -749,6 +773,22 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -804,131 +844,34 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/@inquirer/core": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.1.tgz", - "integrity": "sha512-rmZVXy9iZvO3ZStEe/ayuuwIJ23LSF13aPMlLMTQARX6lGUBDHGV8UB5i9MRrfy0+mZwt5/9bdy8llszSD3NQA==", - "license": "MIT", - "dependencies": { - "@inquirer/figures": "^1.0.8", - "@inquirer/type": "^3.0.1", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/core/node_modules/@inquirer/type": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.1.tgz", - "integrity": "sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==", + "node_modules/@inquirer/figures": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.12.tgz", + "integrity": "sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==", "license": "MIT", "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - } - }, - "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@inquirer/core/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==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@inquirer/core/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==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@inquirer/core/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==", - "license": "MIT" - }, - "node_modules/@inquirer/core/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==", - "license": "MIT" - }, - "node_modules/@inquirer/core/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@inquirer/core/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==", + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": "20 || >=22" } }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@isaacs/balanced-match": "^4.0.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", - "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", - "license": "MIT", - "engines": { - "node": ">=18" + "node": "20 || >=22" } }, "node_modules/@isaacs/cliui": { @@ -993,6 +936,54 @@ "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", "license": "ISC" }, + "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", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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" + } + }, + "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" + } + }, + "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", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1051,9 +1042,9 @@ "license": "ISC" }, "node_modules/@npmcli/arborist": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-9.0.0.tgz", - "integrity": "sha512-ZFsI/VJ7wJ2rTksLNJ9xqr75Ste/wiKvW+7w12ZGbcT67xWii97yS+aDlh3edNhqlqoXvdzYG4hTNui81VxJCA==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-9.1.2.tgz", + "integrity": "sha512-KIuQc8TuMTcL8OTVmOTdVIXmkDFFOHmVlVd94N9wwHjuOA2ZyNsoJPS50Q/irdkS3LF/9BiIcxSIV/ukSjqO6g==", "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", @@ -1099,18 +1090,18 @@ } }, "node_modules/@npmcli/arborist/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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@npmcli/arborist/node_modules/hosted-git-info": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" @@ -1153,9 +1144,9 @@ } }, "node_modules/@npmcli/git": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.1.tgz", - "integrity": "sha512-BBWMMxeQzalmKadyimwb2/VVQyJB01PH0HhVSNLHNBDZN/M/h/02P6f8fxedIiFhpMj11SO9Ep5tKTBE7zL2nw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", + "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^8.0.0", @@ -1163,7 +1154,6 @@ "lru-cache": "^10.0.1", "npm-pick-manifest": "^10.0.0", "proc-log": "^5.0.0", - "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^5.0.0" @@ -1243,9 +1233,9 @@ } }, "node_modules/@npmcli/map-workspaces/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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -1321,27 +1311,27 @@ } }, "node_modules/@npmcli/package-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz", - "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", + "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", "license": "ISC", "dependencies": { "@npmcli/git": "^6.0.0", "glob": "^10.2.2", "hosted-git-info": "^8.0.0", "json-parse-even-better-errors": "^4.0.0", - "normalize-package-data": "^7.0.0", "proc-log": "^5.0.0", - "semver": "^7.5.3" + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" }, "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/package-json/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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -1368,9 +1358,9 @@ } }, "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" @@ -1437,30 +1427,30 @@ } }, "node_modules/@npmcli/query": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-4.0.0.tgz", - "integrity": "sha512-3pPbese0fbCiFJ/7/X1GBgxAKYFE8sxBddA7GtuRmOgNseH4YbGsXJ807Ig3AEwNITjDUISHglvy89cyDJnAwA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-4.0.1.tgz", + "integrity": "sha512-4OIPFb4weUUwkDXJf4Hh1inAn8neBGq3xsH4ZsAaN6FK3ldrFkH7jSpCc7N9xesi0Sp+EBXJ9eGMDrEww2Ztqw==", "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.1.2" + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/redact": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz", - "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", + "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@npmcli/run-script": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.0.2.tgz", - "integrity": "sha512-cJXiUlycdizQwvqE1iaAb4VRUM3RX09/8q46zjvy+ct9GhfZRWd7jXYVc1tn/CfRlGPVkX/u4sstRlepsm7hfw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", + "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^4.0.0", @@ -1523,9 +1513,9 @@ "license": "MIT" }, "node_modules/@octokit/app/node_modules/@octokit/plugin-paginate-rest": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz", - "integrity": "sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz", + "integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==", "license": "MIT", "dependencies": { "@octokit/types": "^12.6.0" @@ -1547,9 +1537,9 @@ } }, "node_modules/@octokit/auth-app": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-6.1.2.tgz", - "integrity": "sha512-fWjIOpxnL8/YFY3kqquciFQ4o99aCqHw5kMFoGPYbz/h5HNZ11dJlV9zag5wS2nt0X1wJ5cs9BUo+CsAPfW4jQ==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-6.1.3.tgz", + "integrity": "sha512-dcaiteA6Y/beAlDLZOPNReN3FGHu+pARD6OHfh3T9f3EO09++ec+5wt3KtGGSSs2Mp5tI8fQwdMOEnrzBLfgUA==", "license": "MIT", "dependencies": { "@octokit/auth-oauth-app": "^7.1.0", @@ -1558,7 +1548,7 @@ "@octokit/request-error": "^5.1.0", "@octokit/types": "^13.1.0", "deprecation": "^2.3.1", - "lru-cache": "^10.0.0", + "lru-cache": "npm:@wolfy1339/lru-cache@^11.0.2-patch.1", "universal-github-app-jwt": "^1.1.2", "universal-user-agent": "^6.0.0" }, @@ -1567,10 +1557,14 @@ } }, "node_modules/@octokit/auth-app/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" + "name": "@wolfy1339/lru-cache", + "version": "11.0.2-patch.1", + "resolved": "https://registry.npmjs.org/@wolfy1339/lru-cache/-/lru-cache-11.0.2-patch.1.tgz", + "integrity": "sha512-BgYZfL2ADCXKOw2wJtkM3slhHotawWkgIRRxq4wEybnZQPjvAp71SPX35xepMykTw8gXlzWcWPTY31hlbnRsDA==", + "license": "ISC", + "engines": { + "node": "18 >=18.20 || 20 || >=22" + } }, "node_modules/@octokit/auth-oauth-app": { "version": "7.1.0", @@ -1660,15 +1654,15 @@ } }, "node_modules/@octokit/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz", - "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.1.tgz", + "integrity": "sha512-dKYCMuPO1bmrpuogcjQ8z7ICCH3FP6WmxpwC03yjzGfZhj9fTJg6+bS1+UAplekbN2C+M61UNllGOOoAfGCrdQ==", "license": "MIT", "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", - "@octokit/request": "^8.3.1", - "@octokit/request-error": "^5.1.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", "@octokit/types": "^13.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" @@ -1678,9 +1672,9 @@ } }, "node_modules/@octokit/endpoint": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", - "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", + "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", @@ -1691,12 +1685,12 @@ } }, "node_modules/@octokit/graphql": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz", - "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", + "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", "license": "MIT", "dependencies": { - "@octokit/request": "^8.3.0", + "@octokit/request": "^8.4.1", "@octokit/types": "^13.0.0", "universal-user-agent": "^6.0.0" }, @@ -1749,9 +1743,9 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", "license": "MIT" }, "node_modules/@octokit/plugin-paginate-graphql": { @@ -1767,12 +1761,12 @@ } }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz", - "integrity": "sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==", + "version": "11.4.4-cjs.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.4-cjs.2.tgz", + "integrity": "sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==", "license": "MIT", "dependencies": { - "@octokit/types": "^13.5.0" + "@octokit/types": "^13.7.0" }, "engines": { "node": ">= 18" @@ -1782,12 +1776,12 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz", - "integrity": "sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==", + "version": "13.3.2-cjs.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.2-cjs.1.tgz", + "integrity": "sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==", "license": "MIT", "dependencies": { - "@octokit/types": "^13.5.0" + "@octokit/types": "^13.8.0" }, "engines": { "node": ">= 18" @@ -1797,35 +1791,20 @@ } }, "node_modules/@octokit/plugin-retry": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-6.0.1.tgz", - "integrity": "sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-6.1.0.tgz", + "integrity": "sha512-WrO3bvq4E1Xh1r2mT9w6SDFg01gFmP81nIG77+p/MqW1JeXXgL++6umim3t6x0Zj5pZm3rXAN+0HEjmmdhIRig==", "license": "MIT", "dependencies": { "@octokit/request-error": "^5.0.0", - "@octokit/types": "^12.0.0", + "@octokit/types": "^13.0.0", "bottleneck": "^2.15.3" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=5" - } - }, - "node_modules/@octokit/plugin-retry/node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-retry/node_modules/@octokit/types": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^20.0.0" + "@octokit/core": "5" } }, "node_modules/@octokit/plugin-throttling": { @@ -1860,13 +1839,13 @@ } }, "node_modules/@octokit/request": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", - "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", + "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", "license": "MIT", "dependencies": { - "@octokit/endpoint": "^9.0.1", - "@octokit/request-error": "^5.1.0", + "@octokit/endpoint": "^9.0.6", + "@octokit/request-error": "^5.1.1", "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" }, @@ -1875,9 +1854,9 @@ } }, "node_modules/@octokit/request-error": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", - "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", @@ -1889,23 +1868,23 @@ } }, "node_modules/@octokit/types": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.0.tgz", - "integrity": "sha512-CrooV/vKCXqwLa+osmHLIMUb87brpgUqlqkPGc6iE2wCkUvTrHiXFMhAKoDDaAAYJrtKtrFTgSQTg5nObBEaew==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^22.2.0" + "@octokit/openapi-types": "^24.2.0" } }, "node_modules/@octokit/webhooks": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-12.2.0.tgz", - "integrity": "sha512-CyuLJ0/P7bKZ+kIYw+fnkeVdhUzNuDKgNSI7pU/m7Nod0T7kP+s4s2f0pNmG9HL8/RZN1S0ZWTDll3VTMrFLAw==", + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-12.3.1.tgz", + "integrity": "sha512-BVwtWE3rRXB9IugmQTfKspqjNa8q+ab73ddkV9k1Zok3XbuOxJUi4lTYk5zBZDhfWb/Y2H+RO9Iggm25gsqeow==", "license": "MIT", "dependencies": { "@octokit/request-error": "^5.0.0", "@octokit/webhooks-methods": "^4.1.0", - "@octokit/webhooks-types": "7.4.0", + "@octokit/webhooks-types": "7.6.1", "aggregate-error": "^3.1.0" }, "engines": { @@ -1922,9 +1901,9 @@ } }, "node_modules/@octokit/webhooks-types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-7.4.0.tgz", - "integrity": "sha512-FE2V+QZ2UYlh+9wWd5BPLNXG+J/XUD/PPq0ovS+nCcGX4+3qVbi3jYOmCTW48hg9SBBLtInx9+o7fFt4H5iP0Q==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-7.6.1.tgz", + "integrity": "sha512-S8u2cJzklBC0FgTwWVLaM8tMrDuDMVE4xiTK4EYXM9GntyvrdbSoxqDQa+Fh57CCNApyIpyeqPhhFEmHPfrXgw==", "license": "MIT" }, "node_modules/@pkgjs/parseargs": { @@ -1937,13 +1916,201 @@ "node": ">=14" } }, + "node_modules/@secretlint/config-creator": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@secretlint/config-creator/-/config-creator-10.2.1.tgz", + "integrity": "sha512-nyuRy8uo2+mXPIRLJ93wizD1HbcdDIsVfgCT01p/zGVFrtvmiL7wqsl4KgZH0QFBM/KRLDLeog3/eaM5ASjtvw==", + "license": "MIT", + "dependencies": { + "@secretlint/types": "^10.2.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/config-loader": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@secretlint/config-loader/-/config-loader-10.2.1.tgz", + "integrity": "sha512-ob1PwhuSw/Hc6Y4TA63NWj6o++rZTRJOwPZG82o6tgEURqkrAN44fXH9GIouLsOxKa8fbCRLMeGmSBtJLdSqtw==", + "license": "MIT", + "dependencies": { + "@secretlint/profiler": "^10.2.1", + "@secretlint/resolver": "^10.2.1", + "@secretlint/types": "^10.2.1", + "ajv": "^8.17.1", + "debug": "^4.4.1", + "rc-config-loader": "^4.1.3" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/core": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-10.2.1.tgz", + "integrity": "sha512-2sPp5IE7pM5Q+f1/NK6nJ49FKuqh+e3fZq5MVbtVjegiD4NMhjcoML1Cg7atCBgXPufhXRHY1DWhIhkGzOx/cw==", + "license": "MIT", + "dependencies": { + "@secretlint/profiler": "^10.2.1", + "@secretlint/types": "^10.2.1", + "debug": "^4.4.1", + "structured-source": "^4.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/formatter": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@secretlint/formatter/-/formatter-10.2.1.tgz", + "integrity": "sha512-0A7ho3j0Y4ysK0mREB3O6FKQtScD4rQgfzuI4Slv9Cut1ynQOI7JXAoIFm4XVzhNcgtmEPeD3pQB206VFphBgQ==", + "license": "MIT", + "dependencies": { + "@secretlint/resolver": "^10.2.1", + "@secretlint/types": "^10.2.1", + "@textlint/linter-formatter": "^15.2.0", + "@textlint/module-interop": "^15.2.0", + "@textlint/types": "^15.2.0", + "chalk": "^5.4.1", + "debug": "^4.4.1", + "pluralize": "^8.0.0", + "strip-ansi": "^7.1.0", + "table": "^6.9.0", + "terminal-link": "^4.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/formatter/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@secretlint/formatter/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@secretlint/formatter/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@secretlint/node": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@secretlint/node/-/node-10.2.1.tgz", + "integrity": "sha512-MQFte7C+5ZHINQGSo6+eUECcUCGvKR9PVgZcTsRj524xsbpeBqF1q1dHsUsdGb9r2jlvf40Q14MRZwMcpmLXWQ==", + "license": "MIT", + "dependencies": { + "@secretlint/config-loader": "^10.2.1", + "@secretlint/core": "^10.2.1", + "@secretlint/formatter": "^10.2.1", + "@secretlint/profiler": "^10.2.1", + "@secretlint/source-creator": "^10.2.1", + "@secretlint/types": "^10.2.1", + "debug": "^4.4.1", + "p-map": "^7.0.3" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/profiler": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-10.2.1.tgz", + "integrity": "sha512-gOlfPZ1ASc5mP5cqsL809uMJGp85t+AJZg1ZPscWvB/m5UFFgeNTZcOawggb1S5ExDvR388sIJxagx5hyDZ34g==", + "license": "MIT" + }, + "node_modules/@secretlint/resolver": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@secretlint/resolver/-/resolver-10.2.1.tgz", + "integrity": "sha512-AuwehKwnE2uxKaJVv2Z5a8FzGezBmlNhtLKm70Cvsvtwd0oAtenxCSTKXkiPGYC0+S91fAw3lrX7CUkyr9cTCA==", + "license": "MIT" + }, + "node_modules/@secretlint/secretlint-formatter-sarif": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-formatter-sarif/-/secretlint-formatter-sarif-10.2.1.tgz", + "integrity": "sha512-qOZUYBesLkhCBP7YVMv0l1Pypt8e3V2rX2PT2Q5aJhJvKTcMiP9YTHG/3H9Zb7Gq3UIwZLEAGXRqJOu1XlE0Fg==", + "license": "MIT", + "dependencies": { + "node-sarif-builder": "^3.2.0" + } + }, + "node_modules/@secretlint/secretlint-rule-no-dotenv": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-no-dotenv/-/secretlint-rule-no-dotenv-10.2.1.tgz", + "integrity": "sha512-XwPjc9Wwe2QljerfvGlBmLJAJVATLvoXXw1fnKyCDNgvY33cu1Z561Kxg93xfRB5LSep0S5hQrAfZRJw6x7MBQ==", + "license": "MIT", + "dependencies": { + "@secretlint/types": "^10.2.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/secretlint-rule-preset-recommend": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-10.2.1.tgz", + "integrity": "sha512-/kj3UOpFbJt80dqoeEaUVv5nbeW1jPqPExA447FItthiybnaDse5C5HYcfNA2ywEInr399ELdcmpEMRe+ld1iQ==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/source-creator": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@secretlint/source-creator/-/source-creator-10.2.1.tgz", + "integrity": "sha512-1CgO+hsRx8KdA5R/LEMNTJkujjomwSQQVV0BcuKynpOefV/rRlIDVQJOU0tJOZdqUMC15oAAwQXs9tMwWLu4JQ==", + "license": "MIT", + "dependencies": { + "@secretlint/types": "^10.2.1", + "istextorbinary": "^9.5.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/types": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-10.2.1.tgz", + "integrity": "sha512-F5k1qpoMoUe7rrZossOBgJ3jWKv/FGDBZIwepqnefgPmNienBdInxhtZeXiGwjcxXHVhsdgp6I5Fi/M8PMgwcw==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@sigstore/bundle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz", - "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", + "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==", "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -1959,24 +2126,24 @@ } }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz", + "integrity": "sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==", "license": "Apache-2.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz", - "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz", + "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==", "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^14.0.1", + "@sigstore/protobuf-specs": "^0.4.0", + "make-fetch-happen": "^14.0.2", "proc-log": "^5.0.0", "promise-retry": "^2.0.1" }, @@ -1985,12 +2152,12 @@ } }, "node_modules/@sigstore/tuf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz", - "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz", + "integrity": "sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==", "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/protobuf-specs": "^0.4.1", "tuf-js": "^3.0.1" }, "engines": { @@ -1998,14 +2165,14 @@ } }, "node_modules/@sigstore/verify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz", - "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz", + "integrity": "sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==", "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2" + "@sigstore/protobuf-specs": "^0.4.1" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -2024,25 +2191,37 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@socketregistry/packageurl-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@socketregistry/packageurl-js/-/packageurl-js-1.0.1.tgz", - "integrity": "sha512-mTO1b/IhYymHmJ94kWLURT+D8GErUmvIXL/+GUm8eeaPie8SjshYCKLiWf+aUZzYJwCf+BmbRlYYmX21383WXg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@socketregistry/packageurl-js/-/packageurl-js-1.0.8.tgz", + "integrity": "sha512-eZkWrz7aufcZ2BQnS9VvMuRiDRXjV1P1mWAlidv9aJJ4qzfWnjUE/bRZvMSTxPrCW4gK9LupJt5KN0ir/7IMmQ==", "license": "MIT", "engines": { - "node": ">=18.20.4" + "node": ">=18" } }, "node_modules/@socketregistry/yocto-spinner": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socketregistry/yocto-spinner/-/yocto-spinner-1.0.2.tgz", - "integrity": "sha512-P7N3M1hVqiCFvy2+SThjnXs7jzckWdaQJTq+wyIlze7wsQ5Q5Af6UrfCcSW7Ct5ov4rkDBIAwVFLHaL2TB+WOA==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/@socketregistry/yocto-spinner/-/yocto-spinner-1.0.19.tgz", + "integrity": "sha512-O2AQ1AsltIXuNScFt++WfLwpR47sH5jmaDXDg4N7xudrkl7zdfXccUyQpb/CorTi1Lkp022VJjGABg1m4cagBQ==", "license": "MIT", "dependencies": { "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=18.20.4" + "node": ">=18.20.8" } }, "node_modules/@socketsecurity/config": { @@ -2098,45 +2277,82 @@ } }, "node_modules/@socketsecurity/registry/node_modules/@inquirer/confirm": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.0.tgz", - "integrity": "sha512-osaBbIMEqVFjTX5exoqPXs6PilWQdjaLhGtMDXMXg/yxkHXNq43GlxGyTA35lK2HpzUgDN+Cjh/2AmqCN0QJpw==", + "version": "5.1.12", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.12.tgz", + "integrity": "sha512-dpq+ielV9/bqgXRUbNH//KsY6WEw9DrGPmipkpmgC1Y46cwuBTNx7PXFWTjc3MQ+urcc0QxoVHcMI0FW4Ok0hg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@socketsecurity/registry/node_modules/@inquirer/core": { + "version": "10.1.13", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.13.tgz", + "integrity": "sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==", "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.1", - "@inquirer/type": "^3.0.1" + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@socketsecurity/registry/node_modules/@inquirer/input": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.0.tgz", - "integrity": "sha512-16B8A9hY741yGXzd8UJ9R8su/fuuyO2e+idd7oVLYjP23wKJ6ILRIIHcnXe8/6AoYgwRS2zp4PNsW/u/iZ24yg==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.12.tgz", + "integrity": "sha512-xJ6PFZpDjC+tC1P8ImGprgcsrzQRsUh9aH3IZixm1lAZFK49UGHxM3ltFfuInN2kPYNfyoPRh+tU4ftsjPLKqQ==", "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.1", - "@inquirer/type": "^3.0.1" + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@socketsecurity/registry/node_modules/@inquirer/password": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.3.tgz", - "integrity": "sha512-3qWjk6hS0iabG9xx0U1plwQLDBc/HA/hWzLFFatADpR6XfE62LqPr9GpFXBkLU0KQUaIXZ996bNG+2yUvocH8w==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.15.tgz", + "integrity": "sha512-75CT2p43DGEnfGTaqFpbDC2p2EEMrq0S+IRrf9iJvYreMy5mAWj087+mdKyLHapUEPLjN10mNvABpGbk8Wdraw==", "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.1", - "@inquirer/type": "^3.0.1", + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7", "ansi-escapes": "^4.3.2" }, "engines": { @@ -2144,17 +2360,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@socketsecurity/registry/node_modules/@inquirer/search": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.3.tgz", - "integrity": "sha512-mQTCbdNolTGvGGVCJSI6afDwiSGTV+fMLPEIMDJgIV6L/s3+RYRpxt6t0DYnqMQmemnZ/Zq0vTIRwoHT1RgcTg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.15.tgz", + "integrity": "sha512-YBMwPxYBrADqyvP4nNItpwkBnGGglAvCLVW8u4pRmmvOsHUtCAUIMbUrLX5B3tFL1/WsLGdQ2HNzkqswMs5Uaw==", "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.1", - "@inquirer/figures": "^1.0.8", - "@inquirer/type": "^3.0.1", + "@inquirer/core": "^10.1.13", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -2162,17 +2383,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@socketsecurity/registry/node_modules/@inquirer/select": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.3.tgz", - "integrity": "sha512-OZfKDtDE8+J54JYAFTUGZwvKNfC7W/gFCjDkcsO7HnTH/wljsZo9y/FJquOxMy++DY0+9l9o/MOZ8s5s1j5wmw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.3.tgz", + "integrity": "sha512-OAGhXU0Cvh0PhLz9xTF/kx6g6x+sP+PcyTiLvCrewI99P3BBeexD+VbuwkNDvqGkk3y2h5ZiWLeRP7BFlhkUDg==", "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.1", - "@inquirer/figures": "^1.0.8", - "@inquirer/type": "^3.0.1", + "@inquirer/core": "^10.1.13", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -2181,30 +2407,47 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@socketsecurity/registry/node_modules/@inquirer/type": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.1.tgz", - "integrity": "sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.7.tgz", + "integrity": "sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==", "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@socketsecurity/registry/node_modules/@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "version": "24.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", + "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", "license": "MIT", + "optional": true, "peer": true, "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~7.8.0" } }, + "node_modules/@socketsecurity/registry/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==", + "license": "MIT" + }, "node_modules/@socketsecurity/registry/node_modules/isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", @@ -2214,6 +2457,15 @@ "node": ">=16" } }, + "node_modules/@socketsecurity/registry/node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/@socketsecurity/registry/node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", @@ -2226,6 +2478,20 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/@socketsecurity/registry/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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@socketsecurity/registry/node_modules/which": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", @@ -2241,6 +2507,20 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/@socketsecurity/registry/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -2254,18 +2534,121 @@ "node": ">=10" } }, - "node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", - "license": "MIT", - "engines": { - "node": "^16.14.0 || >=18.0.0" + "node_modules/@textlint/ast-node-types": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.2.0.tgz", + "integrity": "sha512-nr9wEiZCNYafGZ++uWFZgPlDX3Bi7u4T2d5swpaoMvc1G2toXsBfe7UNVwXZq5dvYDbQN7vDeb3ltlKQ8JnPNQ==", + "license": "MIT" + }, + "node_modules/@textlint/linter-formatter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.2.0.tgz", + "integrity": "sha512-L+fM2OTs17hRxPCLKUdPjHce7cJp81gV9ku53FCL+cXnq5bZx0XYYkqKdtC0jnXujkQmrTYU3SYFrb4DgXqbtA==", + "license": "MIT", + "dependencies": { + "@azu/format-text": "^1.0.2", + "@azu/style-format": "^1.0.1", + "@textlint/module-interop": "15.2.0", + "@textlint/resolver": "15.2.0", + "@textlint/types": "15.2.0", + "chalk": "^4.1.2", + "debug": "^4.4.1", + "js-yaml": "^3.14.1", + "lodash": "^4.17.21", + "pluralize": "^2.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "table": "^6.9.0", + "text-table": "^0.2.0" } }, - "node_modules/@tufjs/models": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", + "node_modules/@textlint/linter-formatter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@textlint/linter-formatter/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==", + "license": "MIT" + }, + "node_modules/@textlint/linter-formatter/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==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@textlint/linter-formatter/node_modules/pluralize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-2.0.0.tgz", + "integrity": "sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==", + "license": "MIT" + }, + "node_modules/@textlint/linter-formatter/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/@textlint/linter-formatter/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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@textlint/module-interop": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.2.0.tgz", + "integrity": "sha512-M3y1s2dZZH8PSHo4RUlnPOdK3qN90wmYGaEdy+il9/BQfrrift7S9R8lOfhHoPS0m9FEsnwyj3dQLkCUugPd9Q==", + "license": "MIT" + }, + "node_modules/@textlint/resolver": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.2.0.tgz", + "integrity": "sha512-1UC+5bEtuoht7uu0uGofb7sX7j17Mvyst9InrRtI4XgKhh1uMZz5YFiMYpNwry1GgCZvq7Wyq1fqtEIsvYWqFw==", + "license": "MIT" + }, + "node_modules/@textlint/types": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.2.0.tgz", + "integrity": "sha512-wpF+xjGJgJK2JiwUdYjuNZrbuas3KfC9VDnHKac6aBLFyrI1iXuXtuxKXQDFi5/hebACactSJOuVVbuQbdJZ1Q==", + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "15.2.0" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz", "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==", "license": "MIT", "dependencies": { @@ -2277,9 +2660,9 @@ } }, "node_modules/@tufjs/models/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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -2301,15 +2684,25 @@ } }, "node_modules/@types/aws-lambda": { - "version": "8.10.145", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.145.tgz", - "integrity": "sha512-dtByW6WiFk5W5Jfgz1VM+YPA21xMXTuSFoLYIDY0L44jDLLflVPtZkYuu3/YxpGcvjzKFBZLU+GyKjR0HOYtyw==", + "version": "8.10.150", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.150.tgz", + "integrity": "sha512-AX+AbjH/rH5ezX1fbK8onC/a+HyQHo7QGmvoxAE42n22OsciAxvZoZNEr22tbXs8WfP1nIsBjKDpgPm3HjOZbA==", "license": "MIT" }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, "node_modules/@types/braces": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.4.tgz", - "integrity": "sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.5.tgz", + "integrity": "sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w==", "dev": true, "license": "MIT" }, @@ -2333,9 +2726,9 @@ } }, "node_modules/@types/emscripten": { - "version": "1.39.13", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz", - "integrity": "sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==", + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.40.1.tgz", + "integrity": "sha512-sr53lnYkQNhjHNN0oJDdUm5564biioI5DuOpycufDVK7D3y+GR3oUswe2rlwY1nPNyusHbrJ9WoTyIHl4/Bpwg==", "license": "MIT", "peer": true }, @@ -2368,11 +2761,12 @@ "license": "MIT" }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", - "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", "license": "MIT", "dependencies": { + "@types/ms": "*", "@types/node": "*" } }, @@ -2396,10 +2790,22 @@ "@types/braces": "*" } }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, "node_modules/@types/node": { - "version": "16.18.112", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.112.tgz", - "integrity": "sha512-EKrbKUGJROm17+dY/gMi31aJlGLJ75e1IkTojt9n6u+hnaTBDs+M1bIdOawpk2m6YUAXq/R2W0SxCng1tndHCg==", + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", + "license": "MIT" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "license": "MIT" }, "node_modules/@types/responselike": { @@ -2412,10 +2818,16 @@ "@types/node": "*" } }, + "node_modules/@types/sarif": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", + "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", + "license": "MIT" + }, "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", "license": "MIT" }, "node_modules/@types/treeify": { @@ -2426,9 +2838,9 @@ "peer": true }, "node_modules/@types/vscode": { - "version": "1.93.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.93.0.tgz", - "integrity": "sha512-kUK6jAHSR5zY8ps42xuW89NLcBpw1kOabah7yv38J8MyiYuOHxLQBi0e7zeXbQgVefDy/mZZetqEFC+Fl5eIEQ==", + "version": "1.101.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.101.0.tgz", + "integrity": "sha512-ZWf0IWa+NGegdW3iU42AcDTFHWW7fApLdkdnBqwYEtHVIBGbTu0ZNQKP/kX3Ds/uMJXIMQNAojHR4vexCEEz5Q==", "dev": true, "license": "MIT" }, @@ -2628,38 +3040,67 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.2.3.tgz", + "integrity": "sha512-oRhjSzcVjX8ExyaF8hC0zzTqxlVuRlgMHL/Bh4w3xB9+wjbm0FpXylVU/lBrn+kgphwYTrOk3tp+AVShGmlYCg==", + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, "license": "ISC" }, + "node_modules/@vscode/python-extension": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@vscode/python-extension/-/python-extension-1.0.5.tgz", + "integrity": "sha512-uYhXUrL/gn92mfqhjAwH2+yGOpjloBxj9ekoL4BhUsKcyJMpEg6WlNf3S3si+5x9zlbHHe7FYQNjZEbz1ymI9Q==", + "license": "MIT", + "engines": { + "node": ">=16.17.1", + "vscode": "^1.78.0" + } + }, "node_modules/@vscode/vsce": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.32.0.tgz", - "integrity": "sha512-3EFJfsgrSftIqt3EtdRcAygy/OJ3hstyI1cDmIgkU9CFZW5C+3djr6mfosndCUqcVYuyjmxOK1xmFp/Bq7+NIg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.6.0.tgz", + "integrity": "sha512-u2ZoMfymRNJb14aHNawnXJtXHLXDVKc1oKZaH4VELKT/9iWKRVgtQOdwxCgtwSxJoqYvuK4hGlBWQJ05wxADhg==", "license": "MIT", "dependencies": { "@azure/identity": "^4.1.0", + "@secretlint/node": "^10.1.1", + "@secretlint/secretlint-formatter-sarif": "^10.1.1", + "@secretlint/secretlint-rule-no-dotenv": "^10.1.1", + "@secretlint/secretlint-rule-preset-recommend": "^10.1.1", "@vscode/vsce-sign": "^2.0.0", "azure-devops-node-api": "^12.5.0", - "chalk": "^2.4.2", + "chalk": "^4.1.2", "cheerio": "^1.0.0-rc.9", "cockatiel": "^3.1.2", - "commander": "^6.2.1", + "commander": "^12.1.0", "form-data": "^4.0.0", - "glob": "^7.0.6", + "glob": "^11.0.0", "hosted-git-info": "^4.0.2", "jsonc-parser": "^3.2.0", "leven": "^3.1.0", - "markdown-it": "^12.3.2", + "markdown-it": "^14.1.0", "mime": "^1.3.4", "minimatch": "^3.0.3", "parse-semver": "^1.1.1", "read": "^1.0.7", + "secretlint": "^10.1.1", "semver": "^7.5.2", - "tmp": "^0.2.1", + "tmp": "^0.2.3", "typed-rest-client": "^1.8.4", "url-join": "^4.0.1", "xml2js": "^0.5.0", @@ -2670,34 +3111,34 @@ "vsce": "vsce" }, "engines": { - "node": ">= 16" + "node": ">= 20" }, "optionalDependencies": { "keytar": "^7.7.0" } }, "node_modules/@vscode/vsce-sign": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.4.tgz", - "integrity": "sha512-0uL32egStKYfy60IqnynAChMTbL0oqpqk0Ew0YHiIb+fayuGZWADuIPHWUcY1GCnAA+VgchOPDMxnc2R3XGWEA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.6.tgz", + "integrity": "sha512-j9Ashk+uOWCDHYDxgGsqzKq5FXW9b9MW7QqOIYZ8IYpneJclWTBeHZz2DJCSKQgo+JAqNcaRRE1hzIx0dswqAw==", "hasInstallScript": true, "license": "SEE LICENSE IN LICENSE.txt", "optionalDependencies": { - "@vscode/vsce-sign-alpine-arm64": "2.0.2", - "@vscode/vsce-sign-alpine-x64": "2.0.2", - "@vscode/vsce-sign-darwin-arm64": "2.0.2", - "@vscode/vsce-sign-darwin-x64": "2.0.2", - "@vscode/vsce-sign-linux-arm": "2.0.2", - "@vscode/vsce-sign-linux-arm64": "2.0.2", - "@vscode/vsce-sign-linux-x64": "2.0.2", - "@vscode/vsce-sign-win32-arm64": "2.0.2", - "@vscode/vsce-sign-win32-x64": "2.0.2" + "@vscode/vsce-sign-alpine-arm64": "2.0.5", + "@vscode/vsce-sign-alpine-x64": "2.0.5", + "@vscode/vsce-sign-darwin-arm64": "2.0.5", + "@vscode/vsce-sign-darwin-x64": "2.0.5", + "@vscode/vsce-sign-linux-arm": "2.0.5", + "@vscode/vsce-sign-linux-arm64": "2.0.5", + "@vscode/vsce-sign-linux-x64": "2.0.5", + "@vscode/vsce-sign-win32-arm64": "2.0.5", + "@vscode/vsce-sign-win32-x64": "2.0.5" } }, "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==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.5.tgz", + "integrity": "sha512-XVmnF40APwRPXSLYA28Ye+qWxB25KhSVpF2eZVtVOs6g7fkpOxsVnpRU1Bz2xG4ySI79IRuapDJoAQFkoOgfdQ==", "cpu": [ "arm64" ], @@ -2708,9 +3149,9 @@ ] }, "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==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.5.tgz", + "integrity": "sha512-JuxY3xcquRsOezKq6PEHwCgd1rh1GnhyH6urVEWUzWn1c1PC4EOoyffMD+zLZtFuZF5qR1I0+cqDRNKyPvpK7Q==", "cpu": [ "x64" ], @@ -2721,9 +3162,9 @@ ] }, "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==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.5.tgz", + "integrity": "sha512-z2Q62bk0ptADFz8a0vtPvnm6vxpyP3hIEYMU+i1AWz263Pj8Mc38cm/4sjzxu+LIsAfhe9HzvYNS49lV+KsatQ==", "cpu": [ "arm64" ], @@ -2734,9 +3175,9 @@ ] }, "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==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.5.tgz", + "integrity": "sha512-ma9JDC7FJ16SuPXlLKkvOD2qLsmW/cKfqK4zzM2iJE1PbckF3BlR08lYqHV89gmuoTpYB55+z8Y5Fz4wEJBVDA==", "cpu": [ "x64" ], @@ -2747,9 +3188,9 @@ ] }, "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==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.5.tgz", + "integrity": "sha512-cdCwtLGmvC1QVrkIsyzv01+o9eR+wodMJUZ9Ak3owhcGxPRB53/WvrDHAFYA6i8Oy232nuen1YqWeEohqBuSzA==", "cpu": [ "arm" ], @@ -2760,9 +3201,9 @@ ] }, "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==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.5.tgz", + "integrity": "sha512-Hr1o0veBymg9SmkCqYnfaiUnes5YK6k/lKFA5MhNmiEN5fNqxyPUCdRZMFs3Ajtx2OFW4q3KuYVRwGA7jdLo7Q==", "cpu": [ "arm64" ], @@ -2773,9 +3214,9 @@ ] }, "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==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.5.tgz", + "integrity": "sha512-XLT0gfGMcxk6CMRLDkgqEPTyG8Oa0OFe1tPv2RVbphSOjFWJwZgK3TYWx39i/7gqpDHlax0AP6cgMygNJrA6zg==", "cpu": [ "x64" ], @@ -2786,9 +3227,9 @@ ] }, "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==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.5.tgz", + "integrity": "sha512-hco8eaoTcvtmuPhavyCZhrk5QIcLiyAUhEso87ApAWDllG7djIrWiOCtqn48k4pHz+L8oCQlE0nwNHfcYcxOPw==", "cpu": [ "arm64" ], @@ -2799,9 +3240,9 @@ ] }, "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==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.5.tgz", + "integrity": "sha512-1ixKFGM2FwM+6kQS2ojfY3aAelICxjiCzeg4nTHpkeU1Tfs4RC+lVLrgq5NwcBC7ZLr6UfY3Ct3D6suPeOf7BQ==", "cpu": [ "x64" ], @@ -2811,22 +3252,100 @@ "win32" ] }, + "node_modules/@vscode/vsce/node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vscode/vsce/node_modules/glob/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vscode/vsce/node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vscode/vsce/node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "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==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@yarnpkg/core": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@yarnpkg/core/-/core-4.1.6.tgz", - "integrity": "sha512-iF8LOSd4K0RVSB56c4IMYcXp6aiCT3wyWfMmiYSAiLm8tepwEtBOcrL9gzTzrT09NnDRz1CV/YB7iwfnUOMsAg==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@yarnpkg/core/-/core-4.4.2.tgz", + "integrity": "sha512-Gf2p9WUygkcT8GobVjrQpFGE7A/GWXPXjDSIFTnZKTiq/W8giN3jqhWpIrpVa2XfPMguXzdEvb2brNYeW3IwdQ==", "license": "BSD-2-Clause", "peer": true, "dependencies": { "@arcanis/slice-ansi": "^1.1.1", "@types/semver": "^7.1.0", "@types/treeify": "^1.0.0", - "@yarnpkg/fslib": "^3.1.1", - "@yarnpkg/libzip": "^3.1.0", - "@yarnpkg/parsers": "^3.0.2", - "@yarnpkg/shell": "^4.1.1", + "@yarnpkg/fslib": "^3.1.2", + "@yarnpkg/libzip": "^3.2.1", + "@yarnpkg/parsers": "^3.0.3", + "@yarnpkg/shell": "^4.1.3", "camelcase": "^5.3.1", - "chalk": "^3.0.0", + "chalk": "^4.1.2", "ci-info": "^4.0.0", "clipanion": "^4.0.0-rc.2", "cross-spawn": "^7.0.3", @@ -2834,6 +3353,7 @@ "dotenv": "^16.3.1", "fast-glob": "^3.2.2", "got": "^11.7.0", + "hpagent": "^1.2.0", "lodash": "^4.17.15", "micromatch": "^4.0.2", "p-limit": "^2.2.0", @@ -2842,73 +3362,12 @@ "tar": "^6.0.5", "tinylogic": "^2.0.0", "treeify": "^1.1.0", - "tslib": "^2.4.0", - "tunnel": "^0.0.6" + "tslib": "^2.4.0" }, "engines": { "node": ">=18.12.0" } }, - "node_modules/@yarnpkg/core/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@yarnpkg/core/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@yarnpkg/core/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@yarnpkg/core/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==", - "license": "MIT", - "peer": true - }, - "node_modules/@yarnpkg/core/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==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@yarnpkg/core/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -2925,35 +3384,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@yarnpkg/core/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@yarnpkg/extensions": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@yarnpkg/extensions/-/extensions-2.0.4.tgz", - "integrity": "sha512-ciBxtOtKW/RZJBbEDeAT3IhSIPv6wVGrvxihJ8ZZV9SHjzjZVsQHxOa2UXEW1Y2epSGsqE0kLvVedkNYFndIGw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@yarnpkg/extensions/-/extensions-2.0.6.tgz", + "integrity": "sha512-3LciOqpKIuoc9MmYoX3k+NmCdcrvw7HqZT4N/AW3sYkujxfbFA9Ml01JNqu4InzdV9V9NcyFkAKAorCjhY8w6Q==", "license": "BSD-2-Clause", "engines": { "node": ">=18.12.0" }, "peerDependencies": { - "@yarnpkg/core": "^4.1.5" + "@yarnpkg/core": "^4.4.2" } }, "node_modules/@yarnpkg/fslib": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-3.1.1.tgz", - "integrity": "sha512-NpeecISQEuDnmipElGa0cOC7DnlPf3+FXnuwwJTciJgt+S/BDb8VFBvXSE5UirGmsFWlf4mfZuuAC7e8Pmhh4g==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-3.1.2.tgz", + "integrity": "sha512-FpB2F1Lrm43F94klS9UN0ceOpe/PHZSpJB7bIkvReF/ba890bSdu1NokSKr998yaFee7yqeD9Wkid5ye7azF3A==", "license": "BSD-2-Clause", "peer": true, "dependencies": { @@ -2964,27 +3410,27 @@ } }, "node_modules/@yarnpkg/libzip": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-3.1.0.tgz", - "integrity": "sha512-x66/F8wEOUL8Hi4NZFVVKCFNITN0keQt0ZNlY5V9dRb+judyO8aJv4hazO3WyblnGhClvuBPbx+a2X4LNS5ziA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-3.2.1.tgz", + "integrity": "sha512-xPdiZxwCXGXxc1GDEyPjRQ5KqkgoOmieDNszLozbqghaeXIaokRbMKLUNx0Mr0LAnzII64kN3gl5qVyzfMxnIg==", "license": "BSD-2-Clause", "peer": true, "dependencies": { "@types/emscripten": "^1.39.6", - "@yarnpkg/fslib": "^3.1.0", + "@yarnpkg/fslib": "^3.1.2", "tslib": "^2.4.0" }, "engines": { "node": ">=18.12.0" }, "peerDependencies": { - "@yarnpkg/fslib": "^3.1.0" + "@yarnpkg/fslib": "^3.1.2" } }, "node_modules/@yarnpkg/parsers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", - "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.3.tgz", + "integrity": "sha512-mQZgUSgFurUtA07ceMjxrWkYz8QtDuYkvPlu0ZqncgjopQ0t6CNEo/OSealkmnagSUx8ZD5ewvezUwUuMqutQg==", "license": "BSD-2-Clause", "peer": true, "dependencies": { @@ -3027,15 +3473,15 @@ "peer": true }, "node_modules/@yarnpkg/shell": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@yarnpkg/shell/-/shell-4.1.1.tgz", - "integrity": "sha512-0aS71iJrNQ4cezU5BJ5JpBTXkFQPKkzOEpDtMQm8E2H3g9PLxUe/5VdA60bZq/4N/qazLLYEOngcFZ6QRpraVQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@yarnpkg/shell/-/shell-4.1.3.tgz", + "integrity": "sha512-5igwsHbPtSAlLdmMdKqU3atXjwhtLFQXsYAG0sn1XcPb3yF8WxxtWxN6fycBoUvFyIHFz1G0KeRefnAy8n6gdw==", "license": "BSD-2-Clause", "peer": true, "dependencies": { - "@yarnpkg/fslib": "^3.1.1", - "@yarnpkg/parsers": "^3.0.2", - "chalk": "^3.0.0", + "@yarnpkg/fslib": "^3.1.2", + "@yarnpkg/parsers": "^3.0.3", + "chalk": "^4.1.2", "clipanion": "^4.0.0-rc.2", "cross-spawn": "^7.0.3", "fast-glob": "^3.2.2", @@ -3049,92 +3495,20 @@ "node": ">=18.12.0" } }, - "node_modules/@yarnpkg/shell/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@yarnpkg/shell/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@yarnpkg/shell/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@yarnpkg/shell/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==", - "license": "MIT", - "peer": true - }, - "node_modules/@yarnpkg/shell/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==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@yarnpkg/shell/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3153,18 +3527,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/agent-base": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", @@ -3240,24 +3602,18 @@ } }, "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==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/antlr4": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.13.2.tgz", - "integrity": "sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=16" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/argparse": { @@ -3276,16 +3632,13 @@ "node": ">=8" } }, - "node_modules/ast-types": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/asynckit": { @@ -3353,6 +3706,21 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/binaryextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz", + "integrity": "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==", + "license": "Artistic-2.0", + "dependencies": { + "editions": "^6.21.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -3377,10 +3745,16 @@ "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", "license": "MIT" }, + "node_modules/boundary": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz", + "integrity": "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==", + "license": "BSD-2-Clause" + }, "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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3400,9 +3774,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "funding": [ { "type": "opencollective", @@ -3419,10 +3793,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -3471,12 +3845,27 @@ "node": "*" } }, - "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==", - "license": "BSD-3-Clause" - }, + "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==", + "license": "BSD-3-Clause" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cacache": { "version": "19.0.1", "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", @@ -3501,9 +3890,9 @@ } }, "node_modules/cacache/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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -3629,17 +4018,27 @@ "node": ">=8" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { - "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" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -3669,9 +4068,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001688", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", - "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", + "version": "1.0.30001724", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", + "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", "funding": [ { "type": "opencollective", @@ -3689,35 +4088,37 @@ "license": "CC-BY-4.0" }, "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==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/cheerio": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", - "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.0.tgz", + "integrity": "sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==", "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "domutils": "^3.1.0", + "domutils": "^3.2.2", "encoding-sniffer": "^0.2.0", - "htmlparser2": "^9.1.0", - "parse5": "^7.1.2", - "parse5-htmlparser2-tree-adapter": "^7.0.0", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", - "undici": "^6.19.5", + "undici": "^7.10.0", "whatwg-mimetype": "^4.0.0" }, "engines": { @@ -3752,9 +4153,9 @@ "optional": true }, "node_modules/ci-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", - "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", + "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", "funding": [ { "type": "github", @@ -3852,18 +4253,21 @@ } }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "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==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/combined-stream": { @@ -3879,12 +4283,12 @@ } }, "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=18" } }, "node_modules/common-ancestor-path": { @@ -3900,9 +4304,9 @@ "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -3954,9 +4358,9 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -4002,6 +4406,34 @@ "dev": true, "license": "MIT" }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -4012,30 +4444,16 @@ "node": ">=10" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "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==", - "license": "MIT", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/delayed-stream": { @@ -4054,9 +4472,9 @@ "license": "ISC" }, "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==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "license": "Apache-2.0", "optional": true, "engines": { @@ -4141,9 +4559,9 @@ } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -4155,9 +4573,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", "license": "BSD-2-Clause", "peer": true, "engines": { @@ -4167,6 +4585,20 @@ "url": "https://dotenvx.com" } }, + "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==", + "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", @@ -4182,10 +4614,25 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/editions": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/editions/-/editions-6.21.0.tgz", + "integrity": "sha512-ofkXJtn7z0urokN62DI3SBo/5xAtF0rR7tn+S/bSYV79Ka8pTajIIl+fFQ1q88DQEImymmo97M4azY3WX/nUdg==", + "license": "Artistic-2.0", + "dependencies": { + "version-range": "^4.13.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/electron-to-chromium": { - "version": "1.5.73", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", - "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", + "version": "1.5.171", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz", + "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -4205,9 +4652,9 @@ } }, "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==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", "license": "MIT", "dependencies": { "iconv-lite": "^0.6.3", @@ -4218,9 +4665,9 @@ } }, "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==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -4247,6 +4694,18 @@ "node": ">=6" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", @@ -4254,13 +4713,10 @@ "license": "MIT" }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -4274,6 +4730,33 @@ "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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { "version": "0.16.17", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", @@ -4321,19 +4804,11 @@ "node": ">=6" } }, - "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==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/eslint": { "version": "8.57.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { @@ -4430,59 +4905,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/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": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/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": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/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/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -4523,14 +4945,20 @@ "node": ">=4.0" } }, - "node_modules/eslint/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==", + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/json-schema-traverse": { @@ -4540,19 +4968,6 @@ "dev": true, "license": "MIT" }, - "node_modules/eslint/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": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -4576,7 +4991,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", - "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -4651,15 +5065,6 @@ "node": ">=0.10.0" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -4671,9 +5076,9 @@ } }, "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "license": "Apache-2.0" }, "node_modules/fast-deep-equal": { @@ -4683,16 +5088,16 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -4731,15 +5136,25 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", - "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==", - "license": "MIT" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -4812,19 +5227,19 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, "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==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -4835,39 +5250,19 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-3.0.1.tgz", - "integrity": "sha512-f8HPYqVUtZcpe+eg0xxDXryMxfFMZdNQZVXs3KOY3nSeLUDQBaz3w3UUVXJSgR266pgW4ruwnvV5JR+cJJD6dw==", - "license": "MIT", - "engines": { - "node": ">= 16.5" - } - }, - "node_modules/formdata-node": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-5.0.1.tgz", - "integrity": "sha512-8xnIjMYGKPj+rY2BTbAmpqVpi8der/2FT4d9f7J32FlsCpO5EzZPq3C/N56zdv8KweHzVF6TGijsS1JT6r1H2g==", - "license": "MIT", - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 14.17" + "node": ">= 6" } }, "node_modules/fs-constants": { @@ -4877,6 +5272,20 @@ "license": "MIT", "optional": true }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", @@ -4893,6 +5302,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, "license": "ISC" }, "node_modules/function-bind": { @@ -4905,16 +5315,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4923,6 +5338,19 @@ "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==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -4951,6 +5379,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -4981,19 +5410,12 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, + "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", - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/globby": { @@ -5018,12 +5440,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5075,30 +5497,18 @@ "license": "MIT" }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "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==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5107,11 +5517,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -5143,10 +5556,20 @@ "node": ">=10" } }, + "node_modules/hpagent": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14" + } + }, "node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -5158,14 +5581,26 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, "node_modules/http-proxy-agent": { @@ -5196,12 +5631,12 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -5264,9 +5699,9 @@ } }, "node_modules/ignore-walk/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==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -5288,9 +5723,9 @@ } }, "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==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5322,11 +5757,24 @@ "node": ">=8" } }, + "node_modules/index-to-position": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.1.0.tgz", + "integrity": "sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -5337,6 +5785,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "devOptional": true, "license": "ISC" }, "node_modules/ini": { @@ -5362,15 +5811,15 @@ } }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5406,6 +5855,24 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -5426,15 +5893,18 @@ } }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isexe": { @@ -5443,6 +5913,23 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, + "node_modules/istextorbinary": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-9.5.0.tgz", + "integrity": "sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==", + "license": "Artistic-2.0", + "dependencies": { + "binaryextensions": "^6.11.0", + "editions": "^6.21.0", + "textextensions": "^6.11.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -5458,11 +5945,16 @@ "@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": "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": { "argparse": "^2.0.1" @@ -5477,6 +5969,18 @@ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "license": "MIT" }, + "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" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -5527,12 +6031,36 @@ "node": ">= 4" } }, + "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" + }, + "engines": { + "node": ">=6" + } + }, "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==", "license": "MIT" }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -5564,27 +6092,6 @@ "npm": ">=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==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/just-diff": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", @@ -5598,23 +6105,23 @@ "license": "MIT" }, "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "1.0.1", + "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "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==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", "license": "MIT", "dependencies": { - "jwa": "^2.0.0", + "jwa": "^1.4.1", "safe-buffer": "^5.0.1" } }, @@ -5663,12 +6170,12 @@ } }, "node_modules/libnpmpack": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/libnpmpack/-/libnpmpack-9.0.0.tgz", - "integrity": "sha512-6UBeHebxorKuFZq6qQDV1PIjfZo6OvyzXMfI2UsRtrhlFDsOQsg9H2mZQwPryQXTOO/ifHxnjpmZmJdVn5INTg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/libnpmpack/-/libnpmpack-9.0.5.tgz", + "integrity": "sha512-/7tusXEEQ8SDUa4wx2CNttU9doAUM5XEUjrBBvONEbNnzQ9h6h9YFtFrMszvNW5/5mmIOFMaMmlWyA5xx7gCng==", "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.0.0", + "@npmcli/arborist": "^9.1.2", "@npmcli/run-script": "^9.0.1", "npm-package-arg": "^12.0.0", "pacote": "^21.0.0" @@ -5678,12 +6185,12 @@ } }, "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "license": "MIT", "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "node_modules/locate-path": { @@ -5706,8 +6213,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.includes": { "version": "4.3.0", @@ -5758,6 +6264,12 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "license": "MIT" + }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -5803,34 +6315,35 @@ } }, "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "license": "MIT", "dependencies": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, "bin": { - "markdown-it": "bin/markdown-it.js" + "markdown-it": "bin/markdown-it.mjs" } }, - "node_modules/markdown-it/node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "license": "MIT" }, "node_modules/merge2": { @@ -5944,9 +6457,9 @@ } }, "node_modules/minipass-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.0.tgz", - "integrity": "sha512-2v6aXUXwLP1Epd/gc32HAMIWoczx+fZwEPRHm/VwtrJzRGwR1qGZXEYV3Zp8ZjjbwaZhMrM6uHV4KVkk+XCc2w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", + "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", "license": "MIT", "dependencies": { "minipass": "^7.0.3", @@ -6001,107 +6514,47 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", - "license": "MIT", - "dependencies": { - "minipass": "^7.0.4", - "rimraf": "^5.0.5" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/minizlib/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/minizlib/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==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "dependencies": { + "yallist": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=8" } }, - "node_modules/minizlib/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/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "minipass": "^3.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/minizlib/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { - "glob": "^10.3.7" + "yallist": "^4.0.0" }, - "bin": { - "rimraf": "dist/esm/bin.mjs" + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 18" } }, "node_modules/mkdirp": { @@ -6136,9 +6589,9 @@ "license": "ISC" }, "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "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==", "license": "MIT", "optional": true }, @@ -6166,9 +6619,9 @@ } }, "node_modules/node-abi": { - "version": "3.68.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.68.0.tgz", - "integrity": "sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==", + "version": "3.75.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", + "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", "license": "MIT", "optional": true, "dependencies": { @@ -6185,40 +6638,21 @@ "license": "MIT", "optional": true }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-gyp": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz", - "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.2.0.tgz", + "integrity": "sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==", "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", "graceful-fs": "^4.2.6", "make-fetch-happen": "^14.0.3", "nopt": "^8.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5", "tar": "^7.4.3", + "tinyglobby": "^0.2.12", "which": "^5.0.0" }, "bin": { @@ -6228,15 +6662,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/node-gyp/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/node-gyp/node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", @@ -6246,26 +6671,6 @@ "node": ">=18" } }, - "node_modules/node-gyp/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==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/node-gyp/node_modules/isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", @@ -6275,21 +6680,6 @@ "node": ">=16" } }, - "node_modules/node-gyp/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/node-gyp/node_modules/mkdirp": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", @@ -6352,13 +6742,26 @@ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "license": "MIT" }, + "node_modules/node-sarif-builder": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.2.0.tgz", + "integrity": "sha512-kVIOdynrF2CRodHZeP/97Rh1syTUHBNiw17hUCIVhlhEsWlfJm19MuO56s4MdKbr22xWx6mzMnNAgXzVlIYM9Q==", + "license": "MIT", + "dependencies": { + "@types/sarif": "^2.1.7", + "fs-extra": "^11.1.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/nopt": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz", - "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", "license": "ISC", "dependencies": { - "abbrev": "^2.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" @@ -6382,9 +6785,9 @@ } }, "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" @@ -6446,9 +6849,9 @@ } }, "node_modules/npm-package-arg": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.1.tgz", - "integrity": "sha512-aDxjFfPV3Liw0WOBWlyZLMBqtbgbg03rmGvHDJa2Ttv7tIz+1oB5qWec4psCDFZcZi9b5XdGkPdQiJxOPzvQRQ==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", "license": "ISC", "dependencies": { "hosted-git-info": "^8.0.0", @@ -6461,9 +6864,9 @@ } }, "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz", - "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz", + "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==", "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" @@ -6537,9 +6940,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -6549,21 +6952,22 @@ } }, "node_modules/octokit": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/octokit/-/octokit-3.2.1.tgz", - "integrity": "sha512-u+XuSejhe3NdIvty3Jod00JvTdAE/0/+XbhIDhefHbu+2OcTRHd80aCiH6TX19ZybJmwPQBKFQmHGxp0i9mJrg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/octokit/-/octokit-3.2.2.tgz", + "integrity": "sha512-7Abo3nADdja8l/aglU6Y3lpnHSfv0tw7gFPiqzry/yCU+2gTAX7R1roJ8hJrxIK+S1j+7iqRJXtmuHJ/UDsBhQ==", "license": "MIT", "dependencies": { "@octokit/app": "^14.0.2", "@octokit/core": "^5.0.0", "@octokit/oauth-app": "^6.0.0", "@octokit/plugin-paginate-graphql": "^4.0.0", - "@octokit/plugin-paginate-rest": "11.3.1", - "@octokit/plugin-rest-endpoint-methods": "13.2.2", + "@octokit/plugin-paginate-rest": "11.4.4-cjs.2", + "@octokit/plugin-rest-endpoint-methods": "13.3.2-cjs.1", "@octokit/plugin-retry": "^6.0.0", "@octokit/plugin-throttling": "^8.0.0", "@octokit/request-error": "^5.0.0", - "@octokit/types": "^13.0.0" + "@octokit/types": "^13.0.0", + "@octokit/webhooks": "^12.3.1" }, "engines": { "node": ">= 18" @@ -6579,17 +6983,18 @@ } }, "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==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", + "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6741,6 +7146,35 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", @@ -6760,24 +7194,24 @@ } }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "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==", "license": "MIT", "dependencies": { - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "parse5": "^7.0.0" }, "funding": { @@ -6796,6 +7230,18 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6810,6 +7256,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6880,6 +7327,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/pony-cause": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz", @@ -6890,9 +7346,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -6903,9 +7359,9 @@ } }, "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", "license": "MIT", "optional": true, "dependencies": { @@ -6914,7 +7370,7 @@ "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", + "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", @@ -6940,9 +7396,9 @@ } }, "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.0.tgz", + "integrity": "sha512-ujSB9uXHJKzM/2GBuE0hBOUgC77CN3Bnpqa+g80bkv3T3A93wL/xlzDATHhnhkzifz/UE2SNOvmbTz5hSkDlHw==", "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" @@ -6990,12 +7446,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "license": "ISC" - }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -7010,9 +7460,9 @@ } }, "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -7029,13 +7479,22 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -7093,6 +7552,18 @@ "rc": "cli.js" } }, + "node_modules/rc-config-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", + "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "js-yaml": "^4.1.0", + "json5": "^2.2.2", + "require-from-string": "^2.0.2" + } + }, "node_modules/rc/node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", @@ -7144,6 +7615,69 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-pkg/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/read-pkg/node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -7208,9 +7742,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -7234,6 +7768,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -7277,31 +7823,108 @@ ], "license": "MIT" }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "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==", + "license": "ISC" + }, + "node_modules/secretlint": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/secretlint/-/secretlint-10.2.1.tgz", + "integrity": "sha512-3BghQkIGrDz3xJklX/COxgKbxHz2CAsGkXH4oh8MxeYVLlhA3L/TLhAxZiTyqeril+CnDGg8MUEZdX1dZNsxVA==", + "license": "MIT", + "dependencies": { + "@secretlint/config-creator": "^10.2.1", + "@secretlint/formatter": "^10.2.1", + "@secretlint/node": "^10.2.1", + "@secretlint/profiler": "^10.2.1", + "debug": "^4.4.1", + "globby": "^14.1.0", + "read-pkg": "^9.0.1" + }, + "bin": { + "secretlint": "bin/secretlint.js" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/secretlint/node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/secretlint/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/secretlint/node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/secretlint/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" + "node_modules/secretlint/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -7310,23 +7933,6 @@ "node": ">=10" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "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/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7349,15 +7955,69 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "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==", + "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==", + "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==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7379,17 +8039,17 @@ } }, "node_modules/sigstore": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz", - "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz", + "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==", "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^3.0.0", + "@sigstore/bundle": "^3.1.0", "@sigstore/core": "^2.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^3.0.0", - "@sigstore/tuf": "^3.0.0", - "@sigstore/verify": "^2.0.0" + "@sigstore/protobuf-specs": "^0.4.0", + "@sigstore/sign": "^3.1.0", + "@sigstore/tuf": "^3.1.0", + "@sigstore/verify": "^2.1.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" @@ -7452,6 +8112,23 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -7463,9 +8140,9 @@ } }, "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.5.tgz", + "integrity": "sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==", "license": "MIT", "dependencies": { "ip-address": "^9.0.5", @@ -7527,9 +8204,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "license": "CC0-1.0" }, "node_modules/sprintf-js": { @@ -7550,16 +8227,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", - "license": "MIT", - "engines": { - "node": ">=4", - "npm": ">=6" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -7673,16 +8340,77 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/structured-source": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/structured-source/-/structured-source-4.0.0.tgz", + "integrity": "sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==", + "license": "BSD-2-Clause", + "dependencies": { + "boundary": "^2.0.0" + } + }, "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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" }, "engines": { - "node": ">=4" + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/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==", + "license": "MIT" + }, + "node_modules/table/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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/tar": { @@ -7703,9 +8431,9 @@ } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", "license": "MIT", "optional": true, "dependencies": { @@ -7799,30 +8527,78 @@ "node": ">=8" } }, + "node_modules/terminal-link": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-4.0.0.tgz", + "integrity": "sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "supports-hyperlinks": "^3.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/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==", + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, "license": "MIT" }, + "node_modules/textextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", + "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", + "license": "Artistic-2.0", + "dependencies": { + "editions": "^6.21.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/tinyglobby": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", - "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", "license": "MIT", "dependencies": { - "fdir": "^6.4.2", + "fdir": "^6.4.4", "picomatch": "^4.0.2" }, "engines": { "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", - "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" @@ -7861,15 +8637,6 @@ "node": ">=14.14" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -7918,9 +8685,9 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/tsutils": { @@ -8044,9 +8811,9 @@ } }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "license": "MIT" }, "node_modules/underscore": { @@ -8056,21 +8823,34 @@ "license": "MIT" }, "node_modules/undici": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", - "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.10.0.tgz", + "integrity": "sha512-u5otvFBOBZvmdjWLVW+5DAc9Nkq8f24g0O9oY7qw2JVIF1VocIFoyz9JFkuVOS2j41AufeO0xnlweJ2RLT8nGw==", "license": "MIT", "engines": { - "node": ">=18.17" + "node": ">=20.18.1" } }, "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==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", "license": "MIT", + "optional": true, "peer": true }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unique-filename": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", @@ -8096,9 +8876,9 @@ } }, "node_modules/universal-github-app-jwt": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.1.2.tgz", - "integrity": "sha512-t1iB2FmLFE+yyJY9+3wMx0ejB+MQpEVkH0gQv7dR6FZyltyq+ZZO0uDpbopxhrZ3SLEO4dCEkIujOMldEQ2iOA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.2.0.tgz", + "integrity": "sha512-dncpMpnsKBk0eetwfN8D8OUHGfiDhhJ+mtsbMl+7PfW7mYjiH8LIcqRmYMtzYLgSh47HjfdBtrBwIQ/gizKR3g==", "license": "MIT", "dependencies": { "@types/jsonwebtoken": "^9.0.0", @@ -8111,10 +8891,19 @@ "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", "license": "ISC" }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "funding": [ { "type": "opencollective", @@ -8132,7 +8921,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -8193,14 +8982,26 @@ } }, "node_modules/validate-npm-package-name": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz", - "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.1.tgz", + "integrity": "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg==", "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/version-range": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.14.0.tgz", + "integrity": "sha512-gjb0ARm9qlcBAonU4zPwkl9ecKkas+tC2CGwFfptTCWWIVTWY1YUbT2zZKsOAF1jR/tNxxyLwwG0cb42XlYcTg==", + "license": "Artistic-2.0", + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/walk-up-path": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", @@ -8210,15 +9011,6 @@ "node": "20 || >=22" } }, - "node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -8300,39 +9092,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/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==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/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==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/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==", - "license": "MIT" - }, "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", @@ -8440,15 +9199,15 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yauzl": { diff --git a/package.json b/package.json index 95ec8fc..58740b0 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ }, "icon": "socket-square.png", "activationEvents": [ - "workspaceContains:**/[pP][aA][cC][kK][aA][gG][eE].[jJ][sS][oO][nN]", + "workspaceConatains:**/[pP][aA][cC][kK][aA][gG][eE].[jJ][sS][oO][nN]", "workspaceContains:**/[sS][oO][cC][kK][eE][tT].[yY][mM][lL]", "workspaceContains:**/[rR][eE][qQ][uU][iI][rR][eE][mM][eE][nN][tT][sS].[tT][xX][tT]", "workspaceContains:**/[pP][yY][pP][rR][oO][jJ][eE][cC][tT].[tT][oO][mM][lL]", @@ -48,59 +48,11 @@ "main": "./out/main.js", "homepage": "https://socket.dev", "contributes": { - "commands": [ - { - "command": "socket-security.runReport", - "category": "Socket Security", - "title": "Run Report", - "enablement": "workspaceFolderCount >= 1" - } - ], "configuration": { "title": "Socket Security", "properties": { - "socket-security.minIssueLevel": { - "order": 1, - "type": "string", - "default": "low", - "enum": [ - "critical", - "high", - "middle", - "low" - ], - "description": "Hide all issues that are less important than this level. Note some issues are hidden by default so you may also wish to enable showing all issue types still." - }, - "socket-security.errorOverlayThreshold": { - "order": 2, - "type": "number", - "default": 50, - "minimum": 0, - "maximum": 100, - "description": "Show error overlay for any import of a package with a summary score less than this value.", - "examples": [ - 50 - ] - }, - "socket-security.warnOverlayThreshold": { - "order": 3, - "type": "number", - "default": 80, - "minimum": 0, - "maximum": 100, - "description": "Show overlay for any import of a package with a summary score less than this value.", - "examples": [ - 80 - ] - }, - "socket-security.reportsEnabled": { - "order": 4, - "type": "boolean", - "default": true, - "description": "Create reports from package manifest files (package.json / package-lock.json) that require sending data remotely. Disabling this will disable all issues but keep scores listed." - }, "socket-security.pythonInterpreter": { - "order": 5, + "order": 1, "type": "string", "description": "Path to a Python interpreter to use for Socket dependency analysis.", "examples": [ @@ -108,7 +60,7 @@ ] }, "socket-security.goExecutable": { - "order": 6, + "order": 2, "type": "string", "description": "Path to a Go executable to use for Socket dependency analysis.", "examples": [ @@ -124,7 +76,7 @@ "publisher": "SocketSecurity", "scripts": { "vscode:prepublish": "npm run esbuild -- --minify", - "esbuild-base": "esbuild --bundle --external:vscode --loader:.wasm=binary --loader:.go=file --outdir=out/ --platform=node --sourcemap", + "esbuild-base": "esbuild --bundle --external:vscode --loader:.wasm=binary --loader:.go=file --loader:.py=text --outdir=out/ --platform=node --sourcemap", "esbuild": "npm run esbuild-base -- --format=cjs main=src/extension.ts", "test-compile": "tsc -p ./", "lint": "eslint \"src/**/*.ts\"", @@ -133,23 +85,18 @@ }, "dependencies": { "@babel/parser": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7", "@socketsecurity/config": "^2.0.0", "@socketsecurity/registry": "^1.0.66", - "@vscode/vsce": "^2.20.1", - "acorn-walk": "^8.2.0", - "antlr4": "^4.13.0", - "ast-types": "^0.14.2", - "form-data-encoder": "^3.0.0", - "formdata-node": "^5.0.1", + "@vscode/python-extension": "^1.0.5", + "@vscode/vsce": "^3.6.0", "ini": "^3.0.1", "json-to-ast": "^2.1.0", - "micromatch": "^4.0.8", - "octokit": "^3.1.2", - "safe-stable-stringify": "^2.4.1", - "semver": "^7.5.2", - "yaml": "^2.2.2" + "octokit": "^3.1.2" }, "devDependencies": { + "@types/babel__traverse": "^7.20.7", "@types/ini": "^1.3.31", "@types/json-to-ast": "^2.1.2", "@types/micromatch": "^4.0.2", diff --git a/src/api.ts b/src/api.ts new file mode 100644 index 0000000..20e7395 --- /dev/null +++ b/src/api.ts @@ -0,0 +1,25 @@ +///////// +// DESIGN NOTES +///////// +// +// We pass apiKeys rather than shared state to avoid certain races, so if a +// workflow starts with 1 API key it is inconvenient to grab an implicitly +// new api key in the middle of the workflow +// +function toAuthHeader(apiKey: string) { + return `Basic ${Buffer.from(`${apiKey}:`).toString('base64url')}` +} +export async function getQuota(apiKey: string) { + const res = await fetch('https://api.socket.dev/v0/settings', { + method: 'POST', + headers: { + Authorization: toAuthHeader(apiKey), + 'Content-Type': 'application/json' + } + }) + if (res.ok) { + return res.json() + } else { + throw new Error(await res.text()) + } +} diff --git a/src/auth.ts b/src/auth.ts new file mode 100644 index 0000000..92c6bc1 --- /dev/null +++ b/src/auth.ts @@ -0,0 +1,183 @@ +import vscode from 'vscode' +import os from 'os' +import path from 'path' +import { DIAGNOSTIC_SOURCE_STR, EXTENSION_PREFIX } from './util' +import { getQuota } from './api' + +export async function activate(context: vscode.ExtensionContext, disposables?: Array) { + //#region file path/watching + // responsible for watching files to know when to sync from disk + let dataHome = process.platform === 'win32' + ? process.env['LOCALAPPDATA'] + : process.env['XDG_DATA_HOME'] + + if (!dataHome) { + if (process.platform === 'win32') throw new Error('missing %LOCALAPPDATA%') + const home = os.homedir() + dataHome = path.join(home, ...(process.platform === 'darwin' + ? ['Library', 'Application Support'] + : ['.local', 'share'] + )) + } + + let defaultSettingsPath = path.join(dataHome, 'socket', 'settings') + let settingsPath = vscode.workspace.getConfiguration(EXTENSION_PREFIX) + .get('settingsFile', defaultSettingsPath) + //#endregion + //#region session sync + // responsible for keeping disk an mem in sync + const PUBLIC_TOKEN = 'sktsec_t_--RAN5U4ivauy4w37-6aoKyYPDt5ZbaT5JBVMqiwKo_api' + let liveSessions: Map = new Map() + const emitter = new vscode.EventEmitter() + async function syncLiveSessionsFromDisk() { + const settings_on_disk = JSON.parse(Buffer.from( + new TextDecoder().decode(await vscode.workspace.fs.readFile(vscode.Uri.file(settingsPath))), + 'base64' + ).toString('utf8')) + const { + apiKey + } = settings_on_disk + const sessionOnDisk: typeof liveSessions = new Map() + if (apiKey) { + sessionOnDisk.set( + apiKey, + { + accessToken: apiKey, + id: apiKey, + account: { + id: apiKey, + label: `API Key for ${DIAGNOSTIC_SOURCE_STR}` + }, + scopes: [], + } + ) + } + let added: Array = [] + let changed: Array = [] + let removed: Array = [] + for (const diskSession of sessionOnDisk.values()) { + // already have this access token in mem session + if (liveSessions.has(diskSession.accessToken)) { + const liveSession = liveSessions.get(diskSession.accessToken) + liveSessions.delete(diskSession.accessToken) + // mem has same as what is on disk + if (JSON.stringify(liveSession) !== JSON.stringify(diskSession)) { + continue + } + changed.push(diskSession) + } else { + added.push(diskSession) + } + } + for (const liveSessionWithoutDiskSession of liveSessions.values()) { + removed.push(liveSessionWithoutDiskSession) + } + liveSessions = sessionOnDisk + if (added.length + changed.length + removed.length > 0) { + emitter.fire({ + added, + changed, + removed + }) + } + } + async function syncLiveSessionsToDisk() { + const contents = Buffer.from( + JSON.stringify( + Array.from(liveSessions.values(), s => ({ + apiKey: s.accessToken + })), + null, + 2 + ) + ).toString('base64') + return vscode.workspace.fs.writeFile(vscode.Uri.file(settingsPath), new TextEncoder().encode(contents)) + } + await syncLiveSessionsFromDisk() + //#endregion + //#region service glue + const service = vscode.authentication.registerAuthenticationProvider(`${EXTENSION_PREFIX}`, `${DIAGNOSTIC_SOURCE_STR}`, { + onDidChangeSessions(fn) { + return emitter.event(fn) + }, + async getSessions(scopes: readonly string[] | undefined, options: vscode.AuthenticationProviderSessionOptions): Promise { + return Array.from(liveSessions.values()) + }, + async createSession(scopes: readonly string[], options: vscode.AuthenticationProviderSessionOptions): Promise { + const realLogin = `Log in to ${DIAGNOSTIC_SOURCE_STR}` + const publicLogin = `Use public token for ${DIAGNOSTIC_SOURCE_STR}` + const res = await vscode.window.showQuickPick([ + realLogin, + publicLogin, + ]) + if (!res) { + throw new Error(`Cancelled creation of session for ${DIAGNOSTIC_SOURCE_STR}`) + } + let apiKey: string + if (res === publicLogin) { + apiKey = '' + } else { + let keyInfo: string + let maybeApiKey = await vscode.window.showInputBox({ + title: 'Socket Security API Token', + placeHolder: 'Leave this blank to use public demo token', + prompt: 'Enter your API token from https://socket.dev/', + async validateInput (value) { + if (!value) return + keyInfo = (await getQuota(value))! + if (!keyInfo) return 'Unable to validate API key' + } + }) + // cancelled + if (maybeApiKey === undefined) { + throw new Error(`Cancelled creation of session for ${DIAGNOSTIC_SOURCE_STR}`) + } + apiKey = maybeApiKey + } + if (apiKey === '') { + apiKey = PUBLIC_TOKEN + } + const session = { + accessToken: apiKey, + id: apiKey, + account: { + id: apiKey, + label: `API Key for ${DIAGNOSTIC_SOURCE_STR}` + }, + scopes: [], + } + let oldSessions = Array.from(liveSessions.values()) + liveSessions = new Map([ + [apiKey, session] + ]) + emitter.fire({ + added: [session], + changed: [], + removed: oldSessions + }) + await syncLiveSessionsToDisk() + return session + }, + async removeSession(sessionId: string): Promise { + const session = liveSessions.get(sessionId) + if (session) { + emitter.fire({ + added: [], + changed: [], + removed: [session] + }) + await syncLiveSessionsToDisk() + } + } + }) + context.subscriptions.push(service) + vscode.commands.registerCommand(`${EXTENSION_PREFIX}.login`, () => { + vscode.authentication.getSession(`${EXTENSION_PREFIX}`, [], { + createIfNone: true, + }) + }) + //#endregion + return { + + } +} diff --git a/src/data/github.ts b/src/data/github.ts index c5def38..8141558 100644 --- a/src/data/github.ts +++ b/src/data/github.ts @@ -78,7 +78,7 @@ export async function sniffForGithubOrgOrUser(workspaceRootURI: vscode.Uri): Pro } catch (e) {} } -export function installGithubApp(uri: vscode.Uri) { +export function installGithubApp(uri: vscode.Uri) {return vscode.authentication.getSession('github', [ 'read:user', 'read:org' diff --git a/src/data/go/executable.ts b/src/data/go/executable.ts index 3b213f0..9d400db 100644 --- a/src/data/go/executable.ts +++ b/src/data/go/executable.ts @@ -14,27 +14,47 @@ export async function initGo(): Promise { const warned = new Set(); -export async function getGoExecutable(fileName?: string): Promise { +export async function getGoExecutable(fileName?: string): Promise<{execPath: string} | void> { // no executable in virtual workspace if (vscode.workspace.workspaceFolders?.every(f => f.uri.scheme !== 'file')) return + let execPath: string = 'go'; + let usingSystemPath = true const workspaceConfig = vscode.workspace.getConfiguration(EXTENSION_PREFIX); const pathOverride = workspaceConfig.get('goExecutable'); if (pathOverride) { - return Promise.resolve(vscode.workspace.fs.stat(vscode.Uri.file(pathOverride))).then( - st => { - if (st.type & vscode.FileType.File) return pathOverride; + try { + const st = await vscode.workspace.fs.stat(vscode.Uri.file(pathOverride)) + if (st.type & vscode.FileType.File) { + usingSystemPath = false; + execPath = pathOverride; + } else { throw new Error('not a file') } - ).catch(err => { - vscode.window.showErrorMessage(`Failed to find Go binary at '${pathOverride}'. Please update ${EXTENSION_PREFIX}.goExecutable.`) - }) + } catch { + } + if (usingSystemPath) { + vscode.window.showErrorMessage(`Failed to find Go binary at '${pathOverride}'. Please update ${EXTENSION_PREFIX}.pythonInterpreter.`); + } + } + if (usingSystemPath) { + const ext = await getGoExtension(); + const cmd = await ext?.settings.getExecutionCommand( + 'go', + fileName && vscode.Uri.file(fileName) + ) + if (cmd) { + usingSystemPath = false; + execPath = cmd.binPath + } else { + // TODO: make this less noisy + // warnToInstallMoreReliableGo(ext); + } } - const ext = await getGoExtension(); - const cmd = await ext?.settings.getExecutionCommand( - 'go', - fileName && vscode.Uri.file(fileName) - ) - if (cmd) return cmd.binPath + return {execPath} +} + +function warnToInstallMoreReliableGo(ext: vscode.Extension) { + const workspaceConfig = vscode.workspace.getConfiguration(EXTENSION_PREFIX); const workspaceID = vscode.workspace.name || vscode.workspace.workspaceFolders?.map(f => f.uri.fsPath).join(',') || vscode.window.activeTextEditor?.document.uri.fsPath; diff --git a/src/data/go/find-imports.go b/src/data/go/find-imports.go index 2a171c8..2856f8e 100644 --- a/src/data/go/find-imports.go +++ b/src/data/go/find-imports.go @@ -7,6 +7,7 @@ import ( "go/parser" "go/token" "strconv" + "fmt" ) // Eventually maybe migrate to WASI with tinygo @@ -33,6 +34,8 @@ func toVSPos(src token.Position) VSPosition { } func main() { + // TODO: stderr + fmt.Fprintln(os.Stderr, "This is an error message") reader := bufio.NewReader(os.Stdin) fset := token.NewFileSet() file, err := parser.ParseFile(fset, "src.go", reader, parser.ImportsOnly) @@ -67,4 +70,4 @@ func main() { } os.Stdout.Write(result) -} \ No newline at end of file +} diff --git a/src/data/go/import-finder.ts b/src/data/go/import-finder.ts index 00b8699..a6a4486 100644 --- a/src/data/go/import-finder.ts +++ b/src/data/go/import-finder.ts @@ -1,20 +1,14 @@ import importFinder from './find-imports.go' +import childProcess from 'node:child_process' +import path from 'node:path' +import fs from 'node:fs/promises' +import fsSync from 'node:fs' +import os from 'node:os' let cachedBin: Promise | null = null let lastBinPath: string | null = null export async function generateNativeGoImportBinary (goBin: string) { - const [ - childProcess, - path, - fs, - os - ] = await Promise.all([ - import('node:child_process'), - import('node:path'), - import('node:fs/promises'), - import('node:os') - ]) if (cachedBin && lastBinPath === goBin) { const bin = await cachedBin.catch(() => null) if (bin) { @@ -32,7 +26,8 @@ export async function generateNativeGoImportBinary (goBin: string) { lastBinPath = goBin cachedBin = (async () => { const outBin = path.join(await fs.mkdtemp(path.join(os.tmpdir(), 'socket-')), 'go-import-parser') - const build = childProcess.spawn(goBin, ['build', '-o', outBin, importFinder], { + const args = ['build', '-o', outBin, importFinder] + const build = childProcess.spawn(goBin, args, { cwd: __dirname }) diff --git a/src/data/python/builtins.py b/src/data/python/builtins.py new file mode 100644 index 0000000..958d7c3 --- /dev/null +++ b/src/data/python/builtins.py @@ -0,0 +1,21 @@ +export function generatePythonBuiltinsExtractor() { + return ` + import sys + import pkgutil + import os + import json + + # Built-in modules + builtin_modules = set(sys.builtin_module_names) + + # Standard library modules + stdlib_path = os.path.dirname(os.__file__) + stdlib_modules = set(module.name for module in pkgutil.iter_modules([stdlib_path])) + + # Combine and sort + all_modules = sorted(builtin_modules | stdlib_modules) + + # Print as JSON + print(json.dumps(all_modules, indent=2)) + ` +} diff --git a/src/data/python/builtins.ts b/src/data/python/builtins.ts deleted file mode 100644 index 3802266..0000000 --- a/src/data/python/builtins.ts +++ /dev/null @@ -1,334 +0,0 @@ -// extracted from https://github.com/PyCQA/isort/blob/main/isort/stdlibs -// it's possible to dynamically get builtins but that doesn't work on web -const pythonBuiltins = new Set([ - 'AL', - 'BaseHTTPServer', - 'Bastion', - 'CGIHTTPServer', - 'Carbon', - 'ColorPicker', - 'ConfigParser', - 'Cookie', - 'DEVICE', - 'DocXMLRPCServer', - 'EasyDialogs', - 'FL', - 'FrameWork', - 'GL', - 'HTMLParser', - 'MacOS', - 'MimeWriter', - 'MiniAEFrame', - 'Nav', - 'PixMapWrapper', - 'Queue', - 'SUNAUDIODEV', - 'ScrolledText', - 'SimpleHTTPServer', - 'SimpleXMLRPCServer', - 'SocketServer', - 'StringIO', - 'Tix', - 'Tkinter', - 'UserDict', - 'UserList', - 'UserString', - 'W', - '__builtin__', - '_ast', - '_dummy_thread', - '_thread', - '_winreg', - 'abc', - 'aepack', - 'aetools', - 'aetypes', - 'aifc', - 'al', - 'anydbm', - 'applesingle', - 'argparse', - 'array', - 'ast', - 'asynchat', - 'asyncio', - 'asyncore', - 'atexit', - 'audioop', - 'autoGIL', - 'base64', - 'bdb', - 'binascii', - 'binhex', - 'bisect', - 'bsddb', - 'buildtools', - 'builtins', - 'bz2', - 'cPickle', - 'cProfile', - 'cStringIO', - 'calendar', - 'cd', - 'cfmfile', - 'cgi', - 'cgitb', - 'chunk', - 'cmath', - 'cmd', - 'code', - 'codecs', - 'codeop', - 'collections', - 'colorsys', - 'commands', - 'compileall', - 'compiler', - 'concurrent', - 'configparser', - 'contextlib', - 'contextvars', - 'cookielib', - 'copy', - 'copy_reg', - 'copyreg', - 'crypt', - 'csv', - 'ctypes', - 'curses', - 'dataclasses', - 'datetime', - 'dbhash', - 'dbm', - 'decimal', - 'difflib', - 'dircache', - 'dis', - 'distutils', - 'dl', - 'doctest', - 'dumbdbm', - 'dummy_thread', - 'dummy_threading', - 'email', - 'encodings', - 'ensurepip', - 'enum', - 'errno', - 'exceptions', - 'faulthandler', - 'fcntl', - 'filecmp', - 'fileinput', - 'findertools', - 'fl', - 'flp', - 'fm', - 'fnmatch', - 'formatter', - 'fpectl', - 'fpformat', - 'fractions', - 'ftplib', - 'functools', - 'future_builtins', - 'gc', - 'gdbm', - 'gensuitemodule', - 'getopt', - 'getpass', - 'gettext', - 'gl', - 'glob', - 'graphlib', - 'grp', - 'gzip', - 'hashlib', - 'heapq', - 'hmac', - 'hotshot', - 'html', - 'htmlentitydefs', - 'htmllib', - 'http', - 'httplib', - 'ic', - 'icopen', - 'idlelib', - 'imageop', - 'imaplib', - 'imgfile', - 'imghdr', - 'imp', - 'importlib', - 'imputil', - 'inspect', - 'io', - 'ipaddress', - 'itertools', - 'jpeg', - 'json', - 'keyword', - 'lib2to3', - 'linecache', - 'locale', - 'logging', - 'lzma', - 'macerrors', - 'macostools', - 'macpath', - 'macresource', - 'mailbox', - 'mailcap', - 'marshal', - 'math', - 'md5', - 'mhlib', - 'mimetools', - 'mimetypes', - 'mimify', - 'mmap', - 'modulefinder', - 'msilib', - 'msvcrt', - 'multifile', - 'multiprocessing', - 'mutex', - 'netrc', - 'new', - 'nis', - 'nntplib', - 'ntpath', - 'numbers', - 'operator', - 'optparse', - 'os', - 'ossaudiodev', - 'parser', - 'pathlib', - 'pdb', - 'pickle', - 'pickletools', - 'pipes', - 'pkgutil', - 'platform', - 'plistlib', - 'popen2', - 'poplib', - 'posix', - 'posixfile', - 'posixpath', - 'pprint', - 'profile', - 'pstats', - 'pty', - 'pwd', - 'py_compile', - 'pyclbr', - 'pydoc', - 'queue', - 'quopri', - 'random', - 're', - 'readline', - 'reprlib', - 'resource', - 'rexec', - 'rfc822', - 'rlcompleter', - 'robotparser', - 'runpy', - 'sched', - 'secrets', - 'select', - 'selectors', - 'sets', - 'sgmllib', - 'sha', - 'shelve', - 'shlex', - 'shutil', - 'signal', - 'site', - 'smtpd', - 'smtplib', - 'sndhdr', - 'socket', - 'socketserver', - 'spwd', - 'sqlite3', - 'sre', - 'sre_compile', - 'sre_constants', - 'sre_parse', - 'ssl', - 'stat', - 'statistics', - 'statvfs', - 'string', - 'stringprep', - 'struct', - 'subprocess', - 'sunau', - 'sunaudiodev', - 'symbol', - 'symtable', - 'sys', - 'sysconfig', - 'syslog', - 'tabnanny', - 'tarfile', - 'telnetlib', - 'tempfile', - 'termios', - 'test', - 'textwrap', - 'thread', - 'threading', - 'time', - 'timeit', - 'tkinter', - 'token', - 'tokenize', - 'tomllib', - 'trace', - 'traceback', - 'tracemalloc', - 'ttk', - 'tty', - 'turtle', - 'turtledemo', - 'types', - 'typing', - 'unicodedata', - 'unittest', - 'urllib', - 'urllib2', - 'urlparse', - 'user', - 'uu', - 'uuid', - 'venv', - 'videoreader', - 'warnings', - 'wave', - 'weakref', - 'webbrowser', - 'whichdb', - 'winreg', - 'winsound', - 'wsgiref', - 'xdrlib', - 'xml', - 'xmlrpc', - 'xmlrpclib', - 'zipapp', - 'zipfile', - 'zipimport', - 'zlib', - 'zoneinfo' -]); - -export function isPythonBuiltin (pkg: string) { - return pythonBuiltins.has(pkg) -} \ No newline at end of file diff --git a/src/data/python/import-finder.ts b/src/data/python/import-finder.py similarity index 82% rename from src/data/python/import-finder.ts rename to src/data/python/import-finder.py index d0caa35..1a3df76 100644 --- a/src/data/python/import-finder.ts +++ b/src/data/python/import-finder.py @@ -1,18 +1,79 @@ -// Python dependency extractor -// handles basic constant folding + dynamic import extraction -// some limited error correction functionality +import ast, tokenize, token, json, sys, io, importlib -// possible future TODO: use python tokenizer with error-correcting -// indents and manually parse - better perf + accuracy -export function generateNativePyImportFinder (src: string): string { - return `import ast, tokenize, token, json, sys, io, importlib - -src = u${JSON.stringify(src)} +src = sys.stdin.read() src_lines = src.split(u'\\n') xrefs = [] pending_xref = None +def get_module_file_path(module_name): + try: + # Preferred: Python 3.4+ + import importlib.util + spec = importlib.util.find_spec(module_name) + if spec and spec.origin: + return spec.origin + except ImportError: + pass + + try: + # Fallback for Python 2.7+ + import pkgutil + loader = pkgutil.get_loader(module_name) + if loader: + try: + return loader.get_filename() + except AttributeError: + pass + except ImportError: + pass + + mod = __import__(module_name) + mod_path = getattr(mod, '__file__', None) + return mod_path + + +def find_distribution_for_module(module_name): + # Step 1: Dynamically import the module + try: + mod_path = get_module_file_path(module_name) + if not mod_path: + return module_name + except ImportError as e: + return module_name + + # Step 2: Try importlib.metadata (Python 3.8+) + try: + import importlib.metadata as metadata + except ImportError: + metadata = None + try: + import importlib_metadata as metadata # type: ignore # Backport (optional) + except ImportError: + pass # Still None if not available + + if metadata is not None: + try: + for dist in metadata.distributions(): + try: + if any(str(file) in mod_path for file in dist.files or []): + return dist.metadata['Name'] + except Exception: + continue + except Exception: + pass # Be safe around possibly buggy metadata + + # Step 3: Fallback to pkg_resources (setuptools) + try: + import pkg_resources + for dist in pkg_resources.working_set: + if mod_path.startswith(dist.location): + return dist.project_name + except ImportError: + pass + + return module_name + def make_range(sl, sc, el, ec): return { "start": { @@ -42,7 +103,7 @@ def save_pending_xref(end_line, end_col): end_col += 1 for name in names: xrefs.append({ - "name": name, + "name": find_distribution_for_module(name), "range": make_range( start_node.lineno - 1, start_node.col_offset, @@ -205,7 +266,7 @@ def visit_Import(self, impt): if has_end and impt.end_lineno is not None and impt.end_col_offset is not None: for alias in impt.names: xrefs.append({ - "name": alias.name, + "name": find_distribution_for_module(alias.name), "range": make_range( impt.lineno - 1, impt.col_offset, @@ -222,7 +283,7 @@ def visit_ImportFrom(self, impt): has_end = hasattr(impt, 'end_lineno') and hasattr(impt, 'end_col_offset') if has_end and impt.end_lineno is not None and impt.end_col_offset is not None: xrefs.append({ - "name": impt.module, + "name": find_distribution_for_module(impt.module), "range": make_range( impt.lineno - 1, impt.col_offset, @@ -253,7 +314,7 @@ def visit_Call(self, call): has_end = hasattr(call, 'end_lineno') and hasattr(call, 'end_col_offset') if has_end and call.end_lineno is not None and call.end_col_offset is not None: xrefs.append({ - "name": tgt, + "name": find_distribution_for_module(tgt), "range": make_range( call.lineno - 1, call.col_offset, @@ -333,5 +394,4 @@ def generic_visit(self, node): copied_xref = dict(xref) copied_xref["name"] = name remapped_xrefs.append(copied_xref) -print(json.dumps(remapped_xrefs))` -} \ No newline at end of file +print(json.dumps(remapped_xrefs)) diff --git a/src/data/python/interpreter.ts b/src/data/python/interpreter.ts index 5ce1a88..360d6c4 100644 --- a/src/data/python/interpreter.ts +++ b/src/data/python/interpreter.ts @@ -1,69 +1,324 @@ import * as vscode from 'vscode' -import { EXTENSION_PREFIX } from '../../util'; +import { EXTENSION_PREFIX } from '../../util' +import { PythonExtension } from '@vscode/python-extension'; async function getPythonExtension() { - const msPython = vscode.extensions.getExtension('ms-python.python'); - if (msPython && !msPython.isActive) await msPython.activate(); - return msPython?.exports; + const msPython = vscode.extensions.getExtension('ms-python.python') + if (msPython && !msPython.isActive) await msPython.activate() + return msPython?.exports +} + +// TODO: defer to python interpreter to provide this list +const builtins = new Set([ + "__future__", + "__hello__", + "__phello__", + "_abc", + "_aix_support", + "_ast", + "_codecs", + "_collections", + "_collections_abc", + "_compat_pickle", + "_compression", + "_functools", + "_imp", + "_io", + "_locale", + "_markupbase", + "_operator", + "_osx_support", + "_py_abc", + "_pydatetime", + "_pydecimal", + "_pyio", + "_pylong", + "_signal", + "_sitebuiltins", + "_sre", + "_stat", + "_string", + "_strptime", + "_symtable", + "_sysconfigdata__darwin_darwin", + "_thread", + "_threading_local", + "_tokenize", + "_tracemalloc", + "_typing", + "_warnings", + "_weakref", + "_weakrefset", + "abc", + "aifc", + "antigravity", + "argparse", + "ast", + "asyncio", + "atexit", + "base64", + "bdb", + "bisect", + "builtins", + "bz2", + "cProfile", + "calendar", + "cgi", + "cgitb", + "chunk", + "cmd", + "code", + "codecs", + "codeop", + "collections", + "colorsys", + "compileall", + "concurrent", + "configparser", + "contextlib", + "contextvars", + "copy", + "copyreg", + "crypt", + "csv", + "ctypes", + "curses", + "dataclasses", + "datetime", + "dbm", + "decimal", + "difflib", + "dis", + "doctest", + "email", + "encodings", + "ensurepip", + "enum", + "errno", + "faulthandler", + "filecmp", + "fileinput", + "fnmatch", + "fractions", + "ftplib", + "functools", + "gc", + "genericpath", + "getopt", + "getpass", + "gettext", + "glob", + "graphlib", + "gzip", + "hashlib", + "heapq", + "hmac", + "html", + "http", + "idlelib", + "imaplib", + "imghdr", + "importlib", + "inspect", + "io", + "ipaddress", + "itertools", + "json", + "keyword", + "lib2to3", + "linecache", + "locale", + "logging", + "lzma", + "mailbox", + "mailcap", + "marshal", + "mimetypes", + "modulefinder", + "multiprocessing", + "netrc", + "nntplib", + "ntpath", + "nturl2path", + "numbers", + "opcode", + "operator", + "optparse", + "os", + "pathlib", + "pdb", + "pickle", + "pickletools", + "pipes", + "pkgutil", + "platform", + "plistlib", + "poplib", + "posix", + "posixpath", + "pprint", + "profile", + "pstats", + "pty", + "pwd", + "py_compile", + "pyclbr", + "pydoc", + "pydoc_data", + "queue", + "quopri", + "random", + "re", + "reprlib", + "rlcompleter", + "runpy", + "sched", + "secrets", + "selectors", + "shelve", + "shlex", + "shutil", + "signal", + "site", + "smtplib", + "sndhdr", + "socket", + "socketserver", + "sqlite3", + "sre_compile", + "sre_constants", + "sre_parse", + "ssl", + "stat", + "statistics", + "string", + "stringprep", + "struct", + "subprocess", + "sunau", + "symtable", + "sys", + "sysconfig", + "tabnanny", + "tarfile", + "telnetlib", + "tempfile", + "test", + "textwrap", + "this", + "threading", + "time", + "timeit", + "tkinter", + "token", + "tokenize", + "tomllib", + "trace", + "traceback", + "tracemalloc", + "tty", + "turtle", + "turtledemo", + "types", + "typing", + "unittest", + "urllib", + "uu", + "uuid", + "venv", + "warnings", + "wave", + "weakref", + "webbrowser", + "wsgiref", + "xdrlib", + "xml", + "xmlrpc", + "zipapp", + "zipfile", + "zipimport", + "zoneinfo" +]) +export function isPythonBuiltin(name: string) { + return builtins.has(name) } export async function initPython(): Promise { - const ext = await getPythonExtension(); + const ext = await getPythonExtension() if (ext) { return ext.environments.onDidChangeActiveEnvironmentPath((e: unknown) => { - changeMSPython.fire(); - }); + changeMSPython.fire() + }) } - return new vscode.Disposable(() => {}); + return new vscode.Disposable(() => { }) } -const warned = new Set(); - -export async function getPythonInterpreter(fileName?: string): Promise { - // no interpreter in virtual workspace - if (vscode.workspace.workspaceFolders?.every(f => f.uri.scheme !== 'file')) return - const workspaceConfig = vscode.workspace.getConfiguration(EXTENSION_PREFIX); - const pathOverride = workspaceConfig.get('pythonInterpreter'); +const warned = new Set() +export async function getPythonInterpreter(doc?: vscode.TextDocument): Promise<{ execPath: string } | null> { + let execPath: string = 'python' + let usingSystemPath = true + const workspaceConfig = vscode.workspace.getConfiguration(EXTENSION_PREFIX) + const pathOverride = workspaceConfig.get('pythonInterpreter') if (pathOverride) { - return Promise.resolve(vscode.workspace.fs.stat(vscode.Uri.file(pathOverride))).then( - st => { - if (st.type & vscode.FileType.File) return pathOverride; - throw new Error('not a file') + try { + const st = await vscode.workspace.fs.stat(vscode.Uri.file(pathOverride)) + if (st.type & vscode.FileType.File) { + usingSystemPath = false + execPath = pathOverride } - ).catch(err => { + } catch { + } + if (usingSystemPath) { vscode.window.showErrorMessage(`Failed to find Python binary at '${pathOverride}'. Please update ${EXTENSION_PREFIX}.pythonInterpreter.`) - }) + } } - const ext = await getPythonExtension(); - const env = await ext?.environments.resolveEnvironment( - ext?.environments.getActiveEnvironmentPath(fileName && vscode.Uri.file(fileName)) - ) - if (env) return env.executable.uri.fsPath; + if (usingSystemPath) { + const ext: PythonExtension = await PythonExtension.api(); + if (ext) { + + const env = await ext.environments.resolveEnvironment( + ext.environments.getActiveEnvironmentPath(doc ? doc.uri : undefined) + ) + if (env) { + usingSystemPath = false + execPath = env.executable.uri?.fsPath || env.executable.sysPrefix || env.executable.uri?.path || '' + } else { + // TODO: make this less noisy + // warnToInstallMoreReliablePython(ext); + } + } + } + return { + execPath + } +} +function warnToInstallMoreReliablePython(ext: vscode.Extension) { + const workspaceConfig = vscode.workspace.getConfiguration(EXTENSION_PREFIX) const workspaceID = vscode.workspace.name || vscode.workspace.workspaceFolders?.map(f => f.uri.fsPath).join(',') || - vscode.window.activeTextEditor?.document.uri.fsPath; + vscode.window.activeTextEditor?.document.uri.fsPath if (workspaceID) { - if (warned.has(workspaceID)) return; - warned.add(workspaceID); + if (warned.has(workspaceID)) return + warned.add(workspaceID) } - const installPython = 'Install Python extension'; - const configPython = 'Configure Python extension'; - const setPath = `Configure Socket`; + const installPython = 'Install Python extension' + const configPython = 'Configure Python extension' + const setPath = `Configure Socket` vscode.window.showErrorMessage( `Socket failed to find a Python installation; please ${ext ? 'pick an interpreter within' : 'install'} the Python extension or set ${EXTENSION_PREFIX}.pythonInterpreter.`, ext ? configPython : installPython, setPath ).then(async res => { if (res === installPython) { - vscode.env.openExternal(vscode.Uri.parse('vscode:extension/ms-python.python')); + vscode.env.openExternal(vscode.Uri.parse('vscode:extension/ms-python.python')) } else if (res === configPython) { - vscode.commands.executeCommand('python.setInterpreter'); + vscode.commands.executeCommand('python.setInterpreter') } else if (res === setPath) { await workspaceConfig.update('pythonInterpreter', '', vscode.ConfigurationTarget.Global) - vscode.commands.executeCommand('workbench.action.openSettingsJson'); + vscode.commands.executeCommand('workbench.action.openSettingsJson') } }) } -const changeMSPython = new vscode.EventEmitter(); -export const onMSPythonInterpreterChange = changeMSPython.event; +const changeMSPython = new vscode.EventEmitter() +export const onMSPythonInterpreterChange = changeMSPython.event diff --git a/src/data/report.ts b/src/data/report.ts deleted file mode 100644 index 7dd65b1..0000000 --- a/src/data/report.ts +++ /dev/null @@ -1,471 +0,0 @@ -import * as vscode from "vscode"; -import { once } from 'node:events'; -import { FormData, File } from 'formdata-node'; -import { FormDataEncoder } from 'form-data-encoder'; -import type { IncomingMessage } from 'node:http'; -import * as https from 'node:https'; -import { Readable } from 'node:stream'; -import { createHash } from 'node:crypto'; -import { text } from 'node:stream/consumers'; -import { setTimeout } from 'node:timers/promises'; -import { EXTENSION_PREFIX, addDisposablesTo, getWorkspaceFolderURI, WorkspaceData } from '../util'; -import * as stableStringify from 'safe-stable-stringify'; -import watch, { SharedFilesystemWatcherHandler } from '../fs-watch' -import { GlobPatterns, getGlobPatterns } from './glob-patterns'; -import { getStaticTOMLValue, parseTOML } from 'toml-eslint-parser'; -import * as socketAPIConfig from './socket-api-config' -import { GoModuleVersion, parseGoMod } from "./go/mod-parser"; - -export type SocketReport = { - issues: Array<{ - type: string, - value: { - severity: string, - description: string, - locations: Array<{type: string, value: any}> - } - }> -}; - -type IssueEco = string -type IssueSource = string -type IssueSeverity = string -type IssueType = string -type IssueDescription = string -type IssueRadixTrie = Map< - IssueEco, Map< - IssueSource, Map< - IssueSeverity, Map< - IssueType, Set - > - > - > -> -export function radixMergeReportIssues(report: SocketReport): IssueRadixTrie { - let issuesForEco: IssueRadixTrie = new Map() - for (const issue of report.issues) { - const type = issue.type - const description = issue.value.description - const severity = issue.value.severity - for (const issueLoc of issue.value.locations) { - const depEco = issueLoc.type; - const existingIssuesByEco = issuesForEco.get(depEco) ?? new Map() - issuesForEco.set(depEco, existingIssuesByEco) - const depSource = issueLoc.value.package - const existingIssuesBySeverity = existingIssuesByEco.get(depSource) ?? new Map() - existingIssuesByEco.set(depSource, existingIssuesBySeverity) - const existingIssuesByType = existingIssuesBySeverity.get(severity) ?? new Map() - existingIssuesBySeverity.set(severity, existingIssuesByType) - const existingIssuesByDescription = existingIssuesByType.get(type) ?? new Set() - existingIssuesByType.set(type, existingIssuesByDescription) - existingIssuesByDescription.add(description); - } - } - return issuesForEco -} - -// type ReportEvent = {uri: string, report: SocketReport} -// type onReportHandler = (evt: ReportEvent) => void -export async function activate(context: vscode.ExtensionContext, disposables?: Array) { - const status = vscode.window.createStatusBarItem(`${EXTENSION_PREFIX}.report`, vscode.StatusBarAlignment.Right) - status.name = 'Socket Security' - status.hide(); - function showErrorStatus(error: unknown) { - status.color = new vscode.ThemeColor('statusBarItem.errorForeground'); - status.text = 'Socket Report Error'; - if (error && typeof error === 'object' && 'message' in error) { - status.tooltip = String(error?.message) - } else { - status.tooltip = error == undefined ? undefined : String(error) - } - status.text = String(status.tooltip) - console.error('ERROR in Reporting', status.tooltip) - status.show(); - } - function showStatus(text: string, tooltip?: string) { - status.color = new vscode.ThemeColor('statusBarItem.foreground'); - status.text = text; - status.tooltip = tooltip; - status.show(); - } - const { workspace } = vscode - - addDisposablesTo( - disposables, - socketAPIConfig.onAPIConfChange(() => reportData.recalculateAll()) - ) - - const reportWatcher: SharedFilesystemWatcherHandler = { - onDidChange(uri) { - runReport(uri) - }, - onDidCreate(uri) { - runReport(uri) - }, - onDidDelete(uri) { - knownPkgFiles.delete(uri.fsPath) - runReport(uri); - } - }; - - const supportedFiles = await getGlobPatterns(); - - const watchTargets = [ - ...Object.values(supportedFiles.npm), - ...Object.values(supportedFiles.pypi), - ...Object.values(supportedFiles.golang) - ].map(info => info.pattern); - - addDisposablesTo( - disposables, - ...watchTargets.map(p => watch(p, reportWatcher)) - ); - - type PackageRootCacheKey = string & { _tag: 'PackageRootCacheKey' } - function pkgJSONCacheKey(src: Buffer): PackageRootCacheKey { - const { - dependencies, - devDependencies, - peerDependencies, - bundledDependencies, - optionalDependencies - } = JSON.parse(src.toString()); - return (stableStringify.stringify({ - dependencies, - devDependencies, - peerDependencies, - bundledDependencies, - optionalDependencies - }) ?? '' ) as PackageRootCacheKey; - } - async function goModCacheKey(src: Buffer): Promise { - const parsed = await parseGoMod(src.toString()) - if (!parsed) { - throw new Error('failed to parse go.mod') - } - const compareMods = (a: GoModuleVersion, b: GoModuleVersion) => - a.Path.localeCompare(b.Path) || a.Version!.localeCompare(b.Version!) - const required = parsed.Require?.map(req => req.Mod).sort(compareMods) - const replaced = parsed.Replace?.map(repl => ({ New: repl.New, Old: repl.Old })) - .sort((a, b) => compareMods(a.New, b.New) || compareMods(a.Old, b.Old)) - const excluded = parsed.Exclude?.map(excl => excl.Mod).sort(compareMods) - - return (stableStringify.stringify({ - required, - replaced, - excluded - }) ?? '') as PackageRootCacheKey - } - function pipfileCacheKey(src: Buffer): PackageRootCacheKey { - const value = getStaticTOMLValue(parseTOML(src.toString())) as { - packages: Record, - 'dev-packages': Record - }; - return (stableStringify.stringify({ - packages: value.packages, - devPackages: value['dev-packages'] - }) ?? '') as PackageRootCacheKey; - } - function pyprojectCacheKey(src: Buffer): PackageRootCacheKey { - const value = getStaticTOMLValue(parseTOML(src.toString())) as { - project?: { - dependencies?: string[], - 'optional-dependencies': string[] - }; - tool?: { - poetry?: { - dependencies?: Record, - 'dev-dependencies'?: Record, - group?: Record - }> - } - } - }; - return (stableStringify.stringify({ - dependencies: value.project?.dependencies, - optionalDependencies: value.project?.["optional-dependencies"], - poetryDependencies: value.tool?.poetry?.dependencies, - poetryDevDependencies: value.tool?.poetry?.['dev-dependencies'], - poetryGroupDependencies: Object.values( - value.tool?.poetry?.group || {} - ).map(group => group?.dependencies) - }) ?? '') as PackageRootCacheKey; - } - function requirementsCacheKey(src: Buffer): PackageRootCacheKey { - const value = src.toString() - .split('\n') - .map(line => line.replace(/(\s|^)#.*/, '')) - .filter(line => line); - return value.sort().join('\n') as PackageRootCacheKey; - } - function hashCacheKey(src: Buffer): PackageRootCacheKey { - return createHash('sha256').update(src).digest('hex') as PackageRootCacheKey; - } - - const knownPkgFiles: Map = new Map() - - type Awaitable = T | { then (onfulfilled: (result: T) => unknown): unknown } - - async function findWorkspaceFiles(pattern: string, getCacheKey: (src: Buffer, path: string) => Awaitable) { - const uris = await workspace.findFiles(pattern, '**/{node_modules,.git}/**'); - - return Promise.all(uris.map(async uri => { - const raw = await workspace.fs.readFile(uri) - const body = Buffer.from(raw.buffer, raw.byteOffset, raw.byteLength) - let cacheKey: PackageRootCacheKey | null = null; - try { - cacheKey = await getCacheKey(body, uri.fsPath) - } catch (e) { - // failed to load - empty cacheKey - } - return { - uri, - body, - cacheKey - } - })) - } - - function uriParent(uri: vscode.Uri) { - return vscode.Uri.joinPath(uri, '..').fsPath; - } - - let warnedLogin = false - - async function runReport(uri: vscode.Uri, force: boolean = false) { - if (!force) { - if (!vscode.workspace.getConfiguration(EXTENSION_PREFIX).get('reportsEnabled')) { - return - } - const result = await socketAPIConfig.getExistingAPIConfig() - if (!result) { - if (!warnedLogin) { - warnedLogin = true - const realLogin = 'Log in' - const publicLogin = 'Use public token' - const res = await vscode.window.showErrorMessage( - 'Please log into Socket or use the free, public demo to run reports on your dependency tree.', - realLogin, - publicLogin - ) - if (res === publicLogin) { - await socketAPIConfig.usePublicConfig(true) - } else if (res === realLogin) { - await socketAPIConfig.getAPIConfig(true) - } - } - - if (!(await socketAPIConfig.getExistingAPIConfig())) { - return - } - } - } - const apiConfig = await socketAPIConfig.getAPIConfig() - if (!apiConfig) { - return - } - const authorizationHeaderValue = socketAPIConfig.toAuthHeader(apiConfig.apiKey) - const workspaceFolderURI = getWorkspaceFolderURI(uri) - if (!workspaceFolderURI) { - return - } - - let globPatterns: GlobPatterns - try { - globPatterns = await getGlobPatterns() - } catch (e) { - showErrorStatus(e); - throw e; - } - - const dynamicPyFiles = Object.keys(globPatterns.pypi) - .filter(name => !['pipfile', 'pyproject', 'requirements'].includes(name)) - .map(name => globPatterns.pypi[name]); - - const [ - pkgJSONFiles, - goModFiles, - ...allPyFiles - ] = await Promise.all([ - findWorkspaceFiles(`**/${globPatterns.npm.packagejson.pattern}`, pkgJSONCacheKey), - findWorkspaceFiles(`**/${globPatterns.golang.gomod.pattern}`, goModCacheKey), - findWorkspaceFiles(`**/${globPatterns.pypi.pipfile.pattern}`, pipfileCacheKey), - findWorkspaceFiles(`**/${globPatterns.pypi.pyproject.pattern}`, pyprojectCacheKey), - findWorkspaceFiles(`**/${globPatterns.pypi.requirements.pattern}`, requirementsCacheKey), - ...dynamicPyFiles.map(p => - findWorkspaceFiles(`**/${p.pattern}`, hashCacheKey) - ) - ]) - - const pkgJSONParents = new Set(pkgJSONFiles.map(file => uriParent(file.uri))) - const npmLockFilePatterns = Object.keys(globPatterns.npm) - .filter(name => name !== 'packagejson') - .map(name => globPatterns.npm[name]) - - const npmLockFiles = (await Promise.all( - npmLockFilePatterns.map(p => findWorkspaceFiles(`**/${p.pattern}`, hashCacheKey)) - )).flat().filter(file => pkgJSONParents.has(uriParent(file.uri))) - - const goModParents = new Set(goModFiles.map(file => uriParent(file.uri))) - const goExtraFilePatterns = Object.keys(globPatterns.golang) - .filter(name => name !== 'gomod') - .map(name => globPatterns.golang[name]) - - const goExtraFiles = (await Promise.all( - goExtraFilePatterns.map(p => findWorkspaceFiles(`**/${p.pattern}`, hashCacheKey)) - )).flat().filter(file => goModParents.has(uriParent(file.uri))) - - const files = [ - ...pkgJSONFiles, ...npmLockFiles, - ...goModFiles, ...goExtraFiles, - ...allPyFiles.flat() - ] - - let needRun = false - for (const file of files) { - if (file.cacheKey === null) continue - let existing = knownPkgFiles.get(file.uri.fsPath) - if (!existing) { - needRun = true - existing = { cacheKey: file.cacheKey } - knownPkgFiles.set(file.uri.fsPath, existing) - } - if (existing.cacheKey !== file.cacheKey) { - needRun = true - } - } - if (!force && !needRun) return - - let id: string; - - try { - showStatus('Creating Socket Report...') - const form = new FormData(); - for (const file of files) { - const filepath = workspace.asRelativePath(file.uri) - const fileObj = new File([file.body], filepath) - form.set(filepath, fileObj); - } - const reportBody = new FormDataEncoder(form); - - const req = https.request(`https://api.socket.dev/v0/report/upload`, { - method: 'PUT', - headers: { - ...reportBody.headers, - 'Authorization': authorizationHeaderValue, - } - }); - Readable.from(reportBody).pipe(req); - - const [res] = (await once(req, 'response')) as [IncomingMessage] - const result = JSON.parse(await text(res)); - if (res.statusCode !== 200) { - throw new Error(result.error.message) - } - id = result.id; - } catch (e) { - showErrorStatus(e); - throw e; - } - - try { - showStatus('Running Socket Report...') - const MAX_ATTEMPTS = 10 - let attempts = 0 - while (attempts++ < MAX_ATTEMPTS) { - const req = https.get(`https://api.socket.dev/v0/report/view/${encodeURIComponent(id)}`, { - headers: { - 'Authorization': authorizationHeaderValue - } - }); - req.end(); - const [res] = (await once(req, 'response')) as [IncomingMessage] - if (res.statusCode === 200) { - const report = JSON.parse(await text(res)) as SocketReport - context.workspaceState.update(`${EXTENSION_PREFIX}.lastReport`, report) - context.workspaceState.update(`${EXTENSION_PREFIX}.lastReport`, report) - reportData.update(workspaceFolderURI, report); - status.text = 'Socket Report Done' - status.hide() - return - } else { - let wait = -1; - if (res.statusCode === 429) { - const waitUntil = res.headers['retry-after'] ?? '5' - if (/^\d+$/.test(waitUntil)) { - wait = parseInt(waitUntil, 10) * 1000; - } else { - let waitUntilTime = Date.parse(waitUntil) - wait = waitUntilTime - Date.now(); - } - } else if ([ - 404, - 403, - undefined - ].includes(res.statusCode)) { - attempts = MAX_ATTEMPTS - } else { - wait = 5000 - } - if (wait > 0) { - await setTimeout(wait) - } - } - } - throw new Error('unable to obtain report in timely manner') - } catch (e) { - showErrorStatus(e); - throw e; - } - } - function getDefaultReport(): SocketReport { - const lastReport = context.workspaceState.get(`${EXTENSION_PREFIX}.lastReport`) as (SocketReport | undefined) - return lastReport ?? { - issues: [] - } - } - const reportData = new WorkspaceData( - (uri) => runReport(uri), - () => getDefaultReport() - ) - reportData.recalculateAll() - const api = { - effectiveReportForUri: (uri: vscode.Uri) => reportData.get(uri), - onReport(...params: Parameters) { - return reportData.on(...params) - } - } as const - context.subscriptions.push( - vscode.commands.registerCommand(`${EXTENSION_PREFIX}.runReport`, () => { - if (vscode.workspace.getConfiguration(EXTENSION_PREFIX).get('reportsEnabled')) { - if (vscode.workspace.workspaceFolders) { - for (const folder of vscode.workspace.workspaceFolders) { - runReport(folder.uri, true); - } - } - } else { - const enableGloballyOption = "Enable globally & retry"; - const enableWorkspaceOption = "Enable in workspace & retry"; - vscode.window.showErrorMessage("Socket Security reports are disabled", enableGloballyOption, enableWorkspaceOption).then((choice) => { - if (choice) { - vscode.workspace.getConfiguration().update( - `${EXTENSION_PREFIX}.reportsEnabled`, - true, - choice === enableGloballyOption ? - true : - undefined - ).then( - () => { - vscode.commands.executeCommand(`${EXTENSION_PREFIX}.runReport`); - } - ) - } - }); - } - }) - ) - return api -} \ No newline at end of file diff --git a/src/data/socket-yaml.ts b/src/data/socket-yaml.ts deleted file mode 100644 index c74f9aa..0000000 --- a/src/data/socket-yaml.ts +++ /dev/null @@ -1,208 +0,0 @@ -import * as vscode from 'vscode'; -import { getDefaultConfig } from '@socketsecurity/config' -import type { SocketYml } from '@socketsecurity/config' -import { parseDocument, YAMLMap } from 'yaml' -import { getWorkspaceFolderURI, addDisposablesTo, WorkspaceData } from '../util' -import watch from '../fs-watch'; - -type EditorSocketYml = SocketYml & { - enabled: boolean -} - -const DEFAULT_SOCKET_YML: Readonly = { - enabled: true, - ...getDefaultConfig() -} - - -type ConfigForUri = { - uri: vscode.Uri, - data: EditorSocketYml, - defaulted: boolean, -} -type OnConfigCallback = (e: ConfigForUri) => void -type PathToValue = Array | string - -type API = { - effectiveConfigForUri(uri: vscode.Uri): ConfigForUri, - onConfig(from: vscode.Uri | null, fn: OnConfigCallback): vscode.Disposable, - update(from: vscode.Uri, ...values: Array<[PathToValue, any]>): Promise -} -export async function activate(context: vscode.ExtensionContext, disposables?: Array): Promise { - function getSocketYmlURIAndWorkspaceURI(uri: vscode.Uri): { - workspaceFolderURI: vscode.Uri, - socketYmlURI: vscode.Uri - } | undefined { - const workspaceFolderURI = getWorkspaceFolderURI(uri) - if (!workspaceFolderURI) { - return - } - const socketYmlURI = vscode.Uri.joinPath(workspaceFolderURI, 'socket.yml'); - return { - workspaceFolderURI, - socketYmlURI - } - } - /** - * workspacefolder -> config - */ - const workspaceConfigs = new Map() - /** - * Parses the config in a race condition safe way. When done notifies via - * onConfig() events. When a race to parse is found, likely due to multiple events, - * cancels first parse. - * @param uri the uri of a socket.yml - */ - async function parseAgain(uri: vscode.Uri): Promise { - const uris = getSocketYmlURIAndWorkspaceURI(uri); - if (!uris) { - return; - } - try { - const buf = await vscode.workspace.fs.readFile(uris.socketYmlURI); - const src = Buffer.from(buf).toString() - const doc = parseDocument(src).toJSON() - const def = DEFAULT_SOCKET_YML - const editorSocketYml: EditorSocketYml = { - enabled: (doc.enabled ?? true) ? true : false, - issueRules: { - ...def.issueRules, - ...doc.issues, - ...doc.issueRules - }, - githubApp: { - ...def.githubApp, - ...doc.githubApp - }, - projectIgnorePaths: doc.projectIgnorePaths, - version: def.version - } - socketYamlData.update(uris.socketYmlURI, editorSocketYml) - } catch (e) { - if (e && typeof e === 'object' && 'code' in e && e.code === 'FileNotFound') { - socketYamlData.update(uris.socketYmlURI, undefined) - } - } - } - - const pendingUpdates: Array<{ - socketYmlURI: vscode.Uri, - values: Array<[Array | string, any]>, - resolve: () => void, - reject: (err: unknown) => void - }> = []; - let activeUpdate: typeof pendingUpdates[0] | null = null - async function doSingleUpdate() { - if (activeUpdate || pendingUpdates.length === 0) { - return - } - activeUpdate = pendingUpdates.shift() ?? null - if (!activeUpdate) { - return; - } - try { - const { socketYmlURI } = activeUpdate - if (!socketYmlURI) { - activeUpdate.reject(new Error('unable to find socketYmlURI')); - return; - } - // have to recalculate, this could have changed between queue and execution - const workspaceFolder = vscode.workspace.getWorkspaceFolder(socketYmlURI) - if (!workspaceFolder) { - activeUpdate.reject(new Error('unable to find workspaceFolder')); - return; - } - let src: string - try { - const buf = await vscode.workspace.fs.readFile(socketYmlURI); - src = Buffer.from(buf).toString() - } catch (e) { - if (e && typeof e === 'object' && 'code' in e && e.code === 'FileNotFound') { - workspaceConfigs.delete(workspaceFolder.uri.fsPath) - src = '' - } else { - activeUpdate.reject(e) - return - } - } - const editableConfig = parseDocument(src, { - keepSourceTokens: true - }) - for (let [updatePath, value] of activeUpdate.values) { - let needle = editableConfig; - if (typeof updatePath === 'string') { - updatePath = [updatePath] - } - let i; - for (i = 0; i < updatePath.length - 1; i++) { - const part = updatePath[i] - let newNeedle: any - let existingNode = needle.get(part) - if (!existingNode || Array.isArray(existingNode) || typeof existingNode !== 'object') { - newNeedle = new YAMLMap() - } else { - newNeedle = existingNode - } - needle.set(part, newNeedle) - needle = newNeedle - } - needle.set(updatePath[i], value) - } - const editedSrc = editableConfig.toString() - await vscode.workspace.fs.writeFile(socketYmlURI, Buffer.from(editedSrc)); - activeUpdate.resolve() - } catch (e) { - activeUpdate.reject(e) - } finally { - activeUpdate = null - if (pendingUpdates.length) { - doSingleUpdate() - } - } - } - function update(from: vscode.Uri, ...values: Array<[PathToValue, any]>): Promise { - const uris = getSocketYmlURIAndWorkspaceURI(from) - if (!uris) { - return Promise.reject(new Error('unable to find workspace folder, please open a folder')) - } - const promise = new Promise((resolve, reject) => { - pendingUpdates.push({ - socketYmlURI: uris.socketYmlURI, - values, - resolve, - reject - }) - }) - doSingleUpdate() - return promise; - } - - addDisposablesTo( - disposables, - watch('socket.yml', { - onDidChange(e) { - parseAgain(e) - }, - onDidCreate(e) { - parseAgain(e) - }, - onDidDelete(uri) { - socketYamlData.update(uri, undefined) - } - }) - ); - - const socketYamlData = new WorkspaceData((uri: vscode.Uri) => { - parseAgain(uri) - }, () => { - return DEFAULT_SOCKET_YML - }) - const api: API = { - effectiveConfigForUri: (uri) => socketYamlData.get(uri), - onConfig: (...params: Parameters): vscode.Disposable => { - return socketYamlData.on(...params) - }, - update - } as const - return api -} \ No newline at end of file diff --git a/src/esbuild.d.ts b/src/esbuild.d.ts index 04cdc4b..80b42fe 100644 --- a/src/esbuild.d.ts +++ b/src/esbuild.d.ts @@ -6,4 +6,9 @@ declare module '*.wasm' { declare module '*.go' { const filePath: string export default filePath -} \ No newline at end of file +} + +declare module '*.py' { + const fileContents: string + export default fileContents +} diff --git a/src/extension.ts b/src/extension.ts index 0b66db6..37b24f9 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -3,257 +3,18 @@ import * as vscode from 'vscode'; import { ExtensionContext, workspace } from 'vscode'; -import * as socketYaml from './data/socket-yaml' import * as socketAPIConfig from './data/socket-api-config' -import * as pkgJSON from './ui/package-json'; -import * as goMod from './ui/go-mod' -import * as pyproject from './ui/pyproject'; -import * as pipfile from './ui/pipfile'; -import * as requirements from './ui/requirements'; -import * as report from './data/report' -import { radixMergeReportIssues, SocketReport } from './data/report'; -import { EXTENSION_PREFIX, DIAGNOSTIC_SOURCE_STR, getWorkspaceFolderURI, getDiagnosticSeverity, sortIssues } from './util'; +import { EXTENSION_PREFIX, getWorkspaceFolderURI} from './util'; import * as editorConfig from './data/editor-config'; -import { installGithubApp, sniffForGithubOrgOrUser } from './data/github'; import * as files from './ui/file' -import { parseExternals } from './ui/parse-externals'; +// import { parseExternals } from './ui/externals/parse-externals'; import watch, { SharedFilesystemWatcherHandler } from './fs-watch'; import { initPython, onMSPythonInterpreterChange } from './data/python/interpreter'; import { initGo } from './data/go/executable'; import { getGlobPatterns } from './data/glob-patterns'; export async function activate(context: ExtensionContext) { - context.subscriptions.push( - vscode.commands.registerCommand(`${EXTENSION_PREFIX}.installGitHubApp`,installGithubApp), - vscode.commands.registerCommand(`${EXTENSION_PREFIX}.ignoreIssueType`, async (from: vscode.Uri, type: string) => { - if (vscode.env.isTelemetryEnabled) { - // ignored on which dep - // how many times diagnostic has show prior - // version of pkg bumped after diagnostic seen? - } - socketConfig.update(from, [ - ['issueRules', type], false - ]) - }), - ) const config = editorConfig.activate(context); - const [socketConfig, reports] = await Promise.all([ - socketYaml.activate(context), - report.activate(context) - ]) - files.activate(context, reports, socketConfig, config) socketAPIConfig.init(context.subscriptions) - const diagnostics = vscode.languages.createDiagnosticCollection() - const watchHandler: SharedFilesystemWatcherHandler = { - onDidChange(f) { - const workspaceFolderURI = getWorkspaceFolderURI(f) - if (!workspaceFolderURI) { - return; - } - populateDiagnostics(workspaceFolderURI) - }, - onDidCreate(f) { - const workspaceFolderURI = getWorkspaceFolderURI(f) - if (!workspaceFolderURI) { - return; - } - populateDiagnostics(workspaceFolderURI) - }, - onDidDelete(f) { - diagnostics.delete(f) - } - } - - const supportedFiles = await getGlobPatterns(); - - const watchTargets = { - npm: ['packagejson'], - pypi: ['pipfile', 'requirements', 'pyproject'], - golang: ['gomod', 'gosum'] - } - - const watchTargetValues = Object.entries(watchTargets).flatMap(([eco, names]) => names.map(name => ({ - eco, - ...supportedFiles[eco][name] - }))); - - context.subscriptions.push( - diagnostics, - await initPython(), - await initGo(), - ...watchTargetValues.map(target => watch(target.pattern, watchHandler)) - ); - const runAll = () => { - if (workspace.workspaceFolders) { - for (const workFolder of workspace.workspaceFolders) { - populateDiagnostics(workFolder.uri) - } - } - } - runAll(); - context.subscriptions.push( - reports.onReport(null, async (evt) => { - populateDiagnostics(evt.uri) - }), - socketConfig.onConfig(null, async (evt) => { - populateDiagnostics(evt.uri) - }), - config.onDependentConfig([ - `${EXTENSION_PREFIX}.minIssueLevel`, - `${EXTENSION_PREFIX}.pythonInterpreter`, - `${EXTENSION_PREFIX}.goExecutable` - ], runAll), - onMSPythonInterpreterChange(() => { - if (!vscode.workspace.getConfiguration(EXTENSION_PREFIX).get('pythonInterpreter')) { - runAll(); - } - }) - ) - async function normalizeReportAndLocations(report: SocketReport, doc: Parameters[0], eco: string) { - const externals = await parseExternals(doc) - if (!externals) return - const issuesForSource = radixMergeReportIssues(report).get(eco) - if (!issuesForSource) return - let ranges: Record> = Object.create(null); - let prioritizedRanges: Record = Object.create(null) - function pushRelatedRange(name: string, range: vscode.Range) { - const existingRanges = ranges[name] ?? [] - existingRanges.push(range) - ranges[name] = existingRanges - } - for (let { name, range, prioritize } of externals) { - prioritize = prioritize ?? false - let existingIssuesBySeverity = issuesForSource.get(name) - if (!existingIssuesBySeverity) continue - const existingPrioritizedRange = prioritizedRanges[name] - if (existingPrioritizedRange) { - if (existingPrioritizedRange.prioritize) { - if (prioritize && range.start.isBefore(existingPrioritizedRange.range.start)) { - pushRelatedRange(name, existingPrioritizedRange.range); - prioritizedRanges[name] = { range, prioritize } - continue - } else { - pushRelatedRange(name, range); - } - } else { - if (prioritize || range.start.isBefore(existingPrioritizedRange.range.start)) { - pushRelatedRange(name, existingPrioritizedRange.range); - prioritizedRanges[name] = { range, prioritize } - continue - } else { - pushRelatedRange(name, range); - } - } - } else { - prioritizedRanges[name] = { range, prioritize } - } - } - const issueLocations: Array<{ - pkgName: string - type: string - description: string - severity: string - range: vscode.Range - related: vscode.Range[] - }> = [] - for (const [ name, {range} ] of Object.entries(prioritizedRanges)) { - let existingIssuesBySeverity = issuesForSource.get(name) - if (!existingIssuesBySeverity) continue - for (const [severity, existingIssuesByType] of existingIssuesBySeverity) { - for (const type of [...existingIssuesByType.keys()].sort()) { - const existingIssuesByDescription = existingIssuesByType.get(type); - if (existingIssuesByDescription) { - for (const description of existingIssuesByDescription) { - issueLocations.push({ - pkgName: name, - type, - description, - severity, - range, - related: ranges[name] ?? [] - }) - } - } - } - } - } - return issueLocations - } - async function populateDiagnostics(workspaceFolderURI: vscode.Uri) { - const effectiveData = reports.effectiveReportForUri(workspaceFolderURI) - const currentReport = effectiveData.data - if (!currentReport) return - const socketYamlConfig = socketConfig.effectiveConfigForUri(workspaceFolderURI).data - if (socketYamlConfig.enabled === false) { - diagnostics.clear() - return - } - const files = (await Promise.all(watchTargetValues.map(async tgt => ({ - eco: tgt.eco, - files: (await workspace.findFiles(`**/${tgt.pattern}`, '**/{node_modules,.git}/**')) - .filter(uri => getWorkspaceFolderURI(uri) === workspaceFolderURI) - })))).filter(tgt => tgt.files.length); - if (files.length === 0) { - return - } - const apiConf = await socketAPIConfig.getExistingAPIConfig() - if (!apiConf) { - return null - } - const githubOrg = await sniffForGithubOrgOrUser(workspaceFolderURI) - const baseRules = apiConf.orgRules.find(org => org.name === githubOrg)?.issueRules || apiConf.defaultRules - for (const tgt of files) { - for (const textDocumentURI of tgt.files) { - const src = Buffer.from(await workspace.fs.readFile(textDocumentURI)).toString() - const relevantIssues = (await normalizeReportAndLocations(currentReport, { - getText() { - return src - }, - fileName: textDocumentURI.fsPath, - languageId: textDocumentURI.fsPath.endsWith('.json') - ? 'json' - : textDocumentURI.fsPath.endsWith('.toml') - ? 'toml' - : 'plaintext' - }, tgt.eco))?.sort(sortIssues) - if (relevantIssues && relevantIssues.length) { - const diagnosticsToShow = (await Promise.all(relevantIssues.map( - async (issue) => { - const severity = getDiagnosticSeverity(issue.type, issue.severity, apiConf.enforcedRules, baseRules, socketYamlConfig) - if (severity == null) return null - const diag = new vscode.Diagnostic( - issue.range, - issue.description, - severity - ) - diag.relatedInformation = issue.related.map( - (r) => new vscode.DiagnosticRelatedInformation( - new vscode.Location(textDocumentURI, r), - 'installation reference' - ) - ) - diag.source = DIAGNOSTIC_SOURCE_STR - diag.code = `${issue.type}, ${issue.pkgName}` - return diag - } - ))).filter(x => !!x) as vscode.Diagnostic[] - diagnostics.set(textDocumentURI, diagnosticsToShow) - } - } - } - - } - - const pkgActionsHandlers = await Promise.all([ - pkgJSON.registerCodeLensProvider(), - pkgJSON.registerCodeActionsProvider(), - goMod.registerCodeLensProvider(), - goMod.registerCodeActionsProvider(), - pyproject.registerCodeLensProvider(), - pyproject.registerCodeActionsProvider(), - pipfile.registerCodeActionsProvider(), - requirements.registerCodeActionsProvider() - ]) - - context.subscriptions.push(...pkgActionsHandlers) + files.activate(context) } diff --git a/src/infra/log.ts b/src/infra/log.ts new file mode 100644 index 0000000..8d25118 --- /dev/null +++ b/src/infra/log.ts @@ -0,0 +1,9 @@ +import * as vscode from 'vscode'; + +const logger = vscode.window.createOutputChannel('Socket Security', { + log: true +}) + +logger.appendLine('Socket Security extension started') + +export default logger; diff --git a/src/ui/decorations.ts b/src/ui/decorations.ts new file mode 100644 index 0000000..4953e42 --- /dev/null +++ b/src/ui/decorations.ts @@ -0,0 +1,494 @@ +import * as vscode from 'vscode'; +import { parseExternals, SimPURL } from './externals/parse-externals' +import { PURLDataCache } from './purl-alerts-and-scores/manager' +import { PackageScoreAndAlerts } from './purl-alerts-and-scores/manager' +import { isGoBuiltin } from '../data/go/builtins' +import logger from '../infra/log' +import { PURLPackageData } from './purl-alerts-and-scores/manager'; +import { SUPPORTED_LSP_LANGUAGE_IDS } from './languages'; +import { isPythonBuiltin } from '../data/python/interpreter'; +import * as Module from 'module'; +import { log } from 'console' +import { getGlobPatterns } from '../data/glob-patterns' + +export async function activate(context: vscode.ExtensionContext) { + const decoManager = new DecorationManager(context); + for (const lang of Object.keys(SUPPORTED_LSP_LANGUAGE_IDS)) { + vscode.languages.registerHoverProvider({ + language: lang, + }, { + provideHover(document, position) { + return decoManager.docManagers.get(document.uri.toString() as TextDocumentURIString)?.provideHover(document, position); + } + }) + } + const patterns = await getGlobPatterns(); + // for (const [group, patternsForGroup] of Object.entries(patterns)) { + // for (const [name, {pattern}] of Object.entries(patternsForGroup)) { + vscode.languages.registerHoverProvider({ + language: 'json', + // pattern, + }, { + provideHover(document, position) { + return decoManager.docManagers.get(document.uri.toString() as TextDocumentURIString)?.provideHover(document, position); + } + }) + // } + // } +} +class DecorationTypes { + informativeDecoration: vscode.TextEditorDecorationType + warningDecoration: vscode.TextEditorDecorationType + errorDecoration: vscode.TextEditorDecorationType + constructor(context: vscode.ExtensionContext) { + this.errorDecoration = vscode.window.createTextEditorDecorationType({ + isWholeLine: true, + after: { + margin: '0 0 0 2rem', + contentIconPath: vscode.Uri.file(context.asAbsolutePath('logo-red.svg')), + width: '12px', + height: '12px', + }, + }); + logger.info('Created error decoration', this.errorDecoration.key); + this.warningDecoration = vscode.window.createTextEditorDecorationType({ + isWholeLine: true, + after: { + margin: '0 0 0 2rem', + contentIconPath: vscode.Uri.file(context.asAbsolutePath('logo-yellow.svg')), + width: '12px', + height: '12px', + }, + }); + logger.info('Created warning decoration', this.warningDecoration.key); + this.informativeDecoration = vscode.window.createTextEditorDecorationType({ + isWholeLine: true + }); + logger.info('Created informative decoration', this.informativeDecoration.key); +} +} + +class DecorationManager { + docManagers: Map = new Map(); + docChangeWatchers: vscode.Disposable + docCloseWatchers: vscode.Disposable + docOpenWatchers: vscode.Disposable + editorChangeWatchers: vscode.Disposable + purlManagers: DecorationManagerForPURLCache + + constructor(context: vscode.ExtensionContext) { + const decorationTypes = new DecorationTypes(context); + this.purlManagers = new DecorationManagerForPURLCache(decorationTypes); + function updateDoc(doc: vscode.TextDocument) { + const docURI = doc.uri.toString() as TextDocumentURIString; + if (docURI.startsWith('output:')) { + return; // ignore output documents + } + let manager = managerForDoc(docURI); + manager.update(doc) + } + const managerForDoc = (docURI: TextDocumentURIString) => { + let manager = this.docManagers.get(docURI); + if (!manager) { + manager = new DecorationManagerForDocument(docURI, decorationTypes, this.purlManagers); + this.docManagers.set(docURI, manager); + } + return manager; + } + for (const editor of vscode.window.visibleTextEditors) { + const docURI = editor.document.uri.toString() as TextDocumentURIString; + const manager = managerForDoc(docURI); + manager.update(editor.document); + } + this.docChangeWatchers = vscode.workspace.onDidChangeTextDocument((doc) => { + // TODO: track if change could affect externals and only decorate then + let hasMeaningfulChange = false; + if (!hasMeaningfulChange) { + for (const docChange of doc.contentChanges) { + if (docChange.rangeLength !== 0) { + hasMeaningfulChange = true; + break + } + if (docChange.text && docChange.text !== '') { + hasMeaningfulChange = true; + break + } + } + } + if (!hasMeaningfulChange) { + return; // no meaningful change, skip + } + updateDoc(doc.document); + }) + this.docCloseWatchers = vscode.workspace.onDidCloseTextDocument((doc) => { + const docURI = doc.uri.toString() as TextDocumentURIString + this.docManagers.get(docURI)?.currentDocUpdate.abort(); + this.docManagers.delete(docURI); + }) + this.docOpenWatchers = vscode.workspace.onDidOpenTextDocument((doc) => { + updateDoc(doc); + }); + this.editorChangeWatchers = vscode.window.onDidChangeVisibleTextEditors((editors) => { + for (const editor of editors) { + const docURI = editor.document.uri.toString() as TextDocumentURIString; + const manager = managerForDoc(docURI); + manager.decorateEditor(editor); + } + }) + } + + dispose() { + for (const manager of this.docManagers.values()) { + manager.currentDocUpdate.abort(); + } + } +} +class DecorationManagerForPURLCache { + purlManagers: Map = new Map() + decorationTypes: DecorationTypes; + constructor(decorationTypes: DecorationTypes) { + this.decorationTypes = decorationTypes; + } + for(purl: SimPURL) { + let manager = this.purlManagers.get(purl); + if (!manager) { + manager = new DecorationManagerForPURL(purl, this.decorationTypes); + this.purlManagers.set(purl, manager); + } + return manager; + } +} + +// @ts-expect-error missing def +let isNodeBuiltin: (name: string) => boolean = Module.isBuiltin + +let isBuiltin = (name: string, eco: string): boolean => { + if (eco === 'npm') return isNodeBuiltin(name); + if (eco === 'pypi') return isPythonBuiltin(name); + if (eco === 'go') return isGoBuiltin(name); + return false; +} + +let isLocalPackage = (name: string, eco: string): boolean => { + if (eco === 'npm') return name.startsWith('.') || name.startsWith('/') + if (eco === 'pypi') return name.startsWith('.') + if (eco === 'go') { + const parts = name.split('/') + return parts.some(p => p.startsWith('.')) || !parts[0].includes('.') || + !/[a-z0-9][a-z0-9.-]*/.test(parts[0]) + } + return false; +} +class DecorationManagerForPURL { + documentManagersForDocumentsWithThisPURL: Set = new Set(); + subscribe(manager: DecorationManagerForDocument): void { + this.documentManagersForDocumentsWithThisPURL.add(manager); + } + unsubscribe(manager: DecorationManagerForDocument): void { + this.documentManagersForDocumentsWithThisPURL.delete(manager); + } + purl: SimPURL; + packageData: PURLPackageData | null = null; + decorationType: vscode.TextEditorDecorationType; + decorationTypes: DecorationTypes; + isBuiltin: boolean; + isLocalPackage: boolean; + subscriptionCallback?: (data: PURLPackageData) => void; + constructor(purl: SimPURL, decorationTypes: DecorationTypes) { + this.purl = purl; + this.decorationTypes = decorationTypes; + this.decorationType = this.decorationTypes.informativeDecoration; + const { eco, name } = getPURLParts(purl); + // we don't need to watch for builtin or local packages + this.isBuiltin = isBuiltin(name, eco) + this.isLocalPackage = isLocalPackage(name, eco); + this.subscriptionCallback = ((data) => { + this.packageData = data; + this.#eagerDecoration(); + for (const manager of this.documentManagersForDocumentsWithThisPURL) { + manager.markDirty(manager.currentDocUpdate.signal); + } + }); + const watcher = PURLDataCache.singleton.watch(this.purl) + this.subscriptionCallback(watcher); + watcher.subscribe(this.subscriptionCallback); + } + linkForPURL(data: PURLPackageData): string { + const pkgData = data?.pkgData; + if (!pkgData) { + return `[${this.purl} $(link-external)](https://socket.dev/${this.purl})` + } + let type = pkgData.type + let version = `/overview/${pkgData.version}` + if (type === 'golang') { + type = 'go' + version = `?section=overview&version=${pkgData.version}` + } + return `[${pkgData.name} $(link-external)](https://socket.dev/${type}/package/${pkgData.namespace ? pkgData.namespace + '/' : ''}${pkgData.name}${version})` + } + dispose() { + if (this.subscriptionCallback) { + PURLDataCache.singleton.watch(this.purl).unsubscribe(this.subscriptionCallback); + } + } + async generateHoverMarkdown(): Promise { + if (this.isBuiltin) { + return new vscode.MarkdownString(`Socket Security for ${this.purl} : Builtin package`, true); + } else if (this.isLocalPackage) { + return new vscode.MarkdownString(`Socket Security for ${this.purl} : Local package (likely installed as an alias)`, true); + } + const data = this.packageData + if (!data) { + return new vscode.MarkdownString(`… fetching Socket Security for ${this.purl} …`, true); + } + const pkgData = data?.pkgData; + if (!pkgData) { + if (data.error) { + return new vscode.MarkdownString(`Socket Security for ${this.linkForPURL(data)}: ${data.error}`, true); + } else { + return new vscode.MarkdownString(`… fetching Socket Security for ${this.linkForPURL(data)} …`, true); + } + } + const { score: { overall: depscore } } = pkgData; + const { eco, name } = getPURLParts(this.purl)! + const depscoreStr = (depscore * 100).toFixed(0) + const groupedAlerts = Object.groupBy(pkgData.alerts, alert => alert.action) + + function rowsForGrouping(actionGroupedAlertSet: PackageScoreAndAlerts['alerts'] | undefined): string { + if (!actionGroupedAlertSet) { + return '' + } + let ret: string[] = []; + let color = (hex: string, text: string) => `${text}`; + // TODO: better grouping since there can be *MANY* alerts of the same type + // this is a bit lossy, but better than noise + let typesListed = new Set(); + for (const alert of actionGroupedAlertSet) { + let extra = color('#888888', ' '); + if (alert.props?.alternatePackage) { + extra = `Possible intent: [${name} $(link-external)](https://socket.dev/${eco}/package/${name})` + } else if (alert.props?.lastPublish) { + const lastPublish = new Date(alert.props.lastPublish).toLocaleDateString(); + extra = `Last published on: ${lastPublish}`; + } else if (typesListed.has(alert.type)) { + continue + } + typesListed.add(alert.type); + const rowColor = { + 'error': '#ff8800', + 'warn': '#cc8800', + 'monitor': '#aaaa00', + 'ignore': '#888888', + }[alert.action] + ret.push([alert.action, alert.type, extra].map( + (str) => color(rowColor, str) // color the action column + ).join(' | ')); + } + return ret.join('\n') + } + const hoverMessage = new vscode.MarkdownString(` +Socket Security for ${this.linkForPURL(data)} (package score: ${depscoreStr}) + +---- + +action | type | extra +------ | ---- | ----- +${([ + 'error', 'warn', 'monitor', 'ignore' +] as const).flatMap( + action => { + const alertsForAction = groupedAlerts[action] + if (!alertsForAction || alertsForAction.length === 0) { + return '' + } + return rowsForGrouping(alertsForAction)+'\n' + } +).join('')} +`, true); + // logger.error(`Generated hover message for ${this.purl}`, hoverMessage.value); + hoverMessage.supportHtml = true; + hoverMessage.isTrusted = true; + return hoverMessage + } + /** + * These must be eager so that they give squigglies etc. + * @returns / + */ + #eagerDecoration() { + const data = this.packageData + const decorationTypes = this.decorationTypes; + const pkgData = data?.pkgData; + if (!pkgData) { + if (data?.error) { + // this can happen if the package is private etc. don't be too noisy + this.decorationType = decorationTypes.informativeDecoration; + } else { + this.decorationType = decorationTypes.informativeDecoration; + } + return + } + const { alerts } = pkgData; + this.decorationType = decorationTypes.informativeDecoration + for (const {action} of alerts) { + if (action === 'error') { + this.decorationType = decorationTypes.errorDecoration + break; + } else if (action === 'warn') { + this.decorationType = decorationTypes.warningDecoration + } + } + } +} +class DecorationManagerForDocument { + externalRefs: Map = new Map(); + currentDocUpdate: AbortController = new AbortController + isDirty: boolean = false; + docURI: TextDocumentURIString; + // parameterized, shared across all instances + decorationTypes: DecorationTypes; + // parameterized, shared across all instances + purlManagers: DecorationManagerForPURLCache + async provideHover(document: vscode.TextDocument, position: vscode.Position): Promise { + for (const [purl, ranges] of this.externalRefs) { + for (const range of ranges) { + const intersects = range.contains(position) + // logger.warn(document.getText(range), 'hovering over range', range, 'for purl', purl, 'intersects:', intersects, 'at position', position); + if (intersects) { + const purlManager = this.purlManagers.for(purl); + const hoverMessage = await purlManager.generateHoverMarkdown(); + if (!hoverMessage) { + // logger.warn(`No hover message for PURL ${purl}, skipping hover`); + return undefined; + } + return new vscode.Hover(hoverMessage, range); + } + } + } + } + constructor(docURI: TextDocumentURIString, decorationTypes: DecorationTypes, purlManagers: DecorationManagerForPURLCache) { + this.docURI = docURI; + this.decorationTypes = decorationTypes; + this.purlManagers = purlManagers + } + async update(doc: vscode.TextDocument) { + const docURI = doc.uri.toString() as TextDocumentURIString; + if (this.docURI !== docURI) { + return + } + // We cannot skip updates if the editor isn't visible since there are some goofy cases + // like when the editor is previewing another or preloading + this.currentDocUpdate.abort(); + this.currentDocUpdate = new AbortController(); + const thisDocUpdateSignal = this.currentDocUpdate.signal; + const externals = await parseExternals(doc); + if (!externals) return; + logger.info(`Parsed externals for ${docURI}:`, externals.size, 'externals found, aborted:', thisDocUpdateSignal.aborted); + logger.info([...externals.keys()].join(', ')); + if (thisDocUpdateSignal.aborted) { + console.info(`Decoration update for ${docURI} was aborted (parsing externals took longer than next update), skipping.`); + return; + } + let isDirty = this.externalRefs.size !== externals.size; + if (!isDirty) { + check_each_purl_is_same_ranges: + for (const [purl, ranges] of externals) { + const existing = this.externalRefs.get(purl); + if (!existing) { + isDirty = true; + break; + } + if (existing.length !== ranges.length) { + isDirty = true; + break; + } + for (let i = 0; i < existing.length; i++) { + if (!ranges[i].isEqual(existing[i])) { + isDirty = true; + break check_each_purl_is_same_ranges; + } + } + } + } + this.externalRefs = externals; + this.isDirty = isDirty + for (const purl of this.externalRefs.keys()) { + this.purlManagers.for(purl).subscribe(this) + } + // this should hold true due to no await above, defensive check here + if (!thisDocUpdateSignal.aborted) { + if (this.isDirty) { + this.markDirty(thisDocUpdateSignal); + } + } + } + async markDirty(thisDocUpdateSignal: AbortSignal) { + this.isDirty = true; + await this.#decorateEverything(thisDocUpdateSignal); + } + decorations: Map = new Map() + createDecorations() { + const newDecorations: typeof this['decorations'] = new Map(); + for (const [purl, ranges] of this.externalRefs) { + const purlManager = this.purlManagers.for(purl); + if (!purlManager.decorationType) { + logger.warn(`No decoration type for PURL ${purl}, skipping decoration creation`); + continue + } + let pool = newDecorations.get(purlManager.decorationType) + if (!pool) { + pool = [...ranges] + newDecorations.set(purlManager.decorationType, pool); + } else { + pool.push(...ranges); + } + } + this.decorations = newDecorations + } + /** + * This will START decorating the document, but since scores / alerts are fetched asynchronously + * This needs to do checks to see if the decoration request is still valid. + * This also needs to be able to handle streaming updates to the decorations and failures + * Each PURL will fetch its own score/alerts from cache in parallel and then update the decorations + */ + async #decorateEverything(thisDecorationUpdateSignal = this.currentDocUpdate.signal) { + if (!this.isDirty) return; + let pending = []; + logger.info(`Updating decorations for ${this.docURI} with externals:`, this.externalRefs.size, 'externals found'); + for (const editor of vscode.window.visibleTextEditors) { + const editorURI = editor.document.uri.toString() as TextDocumentURIString; + if (editorURI === this.docURI) { + logger.info(`Matching editor ${editorURI} for decoration update`); + pending.push(editor) + } + } + if (pending.length === 0) { + logger.info(`No editors found for ${this.docURI}, skipping decoration update`); + return; + } + this.createDecorations(); + await Promise.all( + pending.map(editor => this.decorateEditor(editor, thisDecorationUpdateSignal)) + ) + if (thisDecorationUpdateSignal.aborted) return + this.isDirty = false + } + async decorateEditor(editor: vscode.TextEditor, thisDecorationUpdate: AbortSignal = this.currentDocUpdate.signal) { + if (thisDecorationUpdate.aborted) { + return; + } + for (const decorationType of Object.values(this.decorationTypes)) { + editor.setDecorations(decorationType, this.decorations.get(decorationType) ?? []); + } + } +} +const getPURLParts = (purl: SimPURL) => { + const groups = /^pkg:(?[^\/]+)\/(?.+)$/v.exec(purl)?.groups + return groups as { + eco: string; + name: string; + } +} +/** + * VSCode makes strong guarantee about 1<->1 text document URI to TextDocument mapping. + */ +type TextDocumentURIString = string & { __textDocumentURI: never }; diff --git a/src/ui/dep-file.ts b/src/ui/dep-file.ts deleted file mode 100644 index 205ecb4..0000000 --- a/src/ui/dep-file.ts +++ /dev/null @@ -1,30 +0,0 @@ -import * as vscode from 'vscode'; -import { DIAGNOSTIC_SOURCE_STR, EXTENSION_PREFIX } from '../util'; - -export function generateLens(range: vscode.Range, document: vscode.TextDocument) { - return new vscode.CodeLens(range, { - command: `${EXTENSION_PREFIX}.installGitHubApp`, - title: `Install Socket Security GitHub App`, - arguments: [document.uri] - }) -} - -export function provideCodeActions(document: vscode.TextDocument, range: vscode.Range | vscode.Selection, context: vscode.CodeActionContext, _token: vscode.CancellationToken): vscode.ProviderResult<(vscode.CodeAction | vscode.Command)[]> { - let actions = [] - for (const diag of context.diagnostics) { - if (diag.source === DIAGNOSTIC_SOURCE_STR) { - const [type] = String(diag.code).split(/,/); - const title = `Ignore all ${JSON.stringify(type)} type issues`; - const action = new vscode.CodeAction(title, vscode.CodeActionKind.QuickFix) - action.command = { - command: `${EXTENSION_PREFIX}.ignoreIssueType`, - title, - arguments: [document.uri, type] - } - action.diagnostics = [diag] - action.isPreferred = false - actions.push(action) - } - } - return actions -} \ No newline at end of file diff --git a/src/ui/externals/parse-externals.ts b/src/ui/externals/parse-externals.ts new file mode 100644 index 0000000..900cdfa --- /dev/null +++ b/src/ui/externals/parse-externals.ts @@ -0,0 +1,617 @@ +import * as vscode from 'vscode' +import * as parser from '@babel/parser' +import * as babelTypes from '@babel/types' +import * as babelTraverse from '@babel/traverse' +import childProcess from 'node:child_process' +import * as path from 'node:path' +import { text } from 'node:stream/consumers' +import jsonToAST from 'json-to-ast' +import * as toml from 'toml-eslint-parser' +import { getPythonInterpreter } from '../../data/python/interpreter' +import { getGlobPatterns } from '../../data/glob-patterns' +import { traverseTOMLKeys } from '../../util' +import { parseGoMod } from '../../data/go/mod-parser' +import { getGoExecutable } from '../../data/go/executable' +import pythonImportFinder from '../../data/python/import-finder.py' +import { generateNativeGoImportBinary } from '../../data/go/import-finder' +import logger from '../../infra/log' +import { isSupportedLSPLanguageId, PURL_Type, SUPPORTED_LSP_LANGUAGE_IDS } from '../languages' + +export type ExternalRef = { + name: string, + range: vscode.Range +} + +function simpurl(eco: PURL_Type, name: string): SimPURL { + return `pkg:${eco}/${name}` +} +export type SimPURL = `pkg:${PURL_Type}/${string}` +export class ExternalPurlRangeManager { + externals = new Map(); + add(purl: SimPURL, range: vscode.Range): void { + let group = this.externals.get(purl) + if (!group) { + group = [] + this.externals.set(purl, group) + } + group.push(range) + } +} + +function getJSPackageNameFromSpecifier(name: string): string { + return ( + name.startsWith('@') ? + name.split('/', 2) : + name.split('/', 1) + ).join('/') +} +function getJSPackageNameFromVersionRange(name: string): string { + return ( + name.startsWith('@') ? + name.split('@', 3) : + name.split('@', 2) + ).join('@') +} +function hydrateJSONRefs(src: string): ExternalRef[] { + return JSON.parse(src, (key, value) => { + if (key === 'range') { + return new vscode.Range( + new vscode.Position(value.start.line, value.start.character), + new vscode.Position(value.end.line, value.end.character) + ) + } + return value + }) +} + + +export async function parseExternals(doc: vscode.TextDocument): Promise | null> { + const languageId = doc.languageId + const src = doc.getText() + const results = new ExternalPurlRangeManager() + const basename = path.basename(doc.fileName) + const globPatterns = await getGlobPatterns() + const pep508RE = /(?<=^\s*)([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])(?=<|!|>|~|=|@|\(|\[|;|\s|$)/i + if (path.matchesGlob(basename, globPatterns.npm.packagejson.pattern)) { + const pkg = jsonToAST(src, { + loc: true + }) + if (pkg.type !== 'Object') { + return null + } + + for (const pkgField of pkg.children) { + if (pkgField.key.value === 'dependencies' || + pkgField.key.value === 'devDependencies' || + pkgField.key.value === 'peerDependencies' || + pkgField.key.value === 'optionalDependencies' + ) { + if (pkgField.value.type === 'Object') { + for (const v of pkgField.value.children) { + const { loc } = v + if (loc) { + results.add(simpurl( + 'npm', + v.key.value, + ), + rangeForJSONAstLoc(loc) + ) + } + } + } + } + if (pkgField.key.value === 'bundledDependencies') { + if (pkgField.value.type === 'Array') { + for (const node of pkgField.value.children) { + if (node.type === 'Literal' && typeof node.value === 'string') { + const { loc } = node + if (loc) { + results.add(simpurl( + 'npm', + node.value), + rangeForJSONAstLoc(loc) + ) + } + } + } + } + } + if (pkgField.key.value === 'overrides') { + if (pkgField.value.type === 'Object') { + parsePkgOverrideExternals(pkgField.value, results) + } + } + + } + } else if (path.matchesGlob(basename, globPatterns.pypi.pyproject.pattern)) { + let parsed: toml.AST.TOMLProgram + try { + parsed = toml.parseTOML(src) + } catch (err) { + return null + } + traverseTOMLKeys(parsed, (key, path) => { + const dep = path.length === 2 && + path[0] === 'project' && + path[1] === 'dependencies' + const optionalDep = path.length === 3 && + path[0] === 'project' && + path[2] === 'optional-dependencies' && + typeof path[3] === 'string' + const inPoetry = path.length > 2 && + path[0] === 'tool' && + path[1] === 'poetry' + const oldPoetryDep = inPoetry && path.length === 4 && + ['dependencies', 'dev-dependencies'].includes(path[2] as string) + const groupPoetryDep = inPoetry && path.length === 6 && + path[2] === 'group' && + path[4] === 'dependencies' + if ((oldPoetryDep || groupPoetryDep) && typeof path[path.length - 1] === 'string') { + const loc = key.parent.type === 'TOMLTable' ? key.loc : key.parent.loc + results.add(simpurl('pypi', path[path.length - 1] as string), + new vscode.Range( + new vscode.Position(loc.start.line - 1, loc.start.column), + new vscode.Position(loc.end.line - 1, loc.end.column) + ) + ) + } else if ( + (dep || optionalDep) && + key.parent.type === 'TOMLKeyValue' && + key.parent.value.type === 'TOMLArray' + ) { + for (const depNode of key.parent.value.elements) { + if (depNode.type !== 'TOMLValue' || depNode.kind !== 'string') continue + const match = pep508RE.exec(depNode.value) + if (!match) continue + results.add(simpurl( + 'pypi', + match[1] + ), + new vscode.Range( + new vscode.Position(depNode.loc.start.line - 1, depNode.loc.start.column), + new vscode.Position(depNode.loc.end.line - 1, depNode.loc.end.column) + )) + } + } + }) + } else if (path.matchesGlob(basename, globPatterns.pypi.pipfile.pattern)) { + let parsed: toml.AST.TOMLProgram + try { + parsed = toml.parseTOML(src) + } catch (err) { + return null + } + traverseTOMLKeys(parsed, (key, path) => { + if ( + path.length === 2 && + ['packages', 'dev-packages'].includes(path[0] as string) && + typeof path[1] === 'string' + ) { + const loc = key.parent.type === 'TOMLTable' ? key.loc : key.parent.loc + results.add(simpurl('pypi', + path[1] as string + ), + new vscode.Range( + new vscode.Position(loc.start.line - 1, loc.start.column), + new vscode.Position(loc.end.line - 1, loc.end.column) + ) + ) + } + }) + } else if (path.matchesGlob(basename, globPatterns.pypi.requirements.pattern)) { + const commentRE = /(\s|^)#.*/ + const lines = src.split('\n').map(line => line.replace(commentRE, '')) + for (let i = 0; i < lines.length; ++i) { + const line = lines[i] + const match = pep508RE.exec(line) + if (match) { + results.add(simpurl('pypi', + match[1]), + new vscode.Range( + new vscode.Position(i, match.index), + new vscode.Position(i, match.index + line.length) + ) + ) + } + } + } else if (path.matchesGlob(basename, globPatterns.golang.gomod.pattern)) { + const parsed = await parseGoMod(src) + if (!parsed) return null + + const exclusions: Set = new Set() + for (const exclude of parsed.Exclude ?? []) { + exclusions.add(exclude.Mod.Path) + } + + for (const req of parsed.Require ?? []) { + if (exclusions.has(req.Mod.Path)) continue + results.add(simpurl('golang', + req.Mod.Path), + new vscode.Range( + new vscode.Position(req.Syntax.Start.Line - 1, req.Syntax.Start.LineRune - 1), + new vscode.Position(req.Syntax.End.Line - 1, req.Syntax.End.LineRune - 1), + ) + ) + } + + for (const repl of parsed.Replace ?? []) { + if (exclusions.has(repl.New.Path)) continue + results.add(simpurl('golang', + repl.New.Path), + // TODO: can we get just the new part? + new vscode.Range( + new vscode.Position(repl.Syntax.Start.Line - 1, repl.Syntax.Start.LineRune - 1), + new vscode.Position(repl.Syntax.End.Line - 1, repl.Syntax.End.LineRune - 1), + ) + ) + } + } else if (isSupportedLSPLanguageId(languageId)) { + if (SUPPORTED_LSP_LANGUAGE_IDS[languageId] === 'npm') { + let ast: babelTypes.File + try { + ast = parser.parse( + src, + { + allowAwaitOutsideFunction: true, + allowImportExportEverywhere: true, + allowReturnOutsideFunction: true, + errorRecovery: true, + plugins: [ + 'jsx', + 'typescript', + 'decorators' + ], + } + ) + } catch (e) { + return null + } + function addResult(node: babelTypes.Node, specifier: string) { + if (/^[\.\/]/u.test(specifier)) { + return + } + const pkgName = getJSPackageNameFromSpecifier(specifier) + const loc = node.loc + if (!loc) return + const startPos: vscode.Position = new vscode.Position(loc.start.line - 1, loc.start.column) + const endPos: vscode.Position = new vscode.Position(loc.end.line - 1, loc.end.column) + const range = new vscode.Range(startPos, endPos) + results.add(simpurl('npm', pkgName), range) + } + const kDYNAMIC_VALUE: unique symbol = Symbol('dynamic_value') + type DYNAMIC_VALUE = typeof kDYNAMIC_VALUE + type PRIMITIVE = bigint | boolean | null | number | string | undefined + /** + * Lazy evaluator for finding out if something is constant at compile time + * + * Used to deal w/ some things like require('@babel/${'traverse'}') generated code + * + * Does not support compile time symbols (well known ones) + * Does not support regexp symbols + * Does not support array literals + * Does not support object literals + * + * @returns a function to compute the value (may be non-trivial cost) + */ + function constFor(node: babelTypes.Node): DYNAMIC_VALUE | (() => PRIMITIVE) { + if (babelTypes.isTemplateLiteral(node)) { + if (node.quasis.length === 1) { + return () => node.quasis[0].value.cooked + } else { + let constExps: Array, DYNAMIC_VALUE>> = [] + for (const exp of node.expressions) { + let constExp = constFor(exp) + if (constExp === kDYNAMIC_VALUE) { + return kDYNAMIC_VALUE + } + constExps.push(constExp) + } + return () => { + let result = '' + let i + for (i = 0; i < node.quasis.length - 1; i++) { + result += `${node.quasis[i].value.cooked}${constExps[i]()}` + } + return `${result}${node.quasis[i].value.cooked}` + } + } + } else if (babelTypes.isBigIntLiteral(node)) { + return () => BigInt(node.value) + } else if (babelTypes.isLiteral(node)) { + let value = babelTypes.isRegExpLiteral(node) ? new RegExp( + node.pattern, + node.flags + ) : babelTypes.isNullLiteral(node) ? null : node.value + if (value && typeof value === 'object') { + // regexp literal + return kDYNAMIC_VALUE + } + return () => value + } else if (babelTypes.isBinaryExpression(node)) { + const left = constFor(node.left) + if (left === kDYNAMIC_VALUE) { + return kDYNAMIC_VALUE + } + const right = constFor(node.right) + if (right === kDYNAMIC_VALUE) { + return kDYNAMIC_VALUE + } + let { operator } = node + if (operator === 'in' || operator === 'instanceof') { + return kDYNAMIC_VALUE + } + if (operator === '|>') { + return kDYNAMIC_VALUE + } + // lots of TS unhappy with odd but valid coercions + return { + '==': () => left() == right(), + '!=': () => left() != right(), + '===': () => left() === right(), + '!==': () => left() !== right(), + // @ts-expect-error + '<': () => left() < right(), + // @ts-expect-error + '<=': () => left() <= right(), + // @ts-expect-error + '>': () => left() > right(), + // @ts-expect-error + '>=': () => left() >= right(), + // @ts-expect-error + '<<': () => left() << right(), + // @ts-expect-error + '>>': () => left() >> right(), + // @ts-expect-error + '>>>': () => left() >>> right(), + // @ts-expect-error + '+': () => left() + right(), + // @ts-expect-error + '-': () => left() - right(), + // @ts-expect-error + '*': () => left() * right(), + // @ts-expect-error + '/': () => left() / right(), + // @ts-expect-error + '%': () => left() % right(), + // @ts-expect-error + '&': () => left() & right(), + // @ts-expect-error + '|': () => left() | right(), + // @ts-expect-error + '^': () => left() ^ right(), + // @ts-expect-error + '**': () => left() ** right() + }[operator] + } else if (babelTypes.isUnaryExpression(node)) { + const arg = constFor(node.argument) + if (arg === kDYNAMIC_VALUE) { + return kDYNAMIC_VALUE + } + const { operator } = node + if (operator === 'delete') { + return kDYNAMIC_VALUE + } + if (operator === 'void') { + return () => undefined + } + if (operator === 'throw') { + return kDYNAMIC_VALUE + } + return { + // @ts-expect-error + '-': () => -arg(), + // @ts-expect-error + '+': () => +arg(), + '!': () => !arg(), + // @ts-expect-error + '~': () => ~arg(), + 'typeof': () => typeof arg(), + }[operator] + } else if (babelTypes.isParenthesizedExpression(node)) { + return constFor(node.expression) + } else if (babelTypes.isAwaitExpression(node)) { + if (!node.argument) { + // WTF + return kDYNAMIC_VALUE + } + const arg = constFor(node.argument) + if (arg === kDYNAMIC_VALUE) { + return kDYNAMIC_VALUE + } + return arg + } + return kDYNAMIC_VALUE + } + babelTraverse.default(ast, { + ImportDeclaration(path) { + addResult(path.node.source, `${path.node.source.value}`) + path.skip() + }, + ImportExpression(path) { + const { node } = path + let constantArg = constFor(node.source) + if (constantArg !== kDYNAMIC_VALUE) { + addResult(node, `${constantArg()}`) + } + }, + CallExpression(path) { + const { node } = path + const { callee } = node + if (node.arguments.length > 0) { + path.is + if (babelTypes.isIdentifier(callee, { + name: 'require' + })) { + const { arguments: [firstArg] } = node + let constantArg = constFor(firstArg) + if (constantArg !== kDYNAMIC_VALUE) { + addResult(node, `${constantArg()}`) + } + } else if (babelTypes.isImport(callee)) { + const { arguments: [firstArg] } = node + let constantArg = constFor(firstArg) + if (constantArg !== kDYNAMIC_VALUE) { + addResult(node, `${constantArg()}`) + } + } + } + } + }) + } else if (SUPPORTED_LSP_LANGUAGE_IDS[languageId] === 'pypi') { + const pythonInterpreter = await getPythonInterpreter(doc) + if (pythonInterpreter) { + const proc = childProcess.spawn(pythonInterpreter.execPath, ['-c', pythonImportFinder]) + console.error(pythonInterpreter.execPath) // DEBUG + proc.stdin.end(src) + const output = await text(proc.stdout) + if (!output) return null + const refs = hydrateJSONRefs(output) + for (const ref of refs) { + results.add(simpurl('pypi', ref.name), ref.range) + } + } else { + // fallback for web/whenever Python interpreter not available + const pyImportRE = /(?<=(?:^|\n)\s*)(?:import\s+(.+?)|from\s+(.+?)\s+import.+?)(?=\s*(?:$|\n))/g + const pyDynamicImportRE = /(?:__import__|import_module)\((?:"""(.+?)"""|'''(.+?)'''|"(.+?)"|'(.+?)'|)\)/g + let charInd = 0 + const lineChars = src.split('\n').map(line => charInd += line.length + 1) + let match: RegExpExecArray | null = null + for (let nl = 0; match = pyImportRE.exec(src);) { + while (lineChars[nl] <= match.index) ++nl + const names = match[1] ? match[1].split(',').map(v => v.trim()) : [match[2]] + const startLine = nl, startCol = match.index - (nl && lineChars[nl - 1]) + while (lineChars[nl] <= match.index + match[0].length) ++nl + const endLine = nl, endCol = match.index - (nl && lineChars[nl - 1]) + const range = new vscode.Range(startLine, startCol, endLine, endCol) + for (const name of names) { + results.add(simpurl('pypi', name.split('.')[0]), range) + } + } + for (let nl = 0; match = pyDynamicImportRE.exec(src);) { + while (lineChars[nl] <= match.index) ++nl + const name = match[1] || match[2] || match[3] || match[4] + const startLine = nl, startCol = match.index - (nl && lineChars[nl - 1]) + while (lineChars[nl] <= match.index + match[0].length) ++nl + const endLine = nl, endCol = match.index - (nl && lineChars[nl - 1]) + const range = new vscode.Range(startLine, startCol, endLine, endCol) + results.add(simpurl('pypi', name.split('.')[0]), range) + } + } + } else if (SUPPORTED_LSP_LANGUAGE_IDS[languageId] === 'golang') { + const goExecutable = await getGoExecutable() + if (goExecutable) { + const importFinderBin = await generateNativeGoImportBinary(goExecutable.execPath) + const proc = childProcess.spawn(importFinderBin) + proc.stdin.end(src) + const output = await text(proc.stdout) + if (!output) return null + const refs = hydrateJSONRefs(output) + for (const ref of refs) { + results.add(simpurl('golang', ref.name), ref.range) + } + } else { + const goImportRE = /(?<=(?:^|\n)\s*?)(import\s*(?:\s[^\s\("`]+\s*)?)("|`)([^\s"`]+)("|`)(?=\s*?(?:$|\n))/g + const goImportBlockStartRE = /(?<=(?:^|\n)\s*?)import\s*\(/g + const goImportBlockRE = /(;|\n|\()(\s*(?:\s[^\s\("`]+\s*)?)("|`)([^\s"`]+)("|`)\s*?(?:;|\n|\))/y + let charInd = 0 + const lineChars = src.split('\n').map(line => charInd += line.length + 1) + let match: RegExpExecArray | null = null + for (let nl = 0; match = goImportRE.exec(src);) { + while (lineChars[nl] <= match.index) ++nl + const name = match[3] + const line = nl + const startCol = match.index - (nl && lineChars[nl - 1]) + (match[1] || '').length + const endCol = startCol + name.length + 2 + + const range = new vscode.Range(line, startCol, line, endCol) + let realName = name + if (match[2] === '"' && match[4] === '"') { + try { + realName = JSON.parse(`"${realName}"`) + } catch (err) { + // just use original + } + } + results.add(simpurl('golang', realName), range) + } + for (let nl = 0; match = goImportBlockStartRE.exec(src);) { + goImportBlockRE.lastIndex = match.index + match[0].length - 1 + for (let imMatch: RegExpExecArray | null = null; imMatch = goImportBlockRE.exec(src);) { + const name = imMatch[4] + const imInd = imMatch.index + (imMatch[1] || '').length + (imMatch[2] || '').length + while (lineChars[nl] <= imInd) ++nl + const startCol = imInd - (nl && lineChars[nl - 1]) + const line = nl + const endCol = startCol + name.length + 2 + const range = new vscode.Range(line, startCol, line, endCol) + let realName = name + + if (imMatch[3] === '"' && imMatch[5] === '"') { + try { + realName = JSON.parse(`"${realName}"`) + } catch (err) { + // just use original + } + } + + results.add(simpurl('golang', realName), range) + goImportBlockRE.lastIndex = goImportBlockStartRE.lastIndex = imMatch.index + imMatch[0].length - 1 + } + goImportBlockStartRE.lastIndex += 1 + } + } + } + } else { + return null + } + return results.externals +} +function rangeForJSONAstLoc(loc: Required['loc']): vscode.Range { + return new vscode.Range( + new vscode.Position( + loc.start.line - 1, + loc.start.column - 1 + ), + new vscode.Position( + loc.end.line - 1, + loc.end.column - 1 + ) + ) +} +function parsePkgOverrideExternals(node: jsonToAST.ObjectNode, results: ExternalPurlRangeManager, contextualName?: string): void { + for (const child of node.children) { + let pkgName: string | undefined + if (child.key.value === '.') { + if (contextualName) { + pkgName = contextualName + } + } else { + pkgName = getJSPackageNameFromVersionRange(child.key.value) + } + if (pkgName) { + const { loc } = child.value.type === 'Literal' ? child : child.key + if (loc) { + results.add(simpurl( + 'npm', pkgName), + rangeForJSONAstLoc(loc) + ) + } + } + const { value } = child + if (value.type === 'Object') { + parsePkgOverrideExternals(value, results, pkgName ?? contextualName) + } else if (value.type === 'Literal') { + if (typeof value.value === 'string') { + if (value.value.startsWith('$')) { + const { loc } = value + if (loc) { + results.add(simpurl('npm', + value.value.slice(1)), + rangeForJSONAstLoc(loc) + ) + } + } + } + } + } +} diff --git a/src/ui/file.ts b/src/ui/file.ts index 6ab6176..41d0b91 100644 --- a/src/ui/file.ts +++ b/src/ui/file.ts @@ -1,416 +1,10 @@ -import { SocketYml } from '@socketsecurity/config'; import * as vscode from 'vscode' -import { radixMergeReportIssues, SocketReport } from '../data/report'; -import { EXTENSION_PREFIX, getDiagnosticSeverity, getWorkspaceFolderURI, sortIssues } from '../util'; -import * as https from 'node:https'; -import * as consumer from 'node:stream/consumers' -import * as module from 'module' -import { parseExternals, SUPPORTED_LANGUAGES } from './parse-externals'; -import { isPythonBuiltin } from '../data/python/builtins'; -import { isGoBuiltin } from '../data/go/builtins'; -import { getExistingAPIConfig, getAPIConfig, toAuthHeader } from '../data/socket-api-config'; -import { sniffForGithubOrgOrUser } from '../data/github'; - -// @ts-expect-error missing module.isBuiltin -let isNodeBuiltin: (name: string) => boolean = module.isBuiltin || - ((builtinModules: string[]) => { - const builtins = new Set(builtinModules); - return (name: string) => { - return builtins.has(name.startsWith('node:') ? name.slice(5) : name); - }; - })(module.builtinModules); - -let isBuiltin = (name: string, eco: string): boolean => { - if (eco === 'npm') return isNodeBuiltin(name); - if (eco === 'pypi') return isPythonBuiltin(name); - if (eco === 'go') return isGoBuiltin(name); - return false; -} - -let isLocalPackage = (name: string, eco: string): boolean => { - if (eco === 'npm') return name.startsWith('.') || name.startsWith('/') - if (eco === 'pypi') return name.startsWith('.') - if (eco === 'go') { - const parts = name.split('/') - return parts.some(p => p.startsWith('.')) || !parts[0].includes('.') || - !/[a-z0-9][a-z0-9.-]*/.test(parts[0]) - } - return false; -} +import logger from '../infra/log' - -// TODO: cache by detecting open editors and closing +import {activate as activateDecorations} from './decorations' export function activate( context: vscode.ExtensionContext, - reports: Awaited>, - socketConfig: Awaited>, - editorConfig: ReturnType ) { - let errorDecoration = vscode.window.createTextEditorDecorationType({ - isWholeLine: true, - after: { - margin: '0 0 0 2rem', - contentIconPath: vscode.Uri.file(context.asAbsolutePath('logo-red.svg')), - width: '12px', - height: '12px', - }, - }); - let warningDecoration = vscode.window.createTextEditorDecorationType({ - isWholeLine: true, - after: { - margin: '0 0 0 2rem', - contentIconPath: vscode.Uri.file(context.asAbsolutePath('logo-yellow.svg')), - width: '12px', - height: '12px', - }, - }); - let informativeDecoration = vscode.window.createTextEditorDecorationType({}); - let srcToHoversAndCount = new Map - }>() - let urlToSrc = new Map() - // vscode.workspace.onDidOpenTextDocument(e => { - - // }) - context.subscriptions.push( - vscode.workspace.onDidChangeTextDocument(e => { - if (e.document.uri.scheme !== 'file') return; - decorateEditors() - }) - ) - context.subscriptions.push( - vscode.workspace.onDidCloseTextDocument(e => { - deref(e) - }) - ) - function deref(doc: vscode.TextDocument) { - let hoversAndCount = srcToHoversAndCount.get(doc.fileName); - if (hoversAndCount) { - if (hoversAndCount.refCount === 1) { - srcToHoversAndCount.delete(doc.fileName); - urlToSrc.delete(doc.fileName); - } else { - hoversAndCount.refCount--; - } - } - } - type PackageScore = { - score: { - depscore: number - }, - metrics: { - linesOfCode?: number, - dependencyCount?: number, - devDependencyCount?: number, - transitiveDependencyCount?: number, - } - } - const depscoreCache = new Map - }>() - function getDepscore(pkgName: string, eco: string, signal: AbortSignal): Promise { - if (signal.aborted) { - return Promise.reject('Aborted'); - } - if (['go', 'golang', 'pypi'].includes(eco)) { - // TODO: implement PyPI depscores in backend - return Promise.reject('Python depscores unavailable'); - } - const cacheKey = `${eco}.${pkgName}` - const existing = depscoreCache.get(cacheKey) - const time = Date.now(); - if (existing && time < existing.expires) { - return existing.score; - } - const score = new Promise(async (f, r) => { - const apiConfig = await getAPIConfig() - if (!apiConfig) { - return - } - const req = https.request(`https://socket.dev/api/${eco}/package-info/score?name=${pkgName}`, { - method: 'POST', - headers: { - 'content-type': 'json', - 'authorization': toAuthHeader(apiConfig.apiKey) - } - }); - function cleanupReq() { - try { - req.destroy(); - } catch { - } - r(Promise.reject('Aborted')); - } - signal.addEventListener('abort', cleanupReq); - req.end(JSON.stringify({ - components: [ - purl: `pkg:${eco}/${pkgName}` - ] - })); - req.on('error', r); - req.on('response', (res) => { - signal.removeEventListener('abort', cleanupReq); - function cleanupRes() { - try { - res.destroy(); - } catch { - } - r(Promise.reject('Aborted')); - } - signal.addEventListener('abort', cleanupRes); - if (res.statusCode === 200) { - consumer.json(res).then((obj: any) => { - signal.removeEventListener('abort', cleanupRes); - f(obj as PackageScore); - }).catch(e => { - r(e); - }) - } - }) - }); - depscoreCache.set(cacheKey, { - // 10minute cache - expires: time + 10 * 60 * 1000, - score - }); - return score; - } - async function refAndParseIfNeeded(doc: vscode.TextDocument, socketReport: SocketReport, socketYamlConfig: SocketYml) { - const eco = SUPPORTED_LANGUAGES[doc.languageId] - // const src = doc.getText() - let hoversAndCount = srcToHoversAndCount.get(doc.fileName) - if (hoversAndCount) { - hoversAndCount.refCount++ - } else { - if (!socketReport) return - let hovers: Array = [] - const externals = await parseExternals(doc) - if (!externals) { - return - } - const apiConf = await getExistingAPIConfig() - if (!apiConf) { - return - } - const folderURI = getWorkspaceFolderURI(doc.uri) - const ghOrg = folderURI && await sniffForGithubOrgOrUser(folderURI) - const issueRules = apiConf.orgRules.find(org => org.name === ghOrg)?.issueRules || - apiConf.defaultRules - const issues = radixMergeReportIssues(socketReport) - const ecoIssues = issues.get(eco) - for (const {name, range} of externals) { - const pkgIssues = ecoIssues?.get(name) - if (!pkgIssues || pkgIssues.size === 0) { - continue - } - type IssueTableEntry = { - type: string, - severity: string, - description: string - } - const relevantIssues: IssueTableEntry[] = [] - const irrelevantIssues: IssueTableEntry[] = [] - for (const [severity, types] of pkgIssues) { - for (const [type, descriptions] of types) { - for (const description of descriptions) { - if (getDiagnosticSeverity(type, severity, apiConf.enforcedRules, issueRules, socketYamlConfig) != null) { - relevantIssues.push({ - type, - severity, - description - }) - } else { - irrelevantIssues.push({ - type, - severity, - description - }) - } - } - } - } - if (relevantIssues.length === 0 && irrelevantIssues.length === 0) { - continue - } - let vizMarkdown = `Socket Security Summary for ${name} $(link-external):\n` - function issueTable(issues: IssueTableEntry[]) { - return `\n -Severity | Type | Description --------- | ---- | ----------- -${issues.sort((a, b) => sortIssues({ - severity: a.severity, - type: a.type - }, { - severity: b.severity, - type: b.type - })).map(issue => { - return `${issue.severity} | ${issue.type} | ${issue.description}` - }).join('\n') -}\n` - } - if (relevantIssues.length > 0) { - vizMarkdown += issueTable(relevantIssues); - } - if (irrelevantIssues.length > 0) { - vizMarkdown += `
Hidden Issues${issueTable(irrelevantIssues)}
\n`; - } - const viz = new vscode.MarkdownString(vizMarkdown, true) - viz.supportHtml = true - hovers.push(new vscode.Hover(viz, range)) - } - - srcToHoversAndCount.set(doc.fileName, { - refCount: 1, - hovers - }) - } - } - const hoverProvider: vscode.HoverProvider = { - async provideHover(document, position, token) { - const socketReportData = reports.effectiveReportForUri(document.uri) - const socketReport = socketReportData.data - const socketYamlConfig = socketConfig.effectiveConfigForUri(document.uri).data - const src = document.getText() - let existingSrc = urlToSrc.get(document.fileName) - if (existingSrc !== undefined) { - // changed - if (existingSrc !== src) { - deref(document); - await refAndParseIfNeeded(document, socketReport, socketYamlConfig); - } else { - // unchanged src, changed setting? - } - } else { - // new - await refAndParseIfNeeded(document, socketReport, socketYamlConfig); - } - urlToSrc.set(document.fileName, src) - let cachedHoversAndCount = srcToHoversAndCount.get(document.fileName) - if (cachedHoversAndCount) { - let { hovers } = cachedHoversAndCount - if (hovers.length) { - for (const hover of hovers) { - if (hover.range?.contains(position)) { - return hover - } - } - } - } - return undefined - } - }; - for (const languageId in SUPPORTED_LANGUAGES) { - context.subscriptions.push(vscode.languages.registerHoverProvider(languageId, hoverProvider)); - } - let currentDecorateEditors: AbortController = new AbortController() - editorConfig.onDependentConfig( - [ - `${EXTENSION_PREFIX}.warnOverlayThreshold`, - `${EXTENSION_PREFIX}.errorOverlayThreshold` - ], () => { - decorateEditors() - } - ); - async function decorateEditor(e: vscode.TextEditor, abortSignal: AbortSignal) { - const eco = SUPPORTED_LANGUAGES[e.document.languageId]; - if (!eco) return - - const informativeDecorations: Array = []; - const warningDecorations: Array = []; - const errorDecorations: Array = []; - - const externals = await parseExternals(e.document) - e.setDecorations(informativeDecoration, informativeDecorations); - e.setDecorations(errorDecoration, errorDecorations); - e.setDecorations(warningDecoration, warningDecorations); - if (!externals) { - return - } - for (const {name, range} of externals) { - if (isBuiltin(name, eco)) { - const deco: vscode.DecorationOptions = { - range, - hoverMessage: `Socket Security skipped for builtin module` - } - informativeDecorations.push(deco); - e.setDecorations(informativeDecoration, informativeDecorations) - continue; - } - if (isLocalPackage(name, eco)) { - continue - } - getDepscore(name, eco, abortSignal).then(score => { - if (abortSignal.aborted) { - return; - } - const { score: { depscore }} = score - const depscoreStr = (depscore * 100).toFixed(0) - const hoverMessage = new vscode.MarkdownString(` -Socket Security for [${name} $(link-external)](https://socket.dev/${eco}/package/${name}): ${depscoreStr} - - -${score.metrics.linesOfCode == null ? '' : ` - - -`} -${score.metrics.dependencyCount == null ? '' :` - - -`} -${score.metrics.devDependencyCount == null ? '' :` - - -`} -${score.metrics.transitiveDependencyCount == null ? '' :` - - -`} -
Lines of Code ${score.metrics.linesOfCode}
Dependencies ${score.metrics.dependencyCount}
Dev Dependencies ${score.metrics.devDependencyCount}
Transitive Dependencies ${score.metrics.transitiveDependencyCount}
-`, true) - hoverMessage.supportHtml = true - const deco: vscode.DecorationOptions = { - range, - hoverMessage - } - const [ - warnOverlayThreshold, - errorOverlayThreshold - ] = editorConfig.getConfigValues<[number, number]>([ - `${EXTENSION_PREFIX}.warnOverlayThreshold`, - `${EXTENSION_PREFIX}.errorOverlayThreshold` - ]); - let decoType = null - let decoPool = null - // have to scale, API is 0-1 Config/UX uses 0-100 - const depscoreScaledToConfig = depscore * 100 - if (depscoreScaledToConfig < errorOverlayThreshold) { - decoType = errorDecoration - decoPool = errorDecorations - } else if (depscoreScaledToConfig < warnOverlayThreshold) { - decoType = warningDecoration - decoPool = warningDecorations - } - if (!decoType || !decoPool) { - decoType = informativeDecoration; - decoPool = informativeDecorations; - } - decoPool.push(deco); - e.setDecorations(decoType, decoPool); - }, err => {}) - } - } - function decorateEditors() { - currentDecorateEditors.abort(); - currentDecorateEditors = new AbortController(); - const abortSignal = currentDecorateEditors.signal; - for (const e of vscode.window.visibleTextEditors) { - decorateEditor(e, abortSignal); - } - } - context.subscriptions.push(vscode.window.onDidChangeVisibleTextEditors(() => { - decorateEditors(); - })) - decorateEditors(); + logger.appendLine('Socket Security extension started decorating files') + activateDecorations(context); } diff --git a/src/ui/go-mod.ts b/src/ui/go-mod.ts deleted file mode 100644 index 2975bad..0000000 --- a/src/ui/go-mod.ts +++ /dev/null @@ -1,62 +0,0 @@ -import * as vscode from 'vscode'; -import { generateLens, provideCodeActions } from './dep-file'; -import { getGlobPatterns } from '../data/glob-patterns'; -import { parseGoMod } from '../data/go/mod-parser'; - -async function provideCodeLenses(document: vscode.TextDocument, token: vscode.CancellationToken): Promise { - const goModSource = document.getText() - const parsed = await parseGoMod(goModSource) - const lenses = [] - for (const expr of parsed?.Syntax.Stmt ?? []) { - if ('RParen' in expr && expr.Token.length === 1 && expr.Token[0] === 'require') { - const start = new vscode.Position( - expr.Start.Line - 1, - expr.Start.LineRune - 1 - ) - const end = new vscode.Position( - expr.RParen.Pos.Line - 1, - expr.RParen.Pos.LineRune - ) - const range = new vscode.Range(start, end) - lenses.push(generateLens(range, document)) - // Only highlight first instance for now - break - } else if ('InBlock' in expr && !expr.InBlock && expr.Token[0] === 'require') { - const start = new vscode.Position( - expr.Start.Line - 1, - expr.Start.LineRune - 1 - ) - const end = new vscode.Position( - expr.End.Line - 1, - expr.End.LineRune - 1 - ) - const range = new vscode.Range(start, end) - lenses.push(generateLens(range, document)) - // Only highlight first instance - break - } - } - return lenses -} - -export async function registerCodeLensProvider() { - const globPatterns = await getGlobPatterns(); - return vscode.languages.registerCodeLensProvider({ - pattern: `**/${globPatterns.golang.gomod.pattern}`, - scheme: undefined - }, { - provideCodeLenses - }) -} - -export async function registerCodeActionsProvider() { - const patterns = await getGlobPatterns(); - return vscode.languages.registerCodeActionsProvider({ - pattern: `**/${patterns.golang.gomod.pattern}`, - scheme: undefined - }, { - provideCodeActions - }, { - providedCodeActionKinds: [vscode.CodeActionKind.QuickFix] - }) -} \ No newline at end of file diff --git a/src/ui/languages.ts b/src/ui/languages.ts new file mode 100644 index 0000000..91bc00e --- /dev/null +++ b/src/ui/languages.ts @@ -0,0 +1,17 @@ +export type PURL_Type = 'npm' | 'pypi' | 'golang'; +/** + * Mapping of LSP language IDs to PURL types. + */ +export const SUPPORTED_LSP_LANGUAGE_IDS = { + javascript: 'npm', + javascriptreact: 'npm', + typescript: 'npm', + typescriptreact: 'npm', + 'pip-requirements': 'pip-requirements', + python: 'pypi', + go: 'golang' +} as const satisfies Record + +export const isSupportedLSPLanguageId = (lang: string): lang is keyof typeof SUPPORTED_LSP_LANGUAGE_IDS => { + return Object.prototype.hasOwnProperty.call(SUPPORTED_LSP_LANGUAGE_IDS, lang); +} diff --git a/src/ui/package-json.ts b/src/ui/package-json.ts deleted file mode 100644 index 5340479..0000000 --- a/src/ui/package-json.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as vscode from 'vscode'; -import jsonToAST from 'json-to-ast' -import { generateLens, provideCodeActions } from './dep-file'; -import { getGlobPatterns } from '../data/glob-patterns'; - -function provideCodeLenses(document: vscode.TextDocument, token: vscode.CancellationToken): vscode.ProviderResult { - const packageJSONSource = document.getText() - const ast = jsonToAST(packageJSONSource, { loc: true }) - const lenses = [] - if (ast.type === 'Object') { - const child: jsonToAST.PropertyNode | undefined = ast.children.find( - child => { - return child.key.value === 'dependencies' || child.key.value === 'devDependencies' - } - ) - if (child) { - if (!child.loc) return - const startPos = new vscode.Position( - child.loc.start.line - 1, - child.loc.start.column - ) - const endPos = new vscode.Position( - child.loc.end.line - 1, - child.loc.end.column - ) - const range = new vscode.Range(startPos, endPos) - lenses.push(generateLens(range, document)) - } - } - return lenses -} - -export async function registerCodeLensProvider() { - const globPatterns = await getGlobPatterns(); - return vscode.languages.registerCodeLensProvider({ - language: 'json', - pattern: `**/${globPatterns.npm.packagejson.pattern}`, - scheme: undefined - }, { - provideCodeLenses - }) -} - -export async function registerCodeActionsProvider() { - const globPatterns = await getGlobPatterns(); - return vscode.languages.registerCodeActionsProvider({ - language: 'json', - pattern: `**/${globPatterns.npm.packagejson.pattern}`, - scheme: undefined - }, { - provideCodeActions - }, { - providedCodeActionKinds: [vscode.CodeActionKind.QuickFix] - }) -} diff --git a/src/ui/parse-externals.ts b/src/ui/parse-externals.ts deleted file mode 100644 index 0e2892f..0000000 --- a/src/ui/parse-externals.ts +++ /dev/null @@ -1,595 +0,0 @@ -import * as vscode from 'vscode'; -import * as parser from '@babel/parser' -import * as astTypes from 'ast-types'; -import micromatch from 'micromatch'; -import path from 'node:path'; -import { text } from 'node:stream/consumers'; -import jsonToAST from 'json-to-ast'; -import * as toml from 'toml-eslint-parser'; -import { getPythonInterpreter } from '../data/python/interpreter'; -import { getGlobPatterns } from '../data/glob-patterns'; -import { traverseTOMLKeys } from '../util'; -import { parseGoMod } from '../data/go/mod-parser'; -import { getGoExecutable } from '../data/go/executable'; -import { generateNativePyImportFinder } from '../data/python/import-finder'; -import { generateNativeGoImportBinary } from '../data/go/import-finder'; - -type ExternalRef = { - name: string, - range: vscode.Range, - prioritize?: boolean -} - -export const SUPPORTED_LANGUAGES: Record = { - javascript: 'npm', - javascriptreact: 'npm', - typescript: 'npm', - typescriptreact: 'npm', - python: 'pypi', - go: 'golang' -} - -function getJSPackageNameFromSpecifier(name: string): string { - return ( - name.startsWith('@') ? - name.split('/', 2) : - name.split('/', 1) - ).join('/'); -} -function getJSPackageNameFromVersionRange(name: string): string { - return ( - name.startsWith('@') ? - name.split('@', 3) : - name.split('@', 2) - ).join('@'); -} -function hydrateJSONRefs (src: string): ExternalRef[] { - return JSON.parse(src, (key, value) => { - if (key === 'range') { - return new vscode.Range( - new vscode.Position(value.start.line, value.start.character), - new vscode.Position(value.end.line, value.end.character) - ); - } - return value; - }); -} - -export async function parseExternals(doc: Pick): Promise | null> { - const src = doc.getText(); - const results: Array = [] - if (SUPPORTED_LANGUAGES[doc.languageId] === 'npm') { - let ast - try { - ast = parser.parse( - src, - { - allowAwaitOutsideFunction: true, - allowImportExportEverywhere: true, - allowReturnOutsideFunction: true, - errorRecovery: true, - plugins: [ - 'jsx', - 'typescript', - 'decorators' - ], - } - ) - } catch { - return null - } - function addResult(node: astTypes.namedTypes.Node, specifier: string) { - if (/^[\.\/]/u.test(specifier)) { - return - } - const pkgName = getJSPackageNameFromSpecifier(specifier) - const loc = node.loc - if (!loc) return - const startPos: vscode.Position = new vscode.Position(loc.start.line - 1, loc.start.column) - const endPos: vscode.Position = new vscode.Position(loc.end.line - 1, loc.end.column) - const range = new vscode.Range(startPos, endPos) - results.push({ - range, - name: pkgName - }) - } - const kDYNAMIC_VALUE: unique symbol = Symbol('dynamic_value') - type DYNAMIC_VALUE = typeof kDYNAMIC_VALUE - type PRIMITIVE = bigint | boolean | null | number | string | undefined - /** - * Lazy evaluator for finding out if something is constant at compile time - * - * Used to deal w/ some things like require('@babel/${'traverse'}') generated code - * - * Does not support compile time symbols (well known ones) - * Does not support regexp symbols - * Does not support array literals - * Does not support object literals - * - * @returns a function to compute the value (may be non-trivial cost) - */ - function constFor(node: astTypes.ASTNode): DYNAMIC_VALUE | (() => PRIMITIVE) { - if (astTypes.namedTypes.TemplateLiteral.check(node)) { - if (node.quasis.length === 1) { - return () => node.quasis[0].value.cooked - } else { - let constExps: Array, DYNAMIC_VALUE>> = [] - for (const exp of node.expressions) { - let constExp = constFor(exp) - if (constExp === kDYNAMIC_VALUE) { - return kDYNAMIC_VALUE - } - constExps.push(constExp) - } - return () => { - let result = '' - let i - for (i = 0; i < node.quasis.length - 1; i++) { - result += `${node.quasis[i].value.cooked}${constExps[i]()}` - } - return `${result}${node.quasis[i].value.cooked}` - } - } - } else if (astTypes.namedTypes.BigIntLiteral.check(node)) { - return () => BigInt(node.value) - } else if (astTypes.namedTypes.Literal.check(node)) { - const { value } = node - if (value && typeof value === 'object') { - // regexp literal - return kDYNAMIC_VALUE - } - return () => value - } else if (astTypes.namedTypes.BinaryExpression.check(node)) { - const left = constFor(node.left) - if (left === kDYNAMIC_VALUE) { - return kDYNAMIC_VALUE - } - const right = constFor(node.right) - if (right === kDYNAMIC_VALUE) { - return kDYNAMIC_VALUE - } - let { operator } = node - if (operator === 'in' || operator === 'instanceof') { - return kDYNAMIC_VALUE - } - // lots of TS unhappy with odd but valid coercions - return { - '==': () => left() == right(), - '!=': () => left() != right(), - '===': () => left() === right(), - '!==': () => left() !== right(), - // @ts-expect-error - '<': () => left() < right(), - // @ts-expect-error - '<=': () => left() <= right(), - // @ts-expect-error - '>': () => left() > right(), - // @ts-expect-error - '>=': () => left() >= right(), - // @ts-expect-error - '<<': () => left() << right(), - // @ts-expect-error - '>>': () => left() >> right(), - // @ts-expect-error - '>>>': () => left() >>> right(), - // @ts-expect-error - '+': () => left() + right(), - // @ts-expect-error - '-': () => left() - right(), - // @ts-expect-error - '*': () => left() * right(), - // @ts-expect-error - '/': () => left() / right(), - // @ts-expect-error - '%': () => left() % right(), - // @ts-expect-error - '&': () => left() & right(), - // @ts-expect-error - '|': () => left() | right(), - // @ts-expect-error - '^': () => left() ^ right(), - // @ts-expect-error - '**': () => left() ** right() - }[operator] - } else if (astTypes.namedTypes.UnaryExpression.check(node)) { - const arg = constFor(node.argument) - if (arg === kDYNAMIC_VALUE) { - return kDYNAMIC_VALUE - } - const { operator } = node - if (operator === 'delete') { - return kDYNAMIC_VALUE - } - if (operator === 'void') { - return () => undefined - } - return { - // @ts-expect-error - '-': () => -arg(), - // @ts-expect-error - '+': () => +arg(), - '!': () => !arg(), - // @ts-expect-error - '~': () => ~arg(), - 'typeof': () => typeof arg(), - }[operator] - } else if (astTypes.namedTypes.ParenthesizedExpression.check(node)) { - return constFor(node.expression) - } else if (astTypes.namedTypes.AwaitExpression.check(node)) { - if (!node.argument) { - // WTF - return kDYNAMIC_VALUE - } - const arg = constFor(node.argument) - if (arg === kDYNAMIC_VALUE) { - return kDYNAMIC_VALUE - } - return arg - } - return kDYNAMIC_VALUE - } - astTypes.visit(ast, { - visitImportDeclaration(path) { - addResult(path.node.source, `${path.node.source.value}`) - return false - }, - visitImportExpression(path) { - const { node } = path - let constantArg = constFor(node.source) - if (constantArg !== kDYNAMIC_VALUE) { - addResult(node, `${constantArg()}`) - } - this.traverse(path) - }, - visitCallExpression(path) { - const { node } = path - const { callee } = node - if (node.arguments.length > 0) { - if (astTypes.namedTypes.Identifier.check(callee) && callee.name === 'require') { - const { arguments: [firstArg] } = node - let constantArg = constFor(firstArg) - if (constantArg !== kDYNAMIC_VALUE) { - addResult(node, `${constantArg()}`) - } - } else if (astTypes.namedTypes.Import.check(callee)) { - const { arguments: [firstArg] } = node - let constantArg = constFor(firstArg) - if (constantArg !== kDYNAMIC_VALUE) { - addResult(node, `${constantArg()}`) - } - } - } - this.traverse(path) - } - }) - } else if (SUPPORTED_LANGUAGES[doc.languageId] === 'pypi') { - const pythonInterpreter = await getPythonInterpreter() - if (pythonInterpreter) { - const childProcess = await import('node:child_process'); - const proc = childProcess.spawn(pythonInterpreter, ['-c', generateNativePyImportFinder(src)]); - const output = await Promise.race([ - text(proc.stdout), - new Promise(resolve => setTimeout(() => resolve(''), 1000)) - ]); - if (!output) return null; - return hydrateJSONRefs(output) - } else { - // fallback for web/whenever Python interpreter not available - const pyImportRE = /(?<=(?:^|\n)\s*)(?:import\s+(.+?)|from\s+(.+?)\s+import.+?)(?=\s*(?:$|\n))/g; - const pyDynamicImportRE = /(?:__import__|import_module)\((?:"""(.+?)"""|'''(.+?)'''|"(.+?)"|'(.+?)'|)\)/g; - let charInd = 0 - const lineChars = src.split('\n').map(line => charInd += line.length + 1); - let match: RegExpExecArray | null = null; - for (let nl = 0; match = pyImportRE.exec(src);) { - while (lineChars[nl] <= match.index) ++nl; - const names = match[1] ? match[1].split(',').map(v => v.trim()) : [match[2]]; - const startLine = nl, startCol = match.index - (nl && lineChars[nl - 1]); - while (lineChars[nl] <= match.index + match[0].length) ++nl; - const endLine = nl, endCol = match.index - (nl && lineChars[nl - 1]); - const range = new vscode.Range(startLine, startCol, endLine, endCol); - for (const name of names) { - results.push({ name: name.split('.')[0], range }); - } - } - for (let nl = 0; match = pyDynamicImportRE.exec(src);) { - while (lineChars[nl] <= match.index) ++nl; - const name = match[1] || match[2] || match[3] || match[4]; - const startLine = nl, startCol = match.index - (nl && lineChars[nl - 1]); - while (lineChars[nl] <= match.index + match[0].length) ++nl; - const endLine = nl, endCol = match.index - (nl && lineChars[nl - 1]); - const range = new vscode.Range(startLine, startCol, endLine, endCol); - results.push({ name: name.split('.')[0], range }); - } - } - } else if (SUPPORTED_LANGUAGES[doc.languageId] === 'golang') { - const goExecutable = await getGoExecutable() - if (goExecutable) { - const [childProcess, importFinderBin] = await Promise.all([ - import('node:child_process'), - generateNativeGoImportBinary(goExecutable) - ]) - const proc = childProcess.spawn(importFinderBin); - proc.stdin.end(src) - const output = await Promise.race([ - text(proc.stdout), - new Promise(resolve => setTimeout(() => resolve(''), 1000)) - ]); - if (!output) return null; - return hydrateJSONRefs(output) - } else { - const goImportRE = /(?<=(?:^|\n)\s*?)(import\s*(?:\s[^\s\("`]+\s*)?)("|`)([^\s"`]+)("|`)(?=\s*?(?:$|\n))/g; - const goImportBlockStartRE = /(?<=(?:^|\n)\s*?)import\s*\(/g - const goImportBlockRE = /(;|\n|\()(\s*(?:\s[^\s\("`]+\s*)?)("|`)([^\s"`]+)("|`)\s*?(?:;|\n|\))/y - let charInd = 0 - const lineChars = src.split('\n').map(line => charInd += line.length + 1); - let match: RegExpExecArray | null = null; - for (let nl = 0; match = goImportRE.exec(src);) { - while (lineChars[nl] <= match.index) ++nl; - const name = match[3] - const line = nl - const startCol = match.index - (nl && lineChars[nl - 1]) + (match[1] || '').length; - const endCol = startCol + name.length + 2; - - const range = new vscode.Range(line, startCol, line, endCol); - let realName = name - if (match[2] === '"' && match[4] === '"') { - try { - realName = JSON.parse(`"${realName}"`) - } catch (err) { - // just use original - } - } - results.push({ name: realName, range }) - } - for (let nl = 0; match = goImportBlockStartRE.exec(src);) { - goImportBlockRE.lastIndex = match.index + match[0].length - 1 - for (let imMatch: RegExpExecArray | null = null; imMatch = goImportBlockRE.exec(src);) { - const name = imMatch[4] - const imInd = imMatch.index + (imMatch[1] || '').length + (imMatch[2] || '').length - while (lineChars[nl] <= imInd) ++nl; - const startCol = imInd - (nl && lineChars[nl - 1]) - const line = nl - const endCol = startCol + name.length + 2; - const range = new vscode.Range(line, startCol, line, endCol); - let realName = name - - if (imMatch[3] === '"' && imMatch[5] === '"') { - try { - realName = JSON.parse(`"${realName}"`) - } catch (err) { - // just use original - } - } - - results.push({ name: realName, range }) - goImportBlockRE.lastIndex = goImportBlockStartRE.lastIndex = imMatch.index + imMatch[0].length - 1 - } - goImportBlockStartRE.lastIndex += 1 - } - } - } else { - const basename = path.basename(doc.fileName); - const globPatterns = await getGlobPatterns(); - const pep508RE = /(?<=^\s*)([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])(?=<|!|>|~|=|@|\(|\[|;|\s|$)/i; - if (micromatch.isMatch(basename, globPatterns.npm.packagejson.pattern)) { - const pkg = jsonToAST(src, { - loc: true - }) - if (pkg.type !== 'Object') { - return null; - } - for (const pkgField of pkg.children) { - if (pkgField.key.value === 'dependencies' || - pkgField.key.value === 'devDependencies' || - pkgField.key.value === 'peerDependencies' || - pkgField.key.value === 'optionalDependencies' - ) { - if (pkgField.value.type === 'Object') { - for (const v of pkgField.value.children) { - const { loc } = v; - if (loc) { - results.push({ - name: v.key.value, - range: rangeForJSONAstLoc(loc), - prioritize: true - }) - } - } - } - } - if (pkgField.key.value === 'bundledDependencies') { - if (pkgField.value.type === 'Array') { - for (const node of pkgField.value.children) { - if (node.type === 'Literal' && typeof node.value === 'string') { - const {loc} = node - if (loc) { - results.push({ - name: node.value, - range: rangeForJSONAstLoc(loc) - }) - } - } - } - } - } - if (pkgField.key.value === 'overrides') { - if (pkgField.value.type === 'Object') { - parsePkgOverrideExternals(pkgField.value, results) - } - } - - } - } else if (micromatch.isMatch(basename, globPatterns.pypi.pyproject.pattern)) { - let parsed: toml.AST.TOMLProgram; - try { - parsed = toml.parseTOML(src); - } catch (err) { - return null; - } - traverseTOMLKeys(parsed, (key, path) => { - const dep = path.length === 2 && - path[0] === 'project' && - path[1] === 'dependencies'; - const optionalDep = path.length === 3 && - path[0] === 'project' && - path[2] === 'optional-dependencies' && - typeof path[3] === 'string'; - const inPoetry = path.length > 2 && - path[0] === 'tool' && - path[1] === 'poetry'; - const oldPoetryDep = inPoetry && path.length === 4 && - ['dependencies', 'dev-dependencies'].includes(path[2] as string); - const groupPoetryDep = inPoetry && path.length === 6 && - path[2] === 'group' && - path[4] === 'dependencies'; - if ((oldPoetryDep || groupPoetryDep) && typeof path[path.length - 1] === 'string') { - const loc = key.parent.type === 'TOMLTable' ? key.loc : key.parent.loc; - results.push({ - name: path[path.length - 1] as string, - range: new vscode.Range( - new vscode.Position(loc.start.line - 1, loc.start.column), - new vscode.Position(loc.end.line - 1, loc.end.column) - ) - }); - } else if ( - (dep || optionalDep) && - key.parent.type === 'TOMLKeyValue' && - key.parent.value.type === 'TOMLArray' - ) { - for (const depNode of key.parent.value.elements) { - if (depNode.type !== 'TOMLValue' || depNode.kind !== 'string') continue; - const match = pep508RE.exec(depNode.value); - if (!match) continue; - results.push({ - name: match[1], - range: new vscode.Range( - new vscode.Position(depNode.loc.start.line - 1, depNode.loc.start.column), - new vscode.Position(depNode.loc.end.line - 1, depNode.loc.end.column) - ) - }) - } - } - }); - } else if (micromatch.isMatch(basename, globPatterns.pypi.pipfile.pattern)) { - let parsed: toml.AST.TOMLProgram; - try { - parsed = toml.parseTOML(src); - } catch (err) { - return null; - } - traverseTOMLKeys(parsed, (key, path) => { - if ( - path.length === 2 && - ['packages', 'dev-packages'].includes(path[0] as string) && - typeof path[1] === 'string' - ) { - const loc = key.parent.type === 'TOMLTable' ? key.loc : key.parent.loc; - results.push({ - name: path[1] as string, - range: new vscode.Range( - new vscode.Position(loc.start.line - 1, loc.start.column), - new vscode.Position(loc.end.line - 1, loc.end.column) - ) - }); - } - }); - } else if (micromatch.isMatch(basename, globPatterns.pypi.requirements.pattern)) { - const commentRE = /(\s|^)#.*/; - const lines = src.split('\n').map(line => line.replace(commentRE, '')); - for (let i = 0; i < lines.length; ++i) { - const line = lines[i]; - const match = pep508RE.exec(line); - if (match) { - results.push({ - name: match[1], - range: new vscode.Range( - new vscode.Position(i, match.index), - new vscode.Position(i, match.index + line.length) - ) - }); - } - } - } else if (micromatch.isMatch(basename, globPatterns.golang.gomod.pattern)) { - const parsed = await parseGoMod(src) - if (!parsed) return null - - const exclusions: Set = new Set() - for (const exclude of parsed.Exclude ?? []) { - exclusions.add(exclude.Mod.Path) - } - - for (const req of parsed.Require ?? []) { - if (exclusions.has(req.Mod.Path)) continue - results.push({ - name: req.Mod.Path, - range: new vscode.Range( - new vscode.Position(req.Syntax.Start.Line - 1, req.Syntax.Start.LineRune - 1), - new vscode.Position(req.Syntax.End.Line - 1, req.Syntax.End.LineRune - 1), - ) - }) - } - - for (const repl of parsed.Replace ?? []) { - if (exclusions.has(repl.New.Path)) continue - results.push({ - name: repl.New.Path, - // TODO: can we get just the new part? - range: new vscode.Range( - new vscode.Position(repl.Syntax.Start.Line - 1, repl.Syntax.Start.LineRune - 1), - new vscode.Position(repl.Syntax.End.Line - 1, repl.Syntax.End.LineRune - 1), - ) - }) - } - } - } - return results -} -function rangeForJSONAstLoc(loc: Required['loc']): vscode.Range { - return new vscode.Range( - new vscode.Position( - loc.start.line - 1, - loc.start.column - 1 - ), - new vscode.Position( - loc.end.line - 1, - loc.end.column - 1 - ) - ) -} -function parsePkgOverrideExternals(node: jsonToAST.ObjectNode, results: Array, contextualName?: string): void { - for (const child of node.children) { - let pkgName: string | undefined - if (child.key.value === '.') { - if (contextualName) { - pkgName = contextualName - } - } else { - pkgName = getJSPackageNameFromVersionRange(child.key.value); - } - if (pkgName) { - const { loc } = child.value.type === 'Literal' ? child : child.key - if (loc) { - results.push({ - range: rangeForJSONAstLoc(loc), - name: pkgName - }) - } - } - const { value } = child - if (value.type === 'Object') { - parsePkgOverrideExternals(value, results, pkgName ?? contextualName) - } else if (value.type === 'Literal') { - if (typeof value.value === 'string') { - if (value.value.startsWith('$')) { - const { loc } = value; - if (loc) { - results.push({ - range: rangeForJSONAstLoc(loc), - name: value.value.slice(1) - }) - } - } - } - } - } -} diff --git a/src/ui/pipfile.ts b/src/ui/pipfile.ts deleted file mode 100644 index 4f5bfc1..0000000 --- a/src/ui/pipfile.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as vscode from 'vscode'; -import { provideCodeActions } from './dep-file'; -import { getGlobPatterns } from '../data/glob-patterns'; - -export async function registerCodeActionsProvider() { - const globPatterns = await getGlobPatterns(); - return vscode.languages.registerCodeActionsProvider({ - pattern: `**/${globPatterns.pypi.pipfile.pattern}`, - scheme: undefined - }, { - provideCodeActions - }, { - providedCodeActionKinds: [vscode.CodeActionKind.QuickFix] - }) -} \ No newline at end of file diff --git a/src/ui/purl-alerts-and-scores/manager.ts b/src/ui/purl-alerts-and-scores/manager.ts new file mode 100644 index 0000000..260b48e --- /dev/null +++ b/src/ui/purl-alerts-and-scores/manager.ts @@ -0,0 +1,213 @@ +import type { SimPURL } from '../externals/parse-externals' +import https from 'https' +import { createInterface } from 'readline' +import { once } from 'events' +import type { IncomingMessage } from 'http' +import { getAPIConfig, toAuthHeader } from '../../data/socket-api-config' +import logger from '../../infra/log' +import os from 'os' +import path from 'path' +import fs from 'fs' +const cacheDir = path.resolve(os.homedir(), '.socket', 'vscode') + +export type PackageScoreAndAlerts = { + alerts: Array<{ + action: 'error' | 'warn' | 'monitor' | 'ignore', + type: string, + severity: 'critical' | 'high' | 'medium' | 'low', + props: any + }>, + score: { + license: number, + maintenance: number, + overall: number, + quality: number, + supplyChain: number, + vulnerability: number, + }, + type: string; + namespace?: string; + name: string; + version?: string; + qualifiers?: string; + subpath?: string; +} + +export class PURLPackageData { + purl: SimPURL; + watchers: Set<(pkgData: PURLPackageData) => void> = new Set(); + pkgData!: PackageScoreAndAlerts | null + mtime: number = -Infinity + error: string | null = null; + setError(reason: string) { + this.error = reason; + if (!this.pkgData) { + this.#notifyWatchers(); + } + } + constructor(purl: SimPURL) { + this.purl = purl; + this.readPkgDataFromDisk(); + } + filepath() { + return path.join(cacheDir, `${btoa(this.purl)}.json`); + } + writePkgDataToDisk() { + const filePath = this.filepath(); + try { + fs.mkdirSync(cacheDir, { recursive: true }) + fs.writeFileSync(filePath, JSON.stringify(this.pkgData, null, 2)) + logger.info(`Wrote PURL data to disk for ${this.purl} at ${filePath}`) + } catch (e) { + logger.error(`Failed to write PURL data to disk for ${this.purl}`, e) + } + } + readPkgDataFromDisk() { + const filePath = this.filepath(); + try { + const data = fs.readFileSync(filePath, 'utf-8'); + this.pkgData = JSON.parse(data); + this.mtime = fs.statSync(filePath).mtimeMs; + } catch (e) { + logger.error(`Failed to read PURL data from disk for ${this.purl}`, e) + } + } + isStale() { + return this.mtime + 10 * 60 * 1000 < Date.now(); // 10 minutes + } + subscribe(cb: (pkgData: PURLPackageData) => void) { + this.watchers.add(cb); + } + unsubscribe(cb: (pkgData: PURLPackageData) => void) { + this.watchers.delete(cb); + } + update(data: PackageScoreAndAlerts) { + this.pkgData = data; + this.error = null; + this.writePkgDataToDisk(); + this.#notifyWatchers(); + } + #notifyWatchers() { + for (const watcher of this.watchers) { + watcher(this); + } + } +} +export class PURLDataCache { + static singleton: PURLDataCache = new PURLDataCache(); + timeout: number = 10 * 60 * 1000; // 10 minutes + #pkgData: Map = new Map(); + // PURLs just waiting for bus to be sent + #pkgsNeedingUpdate: Set = new Set(); + // in-flight PURLs + #currentPendingUpdates: Set = new Set(); + private constructor() {} + watch(purl: SimPURL): PURLPackageData { + let pkgDataForPURL = this.#pkgData.get(purl); + if (!pkgDataForPURL) { + const newPkgData = new PURLPackageData(purl); + this.#pkgData.set(purl, newPkgData); + pkgDataForPURL = newPkgData; + } + if (pkgDataForPURL.isStale()) { + this.queueUpdate(purl); + } + return pkgDataForPURL; + } + queueUpdate(purl: SimPURL) { + // already on a bus + if (this.#currentPendingUpdates.has(purl)) { + return + } + const thisIsTheBusForTheseUpdates = this.#pkgsNeedingUpdate.size === 0; + this.#pkgsNeedingUpdate.add(purl); + logger.info(`is bus`, thisIsTheBusForTheseUpdates, `for`, purl, `pending updates:`, this.#currentPendingUpdates.size, `queued updates:`, this.#pkgsNeedingUpdate.size); + if (!thisIsTheBusForTheseUpdates) { + return; // already scheduled a bus trip + } + + const controller = new AbortController() + const abort = controller.abort.bind(controller) + const timer = setTimeout(abort, this.timeout); + ;(async () => { + // microtask to allow other updates to be queued + await null + const thesePendingUpdates = Array.from(this.#pkgsNeedingUpdate); + this.#pkgsNeedingUpdate.clear() + for (const purl of thesePendingUpdates) { + this.#currentPendingUpdates.add(purl); + } + const bailPendingCacheEntries = (reason?: Error) => { + for (const purl of thesePendingUpdates) { + logger.error(`Bailing pending cache entry for PURL: ${purl}`, reason?.message); + this.#currentPendingUpdates.delete(purl); + this.#pkgData.get(purl)?.setError('Unable to load data from Socket API' + (reason ? `: ${reason.message}` : '')); + } + } + controller.signal.addEventListener('abort', () => { + clearTimeout(timer) + bailPendingCacheEntries(controller.signal.reason || new Error('Aborted')) + }) + try { + const apiConfig = await getAPIConfig() + if (!apiConfig) { + bailPendingCacheEntries() + return + } + const req = https.request(`https://api.socket.dev/v0/purl?alerts=true&compact=false'`, { + method: 'POST', + headers: { + 'content-type': 'application/json', + 'authorization': toAuthHeader(apiConfig.apiKey) + }, + signal: controller.signal + }) + logger.info(`Requesting Socket API for PURLs: ${thesePendingUpdates.join(', ')}`) + function cleanupReq() { + try { + req.destroy() + } catch { + } + } + controller.signal.addEventListener('abort', cleanupReq) + const body = JSON.stringify({ + components: thesePendingUpdates.map(str => ({ + purl: str + })) + }) + logger.info(body) + req.end(body ) + const [res] = (await once(req, 'response')) as unknown as [IncomingMessage] + function cleanupRes() { + try { + res.destroy() + } catch { + } + } + controller.signal.addEventListener('abort', cleanupRes) + logger.info(`Received response from Socket API for PURLs: ${thesePendingUpdates.join(', ')}`, res.statusCode, res.statusMessage) + + if (!res.statusCode || res.statusCode < 200 || res.statusCode >= 300) { + throw new Error(`Unexpected response from Socket API: ${res.statusCode} ${res.statusMessage}`) + } + const lines = createInterface({ + input: res, + terminal: false, + crlfDelay: Infinity, + historySize: 0 + }) + for await (const line of lines) { + const scoreAndAlerts = JSON.parse(line) as PackageScoreAndAlerts + const purlWithoutVersion = `pkg:${scoreAndAlerts.type}/${scoreAndAlerts.namespace? scoreAndAlerts.namespace + '/' : ''}${scoreAndAlerts.name}${scoreAndAlerts.qualifiers ? '?' + scoreAndAlerts.qualifiers : ''}${scoreAndAlerts.subpath ? '#' + scoreAndAlerts.subpath : ''}` as SimPURL; + const purlWithVersion = `pkg:${scoreAndAlerts.type}/${scoreAndAlerts.namespace? scoreAndAlerts.namespace + '/' : ''}${scoreAndAlerts.name}@${scoreAndAlerts.version}${scoreAndAlerts.qualifiers ? '?' + scoreAndAlerts.qualifiers : ''}${scoreAndAlerts.subpath ? '#' + scoreAndAlerts.subpath : ''}` as SimPURL; + logger.info(`Received score and alerts for PURL: ${purlWithoutVersion}`, scoreAndAlerts) + this.#pkgData.get(purlWithoutVersion)?.update(scoreAndAlerts); + this.#pkgData.get(purlWithVersion)?.update(scoreAndAlerts); + } + bailPendingCacheEntries(new Error('Not Found')) + } catch (e) { + abort() + } + })() + } +} diff --git a/src/ui/pyproject.ts b/src/ui/pyproject.ts deleted file mode 100644 index edf281e..0000000 --- a/src/ui/pyproject.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as vscode from 'vscode'; -import * as toml from 'toml-eslint-parser' -import { generateLens, provideCodeActions } from './dep-file'; -import { traverseTOMLKeys } from '../util'; -import { getGlobPatterns } from '../data/glob-patterns'; - -function provideCodeLenses(document: vscode.TextDocument, token: vscode.CancellationToken): vscode.ProviderResult { - const pyprojectSource = document.getText() - const ast = toml.parseTOML(pyprojectSource) - const lenses: vscode.CodeLens[] = []; - - traverseTOMLKeys(ast, (node, curPath) => { - const deps = curPath.length == 2 && - curPath[0] === 'project' && - ['dependencies' || 'optional-dependencies'].includes(curPath[1] as string); - const inPoetry = curPath.length > 2 && - curPath[0] === 'tool' && - curPath[1] === 'poetry'; - const oldPoetryDeps = inPoetry && curPath.length === 3 && - ['dependencies', 'dev-dependencies'].includes(curPath[2] as string); - const groupPoetryDeps = inPoetry && curPath.length === 5 && - curPath[2] === 'group' && - curPath[4] === 'dependencies'; - if (deps || oldPoetryDeps || groupPoetryDeps) { - const start = new vscode.Position(node.loc.start.line - 1, node.loc.start.column); - const end = new vscode.Position(node.loc.end.line - 1, node.loc.end.column); - const range = new vscode.Range(start, end) - lenses.push(generateLens(range, document)) - } - }) - - return lenses -} - -export async function registerCodeLensProvider() { - const globPatterns = await getGlobPatterns(); - return vscode.languages.registerCodeLensProvider({ - pattern: `**/${globPatterns.pypi.pyproject.pattern}`, - scheme: undefined - }, { - provideCodeLenses - }) -} - -export async function registerCodeActionsProvider() { - const globPatterns = await getGlobPatterns(); - return vscode.languages.registerCodeActionsProvider({ - pattern: `**/${globPatterns.pypi.pyproject.pattern}`, - scheme: undefined - }, { - provideCodeActions - }, { - providedCodeActionKinds: [vscode.CodeActionKind.QuickFix] - }) -} diff --git a/src/ui/requirements.ts b/src/ui/requirements.ts deleted file mode 100644 index e876f70..0000000 --- a/src/ui/requirements.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as vscode from 'vscode'; -import { provideCodeActions } from './dep-file'; -import { getGlobPatterns } from '../data/glob-patterns'; - -export async function registerCodeActionsProvider() { - const patterns = await getGlobPatterns(); - return vscode.languages.registerCodeActionsProvider({ - pattern: `**/${patterns.pypi.requirements.pattern}`, - scheme: undefined - }, { - provideCodeActions - }, { - providedCodeActionKinds: [vscode.CodeActionKind.QuickFix] - }) -} \ No newline at end of file diff --git a/src/util.ts b/src/util.ts index 4e83ccb..06eb234 100644 --- a/src/util.ts +++ b/src/util.ts @@ -351,5 +351,6 @@ export function flattenGlob(glob: string) { return root.explode() } - return `{${explode(glob).join(',')}}` + const parts = explode(glob) + return parts.length > 1 ? `{${parts.join(',')}}` : parts[0] } diff --git a/tsconfig.json b/tsconfig.json index 8c77caf..753a903 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,9 +2,9 @@ "compilerOptions": { "module": "ESNext", "moduleResolution": "node", - "target": "es2020", + "target": "esnext", // DOM needed for WASM unfortunately - "lib": ["dom", "es2020"], + "lib": ["dom", "esnext"], "outDir": "out", "sourceMap": true, "rootDir": "src",