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 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 diff --git a/Changelog.md b/Changelog.md index 384b8ae0..34afd040 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.101] - 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.100] - 2026-09-22 ### Added - Added Kubernetes Security Baseline rules (`DS200000`-`DS200007`) covering privileged containers, privilege escalation, host namespace sharing, writable root filesystems, running as root, unpinned images, dangerous Linux capabilities, and `hostPath` volumes. These are the first rules to use the engine's `ymlpaths` support, which no shipped rule had used. 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 f3fa9753..00000000 Binary files a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/devskim-icon-200.png and /dev/null differ 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 1708b458..00000000 Binary files a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/devskim-icon-32.png and /dev/null differ 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 61fed4a0..00000000 Binary files a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/devskim.ico and /dev/null differ diff --git a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/readme-gallery.md b/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/readme-gallery.md deleted file mode 100644 index 8841f8f6..00000000 --- a/DevSkim-DotNet/Microsoft.DevSkim.VisualStudio/Content/readme-gallery.md +++ /dev/null @@ -1,35 +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/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..e1706c27 100644 --- a/DevSkim-DotNet/Microsoft.DevSkim.sln +++ b/DevSkim-DotNet/Microsoft.DevSkim.sln @@ -8,12 +8,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 +40,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/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 780b2e3c..00000000 Binary files a/DevSkim-VSCode-Plugin/devskim.ico and /dev/null differ diff --git a/DevSkim-VSCode-Plugin/eslint.config.mjs b/DevSkim-VSCode-Plugin/eslint.config.mjs deleted file mode 100644 index 12c115df..00000000 --- a/DevSkim-VSCode-Plugin/eslint.config.mjs +++ /dev/null @@ -1,19 +0,0 @@ -import eslint from "@eslint/js"; -import tseslint from "typescript-eslint"; - -export default tseslint.config( - eslint.configs.recommended, - ...tseslint.configs.recommended, - { - files: ["client/**/*.ts"], - rules: { - "semi": [2, "always"], - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-non-null-assertion": "off", - }, - }, - { - ignores: ["**/out/**", "**/node_modules/**", "scripts/**"], - } -); diff --git a/DevSkim-VSCode-Plugin/package-lock.json b/DevSkim-VSCode-Plugin/package-lock.json deleted file mode 100644 index 10fff88a..00000000 --- a/DevSkim-VSCode-Plugin/package-lock.json +++ /dev/null @@ -1,5892 +0,0 @@ -{ - "name": "vscode-devskim", - "version": "0.0.0-placeholder", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "vscode-devskim", - "version": "0.0.0-placeholder", - "hasInstallScript": true, - "license": "MIT", - "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" - }, - "engines": { - "vscode": "^1.91.0" - } - }, - "node_modules/@azu/format-text": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz", - "integrity": "sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@azu/style-format": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azu/style-format/-/style-format-1.0.1.tgz", - "integrity": "sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==", - "dev": true, - "license": "WTFPL", - "dependencies": { - "@azu/format-text": "^1.0.1" - } - }, - "node_modules/@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.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 diff --git a/README.md b/README.md index 99d6ce1e..09c042a1 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/) (10.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 diff --git a/media/DevSkim-VisualStudio-Demo-1.gif b/media/DevSkim-VisualStudio-Demo-1.gif deleted file mode 100644 index cf662eee..00000000 Binary files a/media/DevSkim-VisualStudio-Demo-1.gif and /dev/null differ diff --git a/media/DevSkim-VisualStudio-Suppression-Example.png b/media/DevSkim-VisualStudio-Suppression-Example.png deleted file mode 100644 index 7c454a58..00000000 Binary files a/media/DevSkim-VisualStudio-Suppression-Example.png and /dev/null differ