From 1df740a926fe941adaf3da1153064a467cb96363 Mon Sep 17 00:00:00 2001 From: Giulia Stocco <98900+gfs@users.noreply.github.com> Date: Wed, 23 Sep 2026 18:30:02 +0000 Subject: [PATCH 1/7] Remove deprecated scripts and pipeline configurations for DevSkim VSCode and Visual Studio extensions, including version management and package handling. --- DevSkim-VSCode-Plugin/.gitignore | 5 - DevSkim-VSCode-Plugin/.npmrc.pipeline | 3 - DevSkim-VSCode-Plugin/.vscode/extensions.json | 9 - DevSkim-VSCode-Plugin/.vscode/launch.json | 35 - DevSkim-VSCode-Plugin/.vscode/settings.json | 8 - DevSkim-VSCode-Plugin/.vscode/tasks.json | 63 - DevSkim-VSCode-Plugin/.vscodeignore | 8 - DevSkim-VSCode-Plugin/License.txt | 17 - DevSkim-VSCode-Plugin/README.md | 49 - DevSkim-VSCode-Plugin/ThirdPartyNotices.txt | 34 - .../client/common/codeFixMapping.ts | 23 - .../client/common/devskimSettings.ts | 55 - .../client/common/fileVersion.ts | 10 - .../client/common/notificationNames.ts | 15 - .../client/common/selectors.ts | 32 - DevSkim-VSCode-Plugin/client/devSkimFixer.ts | 75 - DevSkim-VSCode-Plugin/client/extension.ts | 148 - .../client/package-lock.json | 932 --- DevSkim-VSCode-Plugin/client/package.json | 23 - DevSkim-VSCode-Plugin/client/tsconfig.json | 28 - DevSkim-VSCode-Plugin/devskim.ico | Bin 32606 -> 0 bytes DevSkim-VSCode-Plugin/eslint.config.mjs | 19 - DevSkim-VSCode-Plugin/package-lock.json | 5892 ----------------- DevSkim-VSCode-Plugin/package.json | 334 - .../scripts/checkPreReleaseFlag.js | 22 - .../scripts/resetPackageVersion.js | 3 - .../scripts/setPackageVersion.js | 10 - .../scripts/updatePackageLock.js | 39 - DevSkim-VSCode-Plugin/tsconfig.json | 21 - Pipelines/vs/devskim-visualstudio-pr.yml | 99 - Pipelines/vs/devskim-visualstudio-release.yml | 254 - Pipelines/vscode/devskim-vscode-pr.yml | 74 - Pipelines/vscode/devskim-vscode-release.yml | 248 - 33 files changed, 8587 deletions(-) delete mode 100644 DevSkim-VSCode-Plugin/.gitignore delete mode 100644 DevSkim-VSCode-Plugin/.npmrc.pipeline delete mode 100644 DevSkim-VSCode-Plugin/.vscode/extensions.json delete mode 100644 DevSkim-VSCode-Plugin/.vscode/launch.json delete mode 100644 DevSkim-VSCode-Plugin/.vscode/settings.json delete mode 100644 DevSkim-VSCode-Plugin/.vscode/tasks.json delete mode 100644 DevSkim-VSCode-Plugin/.vscodeignore delete mode 100644 DevSkim-VSCode-Plugin/License.txt delete mode 100644 DevSkim-VSCode-Plugin/README.md delete mode 100644 DevSkim-VSCode-Plugin/ThirdPartyNotices.txt delete mode 100644 DevSkim-VSCode-Plugin/client/common/codeFixMapping.ts delete mode 100644 DevSkim-VSCode-Plugin/client/common/devskimSettings.ts delete mode 100644 DevSkim-VSCode-Plugin/client/common/fileVersion.ts delete mode 100644 DevSkim-VSCode-Plugin/client/common/notificationNames.ts delete mode 100644 DevSkim-VSCode-Plugin/client/common/selectors.ts delete mode 100644 DevSkim-VSCode-Plugin/client/devSkimFixer.ts delete mode 100644 DevSkim-VSCode-Plugin/client/extension.ts delete mode 100644 DevSkim-VSCode-Plugin/client/package-lock.json delete mode 100644 DevSkim-VSCode-Plugin/client/package.json delete mode 100644 DevSkim-VSCode-Plugin/client/tsconfig.json delete mode 100644 DevSkim-VSCode-Plugin/devskim.ico delete mode 100644 DevSkim-VSCode-Plugin/eslint.config.mjs delete mode 100644 DevSkim-VSCode-Plugin/package-lock.json delete mode 100644 DevSkim-VSCode-Plugin/package.json delete mode 100644 DevSkim-VSCode-Plugin/scripts/checkPreReleaseFlag.js delete mode 100644 DevSkim-VSCode-Plugin/scripts/resetPackageVersion.js delete mode 100644 DevSkim-VSCode-Plugin/scripts/setPackageVersion.js delete mode 100644 DevSkim-VSCode-Plugin/scripts/updatePackageLock.js delete mode 100644 DevSkim-VSCode-Plugin/tsconfig.json delete mode 100644 Pipelines/vs/devskim-visualstudio-pr.yml delete mode 100644 Pipelines/vs/devskim-visualstudio-release.yml delete mode 100644 Pipelines/vscode/devskim-vscode-pr.yml delete mode 100644 Pipelines/vscode/devskim-vscode-release.yml diff --git a/DevSkim-VSCode-Plugin/.gitignore b/DevSkim-VSCode-Plugin/.gitignore deleted file mode 100644 index c1276423..00000000 --- a/DevSkim-VSCode-Plugin/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.vscode-test -devskimBinaries -**/node_modules -**/client/out -**/*.tsbuildinfo \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/.npmrc.pipeline b/DevSkim-VSCode-Plugin/.npmrc.pipeline deleted file mode 100644 index c088fa60..00000000 --- a/DevSkim-VSCode-Plugin/.npmrc.pipeline +++ /dev/null @@ -1,3 +0,0 @@ -registry=https://pkgs.dev.azure.com/microsoft-sdl/General/_packaging/PublicRegistriesFeed/npm/registry/ - -always-auth=true diff --git a/DevSkim-VSCode-Plugin/.vscode/extensions.json b/DevSkim-VSCode-Plugin/.vscode/extensions.json deleted file mode 100644 index af515502..00000000 --- a/DevSkim-VSCode-Plugin/.vscode/extensions.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. - // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp - - // List of extensions which should be recommended for users of this workspace. - "recommendations": [ - "dbaeumer.vscode-eslint" - ] -} \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/.vscode/launch.json b/DevSkim-VSCode-Plugin/.vscode/launch.json deleted file mode 100644 index 3a2cd495..00000000 --- a/DevSkim-VSCode-Plugin/.vscode/launch.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "type": "extensionHost", - "request": "launch", - "name": "Launch VSC Client", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceRoot}" - ], - "sourceMaps": true, - "outFiles": ["${workspaceRoot}/client/out/**/*.js"], - "preLaunchTask": "npm-build" - }, - { - "type": "extensionHost", - "request": "launch", - "name": "Clean + Launch VSC Client", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceRoot}" - ], - "sourceMaps": true, - "outFiles": ["${workspaceRoot}/client/out/**/*.js"], - "preLaunchTask": "npm-clean + npm-build" - }, - { - "name": ".NET Core Attach", - "type": "coreclr", - "request": "attach", - "processId": "${command:pickProcess}" - } - ] -} \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/.vscode/settings.json b/DevSkim-VSCode-Plugin/.vscode/settings.json deleted file mode 100644 index eb71540b..00000000 --- a/DevSkim-VSCode-Plugin/.vscode/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "editor.insertSpaces": false, - "typescript.tsc.autoDetect": "off", - "typescript.preferences.quoteStyle": "single", - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - } -} \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/.vscode/tasks.json b/DevSkim-VSCode-Plugin/.vscode/tasks.json deleted file mode 100644 index abd68e11..00000000 --- a/DevSkim-VSCode-Plugin/.vscode/tasks.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "clean", - "label": "npm-clean", - "group": "build", - "options": { - "cwd": "${workspaceRoot}" - }, - "presentation": { - "panel": "dedicated", - "reveal": "never" - }, - "problemMatcher": [ - "$tsc" - ] - }, - { - "type": "npm", - "script": "build", - "label": "npm-build", - "group": "build", - "options": { - "cwd": "${workspaceRoot}" - }, - "presentation": { - "panel": "dedicated", - "reveal": "never" - }, - "problemMatcher": [ - "$tsc" - ] - }, - { - "type": "npm", - "script": "watch", - "label": "npm-watch", - "isBackground": true, - "group": { - "kind": "build", - "isDefault": true - }, - "options": { - "cwd": "${workspaceRoot}" - }, - "presentation": { - "panel": "dedicated", - "reveal": "never" - }, - "problemMatcher": [ - "$tsc-watch" - ] - }, - { - "label": "npm-clean + npm-build", - "dependsOrder": "sequence", - "dependsOn": ["npm-clean", "npm-build"] - } - - ] -} \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/.vscodeignore b/DevSkim-VSCode-Plugin/.vscodeignore deleted file mode 100644 index becfa87f..00000000 --- a/DevSkim-VSCode-Plugin/.vscodeignore +++ /dev/null @@ -1,8 +0,0 @@ -.vscode -**/node_modules -**/tsconfig.json -**/*.ts -.eslintignore -.gitignore -**/tsconfig.tsbuildinfo -scripts/* \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/License.txt b/DevSkim-VSCode-Plugin/License.txt deleted file mode 100644 index 64cf4406..00000000 --- a/DevSkim-VSCode-Plugin/License.txt +++ /dev/null @@ -1,17 +0,0 @@ -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE -FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/README.md b/DevSkim-VSCode-Plugin/README.md deleted file mode 100644 index d5da1a2b..00000000 --- a/DevSkim-VSCode-Plugin/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# DevSkim - -DevSkim is a framework of IDE extensions and language analyzers that provide inline security analysis in the dev environment as the developer writes code. It has a flexible rule model that supports multiple programming languages. The goal is to notify the developer as they are introducing a security vulnerability in order to fix the issue at the point of introduction, and to help build awareness for the developer. - -## Features - -* Built-in rules, and support for writing custom rules -* IntelliSense error "squiggly lines" for identified security issues -* Information and guidance provided for identified security issues -* Optional suppression of unwanted findings -* Broad language support including: C, C++, C#, Cobol, Go, Java, Javascript/Typescript, Python, and [more](https://github.com/Microsoft/DevSkim/wiki/Supported-Languages). - -## Usage - -As a developer writes code, DevSkim will flag identified security issues and call attention to them with errors or warnings. Mousing over the issue will show a description of the problem and how to address it, with a link to more information. For some issues, one or more safe alternatives are available in the lightbulb menu so that the issue can be fixed automatically. For issues where the alternative has different parameters than the unsafe API that is called out, guidance for the parameters will be inserted in the form of \. For example, when DevSkim turns gets() into fgets() it adds \ to inform a user that they need to provide the size of the buffer. - -![](https://raw.githubusercontent.com/microsoft/DevSkim/9c5a19ab8ff8a182c34ca100112d7c2803e0f180/DevSkim-VSCode-Plugin/vsc-example.gif) - -### Suppressions - -DevSkim has built-in ability to suppress any of its warnings, either permanently, or for a period of time. Permanent suppressions are for scenarios where, for whatever reason, the flagged code should not be changed. Timed suppressions are for scenarios where the code should change, but the developer does not want to change it immediately. In both cases, DevSkim will insert a comment after the code to notify it (and anyone reviewing the code) that the usage should be ignored, and in the case of timed suppressions, when DevSkim should alert again. Users can add additional comments after the suppression to describe why the issue is being suppressed. - -For timed suppressions, the default period is 30 days, but this can be adjusted in the settings file. - -Suppressions can be accessed from the lightbulb menu. Once a suppression is added, DevSkim will highlight the issue number that identifies the check being suppressed (the gets() example above is issue number DS181021 for example), and mousing over will provide details. This will let other contributors to a project know what was suppressed, and reduce confusion about the comment. - -![](https://raw.githubusercontent.com/microsoft/DevSkim/9c5a19ab8ff8a182c34ca100112d7c2803e0f180/DevSkim-VSCode-Plugin/vsc-suppression-example.png) - -## Rules - -DevSkim takes an approach that is programming language agnostic. It primarily finds issues via regular expression, so rules can be written for just about any programming language. Out of the box, DevSkim can find dangerous crypto usage in most programming languages, and also includes rules for a range of language specific issues. The built-in ruleset is growing regularly, and it is very easy for users to write their own rules. For more information, see [Writing Rules](https://github.com/Microsoft/DevSkim/wiki/Writing-Rules). - -## Building - -In order to build you will need the latest .NET Core SDK as well as the appropriate version of node.js. - -### Build Extension -You can build the vsix directly with npm: -`npm run pack-ext` - -### Debugging -To debug the code in vscode, you can use the `Client and Server` task that is defined. You will first need to setup the environment and build: - -`npm run setup` -`tsc -b` - -## Thank You - -Thanks for trying DevSkim! If you find issues, please [report them on GitHub](https://github.com/Microsoft/DevSkim) and feel free to contribute! diff --git a/DevSkim-VSCode-Plugin/ThirdPartyNotices.txt b/DevSkim-VSCode-Plugin/ThirdPartyNotices.txt deleted file mode 100644 index 3f6cd2e5..00000000 --- a/DevSkim-VSCode-Plugin/ThirdPartyNotices.txt +++ /dev/null @@ -1,34 +0,0 @@ -THIRD-PARTY SOFTWARE NOTICES AND INFORMATION -For Microsoft vscode-languageserver-node-example - -This project incorporates material from the project(s) listed below (collectively, “Third Party Code”). -Microsoft is not the original author of the Third Party Code. The original copyright notice and license -under which Microsoft received such Third Party Code are set out below. This Third Party Code is licensed -to you under their original license terms set forth below. Microsoft reserves all other rights not expressly -granted, whether by implication, estoppel or otherwise. - -1. DefinitelyTyped version 0.0.1 (https://github.com/borisyankov/DefinitelyTyped) -2. XRegExp version >=3.1.1 (http://xregexp.com/) -3. node-dir version >=0.1.15 (https://www.npmjs.com/package/node-dir) -4. mkdirp >= 0.5.1 (https://github.com/substack/node-mkdirp) - -This project is licensed under the MIT license. -Copyrights are respective of each contributor listed at the beginning of each definition file. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/client/common/codeFixMapping.ts b/DevSkim-VSCode-Plugin/client/common/codeFixMapping.ts deleted file mode 100644 index b11fc7b5..00000000 --- a/DevSkim-VSCode-Plugin/client/common/codeFixMapping.ts +++ /dev/null @@ -1,23 +0,0 @@ -export class CodeFixMapping -{ - // The Diagnostic Type is declared from a different context but we can pass them this way - diagnostic: any; - replacement: string; - fileName: string; - friendlyString: string; - matchStart: string; - matchEnd: string; - isSuppression: boolean; - version: number; - constructor(diagnostic: any, replacement: string, fileName: string, friendlyString: string, matchStart: string, matchEnd: string, isSuppression: boolean, version: number) - { - this.diagnostic = diagnostic; - this.replacement = replacement; - this.fileName = fileName; - this.friendlyString = friendlyString; - this.matchStart = matchStart; - this.matchEnd = matchEnd; - this.isSuppression = isSuppression; - this.version = version; - } -} \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/client/common/devskimSettings.ts b/DevSkim-VSCode-Plugin/client/common/devskimSettings.ts deleted file mode 100644 index 6d766f84..00000000 --- a/DevSkim-VSCode-Plugin/client/common/devskimSettings.ts +++ /dev/null @@ -1,55 +0,0 @@ - -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -export interface DevSkimSettings { - enableCriticalSeverityRules: boolean; - enableImportantSeverityRules: boolean; - enableModerateSeverityRules: boolean; - enableManualReviewSeverityRules: boolean; - enableBestPracticeSeverityRules: boolean; - enableHighConfidenceRules: boolean; - enableMediumConfidenceRules: boolean; - enableLowConfidenceRules: boolean; - suppressionDurationInDays: number; - suppressionCommentStyle: string; - manualReviewerName: string; - ignoreFiles: string[]; - ignoreRulesList: string[]; - guidanceBaseURL: string; - removeFindingsOnClose: boolean; - ignoreDefaultRules: boolean; - customRulesPaths: string[]; - customLanguagesPath: string; - customCommentsPath: string; - scanOnOpen: boolean; - scanOnSave: boolean; - scanOnChange: boolean; - traceServer: boolean; -} - -export class DevSkimSettingsObject implements DevSkimSettings { - enableCriticalSeverityRules: boolean = true; - enableImportantSeverityRules: boolean = true; - enableModerateSeverityRules: boolean = true; - enableManualReviewSeverityRules: boolean = true; - enableBestPracticeSeverityRules: boolean = true; - enableHighConfidenceRules: boolean = true; - enableMediumConfidenceRules: boolean = true; - enableLowConfidenceRules: boolean = false; - suppressionDurationInDays: number = 30; - suppressionCommentStyle: string = "line"; - manualReviewerName: string = ""; - ignoreFiles: string[] = []; - ignoreRulesList: string[] = []; - guidanceBaseURL: string = "https://github.com/Microsoft/DevSkim/Guidance"; - removeFindingsOnClose: boolean = false; - ignoreDefaultRules: boolean = false; - customRulesPaths: string[] = []; - customLanguagesPath: string = ""; - customCommentsPath: string = ""; - scanOnOpen: boolean = true; - scanOnSave: boolean = true; - scanOnChange: boolean = true; - traceServer: boolean = false; -} \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/client/common/fileVersion.ts b/DevSkim-VSCode-Plugin/client/common/fileVersion.ts deleted file mode 100644 index 365bc377..00000000 --- a/DevSkim-VSCode-Plugin/client/common/fileVersion.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class FileVersion -{ - fileName: string; - version: number; - constructor(fileName: string, version: number) - { - this.fileName = fileName; - this.version = version; - } -} \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/client/common/notificationNames.ts b/DevSkim-VSCode-Plugin/client/common/notificationNames.ts deleted file mode 100644 index 5d49bf44..00000000 --- a/DevSkim-VSCode-Plugin/client/common/notificationNames.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - * ------------------------------------------------------------------------------------------ */ - -// This file has static names for the notifications passed between client and server. -export function getCodeFixMapping() : string -{ - return "devskim/codefixmapping"; -} - -export function getFileVersion() : string -{ - return "devskim/fileversion"; -} \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/client/common/selectors.ts b/DevSkim-VSCode-Plugin/client/common/selectors.ts deleted file mode 100644 index ca6b03d9..00000000 --- a/DevSkim-VSCode-Plugin/client/common/selectors.ts +++ /dev/null @@ -1,32 +0,0 @@ -// TODO: This shoud be dynamically updated by the Languages loaded by the language server -export const selectors = [{ scheme: 'file', language: 'c' }, -{ scheme: 'file', language: 'clojure' }, -{ scheme: 'file', language: 'coffeescript' }, -{ scheme: 'file', language: 'cpp' }, -{ scheme: 'file', language: 'csharp' }, -{ scheme: 'file', language: 'fsharp' }, -{ scheme: 'file', language: 'go' }, -{ scheme: 'file', language: 'groovy' }, -{ scheme: 'file', language: 'jade' }, -{ scheme: 'file', language: 'java' }, -{ scheme: 'file', language: 'javascript' }, -{ scheme: 'file', language: 'javascriptreact' }, -{ scheme: 'file', language: 'lua' }, -{ scheme: 'file', language: 'objective-c' }, -{ scheme: 'file', language: 'perl' }, -{ scheme: 'file', language: 'perl6' }, -{ scheme: 'file', language: 'php' }, -{ scheme: 'file', language: 'plaintext' }, -{ scheme: 'file', language: 'powershell' }, -{ scheme: 'file', language: 'python' }, -{ scheme: 'file', language: 'r' }, -{ scheme: 'file', language: 'ruby' }, -{ scheme: 'file', language: 'rust' }, -{ scheme: 'file', language: 'shellscript' }, -{ scheme: 'file', language: 'sql' }, -{ scheme: 'file', language: 'swift' }, -{ scheme: 'file', language: 'typescript' }, -{ scheme: 'file', language: 'typescriptreact' }, -{ scheme: 'file', language: 'vb' }, -{ scheme: 'file', language: 'xml' }, -{ scheme: 'file', language: 'yaml' }]; \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/client/devSkimFixer.ts b/DevSkim-VSCode-Plugin/client/devSkimFixer.ts deleted file mode 100644 index dfe29100..00000000 --- a/DevSkim-VSCode-Plugin/client/devSkimFixer.ts +++ /dev/null @@ -1,75 +0,0 @@ -import * as vscode from 'vscode'; -import { CodeFixMapping } from './common/codeFixMapping'; -import { FileVersion } from './common/fileVersion'; - -export class DevSkimFixer implements vscode.CodeActionProvider { - - fixMapping = new Map>(); - public static readonly providedCodeActionKinds = [ - vscode.CodeActionKind.QuickFix - ]; - - createMapKeyForDiagnostic(diagnostic: vscode.Diagnostic, fileName: string) : string - { - return `${fileName}: ${diagnostic.message}, ${String(diagnostic.code)}, ${diagnostic.range.start.line}, ${diagnostic.range.start.character}, ${diagnostic.range.end.line}, ${diagnostic.range.end.character}`; - } - - removeFindingsForOtherVersions(fileVersion: FileVersion) - { - const keyNames = this.fixMapping.get(fileVersion.fileName)?.keys() ?? new Array(); - for(const key of keyNames) - { - if (key != fileVersion.version) - { - this.fixMapping.get(fileVersion.fileName)?.delete(key); - } - } - } - - ensureMapHasMappings(mapping: CodeFixMapping) - { - if (!this.fixMapping.has(mapping.fileName)){ - this.fixMapping.set(mapping.fileName, new Map()); - } - if (!this.fixMapping.get(mapping.fileName)?.has(mapping.version)){ - this.fixMapping.get(mapping.fileName)?.set(mapping.version, [mapping]); - } - else - { - this.fixMapping.get(mapping.fileName)?.get(mapping.version)?.push(mapping); - } - } - - provideCodeActions(document: vscode.TextDocument, range: vscode.Range | vscode.Selection, context: vscode.CodeActionContext, token: vscode.CancellationToken): vscode.CodeAction[] { - // for each diagnostic entry that has the matching `source`, create a code action command - const output : vscode.CodeAction[] = []; - context.diagnostics.filter(diagnostic => String(diagnostic.source).startsWith("DevSkim Language Server")).forEach((filteredDiagnostic : vscode.Diagnostic) => { - // The ToString method on URI in node swaps ':' into '%3A', but the C# one does not, but we need them to match. - const diagnosticKey = this.createMapKeyForDiagnostic(filteredDiagnostic, document.uri.toString().replace("%3A", ":")); - this.fixMapping.get(document.uri.toString().replace("%3A", ":"))?.get(document.version)?.forEach(codeFix => { - if (diagnosticKey == this.createMapKeyForDiagnostic(codeFix.diagnostic, codeFix.fileName)) - { - output.push(this.createFix(document, filteredDiagnostic, codeFix)); - } - }); - }); - - return output; - } - - private createFix(document: vscode.TextDocument, diagnostic: vscode.Diagnostic, codeFix: CodeFixMapping): vscode.CodeAction - { - const fix = new vscode.CodeAction(codeFix.friendlyString, vscode.CodeActionKind.QuickFix); - fix.edit = new vscode.WorkspaceEdit(); - if (!codeFix.isSuppression) - { - fix.edit.replace(document.uri, diagnostic.range, codeFix.replacement); - } - else - { - const line = document.lineAt(diagnostic.range.end.line); - fix.edit.insert(document.uri, line.range.end, codeFix.replacement); - } - return fix; - } -} \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/client/extension.ts b/DevSkim-VSCode-Plugin/client/extension.ts deleted file mode 100644 index 71d4a856..00000000 --- a/DevSkim-VSCode-Plugin/client/extension.ts +++ /dev/null @@ -1,148 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - * ------------------------------------------------------------------------------------------ */ -import * as path from 'path'; -import { ExtensionContext } from 'vscode'; -import { - DidChangeConfigurationNotification, - LanguageClient, - LanguageClientOptions, - ServerOptions, - TransportKind -} from 'vscode-languageclient/node'; - -import * as vscode from 'vscode'; -import { DevSkimSettings, DevSkimSettingsObject } from './common/devskimSettings'; -import { getCodeFixMapping, getFileVersion } from './common/notificationNames'; -import { selectors } from './common/selectors'; -import { DevSkimFixer } from './devSkimFixer'; -import { CodeFixMapping } from './common/codeFixMapping'; -import { FileVersion } from './common/fileVersion'; - -let client: LanguageClient; - -async function resolveDotNetPath(): Promise { - const result = await vscode.commands.executeCommand( - "dotnet.acquire", - { - version: "8.0", - requestingExtensionId: "MS-CST-E.vscode-devskim", - } - ); - return result?.dotnetPath; -} - -function getDevSkimConfiguration(section='MS-CST-E.vscode-devskim' ): DevSkimSettings { - const settings: DevSkimSettings = new DevSkimSettingsObject(); - settings.enableCriticalSeverityRules = vscode.workspace.getConfiguration(section).get('rules.enableCriticalSeverityRules', true); - settings.enableImportantSeverityRules = vscode.workspace.getConfiguration(section).get('rules.enableImportantSeverityRules', true); - settings.enableModerateSeverityRules = vscode.workspace.getConfiguration(section).get('rules.enableModerateSeverityRules', true); - settings.enableManualReviewSeverityRules = vscode.workspace.getConfiguration(section).get('rules.enableManualReviewSeverityRules', false); - settings.enableBestPracticeSeverityRules = vscode.workspace.getConfiguration(section).get('rules.enableBestPracticeSeverityRules', false); - settings.enableHighConfidenceRules = vscode.workspace.getConfiguration(section).get('rules.enableHighConfidenceRules', true); - settings.enableMediumConfidenceRules = vscode.workspace.getConfiguration(section).get('rules.enableMediumConfidenceRules', true); - settings.enableLowConfidenceRules = vscode.workspace.getConfiguration(section).get('rules.enableLowConfidenceRules', false); - settings.customRulesPaths = vscode.workspace.getConfiguration(section).get('rules.customRulesPath', []); - settings.customLanguagesPath = vscode.workspace.getConfiguration(section).get('rules.customLanguagesPath', ""); - settings.customCommentsPath = vscode.workspace.getConfiguration(section).get('rules.customCommentsPath', ""); - settings.suppressionDurationInDays = vscode.workspace.getConfiguration(section).get('suppressions.suppressionDurationInDays', 30); - settings.suppressionCommentStyle = vscode.workspace.getConfiguration(section).get('suppressions.suppressionCommentStyle', 'line'); - settings.manualReviewerName = vscode.workspace.getConfiguration(section).get('suppressions.manualReviewerName', ''); - settings.guidanceBaseURL = vscode.workspace.getConfiguration(section).get('guidance.guidanceBaseURL', "https://github.com/Microsoft/DevSkim/blob/main/guidance/"); - settings.ignoreFiles = vscode.workspace.getConfiguration(section).get('ignores.ignoreFiles', - [ "out/.*", "bin/.*", "node_modules/.*", ".vscode/.*", "yarn.lock", "logs/.*", ".log", ".git" ]); - settings.ignoreRulesList = vscode.workspace.getConfiguration(section).get('ignores.ignoreRulesList', []); - settings.ignoreDefaultRules = vscode.workspace.getConfiguration(section).get('ignores.ignoreDefaultRules', false); - settings.removeFindingsOnClose = vscode.workspace.getConfiguration(section).get('findings.removeFindingsOnClose', false); - settings.scanOnOpen = vscode.workspace.getConfiguration(section).get('triggers.scanOnOpen', false); - settings.scanOnSave = vscode.workspace.getConfiguration(section).get('triggers.scanOnSave', false); - settings.scanOnChange = vscode.workspace.getConfiguration(section).get('triggers.scanOnChange', true); - settings.traceServer = vscode.workspace.getConfiguration(section).get('trace.server', false); - return settings; - -} - -export function activate(context: ExtensionContext) { - const config = getDevSkimConfiguration(); - const fixer = new DevSkimFixer(); - context.subscriptions.push( - vscode.languages.registerCodeActionsProvider(selectors, fixer, { - providedCodeActionKinds: DevSkimFixer.providedCodeActionKinds - }) - ); - - // The server bridge is implemented in .NET - const serverModule = vscode.Uri.joinPath(context.extensionUri, 'devskimBinaries', 'Microsoft.DevSkim.LanguageServer.dll'); - - resolveDotNetPath().then((dotNetPath) => - { - if (dotNetPath == undefined || dotNetPath == null) - { - // Error, can't start extension - // TODO: Notify user - } - else - { - const workPath = path.dirname(serverModule.fsPath); - const serverOptions: ServerOptions = { - run: { - command: dotNetPath, - args: [serverModule.fsPath], - options: {cwd: workPath}, - transport: TransportKind.pipe - }, - debug: { - command: dotNetPath, - args: [serverModule.fsPath], - options: {cwd: workPath}, - transport: TransportKind.pipe - } - }; - - // Options to control the language client - const clientOptions: LanguageClientOptions = { - documentSelector: selectors, - progressOnInitialization: true - }; - - client = new LanguageClient( - 'MS-CST-E.vscode-devskim', - 'DevSkim VS Code Client', - serverOptions, - clientOptions - ); - - client.registerProposedFeatures(); - - // Notification handlers must be registered before the client starts so no - // message sent during initialization is missed. - client.onNotification(getCodeFixMapping(), (mapping: CodeFixMapping) => - { - fixer.ensureMapHasMappings(mapping); - }); - client.onNotification(getFileVersion(), (fileversion: FileVersion) =>{ - fixer.removeFindingsForOtherVersions(fileversion); - }); - - // Start the client. This will also launch the server - client.start().then(() => - { - client.sendNotification(DidChangeConfigurationNotification.type, { settings: ""}); - } - ); - - vscode.workspace.onDidChangeConfiguration(e => { - if (e.affectsConfiguration("MS-CST-E.vscode-devskim")) - { - // Triggers server to query for client config. - // Hacky, but vscode insists a pull model should be used over a push model for transmitting settings. - client.sendNotification(DidChangeConfigurationNotification.type, { settings: "" }); - } - }); - - // For disposal of the client - context.subscriptions.push(client); - } - }); -} diff --git a/DevSkim-VSCode-Plugin/client/package-lock.json b/DevSkim-VSCode-Plugin/client/package-lock.json deleted file mode 100644 index c287453a..00000000 --- a/DevSkim-VSCode-Plugin/client/package-lock.json +++ /dev/null @@ -1,932 +0,0 @@ -{ - "name": "devskim-vscode-client", - "version": "0.0.0-placeholder", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "devskim-vscode-client", - "version": "0.0.0-placeholder", - "license": "MIT", - "dependencies": { - "vscode-languageclient": "^10.1.0" - }, - "devDependencies": { - "@types/vscode": "^1.91.0", - "@vscode/test-electron": "^2.5.2" - }, - "engines": { - "vscode": "^1.91.0" - } - }, - "node_modules/@types/vscode": { - "version": "1.91.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.91.0.tgz", - "integrity": "sha512-PgPr+bUODjG3y+ozWUCyzttqR9EHny9sPAfJagddQjDwdtf66y2sDKJMnFZRuzBA2YtBGASqJGPil8VDUPvO6A==", - "dev": true - }, - "node_modules/@vscode/test-electron": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", - "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "jszip": "^3.10.1", - "ora": "^8.1.0", - "semver": "^7.6.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", - "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true, - "license": "MIT" - }, - "node_modules/get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dev": true, - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dependencies": { - "brace-expansion": "^5.0.8" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true, - "license": "(MIT AND Zlib)" - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true, - "license": "MIT" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vscode-jsonrpc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.1.tgz", - "integrity": "sha512-rfuA6T75H6m5EkbhtEPzre9pT0HPcDI2MMy4+nPFIBks5J8JBAUHD4tRYSgaBOijIEC7SRkC1kKyXTLqbmh9jw==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageclient": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.1.0.tgz", - "integrity": "sha512-XXRx6lqVitQy/oOLr9MfNYRG+MbQkhXkDaxbQMiKxEm8zZNfheRFUKNb8UYNh2stn9btl2wQM5wZFJjJvoc+jA==", - "dependencies": { - "minimatch": "^10.2.5", - "semver": "^7.8.1", - "vscode-languageserver-protocol": "3.18.2", - "vscode-languageserver-textdocument": "1.0.13" - }, - "engines": { - "vscode": "^1.91.0" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.2.tgz", - "integrity": "sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg==", - "dependencies": { - "vscode-jsonrpc": "9.0.1", - "vscode-languageserver-types": "3.18.0" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.13.tgz", - "integrity": "sha512-nx0ZHwMGIsVkzFG3/VLeJYBLTaFBRuNdGDvevvjuoayU5EOS2fEYazOhtCM3PI9ClMMg5igc0uwXtAq4tJj+Dw==" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.0.tgz", - "integrity": "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==" - } - }, - "dependencies": { - "@types/vscode": { - "version": "1.91.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.91.0.tgz", - "integrity": "sha512-PgPr+bUODjG3y+ozWUCyzttqR9EHny9sPAfJagddQjDwdtf66y2sDKJMnFZRuzBA2YtBGASqJGPil8VDUPvO6A==", - "dev": true - }, - "@vscode/test-electron": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", - "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", - "dev": true, - "requires": { - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "jszip": "^3.10.1", - "ora": "^8.1.0", - "semver": "^7.6.2" - } - }, - "agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true - }, - "ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true - }, - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==" - }, - "brace-expansion": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", - "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", - "requires": { - "balanced-match": "^4.0.2" - } - }, - "chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true - }, - "cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "requires": { - "restore-cursor": "^5.0.0" - } - }, - "cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true - }, - "get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", - "dev": true - }, - "http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "requires": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - } - }, - "https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "requires": { - "agent-base": "^7.1.2", - "debug": "4" - } - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true - }, - "is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dev": true, - "requires": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "dependencies": { - "is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true - } - } - }, - "mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true - }, - "minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "requires": { - "brace-expansion": "^5.0.8" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "requires": { - "mimic-function": "^5.0.0" - } - }, - "ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", - "dev": true, - "requires": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "requires": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==" - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - }, - "stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "requires": { - "ansi-regex": "^6.2.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "vscode-jsonrpc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.1.tgz", - "integrity": "sha512-rfuA6T75H6m5EkbhtEPzre9pT0HPcDI2MMy4+nPFIBks5J8JBAUHD4tRYSgaBOijIEC7SRkC1kKyXTLqbmh9jw==" - }, - "vscode-languageclient": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.1.0.tgz", - "integrity": "sha512-XXRx6lqVitQy/oOLr9MfNYRG+MbQkhXkDaxbQMiKxEm8zZNfheRFUKNb8UYNh2stn9btl2wQM5wZFJjJvoc+jA==", - "requires": { - "minimatch": "^10.2.5", - "semver": "^7.8.1", - "vscode-languageserver-protocol": "3.18.2", - "vscode-languageserver-textdocument": "1.0.13" - } - }, - "vscode-languageserver-protocol": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.2.tgz", - "integrity": "sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg==", - "requires": { - "vscode-jsonrpc": "9.0.1", - "vscode-languageserver-types": "3.18.0" - } - }, - "vscode-languageserver-textdocument": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.13.tgz", - "integrity": "sha512-nx0ZHwMGIsVkzFG3/VLeJYBLTaFBRuNdGDvevvjuoayU5EOS2fEYazOhtCM3PI9ClMMg5igc0uwXtAq4tJj+Dw==" - }, - "vscode-languageserver-types": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.0.tgz", - "integrity": "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==" - } - } -} diff --git a/DevSkim-VSCode-Plugin/client/package.json b/DevSkim-VSCode-Plugin/client/package.json deleted file mode 100644 index d6fa6c5c..00000000 --- a/DevSkim-VSCode-Plugin/client/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "devskim-vscode-client", - "displayName": "Microsoft DevSkim", - "description": "Detect security mistakes as you type, and get real time details and fix suggestions", - "author": "Microsoft Corporation", - "license": "MIT", - "version": "0.0.0-placeholder", - "publisher": "MS-CST-E", - "repository": { - "type": "git", - "url": "https://github.com/Microsoft/devskim.git" - }, - "engines": { - "vscode": "^1.91.0" - }, - "dependencies": { - "vscode-languageclient": "^10.1.0" - }, - "devDependencies": { - "@types/vscode": "^1.91.0", - "@vscode/test-electron": "^2.5.2" - } -} diff --git a/DevSkim-VSCode-Plugin/client/tsconfig.json b/DevSkim-VSCode-Plugin/client/tsconfig.json deleted file mode 100644 index a56f9ca0..00000000 --- a/DevSkim-VSCode-Plugin/client/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compilerOptions": { - "module": "node16", - "moduleResolution": "node16", - "target": "es2019", - "lib": [ - "ES2019" - ], - "outDir": "out", - "rootDir": ".", - "sourceMap": true, - "strict": true, - "strictNullChecks": true, - "resolveJsonModule": true, - "esModuleInterop": true, - "composite": true - }, - "exclude": [ "node_modules" ], - "files": [ - "./common/codeFixMapping.ts", - "./common/devskimSettings.ts", - "./common/notificationNames.ts", - "./common/selectors.ts", - "./common/fileVersion.ts", - "devSkimFixer.ts", - "extension.ts" - ] -} \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/devskim.ico b/DevSkim-VSCode-Plugin/devskim.ico deleted file mode 100644 index 780b2e3cfced994a2c49c0cbb33156626bc3b57c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32606 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.0.0" - } - }, - "node_modules/@azure/core-auth": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", - "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-util": "^1.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-client": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz", - "integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-rest-pipeline": "^1.22.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.2.tgz", - "integrity": "sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-tracing": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", - "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-util": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", - "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/identity": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.1.tgz", - "integrity": "sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.9.0", - "@azure/core-client": "^1.9.2", - "@azure/core-rest-pipeline": "^1.17.0", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.11.0", - "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^5.5.0", - "@azure/msal-node": "^5.1.0", - "open": "^10.1.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/logger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", - "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/msal-browser": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-5.11.0.tgz", - "integrity": "sha512-zkGNYS3TwY8lUpPIafAmsFCYZbgFixY9y/LZB9GUg0IILoHTqpN26j5OrkL1AQThh/YdZsawe4iWXfp85lFVxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/msal-common": "16.6.2" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-common": { - "version": "16.6.2", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.6.2.tgz", - "integrity": "sha512-hQjjsekAjB00cM1EmatWJlzhEoK2Qhz7Rj5gvM6tYf8iL7RM3tkxlpU9fG0+ofkulzg9AEEA6dIEnSmDr5ZqUA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-node": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.2.2.tgz", - "integrity": "sha512-toS+2AePxqyzb0YOKttDOOiSl3jrkK9aiqIvpurpis0O34QcIS5gToqrgT39p04Dpxw3YoUU0lxJKTpSFFfA6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/msal-common": "16.6.2", - "jsonwebtoken": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "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.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.5" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.14.0", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.5", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@secretlint/config-creator": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/config-creator/-/config-creator-10.2.2.tgz", - "integrity": "sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/types": "^10.2.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/config-loader": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/config-loader/-/config-loader-10.2.2.tgz", - "integrity": "sha512-ndjjQNgLg4DIcMJp4iaRD6xb9ijWQZVbd9694Ol2IszBIbGPPkwZHzJYKICbTBmh6AH/pLr0CiCaWdGJU7RbpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/profiler": "^10.2.2", - "@secretlint/resolver": "^10.2.2", - "@secretlint/types": "^10.2.2", - "ajv": "^8.17.1", - "debug": "^4.4.1", - "rc-config-loader": "^4.1.3" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/config-loader/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@secretlint/config-loader/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/@secretlint/core": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-10.2.2.tgz", - "integrity": "sha512-6rdwBwLP9+TO3rRjMVW1tX+lQeo5gBbxl1I5F8nh8bgGtKwdlCMhMKsBWzWg1ostxx/tIG7OjZI0/BxsP8bUgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/profiler": "^10.2.2", - "@secretlint/types": "^10.2.2", - "debug": "^4.4.1", - "structured-source": "^4.0.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/formatter": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/formatter/-/formatter-10.2.2.tgz", - "integrity": "sha512-10f/eKV+8YdGKNQmoDUD1QnYL7TzhI2kzyx95vsJKbEa8akzLAR5ZrWIZ3LbcMmBLzxlSQMMccRmi05yDQ5YDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/resolver": "^10.2.2", - "@secretlint/types": "^10.2.2", - "@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.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@secretlint/formatter/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "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.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "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.2", - "resolved": "https://registry.npmjs.org/@secretlint/node/-/node-10.2.2.tgz", - "integrity": "sha512-eZGJQgcg/3WRBwX1bRnss7RmHHK/YlP/l7zOQsrjexYt6l+JJa5YhUmHbuGXS94yW0++3YkEJp0kQGYhiw1DMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/config-loader": "^10.2.2", - "@secretlint/core": "^10.2.2", - "@secretlint/formatter": "^10.2.2", - "@secretlint/profiler": "^10.2.2", - "@secretlint/source-creator": "^10.2.2", - "@secretlint/types": "^10.2.2", - "debug": "^4.4.1", - "p-map": "^7.0.3" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/profiler": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-10.2.2.tgz", - "integrity": "sha512-qm9rWfkh/o8OvzMIfY8a5bCmgIniSpltbVlUVl983zDG1bUuQNd1/5lUEeWx5o/WJ99bXxS7yNI4/KIXfHexig==", - "dev": true, - "license": "MIT" - }, - "node_modules/@secretlint/resolver": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/resolver/-/resolver-10.2.2.tgz", - "integrity": "sha512-3md0cp12e+Ae5V+crPQYGd6aaO7ahw95s28OlULGyclyyUtf861UoRGS2prnUrKh7MZb23kdDOyGCYb9br5e4w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@secretlint/secretlint-formatter-sarif": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-formatter-sarif/-/secretlint-formatter-sarif-10.2.2.tgz", - "integrity": "sha512-ojiF9TGRKJJw308DnYBucHxkpNovDNu1XvPh7IfUp0A12gzTtxuWDqdpuVezL7/IP8Ua7mp5/VkDMN9OLp1doQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "node-sarif-builder": "^3.2.0" - } - }, - "node_modules/@secretlint/secretlint-rule-no-dotenv": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-no-dotenv/-/secretlint-rule-no-dotenv-10.2.2.tgz", - "integrity": "sha512-KJRbIShA9DVc5Va3yArtJ6QDzGjg3PRa1uYp9As4RsyKtKSSZjI64jVca57FZ8gbuk4em0/0Jq+uy6485wxIdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/types": "^10.2.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/secretlint-rule-preset-recommend": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-10.2.2.tgz", - "integrity": "sha512-K3jPqjva8bQndDKJqctnGfwuAxU2n9XNCPtbXVI5JvC7FnQiNg/yWlQPbMUlBXtBoBGFYp08A94m6fvtc9v+zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/source-creator": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/source-creator/-/source-creator-10.2.2.tgz", - "integrity": "sha512-h6I87xJfwfUTgQ7irWq7UTdq/Bm1RuQ/fYhA3dtTIAop5BwSFmZyrchph4WcoEvbN460BWKmk4RYSvPElIIvxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/types": "^10.2.2", - "istextorbinary": "^9.5.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@secretlint/types": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-10.2.2.tgz", - "integrity": "sha512-Nqc90v4lWCXyakD6xNyNACBJNJ0tNCwj2WNk/7ivyacYHxiITVgmLUFXTBOeCdy79iz6HtN9Y31uw/jbLrdOAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@textlint/ast-node-types": { - "version": "15.5.1", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.5.1.tgz", - "integrity": "sha512-2ABQSaQoM9u9fycXLJKcCv4XQulJWTUSwjo6F0i/ujjqOH8/AZ2A0RDKKbAddqxDhuabVB20lYoEsZZgzehccg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/linter-formatter": { - "version": "15.5.1", - "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.5.1.tgz", - "integrity": "sha512-7wfzpcQtk7TZ3UJO2deTI71mJCm4VvPGUmSwE4iuH6FoaxpdWpwSBiMLcZtjYrt/oIFOtNz0uf5rI+xJiHTFww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azu/format-text": "^1.0.2", - "@azu/style-format": "^1.0.1", - "@textlint/module-interop": "15.5.1", - "@textlint/resolver": "15.5.1", - "@textlint/types": "15.5.1", - "chalk": "^4.1.2", - "debug": "^4.4.3", - "js-yaml": "^4.1.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/@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==", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/module-interop": { - "version": "15.5.1", - "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.5.1.tgz", - "integrity": "sha512-Y1jcFGCKNSmHxwsLO3mshOfLYX4Wavq2+w5BG6x5lGgZv0XrF1xxURRhbnhns4LzCu0fAcx6W+3V8/1bkyTZCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/resolver": { - "version": "15.5.1", - "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.5.1.tgz", - "integrity": "sha512-CVHxMIm8iNGccqM12CQ/ycvh+HjJId4RyC6as5ynCcp2E1Uy1TCe0jBWOpmLsbT4Nx15Ke29BmspyByawuIRyA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@textlint/types": { - "version": "15.5.1", - "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.5.1.tgz", - "integrity": "sha512-IY1OVZZk8LOOrbapYCsaeH7XSJT89HVukixDT8CoiWMrKGCTCZ3/Kzoa3DtMMbY8jtY777QmPOVCNnR+8fF6YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@textlint/ast-node-types": "15.5.1" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "14.18.63", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", - "dev": true - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/sarif": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", - "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.2.tgz", - "integrity": "sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.58.2", - "@typescript-eslint/type-utils": "8.58.2", - "@typescript-eslint/utils": "8.58.2", - "@typescript-eslint/visitor-keys": "8.58.2", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.58.2", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.2.tgz", - "integrity": "sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.58.2", - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/typescript-estree": "8.58.2", - "@typescript-eslint/visitor-keys": "8.58.2", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.2.tgz", - "integrity": "sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.58.2", - "@typescript-eslint/types": "^8.58.2", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.2.tgz", - "integrity": "sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/visitor-keys": "8.58.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.2.tgz", - "integrity": "sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.2.tgz", - "integrity": "sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/typescript-estree": "8.58.2", - "@typescript-eslint/utils": "8.58.2", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.2.tgz", - "integrity": "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.2.tgz", - "integrity": "sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.58.2", - "@typescript-eslint/tsconfig-utils": "8.58.2", - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/visitor-keys": "8.58.2", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", - "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.2.tgz", - "integrity": "sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.58.2", - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/typescript-estree": "8.58.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.2.tgz", - "integrity": "sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.58.2", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typespec/ts-http-runtime": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.2.tgz", - "integrity": "sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@vscode/vsce": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.9.1.tgz", - "integrity": "sha512-MPn5p+DoudI+3GfJSpAZZraE1lgLv0LcwbH3+xy7RgEhty3UIkmUMUA+5jPTDaxXae00AnX5u77FxGM8FhfKKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/identity": "^4.1.0", - "@secretlint/node": "^10.1.2", - "@secretlint/secretlint-formatter-sarif": "^10.1.2", - "@secretlint/secretlint-rule-no-dotenv": "^10.1.2", - "@secretlint/secretlint-rule-preset-recommend": "^10.1.2", - "@vscode/vsce-sign": "^2.0.0", - "azure-devops-node-api": "^12.5.0", - "chalk": "^4.1.2", - "cheerio": "^1.0.0-rc.9", - "cockatiel": "^3.1.2", - "commander": "^12.1.0", - "form-data": "^4.0.0", - "glob": "^11.0.0", - "hosted-git-info": "^4.0.2", - "jsonc-parser": "^3.2.0", - "leven": "^3.1.0", - "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.2", - "semver": "^7.5.2", - "tmp": "^0.2.3", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.5.0", - "yauzl": "^3.2.1", - "yazl": "^2.2.2" - }, - "bin": { - "vsce": "vsce" - }, - "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "keytar": "^7.7.0" - } - }, - "node_modules/@vscode/vsce-sign": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.9.tgz", - "integrity": "sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==", - "dev": true, - "hasInstallScript": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optionalDependencies": { - "@vscode/vsce-sign-alpine-arm64": "2.0.6", - "@vscode/vsce-sign-alpine-x64": "2.0.6", - "@vscode/vsce-sign-darwin-arm64": "2.0.6", - "@vscode/vsce-sign-darwin-x64": "2.0.6", - "@vscode/vsce-sign-linux-arm": "2.0.6", - "@vscode/vsce-sign-linux-arm64": "2.0.6", - "@vscode/vsce-sign-linux-x64": "2.0.6", - "@vscode/vsce-sign-win32-arm64": "2.0.6", - "@vscode/vsce-sign-win32-x64": "2.0.6" - } - }, - "node_modules/@vscode/vsce-sign-alpine-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.6.tgz", - "integrity": "sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "alpine" - ] - }, - "node_modules/@vscode/vsce-sign-alpine-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.6.tgz", - "integrity": "sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "alpine" - ] - }, - "node_modules/@vscode/vsce-sign-darwin-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.6.tgz", - "integrity": "sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@vscode/vsce-sign-darwin-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.6.tgz", - "integrity": "sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@vscode/vsce-sign-linux-arm": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.6.tgz", - "integrity": "sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/vsce-sign-linux-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.6.tgz", - "integrity": "sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/vsce-sign-linux-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.6.tgz", - "integrity": "sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/vsce-sign-win32-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.6.tgz", - "integrity": "sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vscode/vsce-sign-win32-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.6.tgz", - "integrity": "sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vscode/vsce/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@vscode/vsce/node_modules/brace-expansion": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", - "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@vscode/vsce/node_modules/glob": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", - "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.1.1", - "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.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", - "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/azure-devops-node-api": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", - "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", - "dev": true, - "license": "MIT", - "dependencies": { - "tunnel": "0.0.6", - "typed-rest-client": "^1.8.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true - }, - "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==", - "dev": true, - "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", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/boundary": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz", - "integrity": "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "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/cheerio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", - "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.1.0", - "parse5": "^7.3.0", - "parse5-htmlparser2-tree-adapter": "^7.1.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^7.19.0", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=20.18.1" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/cockatiel": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", - "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "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/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/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/default-browser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", - "dev": true, - "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.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/editions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz", - "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==", - "dev": true, - "license": "Artistic-2.0", - "dependencies": { - "version-range": "^4.15.0" - }, - "engines": { - "ecmascript": ">= es5", - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } - }, - "node_modules/end-of-stream": { - "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==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "dev": true, - "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.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.2", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "license": "(MIT OR WTFPL)", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "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.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", - "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/fs-extra": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "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", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/htmlparser2": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", - "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "entities": "^7.0.1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause", - "optional": true - }, - "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "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": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/index-to-position": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", - "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "optional": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "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==", - "dev": true, - "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", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istextorbinary": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-9.5.0.tgz", - "integrity": "sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==", - "dev": true, - "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": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", - "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "dev": true, - "license": "MIT", - "dependencies": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keytar": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", - "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-addon-api": "^4.3.0", - "prebuild-install": "^7.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/linkify-it": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", - "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/markdown-it": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", - "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.1", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "license": "ISC" - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/nerdbank-gitversioning": { - "version": "3.6.146", - "resolved": "https://registry.npmjs.org/nerdbank-gitversioning/-/nerdbank-gitversioning-3.6.146.tgz", - "integrity": "sha512-PCXq36uIX/S6sMVVJpJ2FHem3131SZ/PgEwbAmrO1Br/iZ+hRrbPFUrDv/n8RKj+7CkZejFjpRKCEbt/9DQA1g==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2" - }, - "bin": { - "nbgv": "main.js", - "nbgv-setversion": "npmVersion.js" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-abi": { - "version": "3.87.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", - "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-sarif-builder": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.4.0.tgz", - "integrity": "sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/sarif": "^2.1.7", - "fs-extra": "^11.1.1" - }, - "engines": { - "node": ">=20" - } - }, - "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==", - "dev": true, - "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/normalize-package-data/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==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/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==", - "dev": true, - "license": "ISC" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "optional": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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", - "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^5.1.0" - } - }, - "node_modules/parse-semver/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "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==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", - "dev": true, - "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/path-scurry/node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.15.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", - "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "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==", - "dev": true, - "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/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "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==", - "dev": true, - "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/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "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", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "dev": true, - "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", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/secretlint": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/secretlint/-/secretlint-10.2.2.tgz", - "integrity": "sha512-xVpkeHV/aoWe4vP4TansF622nBEImzCY73y/0042DuJ29iKIaqgoJ8fGxre3rVSHHbxar4FdJobmTnLp9AU0eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/config-creator": "^10.2.2", - "@secretlint/formatter": "^10.2.2", - "@secretlint/node": "^10.2.2", - "@secretlint/profiler": "^10.2.2", - "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==", - "dev": true, - "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/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "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==", - "dev": true, - "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/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "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==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boundary": "^2.0.0" - } - }, - "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/supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "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==", - "dev": true, - "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/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "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/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 - }, - "node_modules/textextensions": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", - "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", - "dev": true, - "license": "Artistic-2.0", - "dependencies": { - "editions": "^6.21.0" - }, - "engines": { - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tmp": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", - "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typed-rest-client": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", - "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "qs": "^6.9.1", - "tunnel": "0.0.6", - "underscore": "^1.12.1" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/typescript-eslint": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.2.tgz", - "integrity": "sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.58.2", - "@typescript-eslint/parser": "8.58.2", - "@typescript-eslint/typescript-estree": "8.58.2", - "@typescript-eslint/utils": "8.58.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/underscore": { - "version": "1.13.8", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", - "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", - "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true, - "license": "MIT" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/version-range": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", - "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==", - "dev": true, - "license": "Artistic-2.0", - "engines": { - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "optional": true - }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/yauzl": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.3.0.tgz", - "integrity": "sha512-PtGEvEP30p7sbIBJKUBjUnqgTVOyMURc4dLo9iNyAJnNIEz9pm88cCXF21w94Kg3k6RXkeZh5DHOGS0qEONvNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "pend": "~1.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/DevSkim-VSCode-Plugin/package.json b/DevSkim-VSCode-Plugin/package.json deleted file mode 100644 index e586624d..00000000 --- a/DevSkim-VSCode-Plugin/package.json +++ /dev/null @@ -1,334 +0,0 @@ -{ - "type": "module", - "name": "vscode-devskim", - "displayName": "DevSkim", - "description": "DevSkim Security Analyzer Plugin for IDEs. Find security mistakes as code is authored, and fix them with a mouse click.", - "author": "Microsoft Corporation", - "license": "MIT", - "version": "0.0.0-placeholder", - "publisher": "MS-CST-E", - "repository": { - "type": "git", - "url": "https://github.com/Microsoft/devskim.git" - }, - "capabilities": { - "virtualWorkspaces": { - "supported": "limited", - "description": "DevSkim has not been fully tested in virtual workspaces, but is functional." - } - }, - "icon": "devskim.ico", - "galleryBanner": { - "color": "#999999", - "theme": "dark" - }, - "engines": { - "vscode": "^1.91.0" - }, - "bugs": { - "url": "https://github.com/Microsoft/DevSkim/issues" - }, - "homepage": "https://github.com/Microsoft/DevSkim#readme", - "categories": [ - "Linters" - ], - "keywords": [ - "Security" - ], - "activationEvents": [ - "onLanguage:bat", - "onLanguage:php", - "onLanguage:c", - "onLanguage:cpp", - "onLanguage:csharp", - "onLanguage:ruby", - "onLanguage:perl", - "onLanguage:perl6", - "onLanguage:javascriptreact", - "onLanguage:javascript", - "onLanguage:go", - "onLanguage:sql", - "onLanguage:rust", - "onLanguage:groovy", - "onLanguage:typescript", - "onLanguage:typescriptreact", - "onLanguage:jade", - "onLanguage:lua", - "onLanguage:swift", - "onLanguage:clojure", - "onLanguage:vb", - "onLanguage:shellscript", - "onLanguage:yaml", - "onLanguage:fsharp", - "onLanguage:objective-c", - "onLanguage:xml", - "onLanguage:r", - "onLanguage:java", - "onLanguage:powershell", - "onLanguage:coffeescript", - "onLanguage:plaintext", - "onLanguage:python", - "onLanguage:json" - ], - "main": "./client/out/extension.js", - "contributes": { - "commands": [], - "configuration": [ - { - "order": 10, - "id": "MS-CST-E.vscode-devskim.rules", - "title": "Rules", - "properties": { - "MS-CST-E.vscode-devskim.rules.enableCriticalSeverityRules": { - "order": 0, - "type": "boolean", - "default": true, - "description": "Turn on the rules with severity \"Critical\"." - }, - "MS-CST-E.vscode-devskim.rules.enableImportantSeverityRules": { - "order": 1, - "type": "boolean", - "default": true, - "description": "Turn on the rules with severity \"Important\"." - }, - "MS-CST-E.vscode-devskim.rules.enableModerateSeverityRules": { - "order": 2, - "type": "boolean", - "default": true, - "description": "Turn on the rules with severity \"Moderate\"." - }, - "MS-CST-E.vscode-devskim.rules.enableBestPracticeSeverityRules": { - "order": 3, - "type": "boolean", - "default": false, - "description": "Turn on the rules of severity \"Best-Practice\". These rules either flag issues that are typically of a lower severity, or recommended practices that lead to more secure code, but aren't typically outright vulnerabilities." - }, - "MS-CST-E.vscode-devskim.rules.enableManualReviewSeverityRules": { - "order": 4, - "type": "boolean", - "default": false, - "description": "Turn on the rules that flag things for manual review. These are typically scenarios that *could* be incredibly severe if tainted data can be inserted, but are often programmatically necessary (for example, dynamic code generation with \"eval\"). Since these rules tend to require further analysis upon flagging an issue, they disabled by default." - }, - "MS-CST-E.vscode-devskim.rules.enableHighConfidenceRules": { - "order": 5, - "type": "boolean", - "default": true, - "description": "Turn on the rules of confidence \"High\"." - }, - "MS-CST-E.vscode-devskim.rules.enableMediumConfidenceRules": { - "order": 6, - "type": "boolean", - "default": true, - "description": "Turn on the rules of confidence \"Medium\"." - }, - "MS-CST-E.vscode-devskim.rules.enableLowConfidenceRules": { - "order": 7, - "type": "boolean", - "default": false, - "description": "Turn on the rules of confidence \"Low\"." - }, - "MS-CST-E.vscode-devskim.rules.customRulesPaths": { - "order": 8, - "type": "array", - "default": [], - "description": "A list of local paths on disk to rules files or folders containing rule files, for DevSkim to use in analysis.", - "items": { - "type": "string" - } - }, - "MS-CST-E.vscode-devskim.rules.customLanguagesPath": { - "order": 9, - "type": "string", - "default": "", - "description": "A local path to a custom language file for analysis. Also requires customCommentsPath to be set." - }, - "MS-CST-E.vscode-devskim.rules.customCommentsPath": { - "order": 10, - "type": "string", - "default": "", - "description": "A local path to a custom comments file for analysis. Also requires customLanguagesPath to be set." - } - } - }, - { - "order": 20, - "id": "MS-CST-E.vscode-devskim.suppressions", - "title": "Suppressions", - "properties": { - "MS-CST-E.vscode-devskim.suppressions.suppressionDurationInDays": { - "order": 0, - "type": "number", - "default": 30, - "description": "DevSkim allows for findings to be suppressed for a temporary period of time. The default is 30 days. Set to 0 to disable temporary suppressions." - }, - "MS-CST-E.vscode-devskim.suppressions.suppressionCommentStyle": { - "order": 1, - "type": "string", - "enum": [ - "Line", - "Block" - ], - "default": "Line", - "description": "When DevSkim inserts a suppression comment it defaults to using single line comments for every language that has them. Setting this to block will instead use block comments for the languages that support them. Block comments are suggested if regularly adding explanations for why a finding was suppressed" - }, - "MS-CST-E.vscode-devskim.suppressions.manualReviewerName": { - "order": 2, - "type": "string", - "default": "", - "description": "If set, insert this name in inserted suppression comments." - } - } - }, - { - "order": 30, - "id": "MS-CST-E.vscode-devskim.guidance", - "title": "Guidance", - "properties": { - "MS-CST-E.vscode-devskim.guidance.guidanceBaseURL": { - "order": 0, - "type": "string", - "default": "https://github.com/Microsoft/DevSkim/blob/main/guidance/", - "description": "Each finding has a guidance file that describes the issue and solutions in more detail. By default, those files live on the DevSkim github repo however, with this setting, organizations can clone and customize that repo, and specify their own base URL for the guidance." - } - } - }, - { - "order": 40, - "id": "MS-CST-E.vscode-devskim.ignores", - "title": "Ignores", - "properties": { - "MS-CST-E.vscode-devskim.ignores.ignoreFiles": { - "order": 0, - "type": "array", - "default": [], - "items": { - "type": "string" - }, - "description": "Glob expressions to exclude files and folders from analysis." - }, - "MS-CST-E.vscode-devskim.ignores.ignoreRulesList": { - "order": 1, - "type": "array", - "default": [], - "items": { - "type": "string" - }, - "description": "DevSkim Rule IDs to ignore." - }, - "MS-CST-E.vscode-devskim.ignores.ignoreDefaultRules": { - "order": 2, - "type": "boolean", - "default": false, - "description": "Disable all default DevSkim rules." - } - } - }, - { - "order": 50, - "id": "MS-CST-E.vscode-devskim.findings", - "title": "Findings", - "properties": { - "MS-CST-E.vscode-devskim.findings.removeFindingsOnClose": { - "order": 0, - "type": "boolean", - "default": true, - "description": "By default, when a source file is closed the findings remain in the 'Problems' window. Setting this value to true will cause findings to be removed from 'Problems' when the document is closed. Note, setting this to true will cause findings that are listed when invoking the 'Scan all files in workspace' command to automatically clear away after a couple of minutes." - } - } - }, - { - "order": 60, - "id": "MS-CST-E.vscode-devskim.triggers", - "title": "Triggers", - "properties": { - "MS-CST-E.vscode-devskim.triggers.scanOnOpen": { - "order": 0, - "type": "boolean", - "default": true, - "description": "Scan files on open." - }, - "MS-CST-E.vscode-devskim.triggers.scanOnSave": { - "order": 1, - "type": "boolean", - "default": true, - "description": "Scan files on save." - }, - "MS-CST-E.vscode-devskim.triggers.scanOnChange": { - "order": 2, - "type": "boolean", - "default": true, - "description": "Scan files on change." - } - } - }, - { - "order": 70, - "id": "MS-CST-E.vscode-devskim.trace", - "title": "Trace", - "properties": { - "MS-CST-E.vscode-devskim.trace.server": { - "order": 0, - "scope": "window", - "type": "string", - "enum": [ - "off", - "messages", - "verbose" - ], - "default": "off", - "description": "Enables debug trace communications between VS Code and the language server." - } - } - } - ] - }, - "extensionDependencies": [ - "ms-dotnettools.vscode-dotnet-runtime" - ], - "scripts": { - "clean": "npm run clean:net && npm run clean:out && npm run clean:modules && npm run clean:vsix", - "clean:net": "npx --quiet -y rimraf devskimBinaries", - "clean:out": "npx --quiet -y rimraf --glob **/out && npx --quiet -y rimraf --glob **/tsconfig.tsbuildinfo", - "clean:modules": "npx --quiet -y rimraf --glob **/node_modules", - "clean:vsix": "npx --quiet -y rimraf --glob *.vsix", - "net-setup": "dotnet publish -c Debug -f net10.0 ../DevSkim-DotNet/Microsoft.DevSkim.LanguageServer -o devskimBinaries", - "net-setup:release": "dotnet publish -c Release -f net10.0 ../DevSkim-DotNet/Microsoft.DevSkim.LanguageServer -o devskimBinaries", - "setup": "npm install && npm run net-setup", - "setup:release": "npm install && npm run net-setup:release", - "reset": "npm run clean && npm run setup", - "compile": "tsc -b", - "build": "npm run setup && npm run compile", - "watch": "tsc -b -w", - "lint": "eslint ./client", - "postinstall": "cd client && npm install", - "vscode:prepublish": "npm run esbuild-base -- --minify", - "esbuild-base": "esbuild ./client/extension.ts --bundle --outfile=client/out/extension.js --external:vscode --format=cjs --platform=node", - "esbuild": "npm run esbuild-base -- --sourcemap", - "esbuild-watch": "npm run esbuild-base -- --sourcemap --watch", - "pack-ext": "npm run pre-pack-clean && npm run setup:release && npm run compile && npm run set-version-and-pack", - "pack-ext:debug": "npm run pre-pack-clean && npm run setup && npm run compile && npm run set-version-and-pack", - "pre-pack-clean": "npm run clean:out && npm run clean:modules", - "set-version-and-pack": "npm run set-version && npm run do-pack && npm run reset-version", - "do-pack": "(npm run check-pre-release && npm run vsce-pack-pre) || npm run vsce-pack", - "set-version": "node ./scripts/setPackageVersion.js", - "reset-version": "node ./scripts/resetPackageVersion.js", - "check-pre-release": "node ./scripts/checkPreReleaseFlag.js", - "vsce-pack-pre": "vsce package --pre-release || echo 'Pre-Release build failed'", - "vsce-pack": "vsce package || echo 'Release build failed'", - "pipeline-pack": "npm install --global @microsoft/artifacts-npm-credprovider --registry https://pkgs.dev.azure.com/artifacts-public/23934c1b-a3b5-4b70-9dd3-d1bef4cc72a0/_packaging/AzureArtifacts/npm/registry/ && cp .npmrc.pipeline .npmrc && artifacts-npm-credprovider && npm run restore-net && npm run rewrite-registry:root && npm run rewrite-registry:client && npm run pack-ext", - "restore-net": "dotnet restore --configfile ../nuget.config ../DevSkim-Dotnet/Microsoft.DevSkim.LanguageServer", - "rewrite-registry:root": "node scripts/updatePackageLock.js ../package-lock.json https://pkgs.dev.azure.com/microsoft-sdl/General/_packaging/PublicRegistriesFeed/npm/registry/", - "rewrite-registry:client": "node scripts/updatePackageLock.js ../client/package-lock.json https://pkgs.dev.azure.com/microsoft-sdl/General/_packaging/PublicRegistriesFeed/npm/registry/" - }, - "devDependencies": { - "@types/node": "^14.x", - "@typescript-eslint/eslint-plugin": "^8.0.0", - "@typescript-eslint/parser": "^8.0.0", - "@vscode/vsce": "^3.9.1", - "esbuild": "^0.28.1", - "eslint": "^9.0.0", - "nerdbank-gitversioning": "^3.4.255", - "typescript": "^5.9.3", - "typescript-eslint": "^8.54.0" - } -} diff --git a/DevSkim-VSCode-Plugin/scripts/checkPreReleaseFlag.js b/DevSkim-VSCode-Plugin/scripts/checkPreReleaseFlag.js deleted file mode 100644 index 17da6ef9..00000000 --- a/DevSkim-VSCode-Plugin/scripts/checkPreReleaseFlag.js +++ /dev/null @@ -1,22 +0,0 @@ -import * as nbgv from 'nerdbank-gitversioning'; -import { exit } from 'process'; - -async function isPreRelease() { - var versionInfo = await nbgv.getVersion(); - const prereleaseTag = versionInfo.prereleaseVersionNoLeadingHyphen; - if (!prereleaseTag) { - return false; - } - return true; -}; - -// This script exits with a 0 return code if a pre-release version is detected, or a non-zero exit code if release version is detected. -if (await isPreRelease()) -{ - console.log("Detected Pre-Release"); - exit(0); -} -else{ - console.log("Detected Release"); - exit(-1); -} \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/scripts/resetPackageVersion.js b/DevSkim-VSCode-Plugin/scripts/resetPackageVersion.js deleted file mode 100644 index ea0aebc9..00000000 --- a/DevSkim-VSCode-Plugin/scripts/resetPackageVersion.js +++ /dev/null @@ -1,3 +0,0 @@ -import * as nbgv from 'nerdbank-gitversioning'; -console.log(`Resetting package version to 0.0.0-placeholder`); -nbgv.resetPackageVersionPlaceholder(); \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/scripts/setPackageVersion.js b/DevSkim-VSCode-Plugin/scripts/setPackageVersion.js deleted file mode 100644 index 6431ddc3..00000000 --- a/DevSkim-VSCode-Plugin/scripts/setPackageVersion.js +++ /dev/null @@ -1,10 +0,0 @@ -import * as nbgv from 'nerdbank-gitversioning'; -import * as cp from 'child_process'; - -const versionInfo = await nbgv.getVersion(); -// check that versionInfo.simpleVersion is a valid version formatted like x.y.z -if (!versionInfo.simpleVersion.match(/^\d+\.\d+\.\d+$/)) { - throw new Error(`Unexpected version format: ${versionInfo.simpleVersion}`); -} -console.log(`Setting package version to ${versionInfo.simpleVersion}`); -cp.execSync(`npm version ${versionInfo.simpleVersion}`); \ No newline at end of file diff --git a/DevSkim-VSCode-Plugin/scripts/updatePackageLock.js b/DevSkim-VSCode-Plugin/scripts/updatePackageLock.js deleted file mode 100644 index a2108a33..00000000 --- a/DevSkim-VSCode-Plugin/scripts/updatePackageLock.js +++ /dev/null @@ -1,39 +0,0 @@ -// rewrite-registry.mjs -import { readFile, writeFile } from 'fs/promises'; -import path from 'path'; -import { fileURLToPath } from 'url'; - -// Support __dirname in ES modules -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -const filePath = process.argv[2]; -const newRegistryBase = process.argv[3]; - -if (!filePath || !newRegistryBase) { - console.error('❌ Please provide the path to the package-lock.json file and the new registry base URL.'); - console.error('Usage: node updatePackageLock.js '); - process.exit(1); -} - -const registryBase = 'https://registry.npmjs.org/'; - -try { - const fullPath = path.resolve(__dirname, filePath); - const content = await readFile(fullPath, 'utf8'); - const lock = JSON.parse(content); - - if (lock.packages) { - for (const [pkg, data] of Object.entries(lock.packages)) { - if (data.resolved?.startsWith(registryBase)) { - data.resolved = newRegistryBase + data.resolved.slice(registryBase.length); - } - } - await writeFile(fullPath, JSON.stringify(lock, null, 2)); - console.log(`✅ Updated resolved URLs in ${filePath}`); - } else { - console.error('⚠️ No "packages" field found in the file.'); - } -} catch (err) { - console.error(`❌ Failed to process ${filePath}:`, err.message); -} diff --git a/DevSkim-VSCode-Plugin/tsconfig.json b/DevSkim-VSCode-Plugin/tsconfig.json deleted file mode 100644 index fffd5cfa..00000000 --- a/DevSkim-VSCode-Plugin/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "module": "node16", - "moduleResolution": "node16", - "target": "es2019", - "lib": [ - "ES2019" - ], - "rootDir": "client", - "noEmit": true, - "sourceMap": true, - "strict": true, - "strictNullChecks": true, - "resolveJsonModule": true, - "esModuleInterop": true - }, - "exclude": [ ".vscode", "node_modules", "scripts" ], - "references": [ - { "path": "./client" } - ] -} \ No newline at end of file diff --git a/Pipelines/vs/devskim-visualstudio-pr.yml b/Pipelines/vs/devskim-visualstudio-pr.yml deleted file mode 100644 index 60d49c8d..00000000 --- a/Pipelines/vs/devskim-visualstudio-pr.yml +++ /dev/null @@ -1,99 +0,0 @@ -# Azure Pipelines -# https://aka.ms/yaml - -name: DevSkim_VisualStudio_PR_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r) -trigger: none -pr: - branches: - include: - - main - -resources: - repositories: - - repository: templates - type: git - name: General/OSS-Tools-Pipeline-Templates - ref: refs/tags/v2.0.4 - - repository: 1esPipelines - type: git - name: 1ESPipelineTemplates/1ESPipelineTemplates - ref: refs/tags/release - -extends: - template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines - parameters: - pool: - name: MSSecurity-1ES-Build-Agents-Pool - image: MSSecurity-1ES-Windows-2022 - os: windows - stages: - - stage: Test - jobs: - - template: dotnet-test-job.yml@templates - parameters: - jobName: 'dotnet_test_windows' - dotnetVersions: ['8.0.x','9.0.x','10.0.x'] - projectPath: 'DevSkim-DotNet/Microsoft.DevSkim.Tests/Microsoft.DevSkim.Tests.csproj' - poolName: MSSecurity-1ES-Build-Agents-Pool - poolImage: MSSecurity-1ES-Windows-2022 - poolOs: windows - dotnetTestArgs: '-- --coverage --report-trx' - includeNuGetOrg: false - nugetFeedsToUse: 'config' - nugetConfigPath: 'nuget.config' - onInit: - - task: NuGetAuthenticate@1 - - stage: Build - dependsOn: - - Test - jobs: - - job: build_vs_extension - displayName: Build VS Extension - templateContext: - outputs: - - output: pipelineArtifact - targetPath: $(Build.StagingDirectory)/extension - artifactName: 'Unsigned_Extension' - steps: - - task: NuGetAuthenticate@1 - - task: UseDotNet@2 - displayName: Install Dotnet 8 SDK - inputs: - packageType: 'sdk' - version: '8.0.x' - - task: UseDotNet@2 - displayName: Install Dotnet 9 SDK - inputs: - packageType: 'sdk' - version: '9.0.x' - - task: UseDotNet@2 - displayName: Install Dotnet 10 SDK - inputs: - packageType: 'sdk' - version: '10.0.x' - - template: nbgv-set-version-steps.yml@templates - - task: PowerShell@2 - displayName: Mkdir for Extension - inputs: - targetType: 'inline' - script: mkdir extension - workingDirectory: '$(Build.StagingDirectory)' - - task: DotNetCoreCLI@2 - displayName: Build VS Extension - inputs: - command: 'build' - projects: 'DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Microsoft.DevSkim.VisualStudio.csproj' - arguments: '-c Release' - - task: PowerShell@2 - displayName: Move Extension File - inputs: - targetType: 'inline' - script: | - $vsix = Get-ChildItem -Path 'DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/bin/Release/*.vsix' -Recurse | Select-Object -First 1 - if ($vsix) { - Copy-Item $vsix.FullName "$env:BUILD_STAGINGDIRECTORY/extension/" - Write-Host "Copied $($vsix.Name) to staging directory" - } else { - Write-Error "No .vsix file found in build output" - exit 1 - } diff --git a/Pipelines/vs/devskim-visualstudio-release.yml b/Pipelines/vs/devskim-visualstudio-release.yml deleted file mode 100644 index 6ba09c34..00000000 --- a/Pipelines/vs/devskim-visualstudio-release.yml +++ /dev/null @@ -1,254 +0,0 @@ -name: DevSkim_VisualStudio_Release_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r) -trigger: none -pr: none - -resources: - repositories: - - repository: templates - type: git - name: General/OSS-Tools-Pipeline-Templates - ref: refs/tags/v2.0.4 - - repository: 1esPipelines - type: git - name: 1ESPipelineTemplates/1ESPipelineTemplates - ref: refs/tags/release - -extends: - template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines - parameters: - sdl: - sourceRepositoriesToScan: - exclude: - - repository: 1esPipelines - - repository: templates - pool: - name: MSSecurity-1ES-Build-Agents-Pool - image: MSSecurity-1ES-Windows-2022 - os: windows - stages: - - stage: Test - jobs: - - template: dotnet-test-job.yml@templates - parameters: - jobName: 'dotnet_test_windows' - dotnetVersions: ['8.0.x','9.0.x','10.0.x'] - projectPath: 'DevSkim-DotNet/Microsoft.DevSkim.Tests/Microsoft.DevSkim.Tests.csproj' - poolName: MSSecurity-1ES-Build-Agents-Pool - poolImage: MSSecurity-1ES-Windows-2022 - poolOs: windows - dotnetTestArgs: '-- --coverage --report-trx' - includeNuGetOrg: false - nugetFeedsToUse: 'config' - nugetConfigPath: 'nuget.config' - onInit: - - task: NuGetAuthenticate@1 - - template: dotnet-test-job.yml@templates - parameters: - jobName: 'dotnet_test_ubuntu' - dotnetVersions: ['8.0.x','9.0.x','10.0.x'] - poolName: MSSecurity-1ES-Build-Agents-Pool - poolImage: MSSecurity-1ES-Ubuntu-2204 - poolOs: linux - projectPath: 'DevSkim-DotNet/Microsoft.DevSkim.Tests/Microsoft.DevSkim.Tests.csproj' - dotnetTestArgs: '-- --coverage --report-trx' - includeNuGetOrg: false - nugetFeedsToUse: 'config' - nugetConfigPath: 'nuget.config' - onInit: - - task: NuGetAuthenticate@1 - - stage: Build - dependsOn: - - Test - jobs: - - job: build_vs_extension - displayName: Build VS Extension - templateContext: - outputs: - - output: pipelineArtifact - targetPath: $(Build.StagingDirectory)/extension - artifactName: 'Unsigned_Extension' - steps: - - task: NuGetAuthenticate@1 - - task: UseDotNet@2 - displayName: Install Dotnet 8 SDK - inputs: - packageType: 'sdk' - version: '8.0.x' - - task: UseDotNet@2 - displayName: Install Dotnet 9 SDK - inputs: - packageType: 'sdk' - version: '9.0.x' - - task: UseDotNet@2 - displayName: Install Dotnet 10 SDK - inputs: - packageType: 'sdk' - version: '10.0.x' - - template: nbgv-set-version-steps.yml@templates - - task: PowerShell@2 - displayName: Mkdir for Extension - inputs: - targetType: 'inline' - script: mkdir extension - workingDirectory: '$(Build.StagingDirectory)' - - task: DotNetCoreCLI@2 - displayName: Build VS Extension - inputs: - command: 'build' - projects: 'DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Microsoft.DevSkim.VisualStudio.csproj' - arguments: '-c Release' - - task: PowerShell@2 - displayName: Move Extension File - inputs: - targetType: 'inline' - script: | - $vsix = Get-ChildItem -Path 'DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/bin/Release/*.vsix' -Recurse | Select-Object -First 1 - if ($vsix) { - Copy-Item $vsix.FullName "$env:BUILD_STAGINGDIRECTORY/extension/" - Write-Host "Copied $($vsix.Name) to staging directory" - } else { - Write-Error "No .vsix file found in build output" - exit 1 - } - - - stage: Release - dependsOn: - - Build - condition: succeeded() - jobs: - - job: sign_hash_release - displayName: Code Sign, Generate Hashes, Publish Public Release - templateContext: - outputs: - - output: pipelineArtifact - path: '$(Build.StagingDirectory)' - artifact: 'Signed_Binaries' - steps: - - task: NuGetAuthenticate@1 - - template: nbgv-set-version-steps.yml@templates - # set-version-steps only sets it for current job, while adding isOutput only sets it for future jobs - # https://learn.microsoft.com/en-us/azure/devops/pipelines/process/set-variables-scripts?view=azure-devops&tabs=powershell#set-an-output-variable-for-use-in-future-jobs - - powershell: | - $version = (nbgv get-version -v AssemblyInformationalVersion).split('+')[0] - Write-Host "##vso[task.setvariable variable=releaseVersion;isOutput=true]$version" - name: outputReleaseVersionVar - - task: DownloadPipelineArtifact@2 - displayName: Retrieve Unsigned Artifact - inputs: - buildType: 'current' - artifactName: 'Unsigned_Extension' - targetPath: '$(Build.BinariesDirectory)\Unsigned_Extension' - - task: AntiMalware@4 - displayName: Anti-Malware Scan - inputs: - InputType: 'Basic' - ScanType: 'CustomScan' - FileDirPath: '$(Build.BinariesDirectory)' - EnableServices: true - SupportLogOnError: true - TreatSignatureUpdateFailureAs: 'Warning' - SignatureFreshness: 'UpToDate' - TreatStaleSignatureAs: 'Warning' - - task: EsrpCodeSigning@5 - displayName: Code Sign VS Extension - inputs: - ConnectedServiceName: 'oss-esrp-signing-devskim-v5-connection' - AppRegistrationClientId: '8694c10c-c89d-4231-9dca-36cb80737ad0' - AppRegistrationTenantId: '33e01921-4d64-4f8c-a055-5bdaffd5e33d' - AuthAKVName: 'oss-signing-vault' - AuthCertName: 'oss-esrp-auth-cert' - AuthSignCertName: 'oss-esrp-signing-cert' - FolderPath: '$(Build.BinariesDirectory)\Unsigned_Extension' - Pattern: '*.vsix' - signConfigType: 'inlineSignParams' - inlineOperation: | - [ - { - "KeyCode" : "CP-233016", - "OperationCode" : "OpcSign", - "Parameters" : { - "FileDigest" : "/fd SHA256" - }, - "ToolName" : "sign", - "ToolVersion" : "1.0" - }, - { - "KeyCode" : "CP-233016", - "OperationCode" : "OpcVerify", - "Parameters" : {}, - "ToolName" : "sign", - "ToolVersion" : "1.0" - } - ] - SessionTimeout: '60' - MaxConcurrency: '50' - MaxRetryAttempts: '5' - - powershell: 'Get-ChildItem -Path ''$(Build.BinariesDirectory)'' -Recurse CodeSign* | foreach { Remove-Item -Path $_.FullName }' - displayName: 'Delete Code Sign Summaries' - - task: PowerShell@2 - displayName: Move Extension File - inputs: - targetType: 'inline' - script: 'mv $env:BUILD_BINARIESDIRECTORY/Unsigned_Extension/*.vsix $env:BUILD_STAGINGDIRECTORY/' - - task: PowerShell@2 - displayName: Generate Hashes - inputs: - targetType: 'inline' - script: | - Get-ChildItem $(Build.StagingDirectory) | Foreach-Object { - $name = $_.Name - $tmp = (Get-FileHash "$(Build.StagingDirectory)\$name").Hash - Add-Content $(Build.StagingDirectory)\HASHES.txt "$tmp`t$name" - } - - task: PowerShell@2 - displayName: Move VS Marketplace Manifest - inputs: - targetType: 'inline' - script: 'mv $env:BUILD_SOURCESDIRECTORY/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/publish.manifest.json $env:BUILD_STAGINGDIRECTORY/' - - task: PowerShell@2 - displayName: Move Readme-gallery.md - inputs: - targetType: 'inline' - script: 'mv $env:BUILD_SOURCESDIRECTORY/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/readme-gallery.md $env:BUILD_STAGINGDIRECTORY/' - - - task: AzureCLI@2 - displayName: 'Publishing with Managed Identity' - inputs: - azureSubscription: oss-vs-marketplace-publish-mi-connection - scriptType: "pscore" - scriptLocation: 'inlineScript' - inlineScript: | - $aadToken = az account get-access-token --query accessToken --resource 499b84ac-1321-427f-aa17-267ca6975798 -o tsv - Install-Module VSSetup -Force - $vsixPublisher = Join-Path -Path (Get-VSSetupInstance -All | Select-VSSetupInstance -Latest).installationPath -ChildPath "VSSDK\VisualStudioIntegration\Tools\Bin\VsixPublisher.exe" -Resolve - $vsixPath = Resolve-Path $env:BUILD_STAGINGDIRECTORY\*.vsix -Relative - & $vsixPublisher publish -payload $vsixPath -publishManifest $(Build.StagingDirectory)/publish.manifest.json -personalAccessToken $aadToken -ignoreWarnings "VSIXValidatorWarning01,VSIXValidatorWarning02,VSIXValidatorWarning08" - workingDirectory: '$(Build.StagingDirectory)' - - job: gitHubReleaseJob - # Based on Documentation: https://eng.ms/docs/cloud-ai-platform/devdiv/one-engineering-system-1es/1es-docs/1es-pipeline-templates/features/releasepipelines/releaseworkflows/releasejob?tabs=standardreleasejob - displayName: GitHub Release Job - dependsOn: sign_hash_release - variables: - ReleaseVersion: $[ dependencies.sign_hash_release.outputs['outputReleaseVersionVar.releaseVersion'] ] - templateContext: - type: releaseJob - isProduction: true - inputs: - - input: pipelineArtifact - artifactName: Signed_Binaries - targetPath: $(Pipeline.Workspace)/drop - steps: - - task: GitHubRelease@1 - displayName: Release to GitHub - inputs: - gitHubConnection: 'github.com_gfs' - repositoryName: 'microsoft/DevSkim' - action: 'create' - target: '$(Build.SourceVersion)' - tagSource: 'userSpecifiedTag' - tag: 'VS_v$(ReleaseVersion)' - title: 'DevSkim VS Extension v$(ReleaseVersion)' - assets: | - $(Build.StagingDirectory)/*.vsix - changeLogCompareToRelease: 'lastNonDraftRelease' - changeLogType: 'commitBased' diff --git a/Pipelines/vscode/devskim-vscode-pr.yml b/Pipelines/vscode/devskim-vscode-pr.yml deleted file mode 100644 index fd230cd2..00000000 --- a/Pipelines/vscode/devskim-vscode-pr.yml +++ /dev/null @@ -1,74 +0,0 @@ -# Azure Pipelines -# https://aka.ms/yaml - -name: DevSkim_VSCode_PR_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r) -trigger: none -pr: - branches: - include: - - main - -resources: - repositories: - - repository: templates - type: git - name: General/OSS-Tools-Pipeline-Templates - ref: refs/tags/v2.0.4 - - repository: 1esPipelines - type: git - name: 1ESPipelineTemplates/1ESPipelineTemplates - ref: refs/tags/release - -extends: - template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines - parameters: - pool: - name: MSSecurity-1ES-Build-Agents-Pool - image: MSSecurity-1ES-Windows-2022 - os: windows - stages: - - stage: Build - dependsOn: [] - jobs: - - job: build_vscode_plugin - displayName: Build VS Code Plugin - templateContext: - outputs: - - output: pipelineArtifact - targetPath: $(Build.StagingDirectory)/packages - artifactName: 'Unsigned_Plugin' - steps: - - task: NuGetAuthenticate@1 - - task: UseDotNet@2 - displayName: Install Dotnet SDK - inputs: - packageType: 'sdk' - version: '8.0.x' - - task: UseDotNet@2 - displayName: Install Dotnet SDK - inputs: - packageType: 'sdk' - version: '9.0.x' - - task: UseDotNet@2 - displayName: Install Dotnet SDK - inputs: - packageType: 'sdk' - version: '10.0.x' - - template: nbgv-set-version-steps.yml@templates - - task: PowerShell@2 - displayName: Mkdir for Manifests and Packages - inputs: - targetType: 'inline' - script: mkdir sbom/vscode/ ; mkdir sbom/langserver/ ; mkdir packages - workingDirectory: '$(Build.StagingDirectory)' - - task: Npm@1 - displayName: Package VS Code Plugin - inputs: - command: 'custom' - workingDir: 'DevSkim-VSCode-Plugin/' - customCommand: 'run pipeline-pack' - - task: PowerShell@2 - displayName: Move Plugin File - inputs: - targetType: 'inline' - script: 'mv DevSkim-VSCode-Plugin/*.vsix $env:BUILD_STAGINGDIRECTORY/packages/' diff --git a/Pipelines/vscode/devskim-vscode-release.yml b/Pipelines/vscode/devskim-vscode-release.yml deleted file mode 100644 index 69720cb8..00000000 --- a/Pipelines/vscode/devskim-vscode-release.yml +++ /dev/null @@ -1,248 +0,0 @@ -name: DevSkim_VSCode_Release_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r) -trigger: none -pr: none - -resources: - repositories: - - repository: templates - type: git - name: General/OSS-Tools-Pipeline-Templates - ref: refs/tags/v2.0.4 - - repository: 1esPipelines - type: git - name: 1ESPipelineTemplates/1ESPipelineTemplates - ref: refs/tags/release - -extends: - template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines - parameters: - sdl: - sourceRepositoriesToScan: - exclude: - - repository: 1esPipelines - - repository: templates - pool: - name: MSSecurity-1ES-Build-Agents-Pool - image: MSSecurity-1ES-Windows-2022 - os: windows - stages: - - stage: Build - dependsOn: [] - jobs: - - job: build_vscode_plugin - displayName: Build VS Code Plugin - templateContext: - outputs: - - output: pipelineArtifact - targetPath: $(Build.StagingDirectory)/packages - artifactName: 'Unsigned_Plugin' - steps: - - task: NuGetAuthenticate@1 - - task: UseDotNet@2 - displayName: Install Dotnet SDK - inputs: - packageType: 'sdk' - version: '8.0.x' - - task: UseDotNet@2 - displayName: Install Dotnet SDK - inputs: - packageType: 'sdk' - version: '9.0.x' - - task: UseDotNet@2 - displayName: Install Dotnet SDK - inputs: - packageType: 'sdk' - version: '10.0.x' - - template: nbgv-set-version-steps.yml@templates - - task: PowerShell@2 - displayName: Mkdir for Manifests and Packages - inputs: - targetType: 'inline' - script: mkdir sbom/vscode/ ; mkdir sbom/langserver/ ; mkdir packages - workingDirectory: '$(Build.StagingDirectory)' - - task: Npm@1 - displayName: Package VS Code Plugin - inputs: - command: 'custom' - workingDir: 'DevSkim-VSCode-Plugin/' - customCommand: 'run pipeline-pack' - - task: PowerShell@2 - displayName: Move Plugin File - inputs: - targetType: 'inline' - script: 'mv DevSkim-VSCode-Plugin/*.vsix $env:BUILD_STAGINGDIRECTORY/packages/' - - - stage: Release - dependsOn: - - Build - condition: succeeded() - jobs: - - job: sign_hash_release - displayName: Code Sign, Generate Hashes, Publish Public Release - templateContext: - outputs: - - output: pipelineArtifact - path: '$(Build.StagingDirectory)' - artifact: 'Signed_Binaries' - steps: - - task: NuGetAuthenticate@1 - - template: nbgv-set-version-steps.yml@templates - # set-version-steps only sets it for current job, while adding isOutput only sets it for future jobs - # https://learn.microsoft.com/en-us/azure/devops/pipelines/process/set-variables-scripts?view=azure-devops&tabs=powershell#set-an-output-variable-for-use-in-future-jobs - - powershell: | - $version = (nbgv get-version -v AssemblyInformationalVersion).split('+')[0] - Write-Host "##vso[task.setvariable variable=releaseVersion;isOutput=true]$version" - name: outputReleaseVersionVar - - task: DownloadPipelineArtifact@2 - displayName: Retrieve Unsigned Artifact - inputs: - buildType: 'current' - artifactName: 'Unsigned_Plugin' - targetPath: '$(Build.BinariesDirectory)\Unsigned_Plugin' - - task: AntiMalware@4 - displayName: Anti-Malware Scan - inputs: - InputType: 'Basic' - ScanType: 'CustomScan' - FileDirPath: '$(Build.BinariesDirectory)' - EnableServices: true - SupportLogOnError: true - TreatSignatureUpdateFailureAs: 'Warning' - SignatureFreshness: 'UpToDate' - TreatStaleSignatureAs: 'Warning' - - task: EsrpCodeSigning@5 - displayName: Code Sign VSCode Plugin - inputs: - ConnectedServiceName: 'oss-esrp-signing-devskim-v5-connection' - AppRegistrationClientId: '8694c10c-c89d-4231-9dca-36cb80737ad0' - AppRegistrationTenantId: '33e01921-4d64-4f8c-a055-5bdaffd5e33d' - AuthAKVName: 'oss-signing-vault' - AuthCertName: 'oss-esrp-auth-cert' - AuthSignCertName: 'oss-esrp-signing-cert' - FolderPath: '$(Build.BinariesDirectory)\Unsigned_Plugin' - Pattern: '*.vsix' - signConfigType: 'inlineSignParams' - inlineOperation: | - [ - { - "KeyCode" : "CP-233016", - "OperationCode" : "OpcSign", - "Parameters" : { - "FileDigest" : "/fd SHA256" - }, - "ToolName" : "sign", - "ToolVersion" : "1.0" - }, - { - "KeyCode" : "CP-233016", - "OperationCode" : "OpcVerify", - "Parameters" : {}, - "ToolName" : "sign", - "ToolVersion" : "1.0" - } - ] - SessionTimeout: '60' - MaxConcurrency: '50' - MaxRetryAttempts: '5' - - - powershell: 'Get-ChildItem -Path ''$(Build.BinariesDirectory)'' -Recurse CodeSign* | foreach { Remove-Item -Path $_.FullName }' - displayName: 'Delete Code Sign Summaries' - - - task: PowerShell@2 - displayName: Move Plugin File - inputs: - targetType: 'inline' - script: 'mv $env:BUILD_BINARIESDIRECTORY/Unsigned_Plugin/*.vsix $env:BUILD_STAGINGDIRECTORY/' - - - task: CmdLine@2 - displayName: 'Copy .npmrc to staging dir' - inputs: - script: copy "$(Build.SourcesDirectory)\DevSkim-VSCode-Plugin\.npmrc.pipeline" "$(Build.StagingDirectory)\.npmrc" - - - task: CmdLine@2 - displayName: 'List files in StagingDirectory' - inputs: - script: dir /B - workingDirectory: '$(Build.StagingDirectory)' - - # Install dependencies and VS Code Extension Manager (vsce >= v2.26.1 needed) - - script: | - cd $(Build.StagingDirectory) - npm install -g @microsoft/artifacts-npm-credprovider --registry https://pkgs.dev.azure.com/artifacts-public/PublicTools/_packaging/AzureArtifacts/npm/registry/ - artifacts-npm-credprovider - npm install -g @vscode/vsce --registry https://pkgs.dev.azure.com/microsoft-sdl/General/_packaging/PublicRegistriesFeed/npm/registry/ - npm install - displayName: "Install vsce and dependencies" - - # Publish to marketplace - - task: AzureCLI@2 - displayName: 'Publishing with Managed Identity' - inputs: - azureSubscription: oss-vs-marketplace-publish-mi-connection - scriptType: "pscore" - scriptLocation: 'inlineScript' - workingDirectory: '$(Build.StagingDirectory)' - inlineScript: | - # Fail fast if signing/staging did not produce exactly one artifact, rather than - # passing a null or multi-element Resolve-Path result to --packagePath. - $vsixFiles = @(Get-ChildItem -Path $env:BUILD_STAGINGDIRECTORY -Filter '*.vsix' -File) - if ($vsixFiles.Count -ne 1) - { - throw "Expected exactly one .vsix in $env:BUILD_STAGINGDIRECTORY, found $($vsixFiles.Count)" - } - $packPath = $vsixFiles[0].FullName - # Invoke the vsce installed globally in the previous step by its full path. - # `npx @vscode/vsce` cannot be used here: npx only short circuits to an already - # installed binary when the argument matches a bin name, so a package name always - # forces a manifest fetch from the npm registry, which fails with E401 in this task. - # On Windows npm's global bin directory is the global prefix itself, so `npm prefix -g` - # locates the shim (`npm bin` was removed in npm v9 and is not an option). - $vsce = Join-Path (npm prefix -g) 'vsce.cmd' - if (-not (Test-Path $vsce)) - { - throw "vsce was not found at $vsce - check the 'Install vsce and dependencies' step" - } - if ("$(ReleaseVersion)".Contains("-")) - { - echo "Publishing as --pre-release = $(ReleaseVersion)" - & $vsce publish --packagePath $packPath --pre-release --azure-credential - } - else - { - echo "Publishing as official release = $(ReleaseVersion)" - & $vsce publish --packagePath $packPath --azure-credential - } - if ($LASTEXITCODE -ne 0) - { - throw "vsce publish failed with exit code $LASTEXITCODE" - } - - - job: gitHubReleaseJob - # Based on Documentation: https://eng.ms/docs/cloud-ai-platform/devdiv/one-engineering-system-1es/1es-docs/1es-pipeline-templates/features/releasepipelines/releaseworkflows/releasejob?tabs=standardreleasejob - displayName: GitHub Release Job - dependsOn: sign_hash_release - variables: - ReleaseVersion: $[ dependencies.sign_hash_release.outputs['outputReleaseVersionVar.releaseVersion'] ] - # pool: you can optionally specify pool as you would normally do for a standard job - templateContext: - type: releaseJob # Required, this indicates this job is a release job - isProduction: true # Required, must be 'true' or 'false' - inputs: # All input build artifacts must be declared here - - input: pipelineArtifact # Required, type of the input artifact - artifactName: Signed_Binaries # Required, name of the pipeline artifact - targetPath: $(Pipeline.Workspace)/drop # Optional, specifies where the artifact is downloaded - steps: - - task: GitHubRelease@1 - displayName: Release to GitHub - inputs: - gitHubConnection: 'github.com_gfs' - repositoryName: 'microsoft/DevSkim' - action: 'create' - target: '$(Build.SourceVersion)' - tagSource: 'userSpecifiedTag' - tag: 'VSCode_v$(ReleaseVersion)' - title: 'DevSkim VS Code Extension v$(ReleaseVersion)' - assets: | - $(Build.StagingDirectory)/*.vsix - changeLogCompareToRelease: 'lastNonDraftRelease' - changeLogType: 'commitBased' \ No newline at end of file From d88918b4f7e8580624a6e22e1a6c5c5298481420 Mon Sep 17 00:00:00 2001 From: Giulia Stocco <98900+gfs@users.noreply.github.com> Date: Wed, 23 Sep 2026 18:40:50 +0000 Subject: [PATCH 2/7] Remove Visual Studio extension and IDE language server projects Delete Microsoft.DevSkim.VisualStudio, Microsoft.DevSkim.LanguageServer, and Microsoft.DevSkim.LanguageProtoInterop, remove them from the solution, and drop the Visual Studio-only media assets. --- .../CodeFixMapping.cs | 108 ---- .../CommentStylesEnum.cs | 8 - .../IDevSkimOptions.cs | 33 -- .../Messages.cs | 13 - ...rosoft.DevSkim.LanguageProtoInterop.csproj | 16 - .../PortableScannerSettings.cs | 36 -- .../ValueResultEnum.cs | 38 -- .../CodeActionHandler.cs | 168 ------ .../ConfigHelpers.cs | 131 ----- .../DidChangeConfigurationHandler.cs | 36 -- .../Microsoft.DevSkim.LanguageServer.csproj | 30 -- .../Program.cs | 113 ---- .../StaticScannerSettings.cs | 143 ----- .../TextDocumentSyncHandler.cs | 222 -------- .../VisualStudioConfigurationHandler.cs | 37 -- .../.vsextension/string-resources.json | 90 ---- .../Content/License.txt | 21 - .../Content/devskim-icon-200.png | Bin 1684 -> 0 bytes .../Content/devskim-icon-32.png | Bin 444 -> 0 bytes .../Content/devskim.ico | Bin 7406 -> 0 bytes .../Content/readme-gallery.md | 35 -- .../DevSkimExtension.cs | 35 -- .../DevSkimLanguageServerProvider.cs | 488 ------------------ .../DevSkimSettingDefinitions.cs | 223 -------- .../Microsoft.DevSkim.VisualStudio.csproj | 47 -- .../Properties/launchSettings.json | 9 - .../publish.manifest.json | 13 - DevSkim-DotNet/Microsoft.DevSkim.sln | 31 +- media/DevSkim-VisualStudio-Demo-1.gif | Bin 144537 -> 0 bytes ...vSkim-VisualStudio-Suppression-Example.png | Bin 26925 -> 0 bytes 30 files changed, 1 insertion(+), 2123 deletions(-) delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/CodeFixMapping.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/CommentStylesEnum.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/IDevSkimOptions.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/Messages.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/Microsoft.DevSkim.LanguageProtoInterop.csproj delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/PortableScannerSettings.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/ValueResultEnum.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/CodeActionHandler.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/ConfigHelpers.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/DidChangeConfigurationHandler.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/Microsoft.DevSkim.LanguageServer.csproj delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/Program.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/StaticScannerSettings.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/TextDocumentSyncHandler.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/VisualStudioConfigurationHandler.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/.vsextension/string-resources.json delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/License.txt delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/devskim-icon-200.png delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/devskim-icon-32.png delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/devskim.ico delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/readme-gallery.md delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/DevSkimExtension.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/DevSkimLanguageServerProvider.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/DevSkimSettingDefinitions.cs delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Microsoft.DevSkim.VisualStudio.csproj delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Properties/launchSettings.json delete mode 100644 DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/publish.manifest.json delete mode 100644 media/DevSkim-VisualStudio-Demo-1.gif delete mode 100644 media/DevSkim-VisualStudio-Suppression-Example.png diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/CodeFixMapping.cs b/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/CodeFixMapping.cs deleted file mode 100644 index 83e2d0d1..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/CodeFixMapping.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.Linq; - -namespace Microsoft.DevSkim.LanguageProtoInterop -{ - using OmniSharp.Extensions.LanguageServer.Protocol.Models; - using System; - - /// - /// Holds a set of CodeFixMappings for a specific file path and version for that file - /// - public class MappingsVersion - { - public int? version; - public Uri fileName; - } - - public class CodeFixMapping : IEquatable - { - /// - /// Reported version of the document the diagnostic applies to - /// - public int? version; - - /// - /// The diagnostic to attach the fix to - /// - public Diagnostic diagnostic { get; } - /// - /// The replacement to make - /// - public string replacement { get; } - /// - /// The Filename this fix should apply to - /// - public Uri fileName { get; } - /// - /// The description for the CodeFix in the IDE - /// - public string friendlyString { get; } - - /// - /// The absolute character index for the start (used by Visual Studio Extension) - /// - public int matchStart { get; } - - /// - /// The absolute character index for the start (used by Visual Studio Extension) - /// - public int matchEnd { get; } - - /// - /// The absolute character index for the start (used by Visual Studio Extension) - /// - public bool isSuppression { get; } - - /// - /// Create a codefixmapping to send to the IDE - /// - /// - /// - /// - /// - public CodeFixMapping(Diagnostic diagnostic, string replacement, Uri fileName, string friendlyString, int? version, int matchStart, int matchEnd, bool isSuppression) - { - this.version = version; - this.diagnostic = diagnostic; - this.replacement = replacement; - this.fileName = fileName; - this.friendlyString = friendlyString; - this.matchStart = matchStart; - this.matchEnd = matchEnd; - this.isSuppression = isSuppression; - } - - public bool Equals(CodeFixMapping other) - { - if (ReferenceEquals(null, other)) return false; - if (ReferenceEquals(this, other)) return true; - return version == other.version && Equals(diagnostic, other.diagnostic) && replacement == other.replacement && Equals(fileName, other.fileName) && friendlyString == other.friendlyString && matchStart == other.matchStart && matchEnd == other.matchEnd && isSuppression == other.isSuppression; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != this.GetType()) return false; - return Equals((CodeFixMapping)obj); - } - - public override int GetHashCode() - { - unchecked - { - var hashCode = version.GetHashCode(); - hashCode = (hashCode * 397) ^ (diagnostic != null ? diagnostic.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ (replacement != null ? replacement.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ (fileName != null ? fileName.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ (friendlyString != null ? friendlyString.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ matchStart; - hashCode = (hashCode * 397) ^ matchEnd; - hashCode = (hashCode * 397) ^ isSuppression.GetHashCode(); - return hashCode; - } - } - } -} diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/CommentStylesEnum.cs b/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/CommentStylesEnum.cs deleted file mode 100644 index 80ad17f3..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/CommentStylesEnum.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Microsoft.DevSkim.LanguageProtoInterop -{ - public enum CommentStylesEnum - { - Line, - Block - } -} \ No newline at end of file diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/IDevSkimOptions.cs b/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/IDevSkimOptions.cs deleted file mode 100644 index 10a2e785..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/IDevSkimOptions.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Collections.Generic; - -namespace Microsoft.DevSkim.LanguageProtoInterop -{ - /// - /// When updating this Interface ensure UpdateSettingsGenerator can handle any types here - /// - public interface IDevSkimOptions - { - public bool EnableCriticalSeverityRules { get; set; } - public bool EnableImportantSeverityRules { get; set; } - public bool EnableModerateSeverityRules { get; set; } - public bool EnableManualReviewSeverityRules { get; set; } - public bool EnableBestPracticeSeverityRules { get; set; } - public bool EnableHighConfidenceRules { get; set; } - public bool EnableMediumConfidenceRules { get; set; } - public bool EnableLowConfidenceRules { get; set; } - public string CustomRulesPathsString { get; set; } - public string CustomLanguagesPath { get; set; } - public string CustomCommentsPath { get; set; } - public int SuppressionDurationInDays { get; set; } - public CommentStylesEnum SuppressionCommentStyle { get; set; } - public string ManualReviewerName { get; set; } - public string GuidanceBaseURL { get; set; } - public string IgnoreFilesString { get; set; } - public string IgnoreRulesListString { get; set; } - public bool IgnoreDefaultRules { get; set; } - public bool RemoveFindingsOnClose { get; set; } - public bool ScanOnOpen { get; set; } - public bool ScanOnSave { get; set; } - public bool ScanOnChange { get; set; } - } -} \ No newline at end of file diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/Messages.cs b/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/Messages.cs deleted file mode 100644 index 5335acfe..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/Messages.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Microsoft.DevSkim.LanguageProtoInterop -{ - using System; - using System.Collections.Generic; - using System.Text; - - public static class DevSkimMessages - { - public const string FileVersion = "devskim/fileversion"; - public const string CodeFixMapping = "devskim/codefixmapping"; - public const string SetServerSettings = "devskim/setSettings"; - } -} diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/Microsoft.DevSkim.LanguageProtoInterop.csproj b/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/Microsoft.DevSkim.LanguageProtoInterop.csproj deleted file mode 100644 index 73627dcd..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/Microsoft.DevSkim.LanguageProtoInterop.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - netstandard2.0 - MIT - 9 - - - - - - 3.7.115 - - - - diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/PortableScannerSettings.cs b/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/PortableScannerSettings.cs deleted file mode 100644 index 46e25a6e..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/PortableScannerSettings.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace Microsoft.DevSkim.LanguageProtoInterop -{ - public class PortableScannerSettings : IDevSkimOptions - { - public CommentStylesEnum SuppressionCommentStyle { get; set; } = CommentStylesEnum.Line; - public string CustomRulesPathsString { get; set; } = string.Empty; - public string IgnoreRulesListString { get; set; } = string.Empty; - public string IgnoreFilesString { get; set; } = string.Empty; - // Used to populate suppressions - public string ManualReviewerName { get; set; } = string.Empty; - // Suppression duration in days - public int SuppressionDurationInDays { get; set; } = 30; - public bool IgnoreDefaultRules { get; set; } = false; - public bool ScanOnOpen { get; set; } = true; - public bool ScanOnSave { get; set; } = true; - public bool ScanOnChange { get; set; } = true; - public bool RemoveFindingsOnClose { get; set; } = true; - public string CustomLanguagesPath { get; set; } = string.Empty; - public string CustomCommentsPath { get; set; } = string.Empty; - public string GuidanceBaseURL { get; set; } = "https://github.com/microsoft/devskim/tree/main/guidance"; - // Default all severity rules to enabled - public bool EnableCriticalSeverityRules { get; set; } = true; - public bool EnableImportantSeverityRules { get; set; } = true; - public bool EnableModerateSeverityRules { get; set; } = true; - public bool EnableManualReviewSeverityRules { get; set; } = true; - public bool EnableBestPracticeSeverityRules { get; set; } = true; - // Default high and medium confidence to enabled, low disabled - public bool EnableHighConfidenceRules { get; set; } = true; - public bool EnableLowConfidenceRules { get; set; } = false; - public bool EnableMediumConfidenceRules { get; set; } = true; - } -} \ No newline at end of file diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/ValueResultEnum.cs b/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/ValueResultEnum.cs deleted file mode 100644 index 6252e11f..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageProtoInterop/ValueResultEnum.cs +++ /dev/null @@ -1,38 +0,0 @@ -namespace Microsoft.DevSkim.LanguageProtoInterop -{ - using System; - using System.Collections.Generic; - using System.Text; - - /// - /// A copy of Microsoft.VisualStudio.Settings.GetValueResult, - /// so the UpdateSettingsGenerator that must generate enums with these values doesn't have to reference the settings package. - /// - public enum ValueResultEnum - { - // - // Summary: - // The value was retrieved and converted to the specified type successfully. - Success, - // - // Summary: - // The value is not present in the store. - Missing, - // - // Summary: - // The stored value could not be deserialized. - Corrupt, - // - // Summary: - // The deserialized value could not be converted to the specified type. - IncompatibleType, - // - // Summary: - // The stored value is in a old serialization format that is no longer supported. - ObsoleteFormat, - // - // Summary: - // An unexpected error occurred. - UnknownError - } -} diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/CodeActionHandler.cs b/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/CodeActionHandler.cs deleted file mode 100644 index dd020737..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/CodeActionHandler.cs +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System.Collections.Concurrent; -using MediatR; -using Microsoft.DevSkim; -using Microsoft.DevSkim.LanguageProtoInterop; -using Microsoft.Extensions.Logging; -using OmniSharp.Extensions.LanguageServer.Protocol; -using OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities; -using OmniSharp.Extensions.LanguageServer.Protocol.Document; -using OmniSharp.Extensions.LanguageServer.Protocol.Models; - -namespace DevSkim.LanguageServer -{ - /// - /// Handles textDocument/codeAction requests from the LSP client. - /// Provides quick fixes for DevSkim security findings. - /// - internal class CodeActionHandler : ICodeActionHandler - { - private readonly ILogger _logger; - - // Store code fixes keyed by document URI and diagnostic key - private static readonly ConcurrentDictionary>> _codeFixCache = new(); - - // Store line lengths per document so we can compute exact end-of-line positions for suppressions - private static readonly ConcurrentDictionary _lineLengthCache = new(); - - public CodeActionHandler(ILogger logger) - { - _logger = logger; - } - - public CodeActionRegistrationOptions GetRegistrationOptions(CodeActionCapability capability, ClientCapabilities clientCapabilities) - { - return new CodeActionRegistrationOptions - { - DocumentSelector = TextDocumentSelector.ForPattern("**/*"), - CodeActionKinds = new Container(CodeActionKind.QuickFix), - ResolveProvider = false - }; - } - - public Task Handle(CodeActionParams request, CancellationToken cancellationToken) - { - var result = new List(); - var documentUri = request.TextDocument.Uri.ToString(); - - _logger.LogDebug($"CodeActionHandler: Processing request for {documentUri}"); - _logger.LogDebug($"CodeActionHandler: {request.Context.Diagnostics.Count()} diagnostics in context"); - - foreach (var diagnostic in request.Context.Diagnostics) - { - // Only process DevSkim diagnostics - if (diagnostic.Source != "DevSkim Language Server") - { - continue; - } - - var diagnosticKey = CreateDiagnosticKey(documentUri, diagnostic); - - if (_codeFixCache.TryGetValue(documentUri, out var documentFixes) && - documentFixes.TryGetValue(diagnosticKey, out var fixes)) - { - _logger.LogDebug($"CodeActionHandler: Found {fixes.Count} fixes"); - var codeActions = fixes.Select(fix => new CodeAction - { - Title = fix.friendlyString, - Kind = CodeActionKind.QuickFix, - Diagnostics = new Container(diagnostic), - Edit = CreateWorkspaceEdit(request.TextDocument.Uri, diagnostic, fix) - }); - result.AddRange(codeActions.Select(ca => new CommandOrCodeAction(ca))); - } - } - - _logger.LogDebug($"CodeActionHandler: Returning {result.Count} code actions"); - return Task.FromResult(new CommandOrCodeActionContainer(result)); - } - - private static WorkspaceEdit CreateWorkspaceEdit(DocumentUri uri, Diagnostic diagnostic, CodeFixMapping fix) - { - TextEdit textEdit; - if (fix.isSuppression) - { - // For suppressions, insert at the actual end of the line - int line = diagnostic.Range.End.Line; - int lineLength = GetLineLength(uri, line); - textEdit = new TextEdit - { - Range = new OmniSharp.Extensions.LanguageServer.Protocol.Models.Range(line, lineLength, line, lineLength), - NewText = fix.replacement - }; - } - else - { - textEdit = new TextEdit - { - Range = diagnostic.Range, - NewText = fix.replacement - }; - } - - return new WorkspaceEdit - { - Changes = new Dictionary> - { - [uri] = new[] { textEdit } - } - }; - } - - /// - /// Store line lengths for a document, computed from the document text we already have during scanning. - /// - public static void SetLineLengths(DocumentUri uri, string text) - { - var lines = text.Split('\n'); - var lengths = new int[lines.Length]; - for (int i = 0; i < lines.Length; i++) - { - lengths[i] = lines[i].TrimEnd('\r').Length; - } - _lineLengthCache[uri.ToString()] = lengths; - } - - private static int GetLineLength(DocumentUri uri, int line) - { - if (_lineLengthCache.TryGetValue(uri.ToString(), out var lengths) && line < lengths.Length) - { - return lengths[line]; - } - return 0; - } - - /// - /// Register code fixes for a diagnostic. Called by TextDocumentSyncHandler when processing documents. - /// - public static void RegisterCodeFix(DocumentUri uri, Diagnostic diagnostic, CodeFixMapping fix) - { - var documentUri = uri.ToString(); - var diagnosticKey = CreateDiagnosticKey(documentUri, diagnostic); - - var documentFixes = _codeFixCache.GetOrAdd(documentUri, _ => new ConcurrentDictionary>()); - var fixes = documentFixes.GetOrAdd(diagnosticKey, _ => new List()); - - lock (fixes) - { - fixes.Add(fix); - } - } - - /// - /// Clear all code fixes for a document. Called when document is closed or rescanned. - /// - public static void ClearCodeFixes(DocumentUri uri) - { - _codeFixCache.TryRemove(uri.ToString(), out _); - _lineLengthCache.TryRemove(uri.ToString(), out _); - } - - private static string CreateDiagnosticKey(string documentUri, Diagnostic diagnostic) - { - return $"{diagnostic.Code}:{diagnostic.Range.Start.Line}:{diagnostic.Range.Start.Character}:{diagnostic.Range.End.Line}:{diagnostic.Range.End.Character}"; - } - } -} diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/ConfigHelpers.cs b/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/ConfigHelpers.cs deleted file mode 100644 index e715a3fe..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/ConfigHelpers.cs +++ /dev/null @@ -1,131 +0,0 @@ -using Microsoft.ApplicationInspector.RulesEngine; -using Microsoft.DevSkim; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging.Abstractions; -using System.Text.RegularExpressions; -using GlobExpressions; - -namespace DevSkim.LanguageServer; - -internal class ConfigHelpers -{ - /// - /// Lists are presented in the configuration as a number of items with the name of the list appended with ':i' where i is the index of the item from the list. - /// This method compacts those back to a Collection for convenience. - /// - /// - /// - /// - internal static ICollection CompileList(IConfiguration configuration, string valueName) - { - List toReturn = new List(); - int i = 0; - while (true) - { - T nextItem = configuration.GetValue($"{Section}:{valueName}:{i}"); - if (nextItem == null) - { - break; - } - else - { - toReturn.Add(nextItem); - i++; - } - } - return toReturn; - } - - internal static readonly string Section = "MS-CST-E.vscode-devskim"; - internal static void SetScannerSettings(IConfiguration configuration) - { - StaticScannerSettings.RuleProcessorOptions = OptionsFromConfiguration(configuration); - StaticScannerSettings.IgnoreDefaultRuleSet = configuration.GetValue($"{Section}:ignores:ignoreDefaultRules"); - StaticScannerSettings.CustomRulePaths = CompileList(configuration, "rules:customRulesPaths"); - StaticScannerSettings.IgnoreRuleIds = CompileList(configuration, "ignores:ignoreRulesList"); - List fileIgnoreRegexes = new(); - foreach (string potentialRegex in CompileList(configuration, "ignores:ignoreFiles")) - { - try - { - fileIgnoreRegexes.Add(new Glob(potentialRegex)); - } - catch (Exception) - { - // Invalid glob pattern — skip - } - } - StaticScannerSettings.IgnoreFiles = fileIgnoreRegexes; - - StaticScannerSettings.RemoveFindingsOnClose = configuration.GetValue($"{Section}:findings:removeFindingsOnClose"); - StaticScannerSettings.ScanOnOpen = configuration.GetValue($"{Section}:triggers:scanOnOpen"); - StaticScannerSettings.ScanOnSave = configuration.GetValue($"{Section}:triggers:scanOnSave"); - StaticScannerSettings.ScanOnChange = configuration.GetValue($"{Section}:triggers:scanOnChange"); - StaticScannerSettings.SuppressionDuration = configuration.GetValue($"{Section}:suppressions:suppressionDurationInDays"); - StaticScannerSettings.SuppressionStyle = configuration.GetValue($"{Section}:suppressions:suppressionCommentStyle"); - StaticScannerSettings.ReviewerName = configuration.GetValue($"{Section}:suppressions:manualReviewerName"); - - DevSkimRuleSet ruleSet = StaticScannerSettings.IgnoreDefaultRuleSet ? new DevSkimRuleSet() : DevSkimRuleSet.GetDefaultRuleSet(); - foreach (string path in StaticScannerSettings.CustomRulePaths) - { - try - { - ruleSet.AddPath(path); - } - catch (Exception) - { - // Invalid rule path — skip - } - } - ruleSet = ruleSet.WithoutIds(StaticScannerSettings.IgnoreRuleIds); - StaticScannerSettings.RuleSet = ruleSet; - StaticScannerSettings.Processor = new DevSkimRuleProcessor(StaticScannerSettings.RuleSet, StaticScannerSettings.RuleProcessorOptions); - } - - private static DevSkimRuleProcessorOptions OptionsFromConfiguration(IConfiguration configuration) - { - string languagesPath = configuration.GetValue($"{Section}:rules:customLanguagesPath"); - string commentsPath = configuration.GetValue($"{Section}:rules:customCommentsPath"); - Severity severityFilter = Severity.Unspecified; - if (configuration.GetValue($"{Section}:rules:enableCriticalSeverityRules")) - { - severityFilter |= Severity.Critical; - } - if (configuration.GetValue($"{Section}:rules:enableImportantSeverityRules")) - { - severityFilter |= Severity.Important; - } - if (configuration.GetValue($"{Section}:rules:enableModerateSeverityRules")) - { - severityFilter |= Severity.Moderate; - } - if (configuration.GetValue($"{Section}:rules:enableManualReviewSeverityRules")) - { - severityFilter |= Severity.ManualReview; - } - if (configuration.GetValue($"{Section}:rules:enableBestPracticeSeverityRules")) - { - severityFilter |= Severity.BestPractice; - } - Confidence confidenceFilter = Confidence.Unspecified; - if (configuration.GetValue($"{Section}:rules:enableHighConfidenceRules")) - { - confidenceFilter |= Confidence.High; - } - if (configuration.GetValue($"{Section}:rules:enableMediumConfidenceRules")) - { - confidenceFilter |= Confidence.Medium; - } - if (configuration.GetValue($"{Section}:rules:enableLowConfidenceRules")) - { - confidenceFilter |= Confidence.Low; - } - return new DevSkimRuleProcessorOptions() - { - Languages = (string.IsNullOrEmpty(languagesPath) || string.IsNullOrEmpty(commentsPath)) ? DevSkimLanguages.LoadEmbedded() : DevSkimLanguages.FromFiles(commentsPath, languagesPath), - SeverityFilter = severityFilter, - ConfidenceFilter = confidenceFilter, - LoggerFactory = NullLoggerFactory.Instance, - }; - } -} \ No newline at end of file diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/DidChangeConfigurationHandler.cs b/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/DidChangeConfigurationHandler.cs deleted file mode 100644 index 58f54aa8..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/DidChangeConfigurationHandler.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using MediatR; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; -using OmniSharp.Extensions.LanguageServer.Protocol.Models; -using OmniSharp.Extensions.LanguageServer.Protocol.Server; -using OmniSharp.Extensions.LanguageServer.Protocol.Workspace; - -namespace DevSkim.LanguageServer; - -internal class DidChangeConfigurationHandler : DidChangeConfigurationHandlerBase -{ - private readonly ILogger _logger; - private readonly ILanguageServerConfiguration _configuration; - - /// - /// Handle configuration changes from VS Code via workspace/didChangeConfiguration. - /// When notified, pulls settings from the client and applies them. - /// - public DidChangeConfigurationHandler(ILogger logger, ILanguageServerConfiguration configuration) - { - _logger = logger; - _configuration = configuration; - } - - public override async Task Handle(DidChangeConfigurationParams request, CancellationToken cancellationToken) - { - _logger.LogDebug("DidChangeConfigurationHandler.cs: DidChangeConfigurationParams"); - ConfigHelpers.SetScannerSettings( - (IConfiguration)await _configuration.GetConfiguration(new ConfigurationItem { Section = "MS-CST-E.vscode-devskim" }) - ); - return Unit.Value; - } -} diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/Microsoft.DevSkim.LanguageServer.csproj b/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/Microsoft.DevSkim.LanguageServer.csproj deleted file mode 100644 index 02116361..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/Microsoft.DevSkim.LanguageServer.csproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - Exe - enable - enable - DevSkim.LanguageServer - net8.0;net10.0 - MIT - Microsoft - © Microsoft Corporation. All rights reserved. - - - - - - - - - - 3.7.115 - - - - - - - - - diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/Program.cs b/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/Program.cs deleted file mode 100644 index cdbedc56..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/Program.cs +++ /dev/null @@ -1,113 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using OmniSharp.Extensions.LanguageServer.Protocol.Models; -using OmniSharp.Extensions.LanguageServer.Protocol.Server.Capabilities; -using OmniSharp.Extensions.LanguageServer.Server; -using Serilog; - -namespace DevSkim.LanguageServer; - -internal class Program -{ - static async Task Main(string[] args) - { -#if DEBUG - Log.Logger = new LoggerConfiguration() - .Enrich.FromLogContext() - .WriteTo.File("devskim-server-log.txt", rollingInterval: RollingInterval.Day) - .MinimumLevel.Verbose() - .CreateLogger(); -#else - // Creates a "silent" logger - Log.Logger = new LoggerConfiguration().CreateLogger(); -#endif - - Log.Logger.Debug("Configuring server..."); - IObserver workDone = null!; - OmniSharp.Extensions.LanguageServer.Server.LanguageServer server = await OmniSharp.Extensions.LanguageServer.Server.LanguageServer.From( - options => - options - .WithInput(Console.OpenStandardInput()) - .WithOutput(Console.OpenStandardOutput()) - .WithServerInfo(new ServerInfo { Name = "DevSkim Language Server" }) - .ConfigureLogging( - x => x - .AddSerilog(Log.Logger) - .AddLanguageProtocolLogging() - ) - .WithHandler() - .WithHandler() - // Handle settings push from clients (devskim/setSettings custom method) - // This works for both VS Code and VS - avoids workspace/configuration issues - .WithHandler() - // Handle workspace/didChangeConfiguration from VS Code - // VS Code sends this notification; the handler pulls settings via workspace/configuration - .WithHandler() - .WithServices(x => x.AddLogging(b => b.SetMinimumLevel(LogLevel.Debug))) - .OnInitialize( - async (server, request, token) => - { - Log.Logger.Debug("Server is starting..."); - - // Check if the client sent settings via initializationOptions - // (VS extension passes PortableScannerSettings here) - Microsoft.DevSkim.LanguageProtoInterop.PortableScannerSettings? clientSettings = null; - try - { - if (request.InitializationOptions is Newtonsoft.Json.Linq.JToken initOptions) - { - clientSettings = initOptions.ToObject(); - Log.Logger.Debug("Received settings from initializationOptions: IgnoreDefaultRules={IgnoreDefaultRules}", clientSettings?.IgnoreDefaultRules); - } - else - { - Log.Logger.Warning("No initializationOptions received (type: {Type}), using defaults", request.InitializationOptions?.GetType().Name ?? "null"); - } - } - catch (Exception ex) - { - Log.Logger.Warning(ex, "Failed to parse initializationOptions as settings"); - } - - // Apply client settings if provided, otherwise use defaults - var effectiveSettings = clientSettings ?? new Microsoft.DevSkim.LanguageProtoInterop.PortableScannerSettings(); - StaticScannerSettings.UpdateWith(effectiveSettings); - Log.Logger.Debug("Settings applied: IgnoreDefaultRules={IgnoreDefaultRules}, RuleCount={RuleCount}", effectiveSettings.IgnoreDefaultRules, StaticScannerSettings.RuleSet.Count()); - - OmniSharp.Extensions.LanguageServer.Protocol.Server.WorkDone.IWorkDoneObserver manager = server.WorkDoneManager.For( - request, new WorkDoneProgressBegin - { - Title = "Server is starting...", - } - ); - workDone = manager; - } - ) - .OnInitialized( - async (server, request, response, token) => - { - Log.Logger.Debug("Server started"); - workDone.OnNext( - new WorkDoneProgressReport - { - Message = "Server started", - } - ); - workDone.OnCompleted(); - } - ) - .OnStarted( - async (languageServer, token) => - { - Log.Logger.Debug("Beginning server routines..."); - using OmniSharp.Extensions.LanguageServer.Protocol.Server.WorkDone.IWorkDoneObserver manager = await languageServer.WorkDoneManager.Create( - new WorkDoneProgressBegin { Title = "Beginning server routines..." }).ConfigureAwait(false); - - Log.Logger.Debug("Listening for client events..."); - } - ) - ).ConfigureAwait(false); - - await server.WaitForExit.ConfigureAwait(false); - } -} diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/StaticScannerSettings.cs b/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/StaticScannerSettings.cs deleted file mode 100644 index c008d808..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/StaticScannerSettings.cs +++ /dev/null @@ -1,143 +0,0 @@ -using GlobExpressions; -using Microsoft.DevSkim.LanguageProtoInterop; - -namespace DevSkim.LanguageServer -{ - using Microsoft.ApplicationInspector.RulesEngine; - using Microsoft.DevSkim; - using System; - using System.Collections.Generic; - using System.Text.RegularExpressions; - - internal static class StaticScannerSettings - { - internal static SuppressionStyle SuppressionStyle { get; set; } = SuppressionStyle.Line; - internal static ICollection CustomRulePaths { get; set; } = Array.Empty(); - internal static ICollection IgnoreRuleIds { get; set; } = Array.Empty(); - internal static ICollection IgnoreFiles { get; set; } = Array.Empty(); - // Used to populate suppressions - internal static string ReviewerName { get; set; } = string.Empty; - // Suppression duration in days - internal static int SuppressionDuration { get; set; } = 30; - internal static bool IgnoreDefaultRuleSet { get; set; } = false; - internal static bool ScanOnOpen { get; set; } = true; - internal static bool ScanOnSave { get; set; } = true; - internal static bool ScanOnChange { get; set; } = true; - internal static bool RemoveFindingsOnClose { get; set; } = true; - internal static DevSkimRuleSet RuleSet { get; set; } = new DevSkimRuleSet(); - internal static DevSkimRuleProcessorOptions RuleProcessorOptions { get; set; } = CreateDefaultOptions(); - internal static DevSkimRuleProcessor Processor { get; set; } = new DevSkimRuleProcessor(DevSkimRuleSet.GetDefaultRuleSet(), CreateDefaultOptions()); - - private static DevSkimRuleProcessorOptions CreateDefaultOptions() - { - return new DevSkimRuleProcessorOptions - { - // Include all severities by default - SeverityFilter = Severity.Critical | Severity.Important | Severity.Moderate | Severity.BestPractice | Severity.ManualReview, - // Include all confidence levels by default - ConfidenceFilter = Confidence.High | Confidence.Medium | Confidence.Low, - EnableSuppressions = true - }; - } - - public static void UpdateWith(PortableScannerSettings request) - { - SuppressionStyle = ToSuppressionStyle(request.SuppressionCommentStyle); - CustomRulePaths = request.CustomRulesPathsString.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - IgnoreRuleIds = request.IgnoreRulesListString.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - IgnoreFiles = request.IgnoreFilesString - .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) - .Select(x => new Glob(x)).ToArray(); - ReviewerName = request.ManualReviewerName; - SuppressionDuration = request.SuppressionDurationInDays; - IgnoreDefaultRuleSet = request.IgnoreDefaultRules; - ScanOnOpen = request.ScanOnOpen; - ScanOnSave = request.ScanOnSave; - ScanOnChange = request.ScanOnChange; - RemoveFindingsOnClose = request.RemoveFindingsOnClose; - RuleProcessorOptions.SeverityFilter = ParseSeverity(request); - RuleProcessorOptions.ConfidenceFilter = ParseConfidence(request); - try - { - RuleProcessorOptions.Languages = !string.IsNullOrEmpty(request.CustomCommentsPath) && !string.IsNullOrEmpty(request.CustomLanguagesPath) ? DevSkimLanguages.FromFiles(commentsPath: request.CustomCommentsPath, - languagesPath: request.CustomLanguagesPath) : DevSkimLanguages.LoadEmbedded(); - } - catch - { - RuleProcessorOptions.Languages = DevSkimLanguages.LoadEmbedded(); - // TODO: Surface this error - } - - DevSkimRuleSet ruleSet = IgnoreDefaultRuleSet ? new DevSkimRuleSet() : DevSkimRuleSet.GetDefaultRuleSet(); - foreach (string path in CustomRulePaths) - { - try - { - ruleSet.AddPath(path); - } - catch - { - // TODO: Log issue with provided path - } - } - - ruleSet = ruleSet.WithoutIds(IgnoreRuleIds); - RuleSet = ruleSet; - Processor = new DevSkimRuleProcessor(RuleSet, RuleProcessorOptions); - } - - private static SuppressionStyle ToSuppressionStyle(CommentStylesEnum suppressionCommentStyle) - { - return suppressionCommentStyle switch - { - CommentStylesEnum.Line => SuppressionStyle.Line, - CommentStylesEnum.Block => SuppressionStyle.Block, - _ => throw new NotImplementedException() - }; - } - - private static Confidence ParseConfidence(PortableScannerSettings request) - { - Confidence confidence = Confidence.Unspecified; - if (request.EnableHighConfidenceRules) - { - confidence |= Confidence.High; - } - if (request.EnableMediumConfidenceRules) - { - confidence |= Confidence.Medium; - } - if (request.EnableLowConfidenceRules) - { - confidence |= Confidence.Low; - } - return confidence; - } - - private static Severity ParseSeverity(PortableScannerSettings request) - { - Severity severity = Severity.Unspecified; - if (request.EnableCriticalSeverityRules) - { - severity |= Severity.Critical; - } - if (request.EnableImportantSeverityRules) - { - severity |= Severity.Important; - } - if (request.EnableManualReviewSeverityRules) - { - severity |= Severity.ManualReview; - } - if (request.EnableModerateSeverityRules) - { - severity |= Severity.Moderate; - } - if (request.EnableBestPracticeSeverityRules) - { - severity |= Severity.BestPractice; - } - return severity; - } - } -} diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/TextDocumentSyncHandler.cs b/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/TextDocumentSyncHandler.cs deleted file mode 100644 index 50484fd3..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/TextDocumentSyncHandler.cs +++ /dev/null @@ -1,222 +0,0 @@ -using System.Collections.Immutable; -using System.Text; -using MediatR; -using Microsoft.ApplicationInspector.RulesEngine; -using Microsoft.DevSkim; -using Microsoft.DevSkim.LanguageProtoInterop; -using Microsoft.Extensions.Logging; -using OmniSharp.Extensions.LanguageServer.Protocol; -using OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities; -using OmniSharp.Extensions.LanguageServer.Protocol.Document; -using OmniSharp.Extensions.LanguageServer.Protocol.Models; -using OmniSharp.Extensions.LanguageServer.Protocol.Server; -using OmniSharp.Extensions.LanguageServer.Protocol.Server.Capabilities; -using Range = OmniSharp.Extensions.LanguageServer.Protocol.Models.Range; - - -namespace DevSkim.LanguageServer -{ - internal class TextDocumentSyncHandler : TextDocumentSyncHandlerBase - { - private readonly ILogger _logger; - private readonly ILanguageServerFacade _facade; - // Use a broad document selector to handle all common code file types - // The actual language detection happens in GetTextDocumentAttributes - private readonly TextDocumentSelector _documentSelector = TextDocumentSelector.ForPattern("**/*"); - private DevSkimRuleProcessor _processor => StaticScannerSettings.Processor; - - public TextDocumentSyncHandler(ILogger logger, ILanguageServerFacade facade) - { - _facade = facade; - _logger = logger; - } - - public TextDocumentSyncKind Change { get; } = TextDocumentSyncKind.Full; - - private async Task GenerateDiagnosticsForTextDocumentAsync(string text, int? version, DocumentUri uri) - { - if (string.IsNullOrEmpty(text)) - { - _logger.LogDebug("\tNo content found"); - return Unit.Value; - } - - string filename = uri.Path; - if (StaticScannerSettings.IgnoreFiles.Any(x => x.IsMatch(filename))) - { - _logger.LogDebug($"\t{filename} was excluded due to matching IgnoreFiles setting"); - return Unit.Value; - } - // Diagnostics are sent a document at a time - _logger.LogDebug($"\tProcessing document: {filename}"); - _logger.LogDebug($"\tRuleSet has {StaticScannerSettings.RuleSet.Count()} rules"); - _logger.LogDebug($"\tScanOnOpen: {StaticScannerSettings.ScanOnOpen}, ScanOnChange: {StaticScannerSettings.ScanOnChange}"); - List issues = await Task.Run(() => _processor.Analyze(text, filename).ToList()); - ImmutableArray.Builder diagnostics = ImmutableArray.Empty.ToBuilder(); - ImmutableArray.Builder codeFixes = ImmutableArray.Empty.ToBuilder(); - _logger.LogDebug($"\tAdding {issues.Count} issues to diagnostics"); - foreach (Issue issue in issues) - { - if (!issue.IsSuppressionInfo) - { - Diagnostic diag = new Diagnostic() - { - Code = $"{ConfigHelpers.Section}: {issue.Rule.Id}", - Severity = DevSkimSeverityToDiagnositicSeverity(issue.Rule.Severity), - Message = $"{issue.Rule.Description ?? string.Empty}", - // DevSkim/Application Inspector line numbers are one-indexed, but column numbers are zero-indexed - // To get the diagnostic to appear on the correct line, we must subtract 1 from the line number - Range = new Range(issue.StartLocation.Line - 1, issue.StartLocation.Column, issue.EndLocation.Line - 1, issue.EndLocation.Column), - Source = "DevSkim Language Server" - }; - diagnostics.Add(diag); - for (int i = 0; i < issue.Rule.Fixes?.Count; i++) - { - CodeFix fix = issue.Rule.Fixes[i]; - var targetText = text.Substring(issue.Boundary.Index, issue.Boundary.Length); - if (fix.Replacement is not null && DevSkimRuleProcessor.IsFixable(targetText, fix)) - { - string? potentialFix = DevSkimRuleProcessor.Fix(targetText, fix); - if (potentialFix is { }) - { - codeFixes.Add(new CodeFixMapping(diag, potentialFix, uri.ToUri(), $"Replace with {potentialFix}", version, issue.Boundary.Index, issue.Boundary.Index + issue.Boundary.Length, false)); - } - } - } - // Add suppression options - if (StaticScannerSettings.RuleProcessorOptions.EnableSuppressions) - { - // TODO: We should check if there is an existing, expired suppression to update, and if so the replacement range needs to include the old suppression - // TODO: Handle multiple suppressions on one line? - string proposedSuppression = DevSkimRuleProcessor.GenerateSuppressionByFileName(filename, issue.Rule.Id, StaticScannerSettings.SuppressionStyle == SuppressionStyle.Block, 0, StaticScannerSettings.ReviewerName, StaticScannerSettings.RuleProcessorOptions.Languages); - if (!string.IsNullOrEmpty(proposedSuppression)) - { - codeFixes.Add(new CodeFixMapping(diag, $" {proposedSuppression}", uri.ToUri(), $"Suppress {issue.Rule.Id}", version, issue.Boundary.Index, issue.Boundary.Index + issue.Boundary.Length, true)); - - if (StaticScannerSettings.SuppressionDuration > -1) - { - DateTime expiration = DateTime.Now.AddDays(StaticScannerSettings.SuppressionDuration); - string proposedTimedSuppression = DevSkimRuleProcessor.GenerateSuppressionByFileName(filename, issue.Rule.Id, StaticScannerSettings.SuppressionStyle == SuppressionStyle.Block, StaticScannerSettings.SuppressionDuration, StaticScannerSettings.ReviewerName, StaticScannerSettings.RuleProcessorOptions.Languages); - if (!string.IsNullOrEmpty(proposedSuppression)) - { - codeFixes.Add(new CodeFixMapping(diag, $" {proposedTimedSuppression}", uri.ToUri(), $"Suppress {issue.Rule.Id} until {expiration.ToString("yyyy-MM-dd")}", version, issue.Boundary.Index, issue.Boundary.Index + issue.Boundary.Length, true)); - } - } - } - } - } - } - - // Clear previous code fixes for this document and register new ones - CodeActionHandler.ClearCodeFixes(uri); - - // Store line lengths so CodeActionHandler can compute exact end-of-line positions for suppressions - CodeActionHandler.SetLineLengths(uri, text); - - _logger.LogDebug("\tPublishing diagnostics..."); - _facade.TextDocument.PublishDiagnostics(new PublishDiagnosticsParams() - { - Diagnostics = new Container(diagnostics.ToArray()), - Uri = uri, - Version = version - }); - - // Register code fixes with CodeActionHandler for standard LSP textDocument/codeAction - // This works for both VS and VS Code — no custom notifications needed - _logger.LogDebug($"\tRegistering {codeFixes.Count} code fixes..."); - foreach (var mapping in codeFixes) - { - CodeActionHandler.RegisterCodeFix(uri, mapping.diagnostic, mapping); - } - - return Unit.Value; - } - - private static DiagnosticSeverity DevSkimSeverityToDiagnositicSeverity(Severity ruleSeverity) - { - return ruleSeverity switch - { - Severity.Unspecified => DiagnosticSeverity.Hint, - Severity.Critical => DiagnosticSeverity.Error, - Severity.Important => DiagnosticSeverity.Error, - Severity.Moderate => DiagnosticSeverity.Warning, - Severity.BestPractice => DiagnosticSeverity.Hint, - Severity.ManualReview => DiagnosticSeverity.Hint, - _ => DiagnosticSeverity.Information - }; - } - - public override async Task Handle(DidChangeTextDocumentParams request, CancellationToken cancellationToken) - { - _logger.LogDebug("TextDocumentSyncHandler.cs: DidChangeTextDocumentParams"); - if (StaticScannerSettings.ScanOnChange) - { - TextDocumentContentChangeEvent? content = request.ContentChanges.FirstOrDefault(); - if (content is null) - { - _logger.LogDebug("\tNo content found"); - return Unit.Value; - } - return await GenerateDiagnosticsForTextDocumentAsync(content.Text, request.TextDocument.Version, request.TextDocument.Uri); - } - return Unit.Value; - } - - public override async Task Handle(DidOpenTextDocumentParams request, CancellationToken cancellationToken) - { - _logger.LogDebug("TextDocumentSyncHandler.cs: DidOpenTextDocumentParams"); - if (StaticScannerSettings.ScanOnOpen) - { - TextDocumentItem content = request.TextDocument; - return await GenerateDiagnosticsForTextDocumentAsync(content.Text, content.Version, request.TextDocument.Uri); - } - return Unit.Value; - } - - public override Task Handle(DidCloseTextDocumentParams request, CancellationToken cancellationToken) - { - _logger.LogDebug("TextDocumentSyncHandler.cs: DidCloseTextDocumentParams"); - if (StaticScannerSettings.RemoveFindingsOnClose) - { - _facade.TextDocument.PublishDiagnostics(new PublishDiagnosticsParams() - { - Diagnostics = new Container(), - Uri = request.TextDocument.Uri, - Version = null - }); - } - return Unit.Task; - } - - public override async Task Handle(DidSaveTextDocumentParams request, CancellationToken cancellationToken) - { - _logger.LogDebug("TextDocumentSyncHandler.cs: DidSaveTextDocumentParams"); - if (StaticScannerSettings.ScanOnSave) - { - if (request.Text is null) - { - _logger.LogDebug("\tNo content found"); - return Unit.Value; - } - return await GenerateDiagnosticsForTextDocumentAsync(request.Text, null, request.TextDocument.Uri); - } - return Unit.Value; - } - - public override TextDocumentAttributes GetTextDocumentAttributes(DocumentUri uri) - { - if (StaticScannerSettings.RuleProcessorOptions.Languages.FromFileNameOut(uri.GetFileSystemPath(), out LanguageInfo Info)) - { - return new TextDocumentAttributes(uri, Info.Name); - } - return new TextDocumentAttributes(uri, "unknown"); - } - - protected override TextDocumentSyncRegistrationOptions CreateRegistrationOptions(TextSynchronizationCapability capability, ClientCapabilities clientCapabilities) => new TextDocumentSyncRegistrationOptions() - { - DocumentSelector = _documentSelector, - Change = Change, - Save = new SaveOptions() { IncludeText = true } - }; - } -} \ No newline at end of file diff --git a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/VisualStudioConfigurationHandler.cs b/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/VisualStudioConfigurationHandler.cs deleted file mode 100644 index 955d3f2b..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.LanguageServer/VisualStudioConfigurationHandler.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using MediatR; -using Microsoft.DevSkim.LanguageProtoInterop; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using OmniSharp.Extensions.JsonRpc; - -namespace DevSkim.LanguageServer -{ - [Method(DevSkimMessages.SetServerSettings, Direction.ClientToServer)] - public record DevSkimSetLanguageServerSettingsParams : IRequest - { - public JToken? ScannerSettings; - } - - /// - /// Provides settings from the client to the server - /// - public class VisualStudioConfigurationHandler : IJsonRpcRequestHandler - { - public VisualStudioConfigurationHandler() - { - } - - Task IRequestHandler.Handle(DevSkimSetLanguageServerSettingsParams request, CancellationToken cancellationToken) - { - PortableScannerSettings? settings = request.ScannerSettings?.ToObject(); - if (settings is { } deNulledSettings) - { - StaticScannerSettings.UpdateWith(deNulledSettings); - } - return Unit.Task; - } - } -} \ No newline at end of file diff --git a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/.vsextension/string-resources.json b/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/.vsextension/string-resources.json deleted file mode 100644 index 8ac5db47..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/.vsextension/string-resources.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "DevSkim.LanguageServerProvider.DisplayName": "DevSkim Security Analyzer", - - "devskim.DisplayName": "DevSkim", - "devskim.Description": "DevSkim security analyzer settings.", - - "devskim.rules.DisplayName": "Rules", - "devskim.rules.Description": "Settings for controlling which DevSkim rules are enabled and custom rule paths.", - - "devskim.suppressions.DisplayName": "Suppressions", - "devskim.suppressions.Description": "Settings for controlling how DevSkim suppressions are created and managed.", - - "devskim.triggers.DisplayName": "Triggers", - "devskim.triggers.Description": "Settings for controlling when DevSkim scans are triggered.", - - "devskim.ignores.DisplayName": "Ignores", - "devskim.ignores.Description": "Settings for ignoring specific rules or files.", - - "devskim.rules.enableCriticalSeverityRules.DisplayName": "Enable Critical Severity Rules", - "devskim.rules.enableCriticalSeverityRules.Description": "Enable rules with critical severity.", - - "devskim.rules.enableImportantSeverityRules.DisplayName": "Enable Important Severity Rules", - "devskim.rules.enableImportantSeverityRules.Description": "Enable rules with important severity.", - - "devskim.rules.enableModerateSeverityRules.DisplayName": "Enable Moderate Severity Rules", - "devskim.rules.enableModerateSeverityRules.Description": "Enable rules with moderate severity.", - - "devskim.rules.enableManualReviewSeverityRules.DisplayName": "Enable Manual Review Severity Rules", - "devskim.rules.enableManualReviewSeverityRules.Description": "Enable rules that require manual review.", - - "devskim.rules.enableBestPracticeSeverityRules.DisplayName": "Enable Best Practice Severity Rules", - "devskim.rules.enableBestPracticeSeverityRules.Description": "Enable rules for best practice recommendations.", - - "devskim.rules.enableHighConfidenceRules.DisplayName": "Enable High Confidence Rules", - "devskim.rules.enableHighConfidenceRules.Description": "Enable rules with high confidence findings.", - - "devskim.rules.enableMediumConfidenceRules.DisplayName": "Enable Medium Confidence Rules", - "devskim.rules.enableMediumConfidenceRules.Description": "Enable rules with medium confidence findings.", - - "devskim.rules.enableLowConfidenceRules.DisplayName": "Enable Low Confidence Rules", - "devskim.rules.enableLowConfidenceRules.Description": "Enable rules with low confidence findings.", - - "devskim.rules.ignoreDefaultRules.DisplayName": "Ignore Default Rules", - "devskim.rules.ignoreDefaultRules.Description": "When enabled, the built-in default rules are not loaded. Only custom rules will be used.", - - "devskim.rules.customRulesPaths.DisplayName": "Custom Rules Paths", - "devskim.rules.customRulesPaths.Description": "Semicolon-separated list of paths to directories containing custom DevSkim rules.", - - "devskim.rules.customLanguagesPath.DisplayName": "Custom Languages Path", - "devskim.rules.customLanguagesPath.Description": "Path to a custom language definitions file.", - - "devskim.rules.customCommentsPath.DisplayName": "Custom Comments Path", - "devskim.rules.customCommentsPath.Description": "Path to a custom comment definitions file.", - - "devskim.rules.guidanceBaseURL.DisplayName": "Guidance Base URL", - "devskim.rules.guidanceBaseURL.Description": "Base URL for rule guidance documentation.", - - "devskim.suppressions.suppressionCommentStyle.DisplayName": "Suppression Comment Style", - "devskim.suppressions.suppressionCommentStyle.Description": "Comment style used for suppression comments. Valid values: Line, Block.", - - "devskim.suppressions.manualReviewerName.DisplayName": "Manual Reviewer Name", - "devskim.suppressions.manualReviewerName.Description": "Name used to populate the reviewer field in suppression comments.", - - "devskim.suppressions.suppressionDurationInDays.DisplayName": "Suppression Duration (Days)", - "devskim.suppressions.suppressionDurationInDays.Description": "Default number of days before a suppression expires.", - - "devskim.triggers.scanOnOpen.DisplayName": "Scan on Open", - "devskim.triggers.scanOnOpen.Description": "Run DevSkim analysis when a file is opened.", - - "devskim.triggers.scanOnSave.DisplayName": "Scan on Save", - "devskim.triggers.scanOnSave.Description": "Run DevSkim analysis when a file is saved.", - - "devskim.triggers.scanOnChange.DisplayName": "Scan on Change", - "devskim.triggers.scanOnChange.Description": "Run DevSkim analysis when a file is modified.", - - "devskim.triggers.removeFindingsOnClose.DisplayName": "Remove Findings on Close", - "devskim.triggers.removeFindingsOnClose.Description": "Remove DevSkim findings when a file is closed.", - - "devskim.ignores.ignoreRulesList.DisplayName": "Ignore Rules List", - "devskim.ignores.ignoreRulesList.Description": "Comma-separated list of DevSkim rule IDs to ignore.", - - "devskim.ignores.ignoreFiles.DisplayName": "Ignore Files", - "devskim.ignores.ignoreFiles.Description": "Comma-separated list of file glob patterns to exclude from scanning.", - - "devskim.diagnostics.DisplayName": "Diagnostics", - "devskim.diagnostics.Description": "Settings for DevSkim extension diagnostics and logging.", - - "devskim.diagnostics.enableFileLogging.DisplayName": "Enable File Logging", - "devskim.diagnostics.enableFileLogging.Description": "Write extension logs to a file in the temp directory (devskim-vs-extension.log). Useful for troubleshooting." -} diff --git a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/License.txt b/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/License.txt deleted file mode 100644 index 8cb179cd..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/License.txt +++ /dev/null @@ -1,21 +0,0 @@ -Copyright (c) Microsoft Corporation. All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/devskim-icon-200.png b/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/devskim-icon-200.png deleted file mode 100644 index f3fa97538110d62276bdcef88c6709b224e38bcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1684 zcmdT^`#aMM82_$iXJIp!kjQ8u3a7+e(q_XZ6LU*RZDq?PgofO0E*l;!Iwk3H>ZB<` zWoQy*JJSVAh=>pgxilnm^y7J+^ADW&`COjQZ}0QI&+}osyE((;wd4T+fDs9J^16$D z5ei<{;*5ZM003eJ;c)Im91a-~8BPld4FmwAg2aOTgcgkUi{lcG{$^#9ESpnhZVV4) zA^C;=VWTtYK02A}9OLk4GZDovixuarj<2vm6OcO5xX|ch(cwYX{|bQ|-{x z!iM;~hM1K0GV?A)JjlBy$IH%u7FAANG})lJ!JGqPUp}udxRm;NsXjBWGDf*{G;#V( z$DI)pWC=fPB!OkeGGiH%PU{)f%)>--)*H4VtR6YLy*u!aL9~XBdMr&Ox;4heJ*QSN zN8z*`xE-Z>a1)->vctQ;^m%pqBl5}n@pBrG`S&ixlNLgRP(_8{z{=4Qmo+)Cd~(%P zcfQYyTXNP;=KAlc6Q3A4jM;3A5-Q1ld)ly1LE;%kHitwDdZa>hyFkHW^6_e7Xx}T< zrZq+XpfkyjKra)y0pTG-+pi~Y<@3Wr=C(!DffWx-aP_RY*Zy)h0%qt7Bp6Qu;-1>ShFJ>`XDxJCPlYD?)A9>TZV9kF0D-YdWy&Tv5e>dcK zkH_mvgQCf9o&aX7hxRK_4?5$4EIA#*de{^}@QVTf1=U{!0mUVn0090##ACf;-%pkF zg^ij+9f#JE&pYvG#XYT%1m@`(VW}n6dMtPmfkkZmPuxZ%Glwf1n?Z<_dlqY|rpuaLZK& zB`8TCNK|BhOZ=!M2+s-J(+X1y<3N!2k2oc?I&uSSZzsFGP2z=by8{eS;`#=!*GexY zevV2&c+Uv6Q&~kQ2E0+b#$_v>-?4YeKI4bnbKtIRBR!|{*+IdIhe{BZIDY=hQ_|GH zDr)@(JrkZ*0|c|5bN-=xL^8}?Jb~Rcw9}OEyK;3(zZ?5iY2HcZ0xX2pdv>frj%-+! zG~4l-qlXa(rR9GZ`C$wfH7I^fIc-N#5{>&sKA5WYrej;*1j`-enndq~n&mjFw=ed3 zb>CG=9pBa!Ffz8~&W=>Gjc0d>AB1(%v#%hf7Kx%hP-oxKv)EP`udTlY$%Ay&PG5N< zn2(D@;FwzStbKKnrm2!RL%;9yla#h%bN|T-h({~x!m$R7BK=$m0)IeinYZ^)#_l$~ zCO%dGX%4l1tx1ZBwY1@5FOg80Sg$%4=8Yq2!hn(mhQ4j)@Qe877DebXI^%wsUg0jF zO6OoKw&XJXv5InzCH%#*O;%)B5a36?dKvrVLiniQ)Bf2Q#hcd*#Yow5%N|5qLap8W zVI>Ed#!W4p61L|dRV!adl_%8=hF=#@LL_CRqQrM`D_`pB_vKcAdaYMVkiGFml;O9m zToe&|@$FN()aL{uU{kXd*7Z=ewD4s9IZyx3cdr*}l4fHV(xAaFf**t4E@n1MG0~Y< zotzY^ht%2S9Yre@+1-?$>`vLw0g?&LkTaIi*)f?Fz@2@>muTRxqIg&KKe^dCfT5a# z`?`Z42g!;~^U}B1F8ZWJ6UI}%qTZ!2yh1SJ_99KOU2X2XZaW+ypLv6%NCx3mXf3WpPE{{U%$shj`+ diff --git a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/devskim-icon-32.png b/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/devskim-icon-32.png deleted file mode 100644 index 1708b45828a1398b9cef5c901b9babbb06602ad0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy;Q>A&u0Wa=fN%QbT%fr!B|(0{ z3}?ziX9>Q$*Rf}nOPZ4Lw_7#g4pQfO^Rg1n)dSOap8~4;;pyTSVsZLz|INH33OufR z6R)Lgd$;%h|GBLy%3GZ-fB(jzc<|w^8UL)gBY(SgFMagdId{_HBOb=`U!PX}p7LUz zYfGBR+&6!F*Ur$LRXjt^#`bw}uFl4FTnCwT;iY(&vPIjPRPy_|JD{ zf7|r%y=u-&tS$-uR^K*vW55KrH%p>-dAF4*OB!CZVCh%hD)X|Hr}x)09u=<%`@Xe* z-*Ur=S9OAyLgUWM94F?LEp^;=e$|T;J3OMRIJX2cruj_`Q>Yg2@=@At>&3I}*s2e2 z+wD0+qumsbd7W(aS}f^$ubpqRc3iX3lMI_=2?^U{GrBL$f5z?mgik2&!~c7rIPi4! Kb6Mw<&;$T70-YrQ diff --git a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/devskim.ico b/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/devskim.ico deleted file mode 100644 index 61fed4a0eab256b33bfa3d698cb684d4922b05eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7406 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. For example, when DevSkim turns gets() into fgets() it adds \ to inform a user that they need to provide the size of the buffer. - -![](https://raw.githubusercontent.com/microsoft/DevSkim/9c5a19ab8ff8a182c34ca100112d7c2803e0f180/media/DevSkim-VisualStudio-Demo-1.gif) - -### Suppressions - -DevSkim has built-in ability to suppress any of its warnings, either permanently, or for a period of time. Permanent suppressions are for scenarios where, for whatever reason, the flagged code should not be changed. Timed suppressions are for scenarios where the code should change, but the developer does not want to change it immediately. In both cases, DevSkim will insert a comment after the code to notify it (and anyone reviewing the code) that the usage should be ignored, and in the case of timed suppressions, when DevSkim should alert again. Users can add additional comments after the suppression to describe why the issue is being suppressed. - -For timed suppressions, the default period is 30 days, but this can be adjusted in the settings file. - -Suppressions can be accessed from the lightbulb menu. Once a suppression is added, DevSkim will highlight the issue number that identifies the check being suppressed (the gets() example above is issue number DS181021 for example), and mousing over will provide details. This will let other contributors to a project know what was suppressed, and reduce confusion about the comment. - -![](https://raw.githubusercontent.com/microsoft/DevSkim/9c5a19ab8ff8a182c34ca100112d7c2803e0f180/media/DevSkim-VisualStudio-Suppression-Example.png) - -## Rules - -DevSkim takes an approach that is programming language agnostic. It primarily finds issues via regular expression, so rules can be written for just about any programming language. Out of the box, DevSkim can find dangerous crypto usage in most programming languages, and also includes rules for a range of language specific issues. The built-in ruleset is growing regularly, and it is very easy for users to write their own rules. For more information, see [Writing Rules](https://github.com/Microsoft/DevSkim/wiki/Writing-Rules). - -## Thank You - -Thanks for trying DevSkim! If you find issues, please [report them on GitHub](https://github.com/Microsoft/DevSkim) and feel free to contribute! diff --git a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/DevSkimExtension.cs b/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/DevSkimExtension.cs deleted file mode 100644 index e3fa50e4..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/DevSkimExtension.cs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -namespace Microsoft.DevSkim.VisualStudio; - -using global::Microsoft.Extensions.DependencyInjection; -using global::Microsoft.VisualStudio.Extensibility; - -/// -/// Extension entry point for the DevSkim Visual Studio extension. -/// -[VisualStudioContribution] -internal class DevSkimExtension : Extension -{ - /// - public override ExtensionConfiguration ExtensionConfiguration => new() - { - Metadata = new( - id: "Microsoft.DevSkim.VisualStudio.f3a2c5e8-7d9b-4a1c-8e6f-2b3d4c5e6f7a", - version: new Version(ThisAssembly.AssemblyFileVersion), - publisherName: "Microsoft DevLabs", - displayName: "Microsoft DevSkim", - description: "DevSkim is a highly configurable security linter with a default ruleset focused on common security related issues.") - { - MoreInfo = "https://github.com/Microsoft/DevSkim", - Tags = ["linter", "linters", "coding", "security", "static analysis"], - }, - }; - - /// - protected override void InitializeServices(IServiceCollection serviceCollection) - { - base.InitializeServices(serviceCollection); - } -} diff --git a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/DevSkimLanguageServerProvider.cs b/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/DevSkimLanguageServerProvider.cs deleted file mode 100644 index f59eaeba..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/DevSkimLanguageServerProvider.cs +++ /dev/null @@ -1,488 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -namespace Microsoft.DevSkim.VisualStudio; - -using System.Diagnostics; -using System.IO.Pipelines; -using System.Reflection; -using System.Runtime.InteropServices; -using global::Microsoft.DevSkim.LanguageProtoInterop; -using global::Microsoft.VisualStudio.Extensibility; -using global::Microsoft.VisualStudio.Extensibility.Editor; -using global::Microsoft.VisualStudio.Extensibility.LanguageServer; -using global::Microsoft.VisualStudio.Extensibility.Settings; -using global::Microsoft.VisualStudio.RpcContracts.LanguageServerProvider; -using Microsoft.Win32.SafeHandles; -using Nerdbank.Streams; -using Newtonsoft.Json.Linq; -using Serilog; -using Serilog.Core; - -/// -/// DevSkim Language Server Provider. -/// Activates the DevSkim language server for security analysis when supported files are opened. -/// -#pragma warning disable VSEXTPREVIEW_LSP // Type is for evaluation purposes only and is subject to change or removal in future updates. -#pragma warning disable VSEXTPREVIEW_SETTINGS -[VisualStudioContribution] -internal class DevSkimLanguageServerProvider : LanguageServerProvider -{ - private static readonly string LogFilePath = Path.Combine(Path.GetTempPath(), "devskim-vs-extension.log"); - - private Process? _serverProcess; - private SafeHandle? _jobHandle; - private readonly List _settingsSubscriptions = []; - private bool _initialPushDone; - private bool _settingsSubscribed; - private CancellationTokenSource? _restartDebounce; - private readonly CancellationTokenSource _disposeCts = new(); - - /// - public override LanguageServerProviderConfiguration LanguageServerProviderConfiguration => new( - "%DevSkim.LanguageServerProvider.DisplayName%", - [ - DocumentFilter.FromDocumentType("text"), - ]); - - /// - public override async Task CreateServerConnectionAsync(CancellationToken cancellationToken) - { - // Configure logging on each server start (file logging may have changed) - ConfigureLogging(await ReadFileLoggingSettingAsync(cancellationToken)); - - Log.Debug("CreateServerConnectionAsync called"); - - // Kill any leftover process from a previous activation - StopServerProcess(); - - var serverPath = GetLanguageServerPath(); - Log.Debug("Server path: {ServerPath}", serverPath); - - if (string.IsNullOrEmpty(serverPath) || !File.Exists(serverPath)) - { - Log.Error("Language server not found at: {ServerPath}", serverPath); - return null; - } - - // Read current settings and pass them as LSP initializationOptions - // so the server applies them during the initialize handshake. - // IMPORTANT: Modify the existing LanguageServerOptions instance instead of replacing it. - // The framework caches the reference returned from InitializeAsync, so a new object - // would be invisible to the framework. - var currentSettings = await ReadAllSettingsAsync(cancellationToken); - LanguageServerOptions.InitializationOptions = JToken.FromObject(currentSettings); - Log.Debug("InitializationOptions set: IgnoreDefaultRules={IgnoreDefaultRules}", currentSettings.IgnoreDefaultRules); - - // Create a Windows Job Object so the server process is killed when the host process exits - EnsureJobObject(); - - var startInfo = new ProcessStartInfo - { - FileName = serverPath, - RedirectStandardInput = true, - RedirectStandardOutput = true, - RedirectStandardError = true, - UseShellExecute = false, - CreateNoWindow = true, - WorkingDirectory = Path.GetDirectoryName(serverPath), - }; - - var process = new Process { StartInfo = startInfo }; - - process.ErrorDataReceived += (sender, e) => - { - if (!string.IsNullOrEmpty(e.Data)) - { - Log.Debug("Server stderr: {Data}", e.Data); - } - }; - - if (process.Start()) - { - _serverProcess = process; - AssignProcessToJobObject(process); - process.BeginErrorReadLine(); - Log.Information("Language server started (PID: {ProcessId})", process.Id); - - return new DuplexPipe( - PipeReader.Create(process.StandardOutput.BaseStream), - PipeWriter.Create(process.StandardInput.BaseStream)); - } - - Log.Error("Failed to start language server process"); - return null; - } - - /// - public override async Task OnServerInitializationResultAsync( - ServerInitializationResult serverInitializationResult, - LanguageServerInitializationFailureInfo? initializationFailureInfo, - CancellationToken cancellationToken) - { - if (serverInitializationResult == ServerInitializationResult.Failed) - { - Log.Error("Language server initialization failed: {Message}", initializationFailureInfo?.StatusMessage); - Enabled = false; - } - else - { - Log.Information("Language server initialized successfully"); - if (!_settingsSubscribed) - { - _settingsSubscribed = true; - _ = SubscribeToSettingsChangesAsync(); - } - } - - await base.OnServerInitializationResultAsync(serverInitializationResult, initializationFailureInfo, cancellationToken); - } - - /// - protected override void Dispose(bool isDisposing) - { - if (isDisposing) - { - // Cancel pending subscription operations first - _disposeCts.Cancel(); - _disposeCts.Dispose(); - - foreach (var sub in _settingsSubscriptions) - { - sub.Dispose(); - } - _settingsSubscriptions.Clear(); - _restartDebounce?.Cancel(); - _restartDebounce?.Dispose(); - StopServerProcess(); - _jobHandle?.Dispose(); - _jobHandle = null; - } - - base.Dispose(isDisposing); - } - - #region Logging - - private static void ConfigureLogging(bool enableFileLogging) - { - var config = new LoggerConfiguration() - .Enrich.FromLogContext() - .WriteTo.Debug(outputTemplate: "[DevSkim] {Message:lj}{NewLine}{Exception}"); - -#if DEBUG - // Always log to file in debug builds - config = config - .WriteTo.File(LogFilePath, rollingInterval: RollingInterval.Day) - .MinimumLevel.Verbose(); -#else - if (enableFileLogging) - { - config = config.WriteTo.File(LogFilePath, rollingInterval: RollingInterval.Day); - } - - config = config.MinimumLevel.Debug(); -#endif - - Log.Logger = config.CreateLogger(); - } - - private async Task ReadFileLoggingSettingAsync(CancellationToken cancellationToken) - { - try - { - return (await Extensibility.Settings() - .ReadEffectiveValueAsync(DevSkimSettingDefinitions.EnableFileLogging, cancellationToken)) - .ValueOrDefault(false); - } - catch - { - return false; - } - } - - #endregion - - #region Settings - - /// - /// Subscribes to all settings changes. On change, restarts the server so it picks up - /// new settings via initializationOptions during the LSP handshake. - /// Called only once; subscriptions survive server restarts. - /// - private async Task SubscribeToSettingsChangesAsync() - { - var subscriptions = await Task.WhenAll( - CreateSubscriptionAsync(DevSkimSettingDefinitions.EnableCriticalSeverityRules), - CreateSubscriptionAsync(DevSkimSettingDefinitions.EnableImportantSeverityRules), - CreateSubscriptionAsync(DevSkimSettingDefinitions.EnableModerateSeverityRules), - CreateSubscriptionAsync(DevSkimSettingDefinitions.EnableManualReviewSeverityRules), - CreateSubscriptionAsync(DevSkimSettingDefinitions.EnableBestPracticeSeverityRules), - CreateSubscriptionAsync(DevSkimSettingDefinitions.EnableHighConfidenceRules), - CreateSubscriptionAsync(DevSkimSettingDefinitions.EnableMediumConfidenceRules), - CreateSubscriptionAsync(DevSkimSettingDefinitions.EnableLowConfidenceRules), - CreateSubscriptionAsync(DevSkimSettingDefinitions.IgnoreDefaultRules), - CreateSubscriptionAsync(DevSkimSettingDefinitions.ScanOnOpen), - CreateSubscriptionAsync(DevSkimSettingDefinitions.ScanOnSave), - CreateSubscriptionAsync(DevSkimSettingDefinitions.ScanOnChange), - CreateSubscriptionAsync(DevSkimSettingDefinitions.RemoveFindingsOnClose), - CreateSubscriptionAsync(DevSkimSettingDefinitions.CustomRulesPaths), - CreateSubscriptionAsync(DevSkimSettingDefinitions.CustomLanguagesPath), - CreateSubscriptionAsync(DevSkimSettingDefinitions.CustomCommentsPath), - CreateSubscriptionAsync(DevSkimSettingDefinitions.GuidanceBaseURL), - CreateSubscriptionAsync(DevSkimSettingDefinitions.SuppressionCommentStyle), - CreateSubscriptionAsync(DevSkimSettingDefinitions.ManualReviewerName), - CreateSubscriptionAsync(DevSkimSettingDefinitions.IgnoreRulesList), - CreateSubscriptionAsync(DevSkimSettingDefinitions.IgnoreFiles), - CreateSubscriptionAsync(DevSkimSettingDefinitions.SuppressionDurationInDays)); - - _settingsSubscriptions.AddRange(subscriptions); - - // All initial callbacks from SubscribeAsync have now been processed (and skipped - // because _initialPushDone was still false). Enable change handling going forward. - _initialPushDone = true; - Log.Debug("Settings subscriptions active, changes will now trigger server restart"); - } - - private async Task CreateSubscriptionAsync(Setting.Boolean setting) - { - return await Extensibility.Settings().SubscribeAsync( - setting, - _disposeCts.Token, - changeHandler: _ => OnSettingChanged()); - } - - private async Task CreateSubscriptionAsync(Setting.String setting) - { - return await Extensibility.Settings().SubscribeAsync( - setting, - _disposeCts.Token, - changeHandler: _ => OnSettingChanged()); - } - - private async Task CreateSubscriptionAsync(Setting.Integer setting) - { - return await Extensibility.Settings().SubscribeAsync( - setting, - _disposeCts.Token, - changeHandler: _ => OnSettingChanged()); - } - - private void OnSettingChanged() - { - if (!_initialPushDone) - { - return; - } - - // Debounce: cancel any pending restart and start a new timer. - // This way rapid changes (e.g. toggling multiple settings) cause only one restart. - var cts = new CancellationTokenSource(); - var oldCts = Interlocked.Exchange(ref _restartDebounce, cts); - oldCts?.Cancel(); - oldCts?.Dispose(); - var token = cts.Token; - - _ = Task.Run(async () => - { - try - { - await Task.Delay(2000, token); - Log.Information("Settings changed, restarting server"); - Enabled = false; - await Task.Delay(500, CancellationToken.None); - Enabled = true; - } - catch (OperationCanceledException) - { - // Debounced — a newer change superseded this one - } - }); - } - - /// - /// Reads all DevSkim settings from VS and maps them to a . - /// - private async Task ReadAllSettingsAsync(CancellationToken cancellationToken) - { - var api = Extensibility.Settings(); - - var suppressionStyle = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.SuppressionCommentStyle, cancellationToken)) - .ValueOrDefault("Line"); - var parsedStyle = Enum.TryParse(suppressionStyle, ignoreCase: true, out var style) - ? style - : CommentStylesEnum.Line; - - return new PortableScannerSettings - { - EnableCriticalSeverityRules = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.EnableCriticalSeverityRules, cancellationToken)).ValueOrDefault(true), - EnableImportantSeverityRules = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.EnableImportantSeverityRules, cancellationToken)).ValueOrDefault(true), - EnableModerateSeverityRules = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.EnableModerateSeverityRules, cancellationToken)).ValueOrDefault(true), - EnableManualReviewSeverityRules = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.EnableManualReviewSeverityRules, cancellationToken)).ValueOrDefault(true), - EnableBestPracticeSeverityRules = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.EnableBestPracticeSeverityRules, cancellationToken)).ValueOrDefault(true), - EnableHighConfidenceRules = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.EnableHighConfidenceRules, cancellationToken)).ValueOrDefault(true), - EnableMediumConfidenceRules = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.EnableMediumConfidenceRules, cancellationToken)).ValueOrDefault(true), - EnableLowConfidenceRules = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.EnableLowConfidenceRules, cancellationToken)).ValueOrDefault(false), - IgnoreDefaultRules = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.IgnoreDefaultRules, cancellationToken)).ValueOrDefault(false), - ScanOnOpen = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.ScanOnOpen, cancellationToken)).ValueOrDefault(true), - ScanOnSave = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.ScanOnSave, cancellationToken)).ValueOrDefault(true), - ScanOnChange = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.ScanOnChange, cancellationToken)).ValueOrDefault(true), - RemoveFindingsOnClose = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.RemoveFindingsOnClose, cancellationToken)).ValueOrDefault(true), - CustomRulesPathsString = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.CustomRulesPaths, cancellationToken)).ValueOrDefault(""), - CustomLanguagesPath = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.CustomLanguagesPath, cancellationToken)).ValueOrDefault(""), - CustomCommentsPath = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.CustomCommentsPath, cancellationToken)).ValueOrDefault(""), - GuidanceBaseURL = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.GuidanceBaseURL, cancellationToken)).ValueOrDefault("https://github.com/microsoft/devskim/tree/main/guidance"), - SuppressionCommentStyle = parsedStyle, - ManualReviewerName = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.ManualReviewerName, cancellationToken)).ValueOrDefault(""), - SuppressionDurationInDays = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.SuppressionDurationInDays, cancellationToken)).ValueOrDefault(30), - IgnoreRulesListString = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.IgnoreRulesList, cancellationToken)).ValueOrDefault(""), - IgnoreFilesString = (await api.ReadEffectiveValueAsync(DevSkimSettingDefinitions.IgnoreFiles, cancellationToken)).ValueOrDefault(""), - }; - } - - #endregion - - #region Process Management - - private void StopServerProcess() - { - try - { - if (_serverProcess is { HasExited: false }) - { - _serverProcess.Kill(); - _serverProcess.Dispose(); - } - } - catch - { - // Best effort cleanup - } - finally - { - _serverProcess = null; - } - } - - private void EnsureJobObject() - { - if (_jobHandle != null) - { - return; - } - - try - { - string jobName = "DevSkimLanguageServer" + Environment.ProcessId; - _jobHandle = NativeMethods.CreateJobObject(IntPtr.Zero, jobName); - - var extendedInfo = new NativeMethods.JOBOBJECT_EXTENDED_LIMIT_INFORMATION - { - BasicLimitInformation = new NativeMethods.JOBOBJECT_BASIC_LIMIT_INFORMATION - { - LimitFlags = 0x2000 /* JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE */ - } - }; - - int length = Marshal.SizeOf(extendedInfo); - IntPtr pExtendedInfo = Marshal.AllocHGlobal(length); - try - { - Marshal.StructureToPtr(extendedInfo, pExtendedInfo, false); - NativeMethods.SetInformationJobObject(_jobHandle, 9 /* JobObjectExtendedLimitInformation */, pExtendedInfo, (uint)length); - } - finally - { - Marshal.FreeHGlobal(pExtendedInfo); - } - } - catch - { - // Non-fatal: process cleanup will fall back to Dispose/Kill - } - } - - private void AssignProcessToJobObject(Process process) - { - try - { - if (_jobHandle != null && !_jobHandle.IsInvalid) - { - NativeMethods.AssignProcessToJobObject(_jobHandle, process.Handle); - } - } - catch - { - // Non-fatal - } - } - - private static string GetLanguageServerPath() - { - var extensionDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - if (string.IsNullOrEmpty(extensionDirectory)) - { - return string.Empty; - } - - return Path.Combine(extensionDirectory, "Server", "Microsoft.DevSkim.LanguageServer.exe"); - } - - /// - /// Native Windows API declarations for Job Object functionality. - /// Job Objects are required to ensure the language server child process is automatically - /// terminated when Visual Studio exits (even if killed unexpectedly). There is no managed - /// .NET equivalent for this Windows kernel feature, so P/Invoke is necessary. - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Interoperability", "SYSLIB1054:Use 'LibraryImportAttribute' instead of 'DllImportAttribute'", Justification = "DllImport is simpler for these few calls and works correctly")] - private static class NativeMethods - { - [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] - internal static extern SafeWaitHandle CreateJobObject(IntPtr lpJobAttributes, string? lpName); - - [DllImport("kernel32.dll")] - internal static extern bool SetInformationJobObject(SafeHandle hJob, int jobObjectInfoClass, IntPtr lpJobObjectInfo, uint cbJobObjectInfoLength); - - [DllImport("kernel32.dll")] - internal static extern bool AssignProcessToJobObject(SafeHandle hJob, IntPtr hProcess); - - [StructLayout(LayoutKind.Sequential)] - public struct JOBOBJECT_BASIC_LIMIT_INFORMATION - { - public long PerProcessUserTimeLimit; - public long PerJobUserTimeLimit; - public uint LimitFlags; - public UIntPtr MinimumWorkingSetSize; - public UIntPtr MaximumWorkingSetSize; - public uint ActiveProcessLimit; - public UIntPtr Affinity; - public uint PriorityClass; - public uint SchedulingClass; - } - - [StructLayout(LayoutKind.Sequential)] - public struct IO_COUNTERS - { - public ulong ReadOperationCount; - public ulong WriteOperationCount; - public ulong OtherOperationCount; - public ulong ReadTransferCount; - public ulong WriteTransferCount; - public ulong OtherTransferCount; - } - - [StructLayout(LayoutKind.Sequential)] - public struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION - { - public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; - public IO_COUNTERS IoInfo; - public UIntPtr ProcessMemoryLimit; - public UIntPtr JobMemoryLimit; - public UIntPtr PeakProcessMemoryUsed; - public UIntPtr PeakJobMemoryUsed; - } - } - - #endregion -} -#pragma warning restore VSEXTPREVIEW_LSP diff --git a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/DevSkimSettingDefinitions.cs b/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/DevSkimSettingDefinitions.cs deleted file mode 100644 index 934042c5..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/DevSkimSettingDefinitions.cs +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -namespace Microsoft.DevSkim.VisualStudio; - -using Microsoft.VisualStudio.Extensibility; -using Microsoft.VisualStudio.Extensibility.Settings; - -#pragma warning disable VSEXTPREVIEW_SETTINGS - -/// -/// Defines the settings for the DevSkim Visual Studio extension using the VS Extensibility SDK settings API. -/// Settings mirror properties. -/// -internal static class DevSkimSettingDefinitions -{ - #region Categories - - [VisualStudioContribution] - internal static SettingCategory DevSkimCategory { get; } = new("devskim", "%devskim.DisplayName%") - { - Description = "%devskim.Description%", - GenerateObserverClass = true, - }; - - [VisualStudioContribution] - internal static SettingCategory RulesCategory { get; } = new("devskimRules", "%devskim.rules.DisplayName%", DevSkimCategory) - { - Description = "%devskim.rules.Description%", - }; - - [VisualStudioContribution] - internal static SettingCategory SuppressionsCategory { get; } = new("devskimSuppressions", "%devskim.suppressions.DisplayName%", DevSkimCategory) - { - Description = "%devskim.suppressions.Description%", - }; - - [VisualStudioContribution] - internal static SettingCategory TriggersCategory { get; } = new("devskimTriggers", "%devskim.triggers.DisplayName%", DevSkimCategory) - { - Description = "%devskim.triggers.Description%", - }; - - [VisualStudioContribution] - internal static SettingCategory IgnoresCategory { get; } = new("devskimIgnores", "%devskim.ignores.DisplayName%", DevSkimCategory) - { - Description = "%devskim.ignores.Description%", - }; - - #endregion - - #region Rules Settings - Severity - - [VisualStudioContribution] - internal static Setting.Boolean EnableCriticalSeverityRules { get; } = new("devskimEnableCriticalSeverityRules", "%devskim.rules.enableCriticalSeverityRules.DisplayName%", RulesCategory, defaultValue: true) - { - Description = "%devskim.rules.enableCriticalSeverityRules.Description%", - }; - - [VisualStudioContribution] - internal static Setting.Boolean EnableImportantSeverityRules { get; } = new("devskimEnableImportantSeverityRules", "%devskim.rules.enableImportantSeverityRules.DisplayName%", RulesCategory, defaultValue: true) - { - Description = "%devskim.rules.enableImportantSeverityRules.Description%", - }; - - [VisualStudioContribution] - internal static Setting.Boolean EnableModerateSeverityRules { get; } = new("devskimEnableModerateSeverityRules", "%devskim.rules.enableModerateSeverityRules.DisplayName%", RulesCategory, defaultValue: true) - { - Description = "%devskim.rules.enableModerateSeverityRules.Description%", - }; - - [VisualStudioContribution] - internal static Setting.Boolean EnableManualReviewSeverityRules { get; } = new("devskimEnableManualReviewSeverityRules", "%devskim.rules.enableManualReviewSeverityRules.DisplayName%", RulesCategory, defaultValue: true) - { - Description = "%devskim.rules.enableManualReviewSeverityRules.Description%", - }; - - [VisualStudioContribution] - internal static Setting.Boolean EnableBestPracticeSeverityRules { get; } = new("devskimEnableBestPracticeSeverityRules", "%devskim.rules.enableBestPracticeSeverityRules.DisplayName%", RulesCategory, defaultValue: true) - { - Description = "%devskim.rules.enableBestPracticeSeverityRules.Description%", - }; - - #endregion - - #region Rules Settings - Confidence - - [VisualStudioContribution] - internal static Setting.Boolean EnableHighConfidenceRules { get; } = new("devskimEnableHighConfidenceRules", "%devskim.rules.enableHighConfidenceRules.DisplayName%", RulesCategory, defaultValue: true) - { - Description = "%devskim.rules.enableHighConfidenceRules.Description%", - }; - - [VisualStudioContribution] - internal static Setting.Boolean EnableMediumConfidenceRules { get; } = new("devskimEnableMediumConfidenceRules", "%devskim.rules.enableMediumConfidenceRules.DisplayName%", RulesCategory, defaultValue: true) - { - Description = "%devskim.rules.enableMediumConfidenceRules.Description%", - }; - - [VisualStudioContribution] - internal static Setting.Boolean EnableLowConfidenceRules { get; } = new("devskimEnableLowConfidenceRules", "%devskim.rules.enableLowConfidenceRules.DisplayName%", RulesCategory, defaultValue: false) - { - Description = "%devskim.rules.enableLowConfidenceRules.Description%", - }; - - #endregion - - #region Rules Settings - Paths and Configuration - - [VisualStudioContribution] - internal static Setting.Boolean IgnoreDefaultRules { get; } = new("devskimIgnoreDefaultRules", "%devskim.rules.ignoreDefaultRules.DisplayName%", RulesCategory, defaultValue: false) - { - Description = "%devskim.rules.ignoreDefaultRules.Description%", - }; - - [VisualStudioContribution] - internal static Setting.String CustomRulesPaths { get; } = new("devskimCustomRulesPaths", "%devskim.rules.customRulesPaths.DisplayName%", RulesCategory, defaultValue: "") - { - Description = "%devskim.rules.customRulesPaths.Description%", - }; - - [VisualStudioContribution] - internal static Setting.String CustomLanguagesPath { get; } = new("devskimCustomLanguagesPath", "%devskim.rules.customLanguagesPath.DisplayName%", RulesCategory, defaultValue: "") - { - Description = "%devskim.rules.customLanguagesPath.Description%", - }; - - [VisualStudioContribution] - internal static Setting.String CustomCommentsPath { get; } = new("devskimCustomCommentsPath", "%devskim.rules.customCommentsPath.DisplayName%", RulesCategory, defaultValue: "") - { - Description = "%devskim.rules.customCommentsPath.Description%", - }; - - [VisualStudioContribution] - internal static Setting.String GuidanceBaseURL { get; } = new("devskimGuidanceBaseURL", "%devskim.rules.guidanceBaseURL.DisplayName%", RulesCategory, defaultValue: "https://github.com/microsoft/devskim/tree/main/guidance") - { - Description = "%devskim.rules.guidanceBaseURL.Description%", - }; - - #endregion - - #region Suppressions Settings - - [VisualStudioContribution] - internal static Setting.String SuppressionCommentStyle { get; } = new("devskimSuppressionCommentStyle", "%devskim.suppressions.suppressionCommentStyle.DisplayName%", SuppressionsCategory, defaultValue: "Line") - { - Description = "%devskim.suppressions.suppressionCommentStyle.Description%", - }; - - [VisualStudioContribution] - internal static Setting.String ManualReviewerName { get; } = new("devskimManualReviewerName", "%devskim.suppressions.manualReviewerName.DisplayName%", SuppressionsCategory, defaultValue: "") - { - Description = "%devskim.suppressions.manualReviewerName.Description%", - }; - - [VisualStudioContribution] - internal static Setting.Integer SuppressionDurationInDays { get; } = new("devskimSuppressionDurationInDays", "%devskim.suppressions.suppressionDurationInDays.DisplayName%", SuppressionsCategory, defaultValue: 30) - { - Description = "%devskim.suppressions.suppressionDurationInDays.Description%", - }; - - #endregion - - #region Triggers Settings - - [VisualStudioContribution] - internal static Setting.Boolean ScanOnOpen { get; } = new("devskimScanOnOpen", "%devskim.triggers.scanOnOpen.DisplayName%", TriggersCategory, defaultValue: true) - { - Description = "%devskim.triggers.scanOnOpen.Description%", - }; - - [VisualStudioContribution] - internal static Setting.Boolean ScanOnSave { get; } = new("devskimScanOnSave", "%devskim.triggers.scanOnSave.DisplayName%", TriggersCategory, defaultValue: true) - { - Description = "%devskim.triggers.scanOnSave.Description%", - }; - - [VisualStudioContribution] - internal static Setting.Boolean ScanOnChange { get; } = new("devskimScanOnChange", "%devskim.triggers.scanOnChange.DisplayName%", TriggersCategory, defaultValue: true) - { - Description = "%devskim.triggers.scanOnChange.Description%", - }; - - [VisualStudioContribution] - internal static Setting.Boolean RemoveFindingsOnClose { get; } = new("devskimRemoveFindingsOnClose", "%devskim.triggers.removeFindingsOnClose.DisplayName%", TriggersCategory, defaultValue: true) - { - Description = "%devskim.triggers.removeFindingsOnClose.Description%", - }; - - #endregion - - #region Ignores Settings - - [VisualStudioContribution] - internal static Setting.String IgnoreRulesList { get; } = new("devskimIgnoreRulesList", "%devskim.ignores.ignoreRulesList.DisplayName%", IgnoresCategory, defaultValue: "") - { - Description = "%devskim.ignores.ignoreRulesList.Description%", - }; - - [VisualStudioContribution] - internal static Setting.String IgnoreFiles { get; } = new("devskimIgnoreFiles", "%devskim.ignores.ignoreFiles.DisplayName%", IgnoresCategory, defaultValue: "") - { - Description = "%devskim.ignores.ignoreFiles.Description%", - }; - - #endregion - - #region Diagnostics Settings - - [VisualStudioContribution] - internal static SettingCategory DiagnosticsCategory { get; } = new("devskimDiagnostics", "%devskim.diagnostics.DisplayName%", DevSkimCategory) - { - Description = "%devskim.diagnostics.Description%", - }; - - [VisualStudioContribution] - internal static Setting.Boolean EnableFileLogging { get; } = new("devskimEnableFileLogging", "%devskim.diagnostics.enableFileLogging.DisplayName%", DiagnosticsCategory, defaultValue: false) - { - Description = "%devskim.diagnostics.enableFileLogging.Description%", - }; - - #endregion -} diff --git a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Microsoft.DevSkim.VisualStudio.csproj b/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Microsoft.DevSkim.VisualStudio.csproj deleted file mode 100644 index fe6e3bf6..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Microsoft.DevSkim.VisualStudio.csproj +++ /dev/null @@ -1,47 +0,0 @@ - - - net8.0-windows8.0 - enable - 12 - en-US - Microsoft.DevSkim.VisualStudio - Microsoft.DevSkim.VisualStudio - - - enable - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - diff --git a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Properties/launchSettings.json b/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Properties/launchSettings.json deleted file mode 100644 index c8ae9057..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Properties/launchSettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "profiles": { - "Microsoft.DevSkim.VisualStudio": { - "commandName": "Executable", - "executablePath": "$(DevEnvDir)devenv.exe", - "commandLineArgs": "/rootsuffix Exp" - } - } -} diff --git a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/publish.manifest.json b/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/publish.manifest.json deleted file mode 100644 index cfc9aadd..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/publish.manifest.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/vsix-publish", - "categories": [ "coding", "programming languages", "security" ], - "identity": { - "internalName": "MicrosoftDevSkim" - }, - "overview": "readme-gallery.md", - "priceCategory": "free", - "publisher": "MS-CST-E", - "private": false, - "qna": true, - "repo": "https://github.com/Microsoft/DevSkim" -} diff --git a/DevSkim-DotNet/Microsoft.DevSkim.sln b/DevSkim-DotNet/Microsoft.DevSkim.sln index af3b71fd..4509fe41 100644 --- a/DevSkim-DotNet/Microsoft.DevSkim.sln +++ b/DevSkim-DotNet/Microsoft.DevSkim.sln @@ -1,3 +1,4 @@ + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.5.33516.290 @@ -8,12 +9,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DevSkim.CLI", "Mi EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DevSkim.Tests", "Microsoft.DevSkim.Tests\Microsoft.DevSkim.Tests.csproj", "{22E5C50D-93C9-4007-881F-D8B751B880D0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DevSkim.LanguageServer", "Microsoft.DevSkim.LanguageServer\Microsoft.DevSkim.LanguageServer.csproj", "{1668F782-FE09-4106-8393-9A9D9823E027}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DevSkim.VisualStudio", "Microsoft.DevSkim.VisualStudio\Microsoft.DevSkim.VisualStudio.csproj", "{E7A5F71D-137D-4D65-AB27-2ADD1FA6B26B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DevSkim.LanguageProtoInterop", "Microsoft.DevSkim.LanguageProtoInterop\Microsoft.DevSkim.LanguageProtoInterop.csproj", "{774E78F3-B48A-4D01-B70B-9CFB03A55663}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -46,30 +41,6 @@ Global {22E5C50D-93C9-4007-881F-D8B751B880D0}.Release|Any CPU.Build.0 = Release|Any CPU {22E5C50D-93C9-4007-881F-D8B751B880D0}.Release|x64.ActiveCfg = Release|Any CPU {22E5C50D-93C9-4007-881F-D8B751B880D0}.Release|x64.Build.0 = Release|Any CPU - {1668F782-FE09-4106-8393-9A9D9823E027}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1668F782-FE09-4106-8393-9A9D9823E027}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1668F782-FE09-4106-8393-9A9D9823E027}.Debug|x64.ActiveCfg = Debug|Any CPU - {1668F782-FE09-4106-8393-9A9D9823E027}.Debug|x64.Build.0 = Debug|Any CPU - {1668F782-FE09-4106-8393-9A9D9823E027}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1668F782-FE09-4106-8393-9A9D9823E027}.Release|Any CPU.Build.0 = Release|Any CPU - {1668F782-FE09-4106-8393-9A9D9823E027}.Release|x64.ActiveCfg = Release|Any CPU - {1668F782-FE09-4106-8393-9A9D9823E027}.Release|x64.Build.0 = Release|Any CPU - {E7A5F71D-137D-4D65-AB27-2ADD1FA6B26B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E7A5F71D-137D-4D65-AB27-2ADD1FA6B26B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E7A5F71D-137D-4D65-AB27-2ADD1FA6B26B}.Debug|x64.ActiveCfg = Debug|Any CPU - {E7A5F71D-137D-4D65-AB27-2ADD1FA6B26B}.Debug|x64.Build.0 = Debug|Any CPU - {E7A5F71D-137D-4D65-AB27-2ADD1FA6B26B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E7A5F71D-137D-4D65-AB27-2ADD1FA6B26B}.Release|Any CPU.Build.0 = Release|Any CPU - {E7A5F71D-137D-4D65-AB27-2ADD1FA6B26B}.Release|x64.ActiveCfg = Release|Any CPU - {E7A5F71D-137D-4D65-AB27-2ADD1FA6B26B}.Release|x64.Build.0 = Release|Any CPU - {774E78F3-B48A-4D01-B70B-9CFB03A55663}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {774E78F3-B48A-4D01-B70B-9CFB03A55663}.Debug|Any CPU.Build.0 = Debug|Any CPU - {774E78F3-B48A-4D01-B70B-9CFB03A55663}.Debug|x64.ActiveCfg = Debug|Any CPU - {774E78F3-B48A-4D01-B70B-9CFB03A55663}.Debug|x64.Build.0 = Debug|Any CPU - {774E78F3-B48A-4D01-B70B-9CFB03A55663}.Release|Any CPU.ActiveCfg = Release|Any CPU - {774E78F3-B48A-4D01-B70B-9CFB03A55663}.Release|Any CPU.Build.0 = Release|Any CPU - {774E78F3-B48A-4D01-B70B-9CFB03A55663}.Release|x64.ActiveCfg = Release|Any CPU - {774E78F3-B48A-4D01-B70B-9CFB03A55663}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/media/DevSkim-VisualStudio-Demo-1.gif b/media/DevSkim-VisualStudio-Demo-1.gif deleted file mode 100644 index cf662eeecedf069ee15ce721ffb0d4c25a386d64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144537 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 G@BaYvQ@XGK diff --git a/media/DevSkim-VisualStudio-Suppression-Example.png b/media/DevSkim-VisualStudio-Suppression-Example.png deleted file mode 100644 index 7c454a585b1309b008f1975c57bca96c2f23aaaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26925 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 From 8ba8703313887376f5cb79a3690f67991bce083c Mon Sep 17 00:00:00 2001 From: Giulia Stocco <98900+gfs@users.noreply.github.com> Date: Wed, 23 Sep 2026 18:40:50 +0000 Subject: [PATCH 3/7] Remove leftover VS Code extension tooling and configuration Delete the root .vscode extension-development config, drop the npm ecosystem from Dependabot, and remove extension build artifacts from .gitignore. --- .github/dependabot.yml | 29 ++----------------- .gitignore | 13 --------- .vscode/extensions.json | 9 ------ .vscode/launch.json | 35 ----------------------- .vscode/settings.json | 8 ------ .vscode/tasks.json | 63 ----------------------------------------- 6 files changed, 2 insertions(+), 155 deletions(-) delete mode 100644 .vscode/extensions.json delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/settings.json delete mode 100644 .vscode/tasks.json diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 568164b5..b3b35d15 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -2,7 +2,7 @@ # # Goal: one pull request to review and merge instead of one per dependency. # -# * Version updates for every ecosystem (npm, NuGet, GitHub Actions) are assigned to +# * Version updates for every ecosystem (NuGet, GitHub Actions) are assigned to # the `all-dependencies` multi-ecosystem group, so Dependabot consolidates them -- # across every directory it monitors -- into a single weekly pull request. # * Security updates cannot join a multi-ecosystem group, so each ecosystem also @@ -30,32 +30,7 @@ multi-ecosystem-groups: - "no changelog" updates: - # VS Code plugin: extension host and language client packages. - - package-ecosystem: "npm" - directories: - - "/DevSkim-VSCode-Plugin" - - "/DevSkim-VSCode-Plugin/client" - schedule: - interval: "weekly" - day: "monday" - time: "06:00" - timezone: "Etc/UTC" - multi-ecosystem-group: "all-dependencies" - patterns: - - "*" - open-pull-requests-limit: 1 - labels: - - "dependencies" - - "no changelog" - - "javascript" - groups: - npm-security-updates: - applies-to: security-updates - patterns: - - "*" - - # .NET: library, CLI, language server, and Visual Studio extension projects - # discovered through Microsoft.DevSkim.sln. + # .NET: library, CLI, and test projects discovered through Microsoft.DevSkim.sln. - package-ecosystem: "nuget" directory: "/DevSkim-DotNet" schedule: diff --git a/.gitignore b/.gitignore index 5e986add..e542f318 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ # Binaries -*.vsix **/bin/ **/obj @@ -7,18 +6,6 @@ **/.idea DevSkim-DotNet/Microsoft.DevSkim.sln.DotSettings.user -# Build artifacts -DevSkim-VSCode-Plugin/client/dist/* -DevSkim-VSCode-Plugin/devskimBinaries/* -DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/generatedLanguageServerBinaries/* -DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Server/* - -# Debug artifacts -DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/devskim-server-*.txt - -# Legacy Files -DevSkim-VSCode-Plugin/server/ - # Mac OS Metadata **/.DS_Store diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index af515502..00000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. - // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp - - // List of extensions which should be recommended for users of this workspace. - "recommendations": [ - "dbaeumer.vscode-eslint" - ] -} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 49568788..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "type": "extensionHost", - "request": "launch", - "name": "Launch VSC Client", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceRoot}/DevSkim-VSCode-Plugin" - ], - "sourceMaps": true, - "outFiles": ["${workspaceRoot}/DevSkim-VSCode-Plugin/client/out/**/*.js"], - "preLaunchTask": "npm-build" - }, - { - "type": "extensionHost", - "request": "launch", - "name": "Clean + Launch VSC Client", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceRoot}/DevSkim-VSCode-Plugin" - ], - "sourceMaps": true, - "outFiles": ["${workspaceRoot}/DevSkim-VSCode-Plugin/client/out/**/*.js"], - "preLaunchTask": "npm-clean + npm-build" - }, - { - "name": ".NET Core Attach", - "type": "coreclr", - "request": "attach", - "processId": "${command:pickProcess}" - } - ] -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index eb71540b..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "editor.insertSpaces": false, - "typescript.tsc.autoDetect": "off", - "typescript.preferences.quoteStyle": "single", - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - } -} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 30d41242..00000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "clean", - "label": "npm-clean", - "group": "build", - "options": { - "cwd": "${workspaceRoot}/DevSkim-VSCode-Plugin" - }, - "presentation": { - "panel": "dedicated", - "reveal": "never" - }, - "problemMatcher": [ - "$tsc" - ] - }, - { - "type": "npm", - "script": "build", - "label": "npm-build", - "group": "build", - "options": { - "cwd": "${workspaceRoot}/DevSkim-VSCode-Plugin" - }, - "presentation": { - "panel": "dedicated", - "reveal": "never" - }, - "problemMatcher": [ - "$tsc" - ] - }, - { - "type": "npm", - "script": "watch", - "label": "npm-watch", - "isBackground": true, - "group": { - "kind": "build", - "isDefault": true - }, - "options": { - "cwd": "${workspaceRoot}/DevSkim-VSCode-Plugin" - }, - "presentation": { - "panel": "dedicated", - "reveal": "never" - }, - "problemMatcher": [ - "$tsc-watch" - ] - }, - { - "label": "npm-clean + npm-build", - "dependsOrder": "sequence", - "dependsOn": ["npm-clean", "npm-build"] - } - - ] -} \ No newline at end of file From e88dd6db340b6058aa0c6184f7dced7b10502419 Mon Sep 17 00:00:00 2001 From: Giulia Stocco <98900+gfs@users.noreply.github.com> Date: Wed, 23 Sep 2026 18:40:50 +0000 Subject: [PATCH 4/7] Update Copilot instructions to cover only the library and CLI --- .github/copilot-instructions.md | 61 ++++----------------------------- 1 file changed, 6 insertions(+), 55 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 56870472..db1a99cd 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -2,12 +2,11 @@ ## Repository Overview -DevSkim is a framework of IDE extensions and language analyzers that provide inline security analysis in the dev environment as the developer writes code. The repository contains: +DevSkim is a .NET library and cross-platform command line tool that performs static security analysis of source code. The repository contains: -- **DevSkim Library** (C#/.NET): Core security analysis engine (`./DevSkim-DotNet/`) +- **DevSkim Library** (C#/.NET): Core security analysis engine (`./DevSkim-DotNet/Microsoft.DevSkim/`) - **DevSkim CLI** (C#/.NET): Command-line tool (`./DevSkim-DotNet/Microsoft.DevSkim.CLI/`) -- **Visual Studio Extension** (C#/.NET): VS extension (`./DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/`) -- **VS Code Plugin** (TypeScript): VSCode extension (`./DevSkim-VSCode-Plugin/`) +- **Tests** (C#/.NET): MSTest project (`./DevSkim-DotNet/Microsoft.DevSkim.Tests/`) - **Security Rules**: Default rules and guidance (`./rules/default/`, `./guidance/`) ## Critical Repository-Specific Rules @@ -17,12 +16,11 @@ DevSkim is a framework of IDE extensions and language analyzers that provide inl **⚠️ IMPORTANT**: This repository uses private Azure DevOps feeds for package management: - **nuget.config**: Contains private feed configuration (`PublicRegistriesFeed`) -- **.npmrc files**: VSCode plugin uses `.npmrc.pipeline` for private feeds **Rules for agents**: -1. You MAY temporarily modify `nuget.config` or `.npmrc` files to use public feeds (nuget.org, npmjs.com) when working locally +1. You MAY temporarily modify `nuget.config` to use public feeds (nuget.org) when working locally 2. You MUST NOT commit these changes - always revert them before committing -3. Use `git restore nuget.config` or `git restore DevSkim-VSCode-Plugin/.npmrc.pipeline` before creating commits +3. Use `git restore nuget.config` before creating commits 4. The private feed configuration must remain in the repository commits ### Changelog Requirements @@ -62,35 +60,6 @@ DevSkim is a framework of IDE extensions and language analyzers that provide inl ## Building and Testing -### VS Code Plugin (TypeScript) - -**Location**: `./DevSkim-VSCode-Plugin/` - -**Setup**: -```bash -cd DevSkim-VSCode-Plugin -npm run setup # Install dependencies and build .NET language server -npm run setup:release # Release build -``` - -**Build**: -```bash -npm run compile # Compile TypeScript -npm run build # Full build (setup + compile) -npm run watch # Watch mode for development -``` - -**Lint**: -```bash -npm run lint # Run ESLint on TypeScript files -``` - -**Package**: -```bash -npm run pack-ext # Package extension for release -npm run pack-ext:debug # Package extension for debug -``` - ### .NET Projects (C#) **Location**: `./DevSkim-DotNet/` @@ -114,15 +83,6 @@ cd DevSkim-DotNet/Microsoft.DevSkim.CLI dotnet run -- analyze --source-code ``` -### Language Server - -**Build**: -```bash -cd DevSkim-DotNet/Microsoft.DevSkim.LanguageServer -dotnet publish -c Debug -f net8.0 -o ../../DevSkim-VSCode-Plugin/devskimBinaries -dotnet publish -c Release -f net8.0 -o ../../DevSkim-VSCode-Plugin/devskimBinaries -``` - ## Code Style and Conventions ### C# Code @@ -131,12 +91,6 @@ dotnet publish -c Release -f net8.0 -o ../../DevSkim-VSCode-Plugin/devskimBinari - Add XML documentation comments for public APIs - Security-focused: prioritize secure defaults -### TypeScript Code -- Use ESLint configuration in `DevSkim-VSCode-Plugin/.eslintrc.js` -- Follow TypeScript best practices -- Use type annotations -- Avoid `any` types when possible - ### Security Rules - Rules are JSON files in `./rules/default/` - Each rule has corresponding guidance in `./guidance/` @@ -153,13 +107,10 @@ dotnet publish -c Release -f net8.0 -o ../../DevSkim-VSCode-Plugin/devskimBinari ### Updating Dependencies - For .NET: Use `dotnet add package` or edit `.csproj` files -- For npm: Use `npm install` or edit `package.json` - Document in Changelog.md under `### Dependencies` ### Debugging -- **VS Code plugin**: Use F5 in VS Code to launch Extension Development Host -- **.NET projects**: Use Visual Studio or `dotnet run` -- **Language Server**: Attach debugger to running process +- Use Visual Studio, VS Code with the C# extension, or `dotnet run` ## Git Workflow From a7df74255de45fd42c67d51ccbbc6a593001f525 Mon Sep 17 00:00:00 2001 From: Giulia Stocco <98900+gfs@users.noreply.github.com> Date: Wed, 23 Sep 2026 18:40:50 +0000 Subject: [PATCH 5/7] Rewrite README for the DevSkim library and CLI --- README.md | 93 ++++++++++++++++++++++++------------------------------- 1 file changed, 41 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index 99d6ce1e..d9a1c57f 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,37 @@ # DevSkim -[![Nuget](https://img.shields.io/nuget/v/Microsoft.CST.DevSkim.CLI?label=CLI&logo=NuGet)](https://www.nuget.org/packages/Microsoft.CST.DevSkim.CLI) -[![Visual Studio 2022 Version](https://img.shields.io/visual-studio-marketplace/v/MS-CST-E.MicrosoftDevSkim?logo=Visual%20Studio&label=VS)](https://marketplace.visualstudio.com/items?itemName=MS-CST-E.vscode-devskim) -[![Visual Studio Code Version](https://img.shields.io/visual-studio-marketplace/v/MS-CST-E.vscode-devskim?logo=Visual%20Studio%20Code&label=VSCode)](https://marketplace.visualstudio.com/items?itemName=MS-CST-E.vscode-devskim) +[![Nuget CLI](https://img.shields.io/nuget/v/Microsoft.CST.DevSkim.CLI?label=CLI&logo=NuGet)](https://www.nuget.org/packages/Microsoft.CST.DevSkim.CLI) +[![Nuget Library](https://img.shields.io/nuget/v/Microsoft.CST.DevSkim?label=Library&logo=NuGet)](https://www.nuget.org/packages/Microsoft.CST.DevSkim) +[![Nuget CLI Installs](https://img.shields.io/nuget/dt/Microsoft.CST.DevSkim.CLI?logo=NuGet)](https://www.nuget.org/packages/Microsoft.CST.DevSkim.CLI) -[![Nuget CLI Installs](https://img.shields.io/nuget/dt/Microsoft.CST.DevSkim.CLI?logo=NuGet)](https://www.nuget.org/packages/Microsoft.CST.DevSkim.CLI) -[![Visual Studio Installs](https://img.shields.io/visual-studio-marketplace/i/MS-CST-E.MicrosoftDevSkim?logo=Visual%20Studio)](https://marketplace.visualstudio.com/items?itemName=MS-CST-E.MicrosoftDevSkim) -[![Visual Studio Code Installs](https://img.shields.io/visual-studio-marketplace/i/MS-CST-E.vscode-devskim?logo=Visual%20Studio%20Code)](https://marketplace.visualstudio.com/items?itemName=MS-CST-E.vscode-devskim) - -DevSkim is a framework of IDE extensions and language analyzers that provide inline security analysis -in the dev environment as the developer writes code. It has a flexible rule model that supports multiple programming -languages. The goal is to notify the developer as they are introducing a security -vulnerability in order to fix the issue at the point of introduction, and to help build awareness -for the developer. - -![](./DevSkim-VSCode-Plugin/vsc-example.gif) +DevSkim is a .NET library and cross-platform command line tool that performs static security analysis +of source code. It has a flexible rule model that supports multiple programming languages. The goal is +to identify security vulnerabilities as early as possible, fix them at the point of introduction, and +help build security awareness for developers. ### Features * Built-in rules, and support for writing custom rules -* Cross-platform CLI built on .NET for file analysis -* IDE plugins for Visual Studio and Visual Studio Code built on Language Server Protocol -* IntelliSense error "squiggly lines" for identified security issues +* Cross-platform CLI built on .NET for analyzing files and directories +* C# library for embedding DevSkim analysis in your own tools +* SARIF, JSON, and text output formats * Information and guidance provided for identified security issues +* Automated application of suggested fixes from SARIF results * Optional suppression of unwanted findings -* Support for JSONPath, XPATH and YmlPath based rules +* Support for JSONPath, XPath and YmlPath based rules * Broad language support including: C, C++, C#, Cobol, Go, Java, Javascript/Typescript, Python, and [more](https://github.com/Microsoft/DevSkim/wiki/Supported-Languages). ### Repository Structure -This repository contains DevSkim and its official supported plugins. Issues and contributions are accepted here for: +Issues and contributions are accepted here for: * DevSkim Library - * Location: `./DevSkim-DotNet/` + * Location: `./DevSkim-DotNet/Microsoft.DevSkim/` * DevSkim CLI * Location: `./DevSkim-DotNet/Microsoft.DevSkim.CLI/` -* DevSkim Visual Studio Extension - * Location: `./DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/` -* DevSkim Visual Studio Code Plugin - * Location: `./DevSkim-VSCode-Plugin/` +* Tests + * Location: `./DevSkim-DotNet/Microsoft.DevSkim.Tests/` * Default Rules and Guidance - * Location: `./rules/default/` + * Location: `./rules/default/` and `./guidance/` ## Official Releases @@ -47,31 +39,18 @@ The C# library is available on NuGet as [Microsoft.CST.DevSkim](https://www.nuge The .NET Global Tool is available on NuGet as [Microsoft.CST.DevSkim.CLI](https://www.nuget.org/packages/Microsoft.CST.DevSkim.CLI/). -The Visual Studio extension is available in the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=MS-CST-E.MicrosoftDevSkim). - -The Visual Studio Code plugin is available in the [Visual Studio Code Marketplace](https://marketplace.visualstudio.com/items?itemName=MS-CST-E.vscode-devskim). - -DevSkim is also available as a [GitHub Action](https://github.com/microsoft/DevSkim-Action) to integrate with the GitHub Security Issues pane. - Platform specific binaries of the DevSkim CLI are also available on our GitHub [releases page](https://github.com/microsoft/DevSkim/releases). ## Installation -### Visual Studio Extension +### Library -The DevSkim Visual Studio extension can be downloaded and installed from the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=MS-CST-E.MicrosoftDevSkim). +Add the [Microsoft.CST.DevSkim](https://www.nuget.org/packages/Microsoft.CST.DevSkim/) package to your project: -Alternatively, in Visual Studio, open the Extension Manager (Menu: Extensions -> Manage Extensions), search for "Microsoft DevSkim", select the entry, and click on the Download button. - -### Visual Studio Code Plugin - -The DevSkim Visual Studio Code plugin can be downloaded and installed from the [Visual Studio Code Marketplace](https://marketplace.visualstudio.com/items?itemName=MS-CST-E.vscode-devskim). - -Alternatively, In VS Code, launch the Quick Open bar (Ctrl + P), and run the following command: -ext install ms-cst-e.vscode-devskim +`dotnet add package Microsoft.CST.DevSkim` ### Command Line Interface -#### .NET Core Global Tool (Recommended) +#### .NET Global Tool (Recommended) If you already have the .NET SDK installed, you can install the DevSkim CLI as a dotnet global tool by running the following from a command line: @@ -79,30 +58,40 @@ If you already have the .NET SDK installed, you can install the DevSkim CLI as a This will add DevSkim to your PATH. You can then invoke `devskim` from a command line. -#### .NET Core App (Self Contained) +#### Self Contained App Download the platform specific binary archive for your system (Windows, Mac OS, Linux) from the [releases page](https://github.com/microsoft/DevSkim/releases). Extract the archive, navigate to the DevSkim folder from a command line, and invoke `devskim` or `devskim.exe`. -#### .NET Core Runtime Dependent App +#### Runtime Dependent App First download and install the [Latest .NET runtime](https://dotnet.microsoft.com/). Then download the DevSkim netcoreapp archive from the [releases page](https://github.com/microsoft/DevSkim/releases). Extract the archive, navigate to the DevSkim folder from a command line, and invoke `dotnet devskim.dll`. ## Build from Source +DevSkim requires the [.NET SDK](https://dotnet.microsoft.com/) (8.0 or later). + +```bash +cd DevSkim-DotNet +dotnet build Microsoft.DevSkim.sln +dotnet test Microsoft.DevSkim.Tests/Microsoft.DevSkim.Tests.csproj +``` + For more information, see the wiki page about how to [Build from Source](https://github.com/microsoft/DevSkim/wiki/Build-from-Source). ## Basic Usage -### DevSkim CLI +Analyze a directory and write the results as SARIF: -`devskim analyze --source-code c:\path\to\FilesToAnalyze` +`devskim analyze --source-code /path/to/FilesToAnalyze --output-file results.sarif` -For more information, see the wiki page about the [Command Line Interface](https://github.com/microsoft/DevSkim/wiki/Command-Line-Interface). +The CLI also provides the following commands: -### Visual Studio Extension / Visual Studio Code Plugin +* `fix` - Apply suggested fixes from a DevSkim SARIF file +* `suppress` - Add suppression comments for issues identified in a DevSkim SARIF file +* `verify` - Validate rule files -Once the DevSkim plugin is installed and enabled, simply write some code, and feedback will be provided inline if issues are detected. +Run `devskim --help` or `devskim --help` for all options. For more information, see the wiki page about the [Command Line Interface](https://github.com/microsoft/DevSkim/wiki/Command-Line-Interface). ## Writing Rules @@ -131,12 +120,12 @@ For more information, please see [How to Contribute](https://github.com/Microsof ### Reporting Security Vulnerabilities -To report a security vulnerability, please see [SECURITY.md](https://github.com/microsoft/DevSkim/blob/master/SECURITY.md). +To report a security vulnerability, please see [SECURITY.md](SECURITY.md). ## License -DevSkim and its official plugins are licensed under the [MIT license](https://github.com/microsoft/DevSkim/blob/master/LICENSE.txt). +DevSkim is licensed under the [MIT license](LICENSE.txt). ## Privacy -Usage of this application is governed by the [Microsoft Privacy Statement](https://https://go.microsoft.com/fwlink/?LinkId=521839). \ No newline at end of file +Usage of this application is governed by the [Microsoft Privacy Statement](https://go.microsoft.com/fwlink/?LinkId=521839). \ No newline at end of file From 1515119bd16cc16628c6ae742d4c97d00993b031 Mon Sep 17 00:00:00 2001 From: Giulia Stocco <98900+gfs@users.noreply.github.com> Date: Wed, 23 Sep 2026 18:40:50 +0000 Subject: [PATCH 6/7] Add changelog entry for removing IDE extensions --- Changelog.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Changelog.md b/Changelog.md index 0b51833e..bc1b3168 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.0.100] - 2026-09-23 +### Removed +- Removed the Visual Studio Code extension (`DevSkim-VSCode-Plugin`) and the Visual Studio extension (`Microsoft.DevSkim.VisualStudio`), along with the IDE-only `Microsoft.DevSkim.LanguageServer` and `Microsoft.DevSkim.LanguageProtoInterop` projects. DevSkim is now distributed only as the `Microsoft.CST.DevSkim` library and the `Microsoft.CST.DevSkim.CLI` tool. +- Removed Visual Studio-only media assets and the root `.vscode` workspace configuration used for extension development. + +### Pipeline +- Removed the VS Code and Visual Studio extension PR and release pipelines. +- Removed the npm ecosystem from `.github/dependabot.yml`. + +### Changed +- Rewrote `README.md` to cover only the DevSkim library and CLI. +- Removed extension build artifacts from `.gitignore` and extension guidance from the Copilot instructions. + ## [1.0.99] - 2026-09-21 ### Fix - Fixed rule DS440011 (OpenSSL cipher-suite names such as `ECDHE-RSA-AES256-GCM-SHA384`) taking quadratic time on a long unbroken run of cipher-name characters. The middle `[A-Z0-9\-]+-?` group backtracked from every cipher-name prefix (`AES`, `DH`, `DES`, ...) found in the run, so a single 100 KB line such as `AES-AES-AES-...` took about 13 seconds and a 400 KB line took several minutes, hanging the scan. The run is now bounded to 64 characters (`[A-Z0-9\-]{1,64}`), which is longer than any real cipher-suite name, and the redundant `-?` was dropped because `-` is already in the character class. Match spans are unchanged for real OpenSSL cipher names. From e9be913783551e87efbee0251659e3249f5ea063 Mon Sep 17 00:00:00 2001 From: Giulia Stocco <98900+gfs@users.noreply.github.com> Date: Wed, 23 Sep 2026 11:58:43 -0700 Subject: [PATCH 7/7] Change .NET SDK requirement from 8.0 to 10.0 Updated .NET SDK version requirement in README. Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- DevSkim-DotNet/Microsoft.DevSkim.sln | 1 - README.md | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/DevSkim-DotNet/Microsoft.DevSkim.sln b/DevSkim-DotNet/Microsoft.DevSkim.sln index 4509fe41..e1706c27 100644 --- a/DevSkim-DotNet/Microsoft.DevSkim.sln +++ b/DevSkim-DotNet/Microsoft.DevSkim.sln @@ -1,4 +1,3 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.5.33516.290 diff --git a/README.md b/README.md index d9a1c57f..09c042a1 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ Then download the DevSkim netcoreapp archive from the [releases page](https://gi ## Build from Source -DevSkim requires the [.NET SDK](https://dotnet.microsoft.com/) (8.0 or later). +DevSkim requires the [.NET SDK](https://dotnet.microsoft.com/) (10.0 or later). ```bash cd DevSkim-DotNet