From 5c0031fe07ea905e71bc8c0c0d79120b5bdcdd73 Mon Sep 17 00:00:00 2001 From: Itay Paz Date: Tue, 5 Aug 2025 13:31:43 +0300 Subject: [PATCH 01/12] Add ignore path file to iac command --- package-lock.json | 8 ++++---- package.json | 2 +- src/cx/cx.ts | 6 +++--- src/cx/cxMock.ts | 4 ++-- src/cx/cxPlatform.ts | 2 +- src/realtimeScanners/scanners/iac/iacScannerService.ts | 6 +++--- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 681934dd..4a4de93e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "ast-results", "version": "2.34.0", "dependencies": { - "@checkmarxdev/ast-cli-javascript-wrapper": "0.0.139", + "@checkmarxdev/ast-cli-javascript-wrapper": "0.0.140-rc-itay-ignore-iac-con-asca.0", "@popperjs/core": "^2.11.8", "@vscode/codicons": "^0.0.36", "axios": "1.11.0", @@ -548,9 +548,9 @@ }, "node_modules/@checkmarxdev/ast-cli-javascript-wrapper": { "name": "@CheckmarxDev/ast-cli-javascript-wrapper", - "version": "0.0.139", - "resolved": "https://npm.pkg.github.com/download/@CheckmarxDev/ast-cli-javascript-wrapper/0.0.139/a0a2bd715dd39bb66c8cc71834bc4483e79fd1bf", - "integrity": "sha512-ZsWIXtKXzkPQzATo11+DZPu9ls4k8usSIKKrQx6Qpw/TQnPZZ0YwFUAhCl7cmkOoKNbHlAzhB3mB05NvgAO+YQ==", + "version": "0.0.140-rc-itay-ignore-iac-con-asca.0", + "resolved": "https://npm.pkg.github.com/download/@CheckmarxDev/ast-cli-javascript-wrapper/0.0.140-rc-itay-ignore-iac-con-asca.0/e9d9a376725572d198edf72a3713f82a75ce5769", + "integrity": "sha512-U99B8CvL5LxEA36T8tH6jo0OEK3N3SP0INKyVfUEkhRNgLHnQ1cG7/MwUql1GzhxFNW4tEbykFRYWUwOiR7Elg==", "license": "ISC", "dependencies": { "log4js": "^6.9.1" diff --git a/package.json b/package.json index 0dd6e613..7082fb6f 100644 --- a/package.json +++ b/package.json @@ -1018,7 +1018,7 @@ "webpack-cli": "^5.1.4" }, "dependencies": { - "@checkmarxdev/ast-cli-javascript-wrapper": "0.0.139", + "@checkmarxdev/ast-cli-javascript-wrapper": "0.0.140-rc-itay-ignore-iac-con-asca.0", "@popperjs/core": "^2.11.8", "@vscode/codicons": "^0.0.36", "axios": "1.11.0", diff --git a/src/cx/cx.ts b/src/cx/cx.ts index e04e9364..1f823ddb 100644 --- a/src/cx/cx.ts +++ b/src/cx/cx.ts @@ -689,16 +689,16 @@ export class Cx implements CxPlatform { } } - async iacScanResults(sourcePath: string, containersManagementTool: string): Promise { + async iacScanResults(sourcePath: string, containersManagementTool: string, ignoredFilePath?: string): Promise { let config = await this.getAstConfiguration(); if (!config) { config = new CxConfig(); } const cx = new CxWrapper(config); - const scans = await cx.iacRealtimeScanResults(sourcePath, containersManagementTool); + const scans = await cx.iacRealtimeScanResults(sourcePath, containersManagementTool, ignoredFilePath); - if (scans.payload && scans.exitCode === 0) { + if (scans.payload && scans.exitCode === 0) { return scans.payload[0]; } else { throw new Error(scans.status); diff --git a/src/cx/cxMock.ts b/src/cx/cxMock.ts index ace81769..0ea996b7 100644 --- a/src/cx/cxMock.ts +++ b/src/cx/cxMock.ts @@ -21,7 +21,7 @@ export class CxMock implements CxPlatform { constructor(context?: vscode.ExtensionContext) { this.context = context; } - async iacScanResults(sourcePath: string, dockerProvider: string): Promise { + async iacScanResults(sourcePath: string, dockerProvider: string, ignoredFilePath?: string): Promise { return [new CxIacResult()]; } @@ -1655,5 +1655,5 @@ export class CxMock implements CxPlatform { }); } - setUserEventDataForLogs(): void {} + setUserEventDataForLogs(): void { } } diff --git a/src/cx/cxPlatform.ts b/src/cx/cxPlatform.ts index 961b5460..cc9c3363 100644 --- a/src/cx/cxPlatform.ts +++ b/src/cx/cxPlatform.ts @@ -235,7 +235,7 @@ export interface CxPlatform { */ scanContainers(sourcePath: string): Promise; - iacScanResults(sourcePath: string, dockerProvider: string): Promise; + iacScanResults(sourcePath: string, dockerProvider: string, ignoredFilePath?: string): Promise; authValidate(logs: Logs): Promise; diff --git a/src/realtimeScanners/scanners/iac/iacScannerService.ts b/src/realtimeScanners/scanners/iac/iacScannerService.ts index 78acb081..36262f82 100644 --- a/src/realtimeScanners/scanners/iac/iacScannerService.ts +++ b/src/realtimeScanners/scanners/iac/iacScannerService.ts @@ -128,7 +128,7 @@ export class IacScannerService extends BaseScannerService { } keysToDelete.forEach(key => this.iacHoverData.delete(key)); - // Use the method to take care of in DockerFiles + // Use the method to take care of in DockerFiles const filePath = await this.getFullPathWithOriginalCasing(document.uri); logs.info("Scanning IaC in file: " + filePath); @@ -146,7 +146,7 @@ export class IacScannerService extends BaseScannerService { tempSubFolder = saveResult.tempSubFolder; const containersManagementTool = this.getContainersManagementTool(); - const scanResults = await cx.iacScanResults(tempFilePath, containersManagementTool); + const scanResults = await cx.iacScanResults(tempFilePath, containersManagementTool,); this.updateProblems(scanResults, document.uri); } catch (error) { @@ -158,7 +158,7 @@ export class IacScannerService extends BaseScannerService { [], [], [] - ) + ); console.error(error); logs.error(this.config.errorMessage + `: ${error.message}`); } finally { From 5c143139ccf23cf7880a2bdce8c733cb7499294c Mon Sep 17 00:00:00 2001 From: Itay Paz Date: Wed, 6 Aug 2025 10:59:20 +0300 Subject: [PATCH 02/12] Add iac ignore flow without ui and revive --- package-lock.json | 8 +- package.json | 2 +- src/commands/openAIChatCommand.ts | 42 +++++-- src/cx/cx.ts | 2 +- src/extension.ts | 7 +- .../common/ignoreFileManager.ts | 112 +++++++++++++++++- src/realtimeScanners/common/types.ts | 1 + .../scanners/iac/iacScannerCommand.ts | 6 +- .../scanners/iac/iacScannerService.ts | 79 +++++++++++- 9 files changed, 237 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4a4de93e..831c9229 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "ast-results", "version": "2.34.0", "dependencies": { - "@checkmarxdev/ast-cli-javascript-wrapper": "0.0.140-rc-itay-ignore-iac-con-asca.0", + "@checkmarxdev/ast-cli-javascript-wrapper": "0.0.140-rc-itay-Ignore-without-filepath.0", "@popperjs/core": "^2.11.8", "@vscode/codicons": "^0.0.36", "axios": "1.11.0", @@ -548,9 +548,9 @@ }, "node_modules/@checkmarxdev/ast-cli-javascript-wrapper": { "name": "@CheckmarxDev/ast-cli-javascript-wrapper", - "version": "0.0.140-rc-itay-ignore-iac-con-asca.0", - "resolved": "https://npm.pkg.github.com/download/@CheckmarxDev/ast-cli-javascript-wrapper/0.0.140-rc-itay-ignore-iac-con-asca.0/e9d9a376725572d198edf72a3713f82a75ce5769", - "integrity": "sha512-U99B8CvL5LxEA36T8tH6jo0OEK3N3SP0INKyVfUEkhRNgLHnQ1cG7/MwUql1GzhxFNW4tEbykFRYWUwOiR7Elg==", + "version": "0.0.140-rc-itay-Ignore-without-filepath.0", + "resolved": "https://npm.pkg.github.com/download/@CheckmarxDev/ast-cli-javascript-wrapper/0.0.140-rc-itay-Ignore-without-filepath.0/890b1d1a2e7a1ef588125208a1af0b99fbd4a252", + "integrity": "sha512-kshIKoK+2CF9QclRVIOkBcngWVbA1bQ2PtS56USt/ikywC3KFXhtDuczk0nJMLclmmzstBeVBdVKFspPcxD+7Q==", "license": "ISC", "dependencies": { "log4js": "^6.9.1" diff --git a/package.json b/package.json index 7082fb6f..0fd46968 100644 --- a/package.json +++ b/package.json @@ -1018,7 +1018,7 @@ "webpack-cli": "^5.1.4" }, "dependencies": { - "@checkmarxdev/ast-cli-javascript-wrapper": "0.0.140-rc-itay-ignore-iac-con-asca.0", + "@checkmarxdev/ast-cli-javascript-wrapper": "0.0.140-rc-itay-Ignore-without-filepath.0", "@popperjs/core": "^2.11.8", "@vscode/codicons": "^0.0.36", "axios": "1.11.0", diff --git a/src/commands/openAIChatCommand.ts b/src/commands/openAIChatCommand.ts index 7e55d1c2..d4387b40 100644 --- a/src/commands/openAIChatCommand.ts +++ b/src/commands/openAIChatCommand.ts @@ -21,6 +21,7 @@ import { import { IgnoreFileManager } from "../realtimeScanners/common/ignoreFileManager"; import { OssScannerService } from "../realtimeScanners/scanners/oss/ossScannerService"; import { SecretsScannerService } from "../realtimeScanners/scanners/secrets/secretsScannerService"; +import { IacScannerService } from "../realtimeScanners/scanners/iac/iacScannerService"; import { cx } from "../cx"; @@ -30,17 +31,20 @@ export class CopilotChatCommand { logs: Logs; private ossScanner: OssScannerService; private secretsScanner: SecretsScannerService; + private iacScanner: IacScannerService; constructor( context: vscode.ExtensionContext, logs: Logs, ossScanner: OssScannerService, - secretsScanner: SecretsScannerService + secretsScanner: SecretsScannerService, + iacScanner: IacScannerService ) { this.context = context; this.logs = logs; this.ossScanner = ossScanner; this.secretsScanner = secretsScanner; + this.iacScanner = iacScanner; } private pressEnterWindows() { @@ -205,11 +209,19 @@ export class CopilotChatCommand { ); this.context.subscriptions.push( - vscode.commands.registerCommand(commands.ignorePackage, async (item: HoverData | SecretsHoverData) => { + vscode.commands.registerCommand(commands.ignorePackage, async (item: HoverData | SecretsHoverData | IacHoverData) => { this.logUserEvent("click", constants.ignorePackage, item); + try { - const workspaceFolder = getWorkspaceFolder(item.filePath); + let workspaceFolder: vscode.WorkspaceFolder; + + if (isIacHoverData(item)) { + const iacItem = item as IacHoverData & { originalFilePath?: string }; + workspaceFolder = getWorkspaceFolder(iacItem.originalFilePath); + } else { + workspaceFolder = getWorkspaceFolder(item.filePath); + } if (!workspaceFolder) { vscode.window.showErrorMessage("No workspace folder found."); return; @@ -218,7 +230,24 @@ export class CopilotChatCommand { const ignoreManager = IgnoreFileManager.getInstance(); ignoreManager.initialize(workspaceFolder); - if (isSecretsHoverData(item)) { + if (isIacHoverData(item)) { + ignoreManager.addIgnoredEntryIac({ + title: item.title || "", + similarityId: item.similarityId || "", + filePath: item.originalFilePath, + line: (item.location?.line || 0), + severity: item.severity, + description: item.description, + dateAdded: new Date().toISOString() + }); + vscode.window.showInformationMessage(`IaC finding '${item.title}' ignored successfully.`); + const document = vscode.workspace.textDocuments.find(doc => doc.uri.fsPath === item.originalFilePath) + ?? await vscode.workspace.openTextDocument(item.originalFilePath); + if (this.iacScanner && this.iacScanner.scan) { + await this.iacScanner.scan(document, this.logs); + } + } + else if (isSecretsHoverData(item)) { ignoreManager.addIgnoredEntrySecrets({ title: item.title || "", filePath: item.filePath, @@ -229,15 +258,14 @@ export class CopilotChatCommand { secretValue: item.secretValue }); - - vscode.window.showInformationMessage(`Secret '${item.title}' ignored successfully.`); const document = vscode.workspace.textDocuments.find(doc => doc.uri.fsPath === item.filePath) ?? await vscode.workspace.openTextDocument(item.filePath); const secretsScannerForScan = this.secretsScanner as SecretsScannerService; await secretsScannerForScan.scan(document, this.logs); - } else { + } + else { ignoreManager.addIgnoredEntry({ packageManager: item.packageManager, packageName: item.packageName, diff --git a/src/cx/cx.ts b/src/cx/cx.ts index 1f823ddb..16cf2bb1 100644 --- a/src/cx/cx.ts +++ b/src/cx/cx.ts @@ -688,7 +688,7 @@ export class Cx implements CxPlatform { throw new Error(scans.status); } } - + // eslint-disable-next-line @typescript-eslint/no-explicit-any async iacScanResults(sourcePath: string, containersManagementTool: string, ignoredFilePath?: string): Promise { let config = await this.getAstConfiguration(); if (!config) { diff --git a/src/extension.ts b/src/extension.ts index 6f144c78..5a2a1085 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -34,6 +34,7 @@ import { CxCodeActionProvider } from "./realtimeScanners/scanners/CxCodeActionPr import { OssScannerCommand } from "./realtimeScanners/scanners/oss/ossScannerCommand"; import { SecretsScannerCommand } from "./realtimeScanners/scanners/secrets/secretsScannerCommand"; import { IgnoreFileManager } from "./realtimeScanners/common/ignoreFileManager"; +import { IacScannerCommand } from "./realtimeScanners/scanners/iac/iacScannerCommand"; import { registerMcpSettingsInjector } from "./services/mcpSettingsInjector"; @@ -301,14 +302,18 @@ export async function activate(context: vscode.ExtensionContext) { const secretCommand = scannerRegistry.getScanner(constants.secretsScannerEngineName) as SecretsScannerCommand; const secretScanner = secretCommand.getScannerService(); + const iacCommand = scannerRegistry.getScanner(constants.iacRealtimeScannerEngineName) as IacScannerCommand; + const iacScanner = iacCommand.getScannerService(); + ignoreFileManager.setOssScannerService(ossScanner); ignoreFileManager.setSecretsScannerService(secretScanner); + ignoreFileManager.setIacScannerService(iacScanner); context.subscriptions.push({ dispose: () => ignoreFileManager.dispose() }); - const copilotChatCommand = new CopilotChatCommand(context, logs, ossScanner, secretScanner); + const copilotChatCommand = new CopilotChatCommand(context, logs, ossScanner, secretScanner, iacScanner); registerMcpSettingsInjector(context); diff --git a/src/realtimeScanners/common/ignoreFileManager.ts b/src/realtimeScanners/common/ignoreFileManager.ts index c94f6353..c3a91cbc 100644 --- a/src/realtimeScanners/common/ignoreFileManager.ts +++ b/src/realtimeScanners/common/ignoreFileManager.ts @@ -7,14 +7,16 @@ import { SecretsScannerService } from '../scanners/secrets/secretsScannerService import { Logs } from '../../models/logs'; import { constants } from '../../utils/common/constants'; import CxSecretsResult from "@checkmarxdev/ast-cli-javascript-wrapper/dist/main/secrets/CxSecrets"; +import CxIacResult from "@checkmarxdev/ast-cli-javascript-wrapper/dist/main/iacRealtime/CxIac"; +import { IacScannerService } from '../scanners/iac/iacScannerService'; export interface IgnoreEntry { files: Array<{ path: string; active: boolean; line?: number; - }>; secretValue?: string; + similarityId?: string; type: string; PackageManager?: string; PackageName: string; @@ -35,6 +37,7 @@ export class IgnoreFileManager { private previousIgnoreData: Record = {}; private ossScannerService: OssScannerService | undefined; private secretsScannerService: SecretsScannerService | undefined; + private iacScannerService: IacScannerService | undefined; private statusBarUpdateCallback: (() => void) | undefined; private uiRefreshCallback: (() => void) | undefined; @@ -71,6 +74,11 @@ export class IgnoreFileManager { this.secretsScannerService = service; } + + public setIacScannerService(service: IacScannerService): void { + this.iacScannerService = service; + } + public setStatusBarUpdateCallback(callback: () => void): void { this.statusBarUpdateCallback = callback; } @@ -115,7 +123,7 @@ export class IgnoreFileManager { } private async detectAndHandleActiveChanges(): Promise { - if (!this.ossScannerService && !this.secretsScannerService) { + if (!this.ossScannerService && !this.secretsScannerService && !this.iacScannerService) { return; } @@ -279,10 +287,12 @@ export class IgnoreFileManager { if (this.ossScannerService && this.ossScannerService.shouldScanFile(document)) { await this.ossScannerService.scan(document, logs); } - if (this.secretsScannerService && this.secretsScannerService.shouldScanFile(document)) { await this.secretsScannerService.scan(document, logs); } + if (this.iacScannerService && this.iacScannerService.shouldScanFile(document)) { + await this.iacScannerService.scan(document, logs); + } } catch (error) { console.error(`Error rescanning file ${fullPath}:`, error); } @@ -527,6 +537,51 @@ export class IgnoreFileManager { this.uiRefreshCallback?.(); } + public addIgnoredEntryIac(entry: { + title: string; + similarityId: string; + filePath: string; + line: number; + severity?: string; + description?: string; + dateAdded?: string; + }): void { + const relativePath = path.relative(this.workspaceRootPath, entry.filePath); + const packageKey = `${entry.title}:${entry.similarityId}:${relativePath}`; + + if (!this.ignoreData[packageKey]) { + this.ignoreData[packageKey] = { + files: [{ + path: relativePath, + active: true, + line: entry.line + 1 + }], + type: constants.iacRealtimeScannerEngineName, + PackageName: entry.title, + similarityId: entry.similarityId, + severity: entry.severity, + description: entry.description, + dateAdded: entry.dateAdded + }; + } else { + const existingFileEntry = this.ignoreData[packageKey].files.find(f => f.path === relativePath); + if (existingFileEntry) { + existingFileEntry.active = true; + } else { + this.ignoreData[packageKey].files.push({ + path: relativePath, + active: true, + line: this.ignoreData[packageKey].files[0]?.line || (entry.line + 1) + }); + } + if (entry.severity !== undefined) { this.ignoreData[packageKey].severity = entry.severity; } + if (entry.description !== undefined) { this.ignoreData[packageKey].description = entry.description; } + } + this.saveIgnoreFile(); + this.updateTempList(); + this.uiRefreshCallback?.(); + } + private saveIgnoreFile(): void { fs.writeFileSync(this.getIgnoreFilePath(), JSON.stringify(this.ignoreData, null, 2)); if (this.statusBarUpdateCallback) { @@ -548,6 +603,11 @@ export class IgnoreFileManager { FilePath: scannedTempPath, SecretValue: entry.secretValue }; + } else if (entry.type === constants.iacRealtimeScannerEngineName) { + return { + Title: entry.PackageName, + SimilarityID: entry.similarityId + }; } else { return { PackageManager: entry.PackageManager, @@ -636,6 +696,52 @@ export class IgnoreFileManager { return hasChanges; } + public removeMissingIac(currentResults: CxIacResult[], filePath: string): boolean { + let hasChanges = false; + const relativePath = path.relative(this.workspaceRootPath, filePath); + + const currentIacs = new Map(); + currentResults.forEach(result => { + if (result.similarityID) { + const key = `${result.title}:${result.similarityID}:${relativePath}`; + const lines = currentIacs.get(key) || []; + result.locations.forEach(loc => lines.push(loc.line + 1)); + currentIacs.set(key, lines); + } + }); + + Object.entries(this.ignoreData).forEach(([key, entry]) => { + if (entry.type !== constants.iacRealtimeScannerEngineName) { return; } + + const fileEntry = entry.files.find(f => f.path === relativePath); + if (!fileEntry || !fileEntry.active) { return; } + + const iacKey = `${entry.PackageName}:${entry.similarityId}:${relativePath}`; + if (!currentIacs.has(iacKey)) { + if (entry.files.length === 1) { + delete this.ignoreData[key]; + } else { + fileEntry.active = false; + } + hasChanges = true; + } else { + const lines = currentIacs.get(iacKey) || []; + if (lines.length > 0) { + fileEntry.line = lines[0]; + hasChanges = true; + } + } + }); + + if (hasChanges) { + this.saveIgnoreFile(); + this.updateTempList(); + this.uiRefreshCallback?.(); + } + + return hasChanges; + } + diff --git a/src/realtimeScanners/common/types.ts b/src/realtimeScanners/common/types.ts index 0a840f69..66491ed8 100644 --- a/src/realtimeScanners/common/types.ts +++ b/src/realtimeScanners/common/types.ts @@ -83,6 +83,7 @@ export interface IacHoverData { description: string; severity: string; filePath: string; + originalFilePath?: string location?: { line: number; startIndex: number; diff --git a/src/realtimeScanners/scanners/iac/iacScannerCommand.ts b/src/realtimeScanners/scanners/iac/iacScannerCommand.ts index 32c7f3ef..661eff97 100644 --- a/src/realtimeScanners/scanners/iac/iacScannerCommand.ts +++ b/src/realtimeScanners/scanners/iac/iacScannerCommand.ts @@ -82,7 +82,7 @@ export class IacScannerCommand extends BaseScannerCommand { } const args = encodeURIComponent(JSON.stringify([problem])); - const buttons = buildCommandButtons(args, true, false); + const buttons = buildCommandButtons(args, false, false); md.appendMarkdown(this.renderSeverityIcon(problem.severity)); md.appendMarkdown(this.renderID(problem)); @@ -112,4 +112,8 @@ export class IacScannerCommand extends BaseScannerCommand { this.scannerService.dispose(); this.hoverProviderDisposable?.dispose(); } + + public getScannerService(): IacScannerService { + return this.scannerService as IacScannerService; + } } diff --git a/src/realtimeScanners/scanners/iac/iacScannerService.ts b/src/realtimeScanners/scanners/iac/iacScannerService.ts index 36262f82..255a5d7e 100644 --- a/src/realtimeScanners/scanners/iac/iacScannerService.ts +++ b/src/realtimeScanners/scanners/iac/iacScannerService.ts @@ -12,6 +12,7 @@ import fs from "fs"; import { minimatch } from "minimatch"; import { createHash } from "crypto"; import { CxRealtimeEngineStatus } from "@checkmarxdev/ast-cli-javascript-wrapper/dist/main/oss/CxRealtimeEngineStatus"; +import { IgnoreFileManager } from "../../common/ignoreFileManager"; export class IacScannerService extends BaseScannerService { private diagnosticsMap = new Map(); @@ -20,6 +21,7 @@ export class IacScannerService extends BaseScannerService { private highDecorationsMap = new Map(); private mediumDecorationsMap = new Map(); private lowDecorationsMap = new Map(); + private ignoredDecorations: Map = new Map(); private documentOpenListener: vscode.Disposable | undefined; private editorChangeListener: vscode.Disposable | undefined; @@ -28,7 +30,8 @@ export class IacScannerService extends BaseScannerService { critical: this.createDecoration("realtimeEngines/critical_severity.svg", "12px"), high: this.createDecoration("realtimeEngines/high_severity.svg"), medium: this.createDecoration("realtimeEngines/medium_severity.svg"), - low: this.createDecoration("realtimeEngines/low_severity.svg") + low: this.createDecoration("realtimeEngines/low_severity.svg"), + ignored: this.createDecoration("Ignored.svg") }; private createDecoration( @@ -87,8 +90,12 @@ export class IacScannerService extends BaseScannerService { .update(input + timeSuffix) .digest("hex") .substring(0, 16); + } + + + private createSubFolderAndSaveFile( tempFolder: string, originalFilePath: string, @@ -128,7 +135,6 @@ export class IacScannerService extends BaseScannerService { } keysToDelete.forEach(key => this.iacHoverData.delete(key)); - // Use the method to take care of in DockerFiles const filePath = await this.getFullPathWithOriginalCasing(document.uri); logs.info("Scanning IaC in file: " + filePath); @@ -145,10 +151,71 @@ export class IacScannerService extends BaseScannerService { tempFilePath = saveResult.tempFilePath; tempSubFolder = saveResult.tempSubFolder; - const containersManagementTool = this.getContainersManagementTool(); - const scanResults = await cx.iacScanResults(tempFilePath, containersManagementTool,); + const ignoreManager = IgnoreFileManager.getInstance(); + ignoreManager.setScannedFilePath(filePath, tempFilePath); + const ignoredPackagesFile = ignoreManager.getIgnoredPackagesTempFile(); + + const scanResults = await cx.iacScanResults(tempFilePath, this.getContainersManagementTool(), ignoredPackagesFile || ""); + + let fullScanResults = scanResults; + if (ignoreManager.getIgnoredPackagesCount() > 0) { + fullScanResults = await cx.iacScanResults(tempFilePath, this.getContainersManagementTool(), ""); + } + + ignoreManager.removeMissingIac(fullScanResults, filePath); this.updateProblems(scanResults, document.uri); + + const ignoredData = ignoreManager.getIgnoredPackagesData(); + const relativePath = path.relative(vscode.workspace.workspaceFolders?.[0]?.uri.fsPath || '', filePath); + const ignoredDecorations: vscode.DecorationOptions[] = []; + + + const iacLocations = new Map(); + fullScanResults.forEach(result => { + if (result.similarityID) { + const key = `${result.title}:${result.similarityID}:${relativePath}`; + const lines = iacLocations.get(key) || []; + result.locations.forEach(loc => lines.push(loc.line)); + iacLocations.set(key, lines); + } + }); + + Object.entries(ignoredData).forEach(([, entry]) => { + if (entry.type !== constants.iacRealtimeScannerEngineName) { return; } + const fileEntry = entry.files.find(f => f.path === relativePath && f.active); + if (!fileEntry) { return; } + + const key = `${entry.PackageName}:${entry.similarityId}:${relativePath}`; + const lines = iacLocations.get(key) || []; + + lines.forEach(line => { + const adjustedLine = line; + const range = new vscode.Range( + new vscode.Position(adjustedLine, 0), + new vscode.Position(adjustedLine, 1000) + ); + ignoredDecorations.push({ range }); + + const hoverKey = `${filePath}:${adjustedLine}`; + if (!this.iacHoverData.has(hoverKey)) { + this.iacHoverData.set(hoverKey, [{ + similarityId: entry.similarityId, + title: entry.PackageName, + description: entry.description, + severity: entry.severity, + filePath, + originalFilePath: filePath, + location: { line: adjustedLine, startIndex: 0, endIndex: 1000 }, + fileType: path.extname(filePath).substring(1) + }]); + } + }); + }); + + this.ignoredDecorations.set(filePath, ignoredDecorations); + this.applyDecorations(document.uri); + } catch (error) { this.storeAndApplyResults( filePath, @@ -211,6 +278,7 @@ export class IacScannerService extends BaseScannerService { description: result.description, severity: result.severity, filePath: result.filepath, + originalFilePath: uri.fsPath, location: result.locations[0], fileType: fileType })); @@ -320,6 +388,7 @@ export class IacScannerService extends BaseScannerService { editor.setDecorations(this.decorationTypes.high, this.highDecorationsMap.get(filePath) || []); editor.setDecorations(this.decorationTypes.medium, this.mediumDecorationsMap.get(filePath) || []); editor.setDecorations(this.decorationTypes.low, this.lowDecorationsMap.get(filePath) || []); + editor.setDecorations(this.decorationTypes.ignored, this.ignoredDecorations.get(filePath) || []); } } @@ -332,6 +401,7 @@ export class IacScannerService extends BaseScannerService { this.highDecorationsMap.delete(filePath); this.mediumDecorationsMap.delete(filePath); this.lowDecorationsMap.delete(filePath); + this.ignoredDecorations.delete(filePath); } public getHoverData(): Map { @@ -364,5 +434,6 @@ export class IacScannerService extends BaseScannerService { this.highDecorationsMap.clear(); this.mediumDecorationsMap.clear(); this.lowDecorationsMap.clear(); + this.ignoredDecorations.clear(); } } From 2a7976d29e33f9f443d974e88325510945edcbf5 Mon Sep 17 00:00:00 2001 From: Itay Paz Date: Wed, 6 Aug 2025 12:38:11 +0300 Subject: [PATCH 03/12] Finish iac ignore flow --- media/icons/ignorePage/IacAsca/critical.svg | 6 ++++++ .../ignorePage/IacAsca/critical_hover.svg | 6 ++++++ media/icons/ignorePage/IacAsca/high.svg | 6 ++++++ media/icons/ignorePage/IacAsca/high_hover.svg | 6 ++++++ media/icons/ignorePage/IacAsca/low.svg | 6 ++++++ media/icons/ignorePage/IacAsca/low_hover.svg | 6 ++++++ media/icons/ignorePage/IacAsca/malicious.svg | 13 ++++++++++++ .../ignorePage/IacAsca/malicious_hover.svg | 13 ++++++++++++ media/icons/ignorePage/IacAsca/medium.svg | 6 ++++++ .../icons/ignorePage/IacAsca/medium_hover.svg | 6 ++++++ media/icons/ignorePage/iac_ignore.svg | 4 ++++ src/views/ignoredView/ignoredView.ts | 14 ++++++++++--- src/views/ignoredView/ignoredViewUtils.ts | 20 +++++++++++++++++++ 13 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 media/icons/ignorePage/IacAsca/critical.svg create mode 100644 media/icons/ignorePage/IacAsca/critical_hover.svg create mode 100644 media/icons/ignorePage/IacAsca/high.svg create mode 100644 media/icons/ignorePage/IacAsca/high_hover.svg create mode 100644 media/icons/ignorePage/IacAsca/low.svg create mode 100644 media/icons/ignorePage/IacAsca/low_hover.svg create mode 100644 media/icons/ignorePage/IacAsca/malicious.svg create mode 100644 media/icons/ignorePage/IacAsca/malicious_hover.svg create mode 100644 media/icons/ignorePage/IacAsca/medium.svg create mode 100644 media/icons/ignorePage/IacAsca/medium_hover.svg create mode 100644 media/icons/ignorePage/iac_ignore.svg diff --git a/media/icons/ignorePage/IacAsca/critical.svg b/media/icons/ignorePage/IacAsca/critical.svg new file mode 100644 index 00000000..822ee204 --- /dev/null +++ b/media/icons/ignorePage/IacAsca/critical.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/media/icons/ignorePage/IacAsca/critical_hover.svg b/media/icons/ignorePage/IacAsca/critical_hover.svg new file mode 100644 index 00000000..9a04c03d --- /dev/null +++ b/media/icons/ignorePage/IacAsca/critical_hover.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/media/icons/ignorePage/IacAsca/high.svg b/media/icons/ignorePage/IacAsca/high.svg new file mode 100644 index 00000000..68043386 --- /dev/null +++ b/media/icons/ignorePage/IacAsca/high.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/media/icons/ignorePage/IacAsca/high_hover.svg b/media/icons/ignorePage/IacAsca/high_hover.svg new file mode 100644 index 00000000..4d60f212 --- /dev/null +++ b/media/icons/ignorePage/IacAsca/high_hover.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/media/icons/ignorePage/IacAsca/low.svg b/media/icons/ignorePage/IacAsca/low.svg new file mode 100644 index 00000000..5b59f8f5 --- /dev/null +++ b/media/icons/ignorePage/IacAsca/low.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/media/icons/ignorePage/IacAsca/low_hover.svg b/media/icons/ignorePage/IacAsca/low_hover.svg new file mode 100644 index 00000000..2989094b --- /dev/null +++ b/media/icons/ignorePage/IacAsca/low_hover.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/media/icons/ignorePage/IacAsca/malicious.svg b/media/icons/ignorePage/IacAsca/malicious.svg new file mode 100644 index 00000000..1f0d7cb0 --- /dev/null +++ b/media/icons/ignorePage/IacAsca/malicious.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/media/icons/ignorePage/IacAsca/malicious_hover.svg b/media/icons/ignorePage/IacAsca/malicious_hover.svg new file mode 100644 index 00000000..06f38ae2 --- /dev/null +++ b/media/icons/ignorePage/IacAsca/malicious_hover.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/media/icons/ignorePage/IacAsca/medium.svg b/media/icons/ignorePage/IacAsca/medium.svg new file mode 100644 index 00000000..eb03758f --- /dev/null +++ b/media/icons/ignorePage/IacAsca/medium.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/media/icons/ignorePage/IacAsca/medium_hover.svg b/media/icons/ignorePage/IacAsca/medium_hover.svg new file mode 100644 index 00000000..6c320409 --- /dev/null +++ b/media/icons/ignorePage/IacAsca/medium_hover.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/media/icons/ignorePage/iac_ignore.svg b/media/icons/ignorePage/iac_ignore.svg new file mode 100644 index 00000000..bad32f6a --- /dev/null +++ b/media/icons/ignorePage/iac_ignore.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/views/ignoredView/ignoredView.ts b/src/views/ignoredView/ignoredView.ts index da935987..fd8a6183 100644 --- a/src/views/ignoredView/ignoredView.ts +++ b/src/views/ignoredView/ignoredView.ts @@ -145,11 +145,13 @@ export class IgnoredView { const packageData = ignoreManager.getIgnoredPackagesData()[packageKey]; const fileCount = packageData ? packageData.files.filter(file => file.active).length : 0; + const displayName = packageData ? ignoredViewUtils.formatPackageDisplayName(packageKey, packageData.type) : packageKey; + const success = ignoreManager.revivePackage(packageKey); if (success) { vscode.window.showInformationMessage( - `'${packageKey}' vulnerability has been revived in ${fileCount} files.`, + `'${displayName}' vulnerability has been revived in ${fileCount} files.`, 'Close', 'Undo' ); @@ -362,18 +364,23 @@ export class IgnoredView { const fileButtons = ignoredViewUtils.generateFileButtons(pkg.files, webview, extensionPath, pkg.type); const scaIcon = pkg.type === constants.ossRealtimeScannerEngineName ? ignoredViewUtils.getScaIconPath(webview, extensionPath) : ''; const secretsIcon = pkg.type === constants.secretsScannerEngineName ? ignoredViewUtils.getSecretsIgnoreIconPath(webview, extensionPath) : ''; + const iacIcon = pkg.type === constants.iacRealtimeScannerEngineName ? ignoredViewUtils.getIacIgnoreIconPath(webview, extensionPath) : ''; const packageIcon = pkg.type === constants.ossRealtimeScannerEngineName ? ignoredViewUtils.getPackageIconPath(pkg.severity || 'medium', webview, extensionPath) : pkg.type === constants.secretsScannerEngineName ? ignoredViewUtils.getSecretsIconPath(pkg.severity || 'medium', webview, extensionPath) - : ''; + : pkg.type === constants.iacRealtimeScannerEngineName + ? ignoredViewUtils.getIacIconPath(pkg.severity || 'medium', webview, extensionPath) + : ''; const packageIconHover = pkg.type === constants.ossRealtimeScannerEngineName ? ignoredViewUtils.getPackageIconPath(pkg.severity || 'medium', webview, extensionPath, true) : pkg.type === constants.secretsScannerEngineName ? ignoredViewUtils.getSecretsIconPath(pkg.severity || 'medium', webview, extensionPath, true) - : ''; + : pkg.type === constants.iacRealtimeScannerEngineName + ? ignoredViewUtils.getIacIconPath(pkg.severity || 'medium', webview, extensionPath, true) + : ''; const displayName = ignoredViewUtils.formatPackageDisplayName(packageKey, pkg.type); @@ -394,6 +401,7 @@ export class IgnoredView {
${scaIcon ? `SCA` : ''} ${secretsIcon ? `Secrets` : ''} + ${iacIcon ? `IaC` : ''} ${fileButtons}
diff --git a/src/views/ignoredView/ignoredViewUtils.ts b/src/views/ignoredView/ignoredViewUtils.ts index 63542c0d..37ae087d 100644 --- a/src/views/ignoredView/ignoredViewUtils.ts +++ b/src/views/ignoredView/ignoredViewUtils.ts @@ -70,6 +70,24 @@ export function getSecretsIgnoreIconPath(webview: vscode.Webview, extensionPath: return iconPath?.toString() || ''; } +export function getIacIconPath(severity: string, webview: vscode.Webview, extensionPath: string, isHover: boolean = false): string { + const normalizedSeverity = (severity?.toLowerCase()) || 'medium'; + const iconName = isHover ? `${normalizedSeverity}_hover` : normalizedSeverity; + + const iconPath = webview.asWebviewUri( + vscode.Uri.file(path.join(extensionPath, 'media', 'icons', 'ignorePage', 'IacAsca', `${iconName}.svg`)) + ); + + return iconPath?.toString() || ''; +} + +export function getIacIgnoreIconPath(webview: vscode.Webview, extensionPath: string): string { + const iconPath = webview.asWebviewUri( + vscode.Uri.file(path.join(extensionPath, 'media', 'icons', 'ignorePage', 'iac_ignore.svg')) + ); + return iconPath?.toString() || ''; +} + export function getGenericFileIconPath(webview: vscode.Webview, extensionPath: string): string { const iconPath = webview.asWebviewUri( vscode.Uri.file(path.join(extensionPath, 'media', 'icons', 'ignorePage', 'genericFile.svg')) @@ -89,6 +107,8 @@ export function formatPackageDisplayName(packageKey: string, packageType: string return packageKey.replace(':', '@'); } else if (packageType === constants.secretsScannerEngineName) { return packageKey.split(':')[0]; + } else if (packageType === constants.iacRealtimeScannerEngineName) { + return packageKey.split(':')[0]; // Show only title for IaC } return packageKey; } From 03e719c48900659c4279552126011701a11f1023 Mon Sep 17 00:00:00 2001 From: Itay Paz Date: Wed, 6 Aug 2025 14:23:05 +0300 Subject: [PATCH 04/12] Finish iac logic and ui flow --- src/views/ignoredView/ignoredView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/ignoredView/ignoredView.ts b/src/views/ignoredView/ignoredView.ts index fd8a6183..addabe1d 100644 --- a/src/views/ignoredView/ignoredView.ts +++ b/src/views/ignoredView/ignoredView.ts @@ -409,7 +409,7 @@ export class IgnoredView {
${lastUpdated}
- From 5e32661cc588e28c5140e1a0c2827777a44365f8 Mon Sep 17 00:00:00 2001 From: Itay Paz Date: Wed, 6 Aug 2025 16:19:32 +0300 Subject: [PATCH 05/12] Support with asca and containers in ignore manager --- src/commands/openAIChatCommand.ts | 11 +++++++++-- src/extension.ts | 14 +++++++++++--- src/realtimeScanners/common/ignoreFileManager.ts | 15 ++++++++++++++- .../scanners/asca/ascaScannerCommand.ts | 4 ++++ .../containers/containersScannerCommand.ts | 4 ++++ 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/commands/openAIChatCommand.ts b/src/commands/openAIChatCommand.ts index d4387b40..6bb6859b 100644 --- a/src/commands/openAIChatCommand.ts +++ b/src/commands/openAIChatCommand.ts @@ -22,7 +22,8 @@ import { IgnoreFileManager } from "../realtimeScanners/common/ignoreFileManager" import { OssScannerService } from "../realtimeScanners/scanners/oss/ossScannerService"; import { SecretsScannerService } from "../realtimeScanners/scanners/secrets/secretsScannerService"; import { IacScannerService } from "../realtimeScanners/scanners/iac/iacScannerService"; - +import { AscaScannerService } from "../realtimeScanners/scanners/asca/ascaScannerService"; +import { ContainersScannerService } from '../realtimeScanners/scanners/containers/containersScannerService'; import { cx } from "../cx"; @@ -32,19 +33,25 @@ export class CopilotChatCommand { private ossScanner: OssScannerService; private secretsScanner: SecretsScannerService; private iacScanner: IacScannerService; + private ascaScanner: AscaScannerService; + private containersScanner: ContainersScannerService; constructor( context: vscode.ExtensionContext, logs: Logs, ossScanner: OssScannerService, secretsScanner: SecretsScannerService, - iacScanner: IacScannerService + iacScanner: IacScannerService, + ascaScanner: AscaScannerService, + containersScanner: ContainersScannerService ) { this.context = context; this.logs = logs; this.ossScanner = ossScanner; this.secretsScanner = secretsScanner; this.iacScanner = iacScanner; + this.ascaScanner = ascaScanner; + this.containersScanner = containersScanner; } private pressEnterWindows() { diff --git a/src/extension.ts b/src/extension.ts index 5a2a1085..ee7f5d03 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -35,7 +35,8 @@ import { OssScannerCommand } from "./realtimeScanners/scanners/oss/ossScannerCom import { SecretsScannerCommand } from "./realtimeScanners/scanners/secrets/secretsScannerCommand"; import { IgnoreFileManager } from "./realtimeScanners/common/ignoreFileManager"; import { IacScannerCommand } from "./realtimeScanners/scanners/iac/iacScannerCommand"; - +import { AscaScannerCommand } from "./realtimeScanners/scanners/asca/ascaScannerCommand"; +import { ContainersScannerCommand } from "./realtimeScanners/scanners/containers/containersScannerCommand"; import { registerMcpSettingsInjector } from "./services/mcpSettingsInjector"; let globalContext: vscode.ExtensionContext; @@ -305,15 +306,22 @@ export async function activate(context: vscode.ExtensionContext) { const iacCommand = scannerRegistry.getScanner(constants.iacRealtimeScannerEngineName) as IacScannerCommand; const iacScanner = iacCommand.getScannerService(); + const ascaCommand = scannerRegistry.getScanner(constants.ascaRealtimeScannerEngineName) as AscaScannerCommand; + const ascaScanner = ascaCommand.getScannerService(); + + const containersCommand = scannerRegistry.getScanner(constants.containersRealtimeScannerEngineName) as ContainersScannerCommand; + const containersScanner = containersCommand.getScannerService(); + ignoreFileManager.setOssScannerService(ossScanner); ignoreFileManager.setSecretsScannerService(secretScanner); ignoreFileManager.setIacScannerService(iacScanner); - + ignoreFileManager.setAscaScannerService(ascaScanner); + ignoreFileManager.setContainersScannerService(containersScanner); context.subscriptions.push({ dispose: () => ignoreFileManager.dispose() }); - const copilotChatCommand = new CopilotChatCommand(context, logs, ossScanner, secretScanner, iacScanner); + const copilotChatCommand = new CopilotChatCommand(context, logs, ossScanner, secretScanner, iacScanner, ascaScanner, containersScanner); registerMcpSettingsInjector(context); diff --git a/src/realtimeScanners/common/ignoreFileManager.ts b/src/realtimeScanners/common/ignoreFileManager.ts index c3a91cbc..91d71fc5 100644 --- a/src/realtimeScanners/common/ignoreFileManager.ts +++ b/src/realtimeScanners/common/ignoreFileManager.ts @@ -9,6 +9,8 @@ import { constants } from '../../utils/common/constants'; import CxSecretsResult from "@checkmarxdev/ast-cli-javascript-wrapper/dist/main/secrets/CxSecrets"; import CxIacResult from "@checkmarxdev/ast-cli-javascript-wrapper/dist/main/iacRealtime/CxIac"; import { IacScannerService } from '../scanners/iac/iacScannerService'; +import { AscaScannerService } from '../scanners/asca/ascaScannerService'; +import { ContainersScannerService } from '../scanners/containers/containersScannerService'; export interface IgnoreEntry { files: Array<{ path: string; @@ -38,6 +40,8 @@ export class IgnoreFileManager { private ossScannerService: OssScannerService | undefined; private secretsScannerService: SecretsScannerService | undefined; private iacScannerService: IacScannerService | undefined; + private ascaScannerService: AscaScannerService | undefined; + private containersScannerService: ContainersScannerService | undefined; private statusBarUpdateCallback: (() => void) | undefined; private uiRefreshCallback: (() => void) | undefined; @@ -79,6 +83,15 @@ export class IgnoreFileManager { this.iacScannerService = service; } + public setAscaScannerService(service: AscaScannerService): void { + this.ascaScannerService = service; + } + + + public setContainersScannerService(service: ContainersScannerService): void { + this.containersScannerService = service; + } + public setStatusBarUpdateCallback(callback: () => void): void { this.statusBarUpdateCallback = callback; } @@ -123,7 +136,7 @@ export class IgnoreFileManager { } private async detectAndHandleActiveChanges(): Promise { - if (!this.ossScannerService && !this.secretsScannerService && !this.iacScannerService) { + if (!this.ossScannerService && !this.secretsScannerService && !this.iacScannerService && !this.ascaScannerService && !this.containersScannerService) { return; } diff --git a/src/realtimeScanners/scanners/asca/ascaScannerCommand.ts b/src/realtimeScanners/scanners/asca/ascaScannerCommand.ts index f4f29088..d358709f 100644 --- a/src/realtimeScanners/scanners/asca/ascaScannerCommand.ts +++ b/src/realtimeScanners/scanners/asca/ascaScannerCommand.ts @@ -107,4 +107,8 @@ export class AscaScannerCommand extends BaseScannerCommand { this.scannerService.dispose(); this.hoverProviderDisposable?.dispose(); } + + public getScannerService(): AscaScannerService { + return this.scannerService as AscaScannerService; + } } diff --git a/src/realtimeScanners/scanners/containers/containersScannerCommand.ts b/src/realtimeScanners/scanners/containers/containersScannerCommand.ts index ecddc964..62f79fb0 100644 --- a/src/realtimeScanners/scanners/containers/containersScannerCommand.ts +++ b/src/realtimeScanners/scanners/containers/containersScannerCommand.ts @@ -156,4 +156,8 @@ export class ContainersScannerCommand extends BaseScannerCommand { } return super.dispose(); } + + public getScannerService(): ContainersScannerService { + return this.scannerService as ContainersScannerService; + } } From 054d32153b3e12b339c7c7d9bf48b6084f303a9e Mon Sep 17 00:00:00 2001 From: Itay Paz <143506741+cx-itay-paz@users.noreply.github.com> Date: Wed, 13 Aug 2025 10:46:09 +0300 Subject: [PATCH 06/12] Integrated ASCA, Containers, and IAC engines into IgnoreManager (UI & flow enabled for ASCA only) (AST-107991) (#1238) * Finish backend asca realtime need to implement ui page ignore support * Finish Asca support ignore ui page * Integrated ASCA, Containers, and IAC engines into IgnoreManager (UI & flow enabled for CONANRIES only) (AST-107991) (#1239) * add contanries large icons * Support contaniers include ui page * finish container include ui * fix cx scan --------- Co-authored-by: Itay Paz --------- Co-authored-by: Itay Paz --- .../icons/ignorePage/Containers/critical.svg | 5 + .../ignorePage/Containers/critical_hover.svg | 5 + media/icons/ignorePage/Containers/high.svg | 5 + .../ignorePage/Containers/high_hover.svg | 5 + media/icons/ignorePage/Containers/low.svg | 5 + .../icons/ignorePage/Containers/low_hover.svg | 5 + .../icons/ignorePage/Containers/malicious.svg | 12 + .../ignorePage/Containers/malicious_hover.svg | 12 + media/icons/ignorePage/Containers/medium.svg | 5 + .../ignorePage/Containers/medium_hover.svg | 5 + media/icons/ignorePage/asca_ignore.svg | 4 + media/icons/ignorePage/containers_ignore.svg | 4 + .../icons/realtimeEngines/container_image.png | Bin 415 -> 424 bytes package-lock.json | 186 ++--------- package.json | 1 - src/commands/openAIChatCommand.ts | 86 +++++- src/cx/cx.ts | 10 +- src/cx/cxMock.ts | 2 +- src/cx/cxPlatform.ts | 4 +- .../common/ignoreFileManager.ts | 290 ++++++++++++++++-- src/realtimeScanners/common/types.ts | 2 + .../scanners/asca/ascaScannerService.ts | 190 +++++++++++- .../containers/containersScannerService.ts | 108 ++++++- src/utils/utils.ts | 121 ++++++++ src/views/ignoredView/ignoredView.ts | 23 +- src/views/ignoredView/ignoredViewUtils.ts | 43 ++- 26 files changed, 905 insertions(+), 233 deletions(-) create mode 100644 media/icons/ignorePage/Containers/critical.svg create mode 100644 media/icons/ignorePage/Containers/critical_hover.svg create mode 100644 media/icons/ignorePage/Containers/high.svg create mode 100644 media/icons/ignorePage/Containers/high_hover.svg create mode 100644 media/icons/ignorePage/Containers/low.svg create mode 100644 media/icons/ignorePage/Containers/low_hover.svg create mode 100644 media/icons/ignorePage/Containers/malicious.svg create mode 100644 media/icons/ignorePage/Containers/malicious_hover.svg create mode 100644 media/icons/ignorePage/Containers/medium.svg create mode 100644 media/icons/ignorePage/Containers/medium_hover.svg create mode 100644 media/icons/ignorePage/asca_ignore.svg create mode 100644 media/icons/ignorePage/containers_ignore.svg diff --git a/media/icons/ignorePage/Containers/critical.svg b/media/icons/ignorePage/Containers/critical.svg new file mode 100644 index 00000000..86ddb6e4 --- /dev/null +++ b/media/icons/ignorePage/Containers/critical.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/media/icons/ignorePage/Containers/critical_hover.svg b/media/icons/ignorePage/Containers/critical_hover.svg new file mode 100644 index 00000000..8db19ff2 --- /dev/null +++ b/media/icons/ignorePage/Containers/critical_hover.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/media/icons/ignorePage/Containers/high.svg b/media/icons/ignorePage/Containers/high.svg new file mode 100644 index 00000000..60f45106 --- /dev/null +++ b/media/icons/ignorePage/Containers/high.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/media/icons/ignorePage/Containers/high_hover.svg b/media/icons/ignorePage/Containers/high_hover.svg new file mode 100644 index 00000000..c94084c8 --- /dev/null +++ b/media/icons/ignorePage/Containers/high_hover.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/media/icons/ignorePage/Containers/low.svg b/media/icons/ignorePage/Containers/low.svg new file mode 100644 index 00000000..41ce3430 --- /dev/null +++ b/media/icons/ignorePage/Containers/low.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/media/icons/ignorePage/Containers/low_hover.svg b/media/icons/ignorePage/Containers/low_hover.svg new file mode 100644 index 00000000..4f567be9 --- /dev/null +++ b/media/icons/ignorePage/Containers/low_hover.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/media/icons/ignorePage/Containers/malicious.svg b/media/icons/ignorePage/Containers/malicious.svg new file mode 100644 index 00000000..50b2b168 --- /dev/null +++ b/media/icons/ignorePage/Containers/malicious.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/media/icons/ignorePage/Containers/malicious_hover.svg b/media/icons/ignorePage/Containers/malicious_hover.svg new file mode 100644 index 00000000..d59678d8 --- /dev/null +++ b/media/icons/ignorePage/Containers/malicious_hover.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/media/icons/ignorePage/Containers/medium.svg b/media/icons/ignorePage/Containers/medium.svg new file mode 100644 index 00000000..da771039 --- /dev/null +++ b/media/icons/ignorePage/Containers/medium.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/media/icons/ignorePage/Containers/medium_hover.svg b/media/icons/ignorePage/Containers/medium_hover.svg new file mode 100644 index 00000000..f5b664b6 --- /dev/null +++ b/media/icons/ignorePage/Containers/medium_hover.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/media/icons/ignorePage/asca_ignore.svg b/media/icons/ignorePage/asca_ignore.svg new file mode 100644 index 00000000..7c77ed83 --- /dev/null +++ b/media/icons/ignorePage/asca_ignore.svg @@ -0,0 +1,4 @@ + + + + diff --git a/media/icons/ignorePage/containers_ignore.svg b/media/icons/ignorePage/containers_ignore.svg new file mode 100644 index 00000000..4cd6a04b --- /dev/null +++ b/media/icons/ignorePage/containers_ignore.svg @@ -0,0 +1,4 @@ + + + + diff --git a/media/icons/realtimeEngines/container_image.png b/media/icons/realtimeEngines/container_image.png index bff72a4ce4e7eaf69d30891db240182f09be430f..919cc5662a886b535adddf82ccc93117051885ba 100644 GIT binary patch delta 382 zcmV-^0fGLX1E>QbiBL{Q4GJ0x0000DNk~Le0000K0000K2nGNE0F8+q4Ur)=e?3V= zK~#7F-Bit0gFq0T8T2eAqy((M;A8Kxf|w5Mz!G>=pdH9j`FTqRY6s~+o@dx`cJp{f z1w%+q`7X@P&o}!G0{|z1qAVX?@**9ROS=-Z)`2|cgm{%@S#S_xQRroBjAj6z5o#pw z^*Jx^CJ~mUzGpCx2B2<;E?c5de@NFJLYzx%s1COeS*8O-@R4B2Y;MI>Bk+pZt6j3h z08PvcGdZTflvuw~VfBYly2ilfUpd3TN=4Tp{E$4E%oWc&t9OQWR?@(BbW#~O5$Q=6 z6Z=MP_10J0OGpfrQmX2TkU5n(rW+gAQ52=}=HEvX9)hD2p7lBHBFh)zRLfG&WJP3M z&^Ks&WETx=tZB`~XhOk43KriD@M%NlV97oP>b50g1ry=6;`a?34_D`{39LNW6Q4w* c{zNB=F9yDZiwlIvAOHXW07*qoM6N<$f|7ut9{>OV delta 373 zcmV-*0gC>p1D^vSiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZy6!% zK~#7Ftx~~J!$1sNoy{AUkQS&Q@x&hBg;N1gL6Qm}6+kK=E%3#5TmmVJ zs9VM@2;A#QGeRID5Bo{S{C*wB&wBpI)`1A!cLk&Z$QvF~H)Jk%XCCqaTWCL!ro{;4 zitPjW#oD0*Dr-!5VeO1T)2%R$K==4.0.0" } @@ -3618,6 +3607,7 @@ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, "license": "Apache-2.0", + "optional": true, "engines": { "node": ">=8" } @@ -4392,6 +4382,7 @@ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true, "license": "(MIT OR WTFPL)", + "optional": true, "engines": { "node": ">=6" } @@ -4824,7 +4815,8 @@ "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" + "license": "MIT", + "optional": true }, "node_modules/glob": { "version": "7.2.3", @@ -5388,7 +5380,8 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true }, "node_modules/install": { "version": "0.13.0", @@ -6106,6 +6099,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, "dependencies": { "node-addon-api": "^4.3.0", "prebuild-install": "^7.0.1" @@ -6516,6 +6510,7 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", + "optional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6734,7 +6729,8 @@ "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" + "license": "MIT", + "optional": true }, "node_modules/natural-compare": { "version": "1.4.0", @@ -6784,6 +6780,7 @@ "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "semver": "^7.3.5" }, @@ -6796,7 +6793,8 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/node-fetch": { "version": "2.7.0", @@ -7570,6 +7568,7 @@ "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -7719,6 +7718,7 @@ "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", @@ -7735,6 +7735,7 @@ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -8316,7 +8317,8 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/simple-get": { "version": "4.0.1", @@ -8338,6 +8340,7 @@ } ], "license": "MIT", + "optional": true, "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -9131,6 +9134,7 @@ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "license": "Apache-2.0", + "optional": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -9389,154 +9393,6 @@ "node": ">= 0.10" } }, - "node_modules/vsce": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.15.0.tgz", - "integrity": "sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==", - "deprecated": "vsce has been renamed to @vscode/vsce. Install using @vscode/vsce instead.", - "dev": true, - "license": "MIT", - "dependencies": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", - "glob": "^7.0.6", - "hosted-git-info": "^4.0.2", - "keytar": "^7.7.0", - "leven": "^3.1.0", - "markdown-it": "^12.3.2", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.4.23", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "bin": { - "vsce": "vsce" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/vsce/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/vsce/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/vsce/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vsce/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/vsce/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/vsce/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/vsce/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/vscode-extension-tester": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-8.3.0.tgz", diff --git a/package.json b/package.json index 3fbf50e9..28e0b072 100644 --- a/package.json +++ b/package.json @@ -1052,7 +1052,6 @@ "sinon": "^19.0.2", "ts-node": "^10.9.2", "typescript": "^5.6.3", - "vsce": "^2.15.0", "vscode-extension-tester": "8.3.0", "vscode-extension-tester-locators": "^3.12.2", "webpack": "^5.94.0", diff --git a/src/commands/openAIChatCommand.ts b/src/commands/openAIChatCommand.ts index 6bb6859b..c54e9508 100644 --- a/src/commands/openAIChatCommand.ts +++ b/src/commands/openAIChatCommand.ts @@ -3,7 +3,7 @@ import { Logs } from "../models/logs"; import { commands } from "../utils/common/commands"; import { constants, Platform } from "../utils/common/constants"; import { spawn } from "child_process"; -import { isCursorIDE, isSecretsHoverData, getWorkspaceFolder, getInitializedIgnoreManager, findAndIgnoreMatchingPackages, rescanFiles, isContainersHoverData, isAscaHoverData, isIacHoverData } from "../utils/utils"; +import { isCursorIDE, isSecretsHoverData, getWorkspaceFolder, getInitializedIgnoreManager, findAndIgnoreMatchingPackages, rescanFiles, isContainersHoverData, isAscaHoverData, isIacHoverData, findAndIgnoreMatchingContainersInWorkspace, rescanContainerFiles } from "../utils/utils"; import { HoverData, SecretsHoverData, AscaHoverData, ContainersHoverData, IacHoverData } from "../realtimeScanners/common/types"; import { @@ -216,7 +216,7 @@ export class CopilotChatCommand { ); this.context.subscriptions.push( - vscode.commands.registerCommand(commands.ignorePackage, async (item: HoverData | SecretsHoverData | IacHoverData) => { + vscode.commands.registerCommand(commands.ignorePackage, async (item: HoverData | SecretsHoverData | IacHoverData | AscaHoverData | ContainersHoverData) => { this.logUserEvent("click", constants.ignorePackage, item); @@ -226,6 +226,12 @@ export class CopilotChatCommand { if (isIacHoverData(item)) { const iacItem = item as IacHoverData & { originalFilePath?: string }; workspaceFolder = getWorkspaceFolder(iacItem.originalFilePath); + } else if (isContainersHoverData(item)) { + workspaceFolder = vscode.workspace.workspaceFolders?.[0]; + if (!workspaceFolder) { + vscode.window.showErrorMessage("No workspace folder found."); + return; + } } else { workspaceFolder = getWorkspaceFolder(item.filePath); } @@ -272,6 +278,45 @@ export class CopilotChatCommand { const secretsScannerForScan = this.secretsScanner as SecretsScannerService; await secretsScannerForScan.scan(document, this.logs); } + else if (isAscaHoverData(item)) { + ignoreManager.addIgnoredEntryAsca({ + ruleName: item.ruleName, + ruleId: item.ruleId!, + filePath: item.filePath || '', + line: (item.location?.line || 0), + severity: item.severity, + description: item.description, + dateAdded: new Date().toISOString() + }); + + vscode.window.showInformationMessage(`ASCA rule '${item.ruleName}' ignored successfully.`); + + const document = vscode.workspace.textDocuments.find(doc => doc.uri.fsPath === (item.filePath || '')) + ?? await vscode.workspace.openTextDocument(item.filePath || ''); + if (this.ascaScanner && this.ascaScanner.scan) { + await this.ascaScanner.scan(document, this.logs); + } + } + else if (isContainersHoverData(item)) { + ignoreManager.addIgnoredEntryContainers({ + imageName: item.imageName, + imageTag: item.imageTag, + filePath: vscode.window.activeTextEditor?.document.uri.fsPath || '', + line: (item.location?.line || 0) + 1, + severity: item.status, + description: item.vulnerabilities && item.vulnerabilities.length > 0 ? + item.vulnerabilities.map(v => `${v.cve}: ${v.severity}`).join(', ') : + undefined, + dateAdded: new Date().toISOString() + }); + + vscode.window.showInformationMessage(`Container ${item.imageName}:${item.imageTag} ignored successfully.`); + + const document = vscode.window.activeTextEditor?.document; + if (document && this.containersScanner && this.containersScanner.shouldScanFile(document)) { + await this.containersScanner.scan(document, this.logs); + } + } else { ignoreManager.addIgnoredEntry({ packageManager: item.packageManager, @@ -304,19 +349,38 @@ export class CopilotChatCommand { this.context.subscriptions.push( - vscode.commands.registerCommand(commands.ignoreAll, async (item: HoverData) => { + vscode.commands.registerCommand(commands.ignoreAll, async (item: HoverData | ContainersHoverData) => { this.logUserEvent("click", constants.ignoreAll, item); try { - const workspaceFolder = getWorkspaceFolder(item.filePath); - const ignoreManager = getInitializedIgnoreManager(workspaceFolder); - const scanner = this.ossScanner as OssScannerService; + if (isContainersHoverData(item)) { + const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; + if (!workspaceFolder) { + vscode.window.showErrorMessage("No workspace folder found."); + return; + } - const affectedFiles = findAndIgnoreMatchingPackages(item, scanner, ignoreManager); - await rescanFiles(affectedFiles, scanner, this.logs); + const ignoreManager = getInitializedIgnoreManager(workspaceFolder); + const scanner = this.containersScanner as ContainersScannerService; - vscode.window.showInformationMessage( - `Ignored ${item.packageName}@${item.version} in ${affectedFiles.size} files.` - ); + const affectedFiles = await findAndIgnoreMatchingContainersInWorkspace(item, scanner, ignoreManager, this.logs); + await rescanContainerFiles(affectedFiles, scanner, this.logs); + + vscode.window.showInformationMessage( + `Ignored ${item.imageName}@${item.imageTag} in ${affectedFiles.size} files.` + ); + } else { + const ossItem = item as HoverData; + const workspaceFolder = getWorkspaceFolder(ossItem.filePath); + const ignoreManager = getInitializedIgnoreManager(workspaceFolder); + const scanner = this.ossScanner as OssScannerService; + + const affectedFiles = findAndIgnoreMatchingPackages(ossItem, scanner, ignoreManager); + await rescanFiles(affectedFiles, scanner, this.logs); + + vscode.window.showInformationMessage( + `Ignored ${ossItem.packageName}@${ossItem.version} in ${affectedFiles.size} files.` + ); + } } catch (err) { this.logs.error(`Failed to ignore all: ${err}`); vscode.window.showErrorMessage(`Failed to ignore all: ${err}`); diff --git a/src/cx/cx.ts b/src/cx/cx.ts index 658a64fc..96f4625a 100644 --- a/src/cx/cx.ts +++ b/src/cx/cx.ts @@ -629,7 +629,7 @@ export class Cx implements CxPlatform { config = new CxConfig(); } const cx = new CxWrapper(config); - const scans = await cx.scanAsca(null, true, constants.vsCodeAgent); + const scans = await cx.scanAsca(null, true, constants.vsCodeAgent, null); if (scans.payload && scans.exitCode === 0) { return scans.payload[0]; } else { @@ -644,13 +644,13 @@ export class Cx implements CxPlatform { return errorRes; } - async scanAsca(sourcePath: string): Promise { + async scanAsca(sourcePath: string, ignorePath: string): Promise { let config = await this.getAstConfiguration(); if (!config) { config = new CxConfig(); } const cx = new CxWrapper(config); - const scans = await cx.scanAsca(sourcePath, false, constants.vsCodeAgent); + const scans = await cx.scanAsca(sourcePath, false, constants.vsCodeAgent, ignorePath); if (scans.payload && scans.exitCode === 0) { return scans.payload[0]; } else { @@ -658,14 +658,14 @@ export class Cx implements CxPlatform { } } - async scanContainers(sourcePath: string): Promise { + async scanContainers(sourcePath: string, ignoredFilePath?: string): Promise { let config = await this.getAstConfiguration(); if (!config) { config = new CxConfig(); } const cx = new CxWrapper(config); - const scans = await cx.containersRealtimeScanResults(sourcePath); + const scans = await cx.containersRealtimeScanResults(sourcePath, ignoredFilePath); if (scans.payload && scans.exitCode === 0) { return scans.payload[0]; } else { diff --git a/src/cx/cxMock.ts b/src/cx/cxMock.ts index 0ea996b7..ef7d5997 100644 --- a/src/cx/cxMock.ts +++ b/src/cx/cxMock.ts @@ -1471,7 +1471,7 @@ export class CxMock implements CxPlatform { } - async scanContainers(sourcePath: string): Promise { + async scanContainers(sourcePath: string, ignoredFilePath): Promise { return { Images: [ { diff --git a/src/cx/cxPlatform.ts b/src/cx/cxPlatform.ts index cc9c3363..afd45324 100644 --- a/src/cx/cxPlatform.ts +++ b/src/cx/cxPlatform.ts @@ -225,7 +225,7 @@ export interface CxPlatform { * Scan the edited file in the ASCA engine and show the results in the problem section * @param sourcePath the edited file sent to the ASCA engine */ - scanAsca(sourcePath: string): Promise; + scanAsca(sourcePath: string, ignorePath: string): Promise; ossScanResults(sourcePath: string, ignoredFilePath?: string): Promise; @@ -233,7 +233,7 @@ export interface CxPlatform { * Scan the edited file in the Containers engine and show the results in the problem section * @param sourcePath the edited file sent to the Containers engine */ - scanContainers(sourcePath: string): Promise; + scanContainers(sourcePath: string, ignoredFilePath): Promise; iacScanResults(sourcePath: string, dockerProvider: string, ignoredFilePath?: string): Promise; diff --git a/src/realtimeScanners/common/ignoreFileManager.ts b/src/realtimeScanners/common/ignoreFileManager.ts index 91d71fc5..94eba522 100644 --- a/src/realtimeScanners/common/ignoreFileManager.ts +++ b/src/realtimeScanners/common/ignoreFileManager.ts @@ -19,6 +19,9 @@ export interface IgnoreEntry { }>; secretValue?: string; similarityId?: string; + ruleId?: number; + imageName?: string; + imageTag?: string; type: string; PackageManager?: string; PackageName: string; @@ -87,7 +90,6 @@ export class IgnoreFileManager { this.ascaScannerService = service; } - public setContainersScannerService(service: ContainersScannerService): void { this.containersScannerService = service; } @@ -306,6 +308,12 @@ export class IgnoreFileManager { if (this.iacScannerService && this.iacScannerService.shouldScanFile(document)) { await this.iacScannerService.scan(document, logs); } + if (this.ascaScannerService && this.ascaScannerService.shouldScanFile(document)) { + await this.ascaScannerService.scan(document, logs); + } + if (this.containersScannerService && this.containersScannerService.shouldScanFile(document)) { + await this.containersScannerService.scan(document, logs); + } } catch (error) { console.error(`Error rescanning file ${fullPath}:`, error); } @@ -595,6 +603,97 @@ export class IgnoreFileManager { this.uiRefreshCallback?.(); } + public addIgnoredEntryAsca(entry: { + ruleName: string; + ruleId: number; + filePath: string; + line: number; + severity?: string; + description?: string; + dateAdded?: string; + }): void { + const relativePath = path.relative(this.workspaceRootPath, entry.filePath); + const packageKey = `${entry.ruleName}:${entry.ruleId}:${relativePath}`; + + if (!this.ignoreData[packageKey]) { + this.ignoreData[packageKey] = { + files: [{ + path: relativePath, + active: true, + line: entry.line + 1 + }], + type: constants.ascaRealtimeScannerEngineName, + PackageName: entry.ruleName, + ruleId: entry.ruleId, + severity: entry.severity, + description: entry.description, + dateAdded: entry.dateAdded + }; + } else { + const existingFileEntry = this.ignoreData[packageKey].files.find(f => f.path === relativePath); + if (existingFileEntry) { + existingFileEntry.active = true; + } else { + this.ignoreData[packageKey].files.push({ + path: relativePath, + active: true, + line: this.ignoreData[packageKey].files[0]?.line || (entry.line + 1) + }); + } + if (entry.severity !== undefined) { this.ignoreData[packageKey].severity = entry.severity; } + if (entry.description !== undefined) { this.ignoreData[packageKey].description = entry.description; } + } + this.saveIgnoreFile(); + this.updateTempList(); + this.uiRefreshCallback?.(); + } + + public addIgnoredEntryContainers(entry: { + imageName: string; + imageTag: string; + filePath: string; + line: number; + severity?: string; + description?: string; + dateAdded?: string; + }): void { + const relativePath = path.relative(this.workspaceRootPath, entry.filePath); + const packageKey = `${entry.imageName}:${entry.imageTag}`; + + if (!this.ignoreData[packageKey]) { + this.ignoreData[packageKey] = { + files: [{ + path: relativePath, + active: true, + line: entry.line + }], + type: constants.containersRealtimeScannerEngineName, + PackageName: `${entry.imageName}:${entry.imageTag}`, + imageName: entry.imageName, + imageTag: entry.imageTag, + severity: entry.severity, + description: entry.description, + dateAdded: entry.dateAdded + }; + } else { + const existingFileEntry = this.ignoreData[packageKey].files.find(f => f.path === relativePath); + if (existingFileEntry) { + existingFileEntry.active = true; + } else { + this.ignoreData[packageKey].files.push({ + path: relativePath, + active: true, + line: this.ignoreData[packageKey].files[0]?.line || entry.line + }); + } + if (entry.severity !== undefined) { this.ignoreData[packageKey].severity = entry.severity; } + if (entry.description !== undefined) { this.ignoreData[packageKey].description = entry.description; } + } + this.saveIgnoreFile(); + this.updateTempList(); + this.uiRefreshCallback?.(); + } + private saveIgnoreFile(): void { fs.writeFileSync(this.getIgnoreFilePath(), JSON.stringify(this.ignoreData, null, 2)); if (this.statusBarUpdateCallback) { @@ -603,34 +702,70 @@ export class IgnoreFileManager { } private updateTempList(): void { - const tempList = Object.values(this.ignoreData).flatMap(entry => - entry.files - .filter(file => file.active) - .map(file => { - const originalPath = path.resolve(this.workspaceRootPath, file.path); - const scannedTempPath = this.scannedFileMap?.get(originalPath) || originalPath; - - if (entry.type === constants.secretsScannerEngineName) { - return { - Title: entry.PackageName, - FilePath: scannedTempPath, - SecretValue: entry.secretValue - }; - } else if (entry.type === constants.iacRealtimeScannerEngineName) { - return { - Title: entry.PackageName, - SimilarityID: entry.similarityId - }; - } else { - return { - PackageManager: entry.PackageManager, - PackageName: entry.PackageName, - PackageVersion: entry.PackageVersion, - FilePath: scannedTempPath, - }; - } - }) - ); + const tempList: Array<{ + Title?: string; + FilePath?: string; + SecretValue?: string; + SimilarityID?: string; + FileName?: string; + Line?: number; + RuleID?: number; + ImageName?: string; + ImageTag?: string; + PackageManager?: string; + PackageName?: string; + PackageVersion?: string; + }> = []; + const addedContainers = new Set(); + + Object.values(this.ignoreData).forEach(entry => { + const hasActiveFiles = entry.files.some(file => file.active); + if (!hasActiveFiles) { return; } + + if (entry.type === constants.containersRealtimeScannerEngineName) { + const containerKey = `${entry.imageName}:${entry.imageTag}`; + if (!addedContainers.has(containerKey)) { + tempList.push({ + ImageName: entry.imageName, + ImageTag: entry.imageTag + }); + addedContainers.add(containerKey); + } + } else { + entry.files + .filter(file => file.active) + .forEach(file => { + const originalPath = path.resolve(this.workspaceRootPath, file.path); + const scannedTempPath = this.scannedFileMap?.get(originalPath) || originalPath; + + if (entry.type === constants.secretsScannerEngineName) { + tempList.push({ + Title: entry.PackageName, + FilePath: scannedTempPath, + SecretValue: entry.secretValue + }); + } else if (entry.type === constants.iacRealtimeScannerEngineName) { + tempList.push({ + Title: entry.PackageName, + SimilarityID: entry.similarityId + }); + } else if (entry.type === constants.ascaRealtimeScannerEngineName) { + tempList.push({ + FileName: path.basename(scannedTempPath), + Line: file.line, + RuleID: entry.ruleId + }); + } else { + tempList.push({ + PackageManager: entry.PackageManager, + PackageName: entry.PackageName, + PackageVersion: entry.PackageVersion, + FilePath: scannedTempPath, + }); + } + }); + } + }); fs.writeFileSync(this.getTempListPath(), JSON.stringify(tempList, null, 2)); } @@ -755,8 +890,105 @@ export class IgnoreFileManager { return hasChanges; } + public removeMissingAsca(currentResults: unknown[], filePath: string): boolean { + let hasChanges = false; + const relativePath = path.relative(this.workspaceRootPath, filePath); + const currentAsca = new Map(); + currentResults.forEach(result => { + const scanDetail = result as { ruleName: string; ruleId: number; line: number }; + const key = `${scanDetail.ruleName}:${scanDetail.ruleId}`; + const lines = currentAsca.get(key) || []; + lines.push(scanDetail.line); + currentAsca.set(key, lines); + }); + + Object.entries(this.ignoreData).forEach(([packageKey, entry]) => { + if (entry.type !== constants.ascaRealtimeScannerEngineName) { return; } + + const fileEntry = entry.files.find(f => f.path === relativePath); + if (!fileEntry) { return; } + + const ascaKey = `${entry.PackageName}:${entry.ruleId}`; + const currentLines = currentAsca.get(ascaKey) || []; + const lineStillExists = currentLines.includes(fileEntry.line); + if (!lineStillExists) { + if (currentLines.length === 0) { + delete this.ignoreData[packageKey]; + hasChanges = true; + } else { + fileEntry.line = currentLines[0]; + hasChanges = true; + } + } + }); + + if (hasChanges) { + this.saveIgnoreFile(); + this.updateTempList(); + this.uiRefreshCallback?.(); + } + + return hasChanges; + } + + public removeMissingContainers(currentResults: unknown[], filePath: string): boolean { + const relativePath = path.relative(this.workspaceRootPath, filePath); + let hasChanges = false; + + const currentImages = new Map(); + currentResults.forEach(result => { + const containerResult = result as { imageName: string; imageTag: string; locations: Array<{ line: number }> }; + const imageKey = `${containerResult.imageName}:${containerResult.imageTag}`; + if (!currentImages.has(imageKey)) { + currentImages.set(imageKey, []); + } + containerResult.locations.forEach(location => { + currentImages.get(imageKey)!.push(location.line); + }); + }); + + Object.keys(this.ignoreData).forEach(packageKey => { + const entry = this.ignoreData[packageKey]; + if (entry.type !== constants.containersRealtimeScannerEngineName) { + return; + } + + const fileEntry = entry.files.find(f => f.path === relativePath && f.active); + if (!fileEntry) { + return; + } + + const imageKey = `${entry.imageName}:${entry.imageTag}`; + const currentLines = currentImages.get(imageKey) || []; + + if (currentLines.length === 0) { + const updatedFiles = entry.files.filter(f => f.path !== relativePath); + if (updatedFiles.length === 0) { + delete this.ignoreData[packageKey]; + } else { + entry.files = updatedFiles; + } + hasChanges = true; + } else { + entry.files.forEach(fileEntry => { + if (fileEntry.path === relativePath && fileEntry.active) { + fileEntry.line = currentLines[0] + 1; + hasChanges = true; + } + }); + } + }); + + if (hasChanges) { + this.saveIgnoreFile(); + this.updateTempList(); + this.uiRefreshCallback?.(); + } + + return hasChanges; + } } diff --git a/src/realtimeScanners/common/types.ts b/src/realtimeScanners/common/types.ts index 66491ed8..08197bfd 100644 --- a/src/realtimeScanners/common/types.ts +++ b/src/realtimeScanners/common/types.ts @@ -54,6 +54,8 @@ export interface AscaHoverData { description: string; severity: string; remediationAdvise: string; + ruleId?: number; + filePath?: string; location?: { line: number; startIndex: number; diff --git a/src/realtimeScanners/scanners/asca/ascaScannerService.ts b/src/realtimeScanners/scanners/asca/ascaScannerService.ts index b858724c..6aec7d5f 100644 --- a/src/realtimeScanners/scanners/asca/ascaScannerService.ts +++ b/src/realtimeScanners/scanners/asca/ascaScannerService.ts @@ -8,6 +8,7 @@ import path from "path"; import CxAsca from "@checkmarxdev/ast-cli-javascript-wrapper/dist/main/asca/CxAsca"; import { cx } from "../../../cx"; import fs from "fs"; +import { IgnoreFileManager } from "../../common/ignoreFileManager"; export class AscaScannerService extends BaseScannerService { private diagnosticsMap = new Map(); @@ -16,6 +17,7 @@ export class AscaScannerService extends BaseScannerService { private highDecorations = new Map(); private mediumDecorations = new Map(); private lowDecorations = new Map(); + private ignoredDecorations = new Map(); private documentOpenListener: vscode.Disposable | undefined; private editorChangeListener: vscode.Disposable | undefined; @@ -28,6 +30,7 @@ export class AscaScannerService extends BaseScannerService { high: this.createDecoration("realtimeEngines/high_severity.svg"), medium: this.createDecoration("realtimeEngines/medium_severity.svg"), low: this.createDecoration("realtimeEngines/low_severity.svg"), + ignored: this.createDecoration("Ignored.svg"), underline: vscode.window.createTextEditorDecorationType({ textDecoration: "underline wavy #f14c4c", rangeBehavior: vscode.DecorationRangeBehavior.ClosedClosed, @@ -103,14 +106,80 @@ export class AscaScannerService extends BaseScannerService { document.getText() ); - const scanResults = await cx.scanAsca(tempFilePath); + const ignoreManager = IgnoreFileManager.getInstance(); + ignoreManager.setScannedFilePath(filePath, tempFilePath); - if (scanResults.error) { - logs.warn("ASCA Warning: " + (scanResults.error.description ?? scanResults.error)); + const fullScanResults = await cx.scanAsca(tempFilePath, ""); + + if (fullScanResults.error) { + logs.warn("ASCA Warning: " + (fullScanResults.error.description ?? fullScanResults.error)); return; } + if (ignoreManager.getIgnoredPackagesCount() > 0) { + ignoreManager.removeMissingAsca(fullScanResults.scanDetails, filePath); + } + const ignoredPackagesFile = ignoreManager.getIgnoredPackagesTempFile(); + const scanResults = await cx.scanAsca(tempFilePath, ignoredPackagesFile || ""); + this.updateProblems(scanResults, document.uri); + + if (ignoreManager.getIgnoredPackagesCount() > 0) { + this.cleanupIgnoredEntries(fullScanResults.scanDetails, filePath); + } + + + const ignoredData = ignoreManager.getIgnoredPackagesData(); + const relativePath = path.relative(vscode.workspace.workspaceFolders?.[0]?.uri.fsPath || '', filePath); + const ignoredDecorations: vscode.DecorationOptions[] = []; + + + const ascaLocations = new Map(); + fullScanResults.scanDetails.forEach(result => { + const key = `${result.ruleName}:${result.ruleId}`; + const lines = ascaLocations.get(key) || []; + lines.push(result.line - 1); + ascaLocations.set(key, lines); + }); + + Object.entries(ignoredData).forEach(([packageKey, entry]) => { + if (entry.type !== constants.ascaRealtimeScannerEngineName) { return; } + + const expectedPackageKey = `${entry.PackageName}:${entry.ruleId}:${relativePath}`; + if (packageKey !== expectedPackageKey) { return; } + + const fileEntry = entry.files.find(f => f.path === relativePath && f.active); + if (!fileEntry) { return; } + + const key = `${entry.PackageName}:${entry.ruleId}`; + const lines = ascaLocations.get(key) || []; + + lines.forEach(line => { + const adjustedLine = line; + const range = new vscode.Range( + new vscode.Position(adjustedLine, 0), + new vscode.Position(adjustedLine, 1000) + ); + ignoredDecorations.push({ range }); + + const hoverKey = `${filePath}:${adjustedLine}`; + if (!this.ascaHoverData.has(hoverKey)) { + this.ascaHoverData.set(hoverKey, { + ruleName: entry.PackageName, + description: entry.description || '', + severity: entry.severity || 'medium', + remediationAdvise: entry.description || '', + filePath: filePath, + ruleId: entry.ruleId, + location: { line: adjustedLine, startIndex: 0, endIndex: 1000 } + }); + } + }); + }); + + this.ignoredDecorations.set(filePath, ignoredDecorations); + this.applyDecorations(document.uri); + logs.info(`${scanResults.scanDetails.length} security best practice violations were found in ${filePath}`); } catch (error) { console.error(error); @@ -193,6 +262,8 @@ export class AscaScannerService extends BaseScannerService { description: result.description || result.remediationAdvise, severity: result.severity, remediationAdvise: result.remediationAdvise, + filePath: filePath, + ruleId: result.ruleId, location: { line: result.line - 1, startIndex: startIndex, @@ -236,6 +307,7 @@ export class AscaScannerService extends BaseScannerService { this.highDecorations.clear(); this.mediumDecorations.clear(); this.lowDecorations.clear(); + this.ignoredDecorations.clear(); } public dispose(): void { @@ -257,6 +329,7 @@ export class AscaScannerService extends BaseScannerService { this.highDecorations.delete(filePath); this.mediumDecorations.delete(filePath); this.lowDecorations.delete(filePath); + this.ignoredDecorations.delete(filePath); } public async initializeScanner(): Promise { @@ -298,6 +371,7 @@ export class AscaScannerService extends BaseScannerService { editor.setDecorations(this.decorationTypes.high, highDecorations); editor.setDecorations(this.decorationTypes.medium, mediumDecorations); editor.setDecorations(this.decorationTypes.low, lowDecorations); + editor.setDecorations(this.decorationTypes.ignored, this.ignoredDecorations.get(filePath) || []); } // Getter for hover data to be used by the command @@ -309,4 +383,114 @@ export class AscaScannerService extends BaseScannerService { getDiagnosticsMap(): Map { return this.diagnosticsMap; } + + private updateIgnoredDecorationLine(filePath: string, oldLine: number, newLine: number): void { + const ignoredDecorations = this.ignoredDecorations.get(filePath) || []; + + const oldDecorationIndex = ignoredDecorations.findIndex(decoration => + decoration.range.start.line === oldLine + ); + + if (oldDecorationIndex !== -1) { + const oldDecoration = ignoredDecorations[oldDecorationIndex]; + ignoredDecorations.splice(oldDecorationIndex, 1); + + const newRange = new vscode.Range( + new vscode.Position(newLine, oldDecoration.range.start.character), + new vscode.Position(newLine, oldDecoration.range.end.character) + ); + ignoredDecorations.push({ range: newRange }); + + this.ignoredDecorations.set(filePath, ignoredDecorations); + + const editor = vscode.window.visibleTextEditors.find(e => e.document.uri.fsPath === filePath); + if (editor) { + editor.setDecorations(this.decorationTypes.ignored, ignoredDecorations); + } + } + } + + private updateHoverDataLine(filePath: string, oldLine: number, newLine: number): void { + const oldKey = `${filePath}:${oldLine}`; + const newKey = `${filePath}:${newLine}`; + + const hoverData = this.ascaHoverData.get(oldKey); + if (hoverData) { + hoverData.location.line = newLine; + + this.ascaHoverData.set(newKey, hoverData); + this.ascaHoverData.delete(oldKey); + } + } + + private removeIgnoredDecorationAtLine(filePath: string, line: number): void { + const ignoredDecorations = this.ignoredDecorations.get(filePath) || []; + + const filteredDecorations = ignoredDecorations.filter(decoration => + decoration.range.start.line !== line + ); + + this.ignoredDecorations.set(filePath, filteredDecorations); + + const editor = vscode.window.visibleTextEditors.find(e => e.document.uri.fsPath === filePath); + if (editor) { + editor.setDecorations(this.decorationTypes.ignored, filteredDecorations); + } + + + const hoverKey = `${filePath}:${line}`; + this.ascaHoverData.delete(hoverKey); + } + + private cleanupIgnoredEntries(fullScanResults: unknown[], currentFilePath: string): void { + const ignoreManager = IgnoreFileManager.getInstance(); + const ignoredData = ignoreManager.getIgnoredPackagesData(); + const relativePath = path.relative(vscode.workspace.workspaceFolders?.[0]?.uri.fsPath || '', currentFilePath); + + + const existingFindingsByRule = new Map(); + fullScanResults.forEach(result => { + const scanDetail = result as { ruleName: string; ruleId: number; line: number }; + const ruleKey = `${scanDetail.ruleName}:${scanDetail.ruleId}`; + if (!existingFindingsByRule.has(ruleKey)) { + existingFindingsByRule.set(ruleKey, []); + } + existingFindingsByRule.get(ruleKey)!.push(scanDetail.line - 1); + }); + + + const activeEntries = Object.entries(ignoredData) + .filter(([, entry]) => entry.type === constants.ascaRealtimeScannerEngineName) + .flatMap(([packageKey, entry]) => + entry.files + .filter(file => file.active && file.path === relativePath) + .map(file => ({ + packageKey, + entry, + file, + currentLine: file.line - 1 + })) + ); + + activeEntries.forEach(item => { + const ruleKey = `${item.entry.PackageName}:${item.entry.ruleId}`; + const availableLines = existingFindingsByRule.get(ruleKey); + + if (availableLines && availableLines.length > 0) { + if (!availableLines.includes(item.currentLine)) { + const newLine = availableLines[0]; + const success = ignoreManager.updatePackageLineNumber(item.packageKey, currentFilePath, newLine + 1); + + if (success) { + this.updateIgnoredDecorationLine(currentFilePath, item.currentLine, newLine); + this.updateHoverDataLine(currentFilePath, item.currentLine, newLine); + } + } + } else { + ignoreManager.removePackageEntry(item.packageKey, relativePath); + this.removeIgnoredDecorationAtLine(currentFilePath, item.currentLine); + } + }); + } + } diff --git a/src/realtimeScanners/scanners/containers/containersScannerService.ts b/src/realtimeScanners/scanners/containers/containersScannerService.ts index 3ef1cdeb..9dd7ff83 100644 --- a/src/realtimeScanners/scanners/containers/containersScannerService.ts +++ b/src/realtimeScanners/scanners/containers/containersScannerService.ts @@ -11,6 +11,7 @@ import fs from "fs"; import { minimatch } from "minimatch"; import { CxRealtimeEngineStatus } from "@checkmarxdev/ast-cli-javascript-wrapper/dist/main/containersRealtime/CxRealtimeEngineStatus"; import { createHash } from "crypto"; +import { IgnoreFileManager } from "../../common/ignoreFileManager"; export class ContainersScannerService extends BaseScannerService { private diagnosticsMap = new Map(); @@ -28,6 +29,8 @@ export class ContainersScannerService extends BaseScannerService { private highIconDecorationsMap = new Map(); private mediumIconDecorationsMap = new Map(); private lowIconDecorationsMap = new Map(); + private ignoredDecorations: Map = new Map(); + private lastFullScanResults: unknown[] = []; private documentOpenListener: vscode.Disposable | undefined; private editorChangeListener: vscode.Disposable | undefined; @@ -40,6 +43,7 @@ export class ContainersScannerService extends BaseScannerService { high: this.createDecoration("realtimeEngines/high_severity.svg"), medium: this.createDecoration("realtimeEngines/medium_severity.svg"), low: this.createDecoration("realtimeEngines/low_severity.svg"), + ignored: this.createDecoration("Ignored.svg"), underline: vscode.window.createTextEditorDecorationType({ textDecoration: "underline wavy #f14c4c", rangeBehavior: vscode.DecorationRangeBehavior.ClosedClosed, @@ -78,7 +82,7 @@ export class ContainersScannerService extends BaseScannerService { const fileNameLower = path.basename(uri.fsPath).toLowerCase(); - for (const [entryName, _type] of entries) { + for (const [entryName] of entries) { if (entryName.toLowerCase() === fileNameLower) { return path.join(dirPath, entryName); } @@ -190,7 +194,7 @@ export class ContainersScannerService extends BaseScannerService { return; } - // Use the method to take care of in DockerFiles + // Use the method to take care of in DockerFiles const filePath = await this.getFullPathWithOriginalCasing(document.uri); logs.info("Scanning Containers in file: " + filePath); @@ -217,9 +221,16 @@ export class ContainersScannerService extends BaseScannerService { tempFilePath = saveResult.tempFilePath; tempSubFolder = saveResult.tempSubFolder; - const scanResults = await cx.scanContainers(tempFilePath); + const ignoreManager = IgnoreFileManager.getInstance(); + ignoreManager.setScannedFilePath(filePath, tempFilePath); - this.updateProblems(scanResults, document.uri); + const unfiltered = await cx.scanContainers(tempFilePath, ""); + this.lastFullScanResults = unfiltered as CxContainerRealtimeResult[]; + + const ignoredPackagesFile = ignoreManager.getIgnoredPackagesTempFile(); + const scanResults = await cx.scanContainers(tempFilePath, ignoredPackagesFile || ""); + + this.updateProblems(scanResults, document.uri, this.lastFullScanResults); } catch (error) { this.storeAndApplyResults( filePath, @@ -236,8 +247,10 @@ export class ContainersScannerService extends BaseScannerService { [], [], [], - [] - ) + [], + [], + + ); console.error(error); logs.error(this.config.errorMessage + `: ${error.message}`); } finally { @@ -247,7 +260,7 @@ export class ContainersScannerService extends BaseScannerService { } } - updateProblems(problems: T, uri: vscode.Uri): void { + updateProblems(problems: T, uri: vscode.Uri, fullScanResults?: unknown[]): void { const scanResults = problems as CxContainerRealtimeResult[]; const filePath = uri.fsPath; @@ -395,6 +408,64 @@ export class ContainersScannerService extends BaseScannerService { } + const ignoredDecorations: vscode.DecorationOptions[] = []; + const ignoreManager = IgnoreFileManager.getInstance(); + const ignoredData = ignoreManager.getIgnoredPackagesData(); + const relativePath = path.relative(vscode.workspace.workspaceFolders?.[0]?.uri.fsPath || '', filePath); + + const allScanResults = (this.lastFullScanResults as CxContainerRealtimeResult[]) || scanResults; + + Object.entries(ignoredData).forEach(([, entry]) => { + if (entry.type !== constants.containersRealtimeScannerEngineName) { return; } + const fileEntry = entry.files.find(f => f.path === relativePath && f.active); + if (!fileEntry) { return; } + + const imageKey = `${entry.imageName}:${entry.imageTag}`; + + allScanResults.forEach(result => { + const resultKey = `${result.imageName}:${result.imageTag}`; + if (resultKey === imageKey && result.locations) { + result.locations.forEach(location => { + const range = new vscode.Range( + new vscode.Position(location.line, location.startIndex), + new vscode.Position(location.line, location.endIndex) + ); + ignoredDecorations.push({ range }); + + const hoverKey = `${filePath}:${location.line}`; + if (!this.containersHoverData.has(hoverKey)) { + this.containersHoverData.set(hoverKey, { + imageName: entry.imageName!, + imageTag: entry.imageTag!, + status: (entry.severity as CxRealtimeEngineStatus) || CxRealtimeEngineStatus.medium, + vulnerabilities: [], + location: { + line: location.line, + startIndex: location.startIndex, + endIndex: location.endIndex + }, + fileType: this.isDockerComposeFile(filePath) + ? 'docker-compose' + : constants.containersHelmExtensions.includes(path.extname(filePath).toLowerCase()) + ? 'helm' + : 'dockerfile' + }); + } + }); + } + }); + }); + + this.ignoredDecorations.set(filePath, ignoredDecorations); + + const hasContainerIgnores = Object.values(ignoredData).some( + entry => entry.type === constants.containersRealtimeScannerEngineName + ); + + if (hasContainerIgnores && fullScanResults) { + this.cleanupContainersIgnoredEntriesWithoutFileWatcher(fullScanResults, filePath, ignoreManager); + } + this.storeAndApplyResults( filePath, uri, @@ -406,6 +477,7 @@ export class ContainersScannerService extends BaseScannerService { highDecorations, mediumDecorations, lowDecorations, + ignoredDecorations, maliciousIconDecorations, criticalIconDecorations, highIconDecorations, @@ -414,6 +486,24 @@ export class ContainersScannerService extends BaseScannerService { ); } + private cleanupContainersIgnoredEntriesWithoutFileWatcher( + fullScanResults: unknown[], + currentFilePath: string, + ignoreManager: IgnoreFileManager + ): void { + ignoreManager.dispose(); + + ignoreManager.removeMissingContainers(fullScanResults, currentFilePath); + + setTimeout(async () => { + const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; + if (workspaceFolder) { + ignoreManager.initialize(workspaceFolder); + ignoreManager.setContainersScannerService(this); + } + }, 100); + } + private exsistIacSeverityAtLine(uri: vscode.Uri, lineNumber: number): string | undefined { const iacCollection = this.getOtherScannerCollection(constants.iacRealtimeScannerEngineName); if (iacCollection) { @@ -440,6 +530,7 @@ export class ContainersScannerService extends BaseScannerService { highDecorations: vscode.DecorationOptions[], mediumDecorations: vscode.DecorationOptions[], lowDecorations: vscode.DecorationOptions[], + ignoredDecorations: vscode.DecorationOptions[], maliciousIconDecorations: vscode.DecorationOptions[], criticalIconDecorations: vscode.DecorationOptions[], highIconDecorations: vscode.DecorationOptions[], @@ -546,6 +637,7 @@ export class ContainersScannerService extends BaseScannerService { this.highIconDecorationsMap.clear(); this.mediumIconDecorationsMap.clear(); this.lowIconDecorationsMap.clear(); + this.ignoredDecorations.clear(); } public dispose(): void { @@ -575,6 +667,7 @@ export class ContainersScannerService extends BaseScannerService { this.highIconDecorationsMap.delete(filePath); this.mediumIconDecorationsMap.delete(filePath); this.lowIconDecorationsMap.delete(filePath); + this.ignoredDecorations.delete(filePath); } public async initializeScanner(): Promise { @@ -634,6 +727,7 @@ export class ContainersScannerService extends BaseScannerService { editor.setDecorations(this.decorationTypes.high, highDecorations); editor.setDecorations(this.decorationTypes.medium, mediumDecorations); editor.setDecorations(this.decorationTypes.low, lowDecorations); + editor.setDecorations(this.decorationTypes.ignored, this.ignoredDecorations.get(filePath) || []); editor.setDecorations(this.decorationTypes.underline, allUnderlineDecorations); } } diff --git a/src/utils/utils.ts b/src/utils/utils.ts index a14e10bb..a8b4cc57 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -12,6 +12,7 @@ import { getGlobalContext } from "../extension"; import { commands } from "./common/commands"; import { IgnoreFileManager } from "../realtimeScanners/common/ignoreFileManager"; import { OssScannerService } from "../realtimeScanners/scanners/oss/ossScannerService"; +import { ContainersScannerService } from "../realtimeScanners/scanners/containers/containersScannerService"; import { Logs } from "../models/logs"; import { HoverData, SecretsHoverData, AscaHoverData, ContainersHoverData, IacHoverData } from "../realtimeScanners/common/types"; @@ -383,4 +384,124 @@ export async function rescanFiles(files: Set, scanner: OssScannerService await scanner.scan(document, logs); } } +} + + +export async function scanAllContainerFilesInWorkspace( + scanner: ContainersScannerService, + logs: Logs +): Promise { + for (const pattern of constants.containersSupportedPatterns) { + const uris = await vscode.workspace.findFiles(pattern); + for (const uri of uris) { + try { + const document = await vscode.workspace.openTextDocument(uri); + if (scanner.shouldScanFile(document)) { + await scanner.scan(document, logs); + } + } catch (err) { + logs.warn(`Failed to scan container file: ${uri.fsPath}`); + } + } + } +} + +/** + */ +function buildContainerToDataMap(scanner: ContainersScannerService): Map> { + const containerMap = new Map>(); + + scanner.getHoverData().forEach((hoverData, key) => { + const filePath = key.split(':')[0]; + const imageKey = `${hoverData.imageName}:${hoverData.imageTag}`; + + if (!containerMap.has(imageKey)) { + containerMap.set(imageKey, []); + } + + containerMap.get(imageKey)!.push({ hoverData, filePath }); + }); + + return containerMap; +} + +export async function findAndIgnoreMatchingContainersInWorkspace( + item: ContainersHoverData, + scanner: ContainersScannerService, + manager: IgnoreFileManager, + logs: Logs +): Promise> { + const affected = new Set(); + + await scanAllContainerFilesInWorkspace(scanner, logs); + + const imageKey = `${item.imageName}:${item.imageTag}`; + const containerToDataMap = buildContainerToDataMap(scanner); + const matchingData = containerToDataMap.get(imageKey); + + if (matchingData) { + const ignoreDate = new Date().toISOString(); + + matchingData.forEach(({ hoverData, filePath }) => { + affected.add(filePath); + manager.addIgnoredEntryContainers({ + imageName: hoverData.imageName, + imageTag: hoverData.imageTag, + filePath: filePath, + line: (hoverData.location?.line || 0) + 1, + severity: hoverData.status, + description: hoverData.vulnerabilities && hoverData.vulnerabilities.length > 0 ? + hoverData.vulnerabilities.map(v => `${v.cve}: ${v.severity}`).join(', ') : + undefined, + dateAdded: ignoreDate + }); + }); + } + + return affected; +} + + +export async function rescanContainerFiles(files: Set, scanner: ContainersScannerService, logs: Logs): Promise { + for (const filePath of files) { + try { + const document = + vscode.workspace.textDocuments.find(doc => doc.uri.fsPath === filePath) + ?? await vscode.workspace.openTextDocument(filePath); + + if (scanner.shouldScanFile(document)) { + await scanner.scan(document, logs); + } + } catch (error) { + continue; + } + } +} + + +export async function rescanAllContainerIgnoredFiles( + ignoreManager: IgnoreFileManager, + scanner: ContainersScannerService, + logs: Logs +): Promise { + const ignoredData = ignoreManager.getIgnoredPackagesData(); + const containerEntries = Object.values(ignoredData).filter( + entry => entry.type === constants.containersRealtimeScannerEngineName + ); + + const affectedFiles = new Set(); + const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; + + if (!workspaceFolder) { return; } + + containerEntries.forEach(entry => { + entry.files?.forEach(file => { + if (file.active) { + const fullPath = path.resolve(workspaceFolder.uri.fsPath, file.path); + affectedFiles.add(fullPath); + } + }); + }); + + await rescanContainerFiles(affectedFiles, scanner, logs); } \ No newline at end of file diff --git a/src/views/ignoredView/ignoredView.ts b/src/views/ignoredView/ignoredView.ts index addabe1d..97789e51 100644 --- a/src/views/ignoredView/ignoredView.ts +++ b/src/views/ignoredView/ignoredView.ts @@ -83,7 +83,7 @@ export class IgnoredView { const msUntilTomorrow = tomorrow.getTime() - now.getTime(); - console.log(`Next refresh scheduled in ${Math.round(msUntilTomorrow / 1000 / 60)} minutes (at ${tomorrow.toLocaleString()})`); + this.autoRefreshTimer = setTimeout(() => { this.onDayChanged(); @@ -91,7 +91,6 @@ export class IgnoredView { } private onDayChanged(): void { - console.log('Day changed - refreshing ignored view with updated dates'); this.lastRefreshDate = new Date().toDateString(); this.refresh(); @@ -108,7 +107,6 @@ export class IgnoredView { private checkAndRefreshIfDateChanged(): void { const currentDate = new Date().toDateString(); if (currentDate !== this.lastRefreshDate) { - console.log('Date changed detected - refreshing ignored view'); this.lastRefreshDate = currentDate; this.refresh(); @@ -254,9 +252,6 @@ export class IgnoredView { const ignoredPackages = ignoreManager.getIgnoredPackagesData(); - console.log('Ignored packages data:', ignoredPackages); - - const ignoreManagerInstance = IgnoreFileManager.getInstance(); const packageCount = ignoreManagerInstance.getIgnoredPackagesCount(); const hasPackages = packageCount > 0; @@ -365,6 +360,8 @@ export class IgnoredView { const scaIcon = pkg.type === constants.ossRealtimeScannerEngineName ? ignoredViewUtils.getScaIconPath(webview, extensionPath) : ''; const secretsIcon = pkg.type === constants.secretsScannerEngineName ? ignoredViewUtils.getSecretsIgnoreIconPath(webview, extensionPath) : ''; const iacIcon = pkg.type === constants.iacRealtimeScannerEngineName ? ignoredViewUtils.getIacIgnoreIconPath(webview, extensionPath) : ''; + const ascaIcon = pkg.type === constants.ascaRealtimeScannerEngineName ? ignoredViewUtils.getAscaIgnoreIconPath(webview, extensionPath) : ''; + const containersIcon = pkg.type === constants.containersRealtimeScannerEngineName ? ignoredViewUtils.getContainersIgnoreIconPath(webview, extensionPath) : ''; const packageIcon = pkg.type === constants.ossRealtimeScannerEngineName ? ignoredViewUtils.getPackageIconPath(pkg.severity || 'medium', webview, extensionPath) @@ -372,7 +369,11 @@ export class IgnoredView { ? ignoredViewUtils.getSecretsIconPath(pkg.severity || 'medium', webview, extensionPath) : pkg.type === constants.iacRealtimeScannerEngineName ? ignoredViewUtils.getIacIconPath(pkg.severity || 'medium', webview, extensionPath) - : ''; + : pkg.type === constants.ascaRealtimeScannerEngineName + ? ignoredViewUtils.getAscaIconPath(pkg.severity || 'medium', webview, extensionPath) + : pkg.type === constants.containersRealtimeScannerEngineName + ? ignoredViewUtils.getContainersIconPath(pkg.severity || 'medium', webview, extensionPath) + : ''; const packageIconHover = pkg.type === constants.ossRealtimeScannerEngineName ? ignoredViewUtils.getPackageIconPath(pkg.severity || 'medium', webview, extensionPath, true) @@ -380,7 +381,11 @@ export class IgnoredView { ? ignoredViewUtils.getSecretsIconPath(pkg.severity || 'medium', webview, extensionPath, true) : pkg.type === constants.iacRealtimeScannerEngineName ? ignoredViewUtils.getIacIconPath(pkg.severity || 'medium', webview, extensionPath, true) - : ''; + : pkg.type === constants.ascaRealtimeScannerEngineName + ? ignoredViewUtils.getAscaIconPath(pkg.severity || 'medium', webview, extensionPath, true) + : pkg.type === constants.containersRealtimeScannerEngineName + ? ignoredViewUtils.getContainersIconPath(pkg.severity || 'medium', webview, extensionPath, true) + : ''; const displayName = ignoredViewUtils.formatPackageDisplayName(packageKey, pkg.type); @@ -402,6 +407,8 @@ export class IgnoredView { ${scaIcon ? `SCA` : ''} ${secretsIcon ? `Secrets` : ''} ${iacIcon ? `IaC` : ''} + ${ascaIcon ? `ASCA` : ''} + ${containersIcon ? `Containers` : ''} ${fileButtons}
diff --git a/src/views/ignoredView/ignoredViewUtils.ts b/src/views/ignoredView/ignoredViewUtils.ts index 37ae087d..d7c4aad1 100644 --- a/src/views/ignoredView/ignoredViewUtils.ts +++ b/src/views/ignoredView/ignoredViewUtils.ts @@ -108,7 +108,12 @@ export function formatPackageDisplayName(packageKey: string, packageType: string } else if (packageType === constants.secretsScannerEngineName) { return packageKey.split(':')[0]; } else if (packageType === constants.iacRealtimeScannerEngineName) { - return packageKey.split(':')[0]; // Show only title for IaC + return packageKey.split(':')[0]; + } else if (packageType === constants.ascaRealtimeScannerEngineName) { + return packageKey.split(':')[0]; + } else if (packageType === constants.containersRealtimeScannerEngineName) { + const parts = packageKey.split(':'); + return parts.slice(0, 2).join('@'); } return packageKey; } @@ -211,4 +216,40 @@ export function generateFileButtons( : ''; return `
${visibleButtons}${expandButton}${hiddenButtons}
`; +} + +export function getAscaIgnoreIconPath(webview: vscode.Webview, extensionPath: string): string { + const iconPath = webview.asWebviewUri( + vscode.Uri.file(path.join(extensionPath, 'media', 'icons', 'ignorePage', 'asca_ignore.svg')) + ); + return iconPath?.toString() || ''; +} + +export function getAscaIconPath(severity: string, webview: vscode.Webview, extensionPath: string, isHover: boolean = false): string { + const normalizedSeverity = severity?.toLowerCase() || 'medium'; + const iconName = isHover ? `${normalizedSeverity}_hover` : normalizedSeverity; + + const iconPath = webview.asWebviewUri( + vscode.Uri.file(path.join(extensionPath, 'media', 'icons', 'ignorePage', 'IacAsca', `${iconName}.svg`)) + ); + + return iconPath?.toString() || ''; +} + +export function getContainersIgnoreIconPath(webview: vscode.Webview, extensionPath: string): string { + const iconPath = webview.asWebviewUri( + vscode.Uri.file(path.join(extensionPath, 'media', 'icons', 'ignorePage', 'containers_ignore.svg')) + ); + return iconPath?.toString() || ''; +} + +export function getContainersIconPath(severity: string, webview: vscode.Webview, extensionPath: string, isHover: boolean = false): string { + const normalizedSeverity = severity?.toLowerCase() || 'medium'; + const iconName = isHover ? `${normalizedSeverity}_hover` : normalizedSeverity; + + const iconPath = webview.asWebviewUri( + vscode.Uri.file(path.join(extensionPath, 'media', 'icons', 'ignorePage', 'Containers', `${iconName}.svg`)) + ); + + return iconPath?.toString() || ''; } \ No newline at end of file From 510f6fd6832b10a4c15264b4b055c7ac18d28857 Mon Sep 17 00:00:00 2001 From: Itay Paz Date: Wed, 13 Aug 2025 11:49:25 +0300 Subject: [PATCH 07/12] update vscode tester package --- package-lock.json | 1873 ++++++++++++++++++++++++++++++++++++--------- package.json | 4 +- 2 files changed, 1495 insertions(+), 382 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0238c4aa..c1bdc406 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,7 +46,7 @@ "sinon": "^19.0.2", "ts-node": "^10.9.2", "typescript": "^5.6.3", - "vscode-extension-tester": "8.3.0", + "vscode-extension-tester": "8.17.0", "vscode-extension-tester-locators": "^3.12.2", "webpack": "^5.94.0", "webpack-cli": "^5.1.4" @@ -83,6 +83,23 @@ "lru-cache": "^10.4.3" } }, + "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", @@ -97,9 +114,9 @@ } }, "node_modules/@azure/core-auth": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz", - "integrity": "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.0.tgz", + "integrity": "sha512-88Djs5vBvGbHQHf5ZZcaoNHo6Y8BKZkt3cw2iuJIQzLEgH4Ox6Tm4hjFhbqOxyYsgIG/eJbFEHpxRIfEEWv5Ow==", "dev": true, "license": "MIT", "dependencies": { @@ -108,32 +125,32 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/core-client": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.3.tgz", - "integrity": "sha512-/wGw8fJ4mdpJ1Cum7s1S+VQyXt1ihwKLzfabS1O/RDADnmzVc01dHn44qD0BvGH6KlZNzOMW95tEpKqhkCChPA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.0.tgz", + "integrity": "sha512-O4aP3CLFNodg8eTHXECaH3B3CjicfzkxVtnrfLkOq0XNP7TIECGfHpK/C6vADZkWP75wzmdBnsIA8ksuJMk18g==", "dev": true, "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.4.0", - "@azure/core-rest-pipeline": "^1.9.1", + "@azure/core-rest-pipeline": "^1.20.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.19.1.tgz", - "integrity": "sha512-zHeoI3NCs53lLBbWNzQycjnYKsA1CVKlnzSNuSFcUDwBp8HHVObePxrM7HaX+Ha5Ks639H7chNC9HOaIhNS03w==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.0.tgz", + "integrity": "sha512-OKHmb3/Kpm06HypvB3g6Q3zJuvyXcpxDpCS1PnU8OV6AJgSFaee/covXBcPbWc6XDDxtEPlbi3EMQ6nUiPaQtw==", "dev": true, "license": "MIT", "dependencies": { @@ -142,45 +159,45 @@ "@azure/core-tracing": "^1.0.1", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", + "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/core-tracing": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz", - "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.0.tgz", + "integrity": "sha512-+XvmZLLWPe67WXNZo9Oc9CrPj/Tm8QnHR92fFAFdnbzwNdCH1h+7UdpaQgRSBsMY+oW1kHXNUZQLdZ1gHX3ROw==", "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/core-util": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.11.0.tgz", - "integrity": "sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.0.tgz", + "integrity": "sha512-o0psW8QWQ58fq3i24Q1K2XfS/jYTxr7O1HRcyUE9bV9NttLU+kYOH82Ixj8DGlMTOWgxm1Sss2QAfKK5UkSPxw==", "dev": true, "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", + "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/identity": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.9.0.tgz", - "integrity": "sha512-dz2ZvKxDFoTUmJgmkCBVcyuKckgqE1qVxrRPzUhyKN7FyvUbtNPUrGzqSllOAf1OL9TMGgYqZWbIyD0b/AE15g==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.11.1.tgz", + "integrity": "sha512-0ZdsLRaOyLxtCYgyuqyWqGU5XQ9gGnjxgfoNTt1pvELGkkUFrMATABZFIq8gusM7N1qbqpVtwLOhk0d/3kacLg==", "dev": true, "license": "MIT", "dependencies": { @@ -197,39 +214,40 @@ "tslib": "^2.2.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/logger": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz", - "integrity": "sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==", + "version": "1.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": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/msal-browser": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.11.0.tgz", - "integrity": "sha512-0p5Ut3wORMP+975AKvaSPIO4UytgsfAvJ7RxaTx+nkP+Hpkmm93AuiMkBWKI2x9tApU/SLgIyPz/ZwLYUIWb5Q==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.20.0.tgz", + "integrity": "sha512-JBGaxnYAvzFsT5TU6XhVpqc4XVMFjzsi6rrAVINX0PL3+wzs+k12fnvN/XFICvzCfV28NvHzxGfRRBoqE6GxNg==", "dev": true, "license": "MIT", "dependencies": { - "@azure/msal-common": "15.5.1" + "@azure/msal-common": "15.11.0" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "15.5.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.5.1.tgz", - "integrity": "sha512-oxK0khbc4Bg1bKQnqDr7ikULhVL2OHgSrIq0Vlh4b6+hm4r0lr6zPMQE8ZvmacJuh+ZZGKBM5iIObhF1q1QimQ==", + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.11.0.tgz", + "integrity": "sha512-1IseGNH6XGWe+5xhZlhasTJP6Ob7tnVSlfFUnjdeH4Kik0n1SORTmdB6xxTwbx9Ro8EuO0XaRzpdABWSf15sdg==", "dev": true, "license": "MIT", "engines": { @@ -237,13 +255,13 @@ } }, "node_modules/@azure/msal-node": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.5.1.tgz", - "integrity": "sha512-dkgMYM5B6tI88r/oqf5bYd93WkenQpaWwiszJDk7avVjso8cmuKRTW97dA1RMi6RhihZFLtY1VtWxU9+sW2T5g==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.7.1.tgz", + "integrity": "sha512-ZTopY+BmE/OubqTXEQ5Eq+h6M5NKTchQBtvLj1tgiAf26lk2C+9jJTvtHjcyzE3iWn3wzySJLa4ArcjHJaZMQw==", "dev": true, "license": "MIT", "dependencies": { - "@azure/msal-common": "15.5.1", + "@azure/msal-common": "15.11.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, @@ -860,6 +878,27 @@ "deprecated": "Use @eslint/object-schema instead", "license": "BSD-3-Clause" }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1237,9 +1276,9 @@ } }, "node_modules/@redhat-developer/locators": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@redhat-developer/locators/-/locators-1.12.1.tgz", - "integrity": "sha512-bJZSZ1J1t0NM0UroK2jiT125hEiqzaGjcKCZBXyOQoUGTr9XvGnk/nDg1VBEm1krQjLdsNxZ3TgfCRDbXsQCnA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@redhat-developer/locators/-/locators-1.15.0.tgz", + "integrity": "sha512-xxkCoCQsqiA7IVR5kdNfU3MnuT9QSYDeu0KXrwW59FMCcZpUftz6uiQkqgbB212ASlS3mxVhyYpqJan4zr+XtA==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -1248,9 +1287,9 @@ } }, "node_modules/@redhat-developer/page-objects": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@redhat-developer/page-objects/-/page-objects-1.12.1.tgz", - "integrity": "sha512-rfSQDYlHLeSpn+OHzMb3AYmTG5c2Ped4JRH7eHQb5yhhcxkZA755Ik0DvvdRQZMo1H9Kk8Ajn44PdicPewhPVg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@redhat-developer/page-objects/-/page-objects-1.15.0.tgz", + "integrity": "sha512-Mfr7rVcFB+J16VzLbbqLF9Yo1W7G2bgjkVv0vPUrlkz1dgYdAjZpaQpjs6dVlRO5Uopt11loYu4SS+wnxPopMw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1258,7 +1297,7 @@ "clone-deep": "^4.0.1", "compare-versions": "^6.1.1", "fs-extra": "^11.3.0", - "type-fest": "^4.39.1" + "type-fest": "^4.41.0" }, "peerDependencies": { "selenium-webdriver": ">=4.6.1", @@ -1266,9 +1305,9 @@ } }, "node_modules/@redhat-developer/page-objects/node_modules/type-fest": { - "version": "4.40.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.40.0.tgz", - "integrity": "sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw==", + "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": { @@ -1278,19 +1317,279 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, + "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.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "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.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "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.5.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.5.0.tgz", + "integrity": "sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==", + "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.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "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/node/node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.2.tgz", + "integrity": "sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" } }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -1353,6 +1652,67 @@ "node": ">=14.16" } }, + "node_modules/@textlint/ast-node-types": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.2.1.tgz", + "integrity": "sha512-20fEcLPsXg81yWpApv4FQxrZmlFF/Ta7/kz1HGIL+pJo5cSTmkc+eCki3GpOPZIoZk0tbJU8hrlwUb91F+3SNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/linter-formatter": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.2.1.tgz", + "integrity": "sha512-oollG/BHa07+mMt372amxHohteASC+Zxgollc1sZgiyxo4S6EuureV3a4QIQB0NecA+Ak3d0cl0WI/8nou38jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azu/format-text": "^1.0.2", + "@azu/style-format": "^1.0.1", + "@textlint/module-interop": "15.2.1", + "@textlint/resolver": "15.2.1", + "@textlint/types": "15.2.1", + "chalk": "^4.1.2", + "debug": "^4.4.1", + "js-yaml": "^3.14.1", + "lodash": "^4.17.21", + "pluralize": "^2.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "table": "^6.9.0", + "text-table": "^0.2.0" + } + }, + "node_modules/@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.2.1", + "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.2.1.tgz", + "integrity": "sha512-b/C/ZNrm05n1ypymDknIcpkBle30V2ZgE3JVqQlA9PnQV46Ky510qrZk6s9yfKgA3m1YRnAw04m8xdVtqjq1qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/resolver": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.2.1.tgz", + "integrity": "sha512-FY3aK4tElEcOJVUsaMj4Zro4jCtKEEwUMIkDL0tcn6ljNcgOF7Em+KskRRk/xowFWayqDtdz5T3u7w/6fjjuJQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/types": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.2.1.tgz", + "integrity": "sha512-zyqNhSatK1cwxDUgosEEN43hFh3WCty9Zm2Vm3ogU566IYegifwqN54ey/CiRy/DiO4vMcFHykuQnh2Zwp6LLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "15.2.1" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -1472,6 +1832,20 @@ "undici-types": "~6.21.0" } }, + "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/@types/selenium-webdriver": { "version": "4.1.28", "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.28.tgz", @@ -1726,6 +2100,21 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.0.tgz", + "integrity": "sha512-sOx1PKSuFwnIl7z4RN0Ls7N9AQawmR9r66eI5rFCzLDIs8HTIYrIpH9QjYWoX0lkgGrkLxXhi4QnK7MizPRrIg==", + "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/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", @@ -1739,31 +2128,36 @@ "license": "CC-BY-4.0" }, "node_modules/@vscode/vsce": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.32.0.tgz", - "integrity": "sha512-3EFJfsgrSftIqt3EtdRcAygy/OJ3hstyI1cDmIgkU9CFZW5C+3djr6mfosndCUqcVYuyjmxOK1xmFp/Bq7+NIg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.6.0.tgz", + "integrity": "sha512-u2ZoMfymRNJb14aHNawnXJtXHLXDVKc1oKZaH4VELKT/9iWKRVgtQOdwxCgtwSxJoqYvuK4hGlBWQJ05wxADhg==", "dev": true, "license": "MIT", "dependencies": { "@azure/identity": "^4.1.0", + "@secretlint/node": "^10.1.1", + "@secretlint/secretlint-formatter-sarif": "^10.1.1", + "@secretlint/secretlint-rule-no-dotenv": "^10.1.1", + "@secretlint/secretlint-rule-preset-recommend": "^10.1.1", "@vscode/vsce-sign": "^2.0.0", "azure-devops-node-api": "^12.5.0", - "chalk": "^2.4.2", + "chalk": "^4.1.2", "cheerio": "^1.0.0-rc.9", "cockatiel": "^3.1.2", - "commander": "^6.2.1", + "commander": "^12.1.0", "form-data": "^4.0.0", - "glob": "^7.0.6", + "glob": "^11.0.0", "hosted-git-info": "^4.0.2", "jsonc-parser": "^3.2.0", "leven": "^3.1.0", - "markdown-it": "^12.3.2", + "markdown-it": "^14.1.0", "mime": "^1.3.4", "minimatch": "^3.0.3", "parse-semver": "^1.1.1", "read": "^1.0.7", + "secretlint": "^10.1.1", "semver": "^7.5.2", - "tmp": "^0.2.1", + "tmp": "^0.2.3", "typed-rest-client": "^1.8.4", "url-join": "^4.0.1", "xml2js": "^0.5.0", @@ -1774,35 +2168,35 @@ "vsce": "vsce" }, "engines": { - "node": ">= 16" + "node": ">= 20" }, "optionalDependencies": { "keytar": "^7.7.0" } }, "node_modules/@vscode/vsce-sign": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.5.tgz", - "integrity": "sha512-GfYWrsT/vypTMDMgWDm75iDmAOMe7F71sZECJ+Ws6/xyIfmB3ELVnVN+LwMFAvmXY+e6eWhR2EzNGF/zAhWY3Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.6.tgz", + "integrity": "sha512-j9Ashk+uOWCDHYDxgGsqzKq5FXW9b9MW7QqOIYZ8IYpneJclWTBeHZz2DJCSKQgo+JAqNcaRRE1hzIx0dswqAw==", "dev": true, "hasInstallScript": true, "license": "SEE LICENSE IN LICENSE.txt", "optionalDependencies": { - "@vscode/vsce-sign-alpine-arm64": "2.0.2", - "@vscode/vsce-sign-alpine-x64": "2.0.2", - "@vscode/vsce-sign-darwin-arm64": "2.0.2", - "@vscode/vsce-sign-darwin-x64": "2.0.2", - "@vscode/vsce-sign-linux-arm": "2.0.2", - "@vscode/vsce-sign-linux-arm64": "2.0.2", - "@vscode/vsce-sign-linux-x64": "2.0.2", - "@vscode/vsce-sign-win32-arm64": "2.0.2", - "@vscode/vsce-sign-win32-x64": "2.0.2" + "@vscode/vsce-sign-alpine-arm64": "2.0.5", + "@vscode/vsce-sign-alpine-x64": "2.0.5", + "@vscode/vsce-sign-darwin-arm64": "2.0.5", + "@vscode/vsce-sign-darwin-x64": "2.0.5", + "@vscode/vsce-sign-linux-arm": "2.0.5", + "@vscode/vsce-sign-linux-arm64": "2.0.5", + "@vscode/vsce-sign-linux-x64": "2.0.5", + "@vscode/vsce-sign-win32-arm64": "2.0.5", + "@vscode/vsce-sign-win32-x64": "2.0.5" } }, "node_modules/@vscode/vsce-sign-alpine-arm64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.2.tgz", - "integrity": "sha512-E80YvqhtZCLUv3YAf9+tIbbqoinWLCO/B3j03yQPbjT3ZIHCliKZlsy1peNc4XNZ5uIb87Jn0HWx/ZbPXviuAQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.5.tgz", + "integrity": "sha512-XVmnF40APwRPXSLYA28Ye+qWxB25KhSVpF2eZVtVOs6g7fkpOxsVnpRU1Bz2xG4ySI79IRuapDJoAQFkoOgfdQ==", "cpu": [ "arm64" ], @@ -1814,9 +2208,9 @@ ] }, "node_modules/@vscode/vsce-sign-alpine-x64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.2.tgz", - "integrity": "sha512-n1WC15MSMvTaeJ5KjWCzo0nzjydwxLyoHiMJHu1Ov0VWTZiddasmOQHekA47tFRycnt4FsQrlkSCTdgHppn6bw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.5.tgz", + "integrity": "sha512-JuxY3xcquRsOezKq6PEHwCgd1rh1GnhyH6urVEWUzWn1c1PC4EOoyffMD+zLZtFuZF5qR1I0+cqDRNKyPvpK7Q==", "cpu": [ "x64" ], @@ -1828,9 +2222,9 @@ ] }, "node_modules/@vscode/vsce-sign-darwin-arm64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.2.tgz", - "integrity": "sha512-rz8F4pMcxPj8fjKAJIfkUT8ycG9CjIp888VY/6pq6cuI2qEzQ0+b5p3xb74CJnBbSC0p2eRVoe+WgNCAxCLtzQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.5.tgz", + "integrity": "sha512-z2Q62bk0ptADFz8a0vtPvnm6vxpyP3hIEYMU+i1AWz263Pj8Mc38cm/4sjzxu+LIsAfhe9HzvYNS49lV+KsatQ==", "cpu": [ "arm64" ], @@ -1842,9 +2236,9 @@ ] }, "node_modules/@vscode/vsce-sign-darwin-x64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.2.tgz", - "integrity": "sha512-MCjPrQ5MY/QVoZ6n0D92jcRb7eYvxAujG/AH2yM6lI0BspvJQxp0o9s5oiAM9r32r9tkLpiy5s2icsbwefAQIw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.5.tgz", + "integrity": "sha512-ma9JDC7FJ16SuPXlLKkvOD2qLsmW/cKfqK4zzM2iJE1PbckF3BlR08lYqHV89gmuoTpYB55+z8Y5Fz4wEJBVDA==", "cpu": [ "x64" ], @@ -1856,9 +2250,9 @@ ] }, "node_modules/@vscode/vsce-sign-linux-arm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.2.tgz", - "integrity": "sha512-Fkb5jpbfhZKVw3xwR6t7WYfwKZktVGNXdg1m08uEx1anO0oUPUkoQRsNm4QniL3hmfw0ijg00YA6TrxCRkPVOQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.5.tgz", + "integrity": "sha512-cdCwtLGmvC1QVrkIsyzv01+o9eR+wodMJUZ9Ak3owhcGxPRB53/WvrDHAFYA6i8Oy232nuen1YqWeEohqBuSzA==", "cpu": [ "arm" ], @@ -1870,9 +2264,9 @@ ] }, "node_modules/@vscode/vsce-sign-linux-arm64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.2.tgz", - "integrity": "sha512-Ybeu7cA6+/koxszsORXX0OJk9N0GgfHq70Wqi4vv2iJCZvBrOWwcIrxKjvFtwyDgdeQzgPheH5nhLVl5eQy7WA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.5.tgz", + "integrity": "sha512-Hr1o0veBymg9SmkCqYnfaiUnes5YK6k/lKFA5MhNmiEN5fNqxyPUCdRZMFs3Ajtx2OFW4q3KuYVRwGA7jdLo7Q==", "cpu": [ "arm64" ], @@ -1884,9 +2278,9 @@ ] }, "node_modules/@vscode/vsce-sign-linux-x64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.2.tgz", - "integrity": "sha512-NsPPFVtLaTlVJKOiTnO8Cl78LZNWy0Q8iAg+LlBiCDEgC12Gt4WXOSs2pmcIjDYzj2kY4NwdeN1mBTaujYZaPg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.5.tgz", + "integrity": "sha512-XLT0gfGMcxk6CMRLDkgqEPTyG8Oa0OFe1tPv2RVbphSOjFWJwZgK3TYWx39i/7gqpDHlax0AP6cgMygNJrA6zg==", "cpu": [ "x64" ], @@ -1898,9 +2292,9 @@ ] }, "node_modules/@vscode/vsce-sign-win32-arm64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.2.tgz", - "integrity": "sha512-wPs848ymZ3Ny+Y1Qlyi7mcT6VSigG89FWQnp2qRYCyMhdJxOpA4lDwxzlpL8fG6xC8GjQjGDkwbkWUcCobvksQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.5.tgz", + "integrity": "sha512-hco8eaoTcvtmuPhavyCZhrk5QIcLiyAUhEso87ApAWDllG7djIrWiOCtqn48k4pHz+L8oCQlE0nwNHfcYcxOPw==", "cpu": [ "arm64" ], @@ -1912,9 +2306,9 @@ ] }, "node_modules/@vscode/vsce-sign-win32-x64": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.2.tgz", - "integrity": "sha512-pAiRN6qSAhDM5SVOIxgx+2xnoVUePHbRNC7OD2aOR3WltTKxxF25OfpK8h8UQ7A0BuRkSgREbB59DBlFk4iAeg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.5.tgz", + "integrity": "sha512-1ixKFGM2FwM+6kQS2ojfY3aAelICxjiCzeg4nTHpkeU1Tfs4RC+lVLrgq5NwcBC7ZLr6UfY3Ct3D6suPeOf7BQ==", "cpu": [ "x64" ], @@ -1925,30 +2319,6 @@ "win32" ] }, - "node_modules/@vscode/vsce/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@vscode/vsce/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/@vscode/vsce/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -1960,56 +2330,80 @@ "concat-map": "0.0.1" } }, - "node_modules/@vscode/vsce/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@vscode/vsce/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", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/@vscode/vsce/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@vscode/vsce/node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "color-name": "1.1.3" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@vscode/vsce/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "node_modules/@vscode/vsce/node_modules/glob/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/@vscode/vsce/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@vscode/vsce/node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, "engines": { - "node": ">=0.8.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@vscode/vsce/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@vscode/vsce/node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=4" + "node": "20 || >=22" } }, "node_modules/@vscode/vsce/node_modules/minimatch": { @@ -2025,17 +2419,21 @@ "node": "*" } }, - "node_modules/@vscode/vsce/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@vscode/vsce/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "has-flag": "^3.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=4" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@webassemblyjs/ast": { @@ -2386,6 +2784,22 @@ "node": ">=6" } }, + "node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "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", @@ -2491,6 +2905,16 @@ "node": "*" } }, + "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", @@ -2508,6 +2932,17 @@ "proxy-from-env": "^1.1.0" } }, + "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", @@ -2548,6 +2983,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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", @@ -2585,6 +3036,13 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -2592,10 +3050,18 @@ "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": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -2870,45 +3336,49 @@ } }, "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-12.0.1.tgz", + "integrity": "sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==", "dev": true, "license": "MIT", "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", + "@types/http-cache-semantics": "^4.0.4", + "get-stream": "^9.0.1", "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", + "keyv": "^4.5.4", "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", + "normalize-url": "^8.0.1", "responselike": "^3.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" } }, "node_modules/cacheable-request/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cacheable-request/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "node_modules/cacheable-request/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3048,26 +3518,26 @@ } }, "node_modules/cheerio": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", - "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", "dev": true, "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "encoding-sniffer": "^0.2.0", - "htmlparser2": "^9.1.0", - "parse5": "^7.1.2", - "parse5-htmlparser2-tree-adapter": "^7.0.0", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", - "undici": "^6.19.5", + "undici": "^7.12.0", "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">=18.17" + "node": ">=20.18.1" }, "funding": { "url": "https://github.com/cheeriojs/cheerio?sponsor=1" @@ -3272,13 +3742,13 @@ } }, "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", + "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=20" } }, "node_modules/commondir": { @@ -3377,9 +3847,9 @@ } }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "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": { @@ -3394,9 +3864,9 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "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": { @@ -3444,9 +3914,9 @@ } }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3493,6 +3963,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decompress-response/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", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -3602,9 +4085,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -3706,30 +4189,80 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dotenv": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", - "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/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/duplexer2/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/duplexer2/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/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "node_modules/duplexer2/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": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" + "safe-buffer": "~5.1.0" } }, "node_modules/eastasianwidth": { @@ -3749,6 +4282,23 @@ "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/electron-to-chromium": { "version": "1.5.137", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.137.tgz", @@ -3763,9 +4313,9 @@ "license": "MIT" }, "node_modules/encoding-sniffer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", - "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "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": { @@ -3826,6 +4376,19 @@ "node": ">=4" } }, + "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", @@ -4641,13 +5204,13 @@ } }, "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", + "integrity": "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.17" + "node": ">= 18" } }, "node_modules/fromentries": { @@ -4929,39 +5492,39 @@ } }, "node_modules/got": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", - "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", + "version": "14.4.7", + "resolved": "https://registry.npmjs.org/got/-/got-14.4.7.tgz", + "integrity": "sha512-DI8zV1231tqiGzOiOzQWDhsBmncFW7oQDH6Zgy6pDPrqJuVZMtoSgPLLsBZQj8Jg4JFfwoOsDA8NGtLQLnIx2g==", "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/is": "^5.2.0", + "@sindresorhus/is": "^7.0.1", "@szmarczak/http-timer": "^5.0.1", "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", + "cacheable-request": "^12.0.1", "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", + "form-data-encoder": "^4.0.2", + "http2-wrapper": "^2.2.1", "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" + "p-cancelable": "^4.0.1", + "responselike": "^3.0.0", + "type-fest": "^4.26.1" }, "engines": { - "node": ">=16" + "node": ">=20" }, "funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/got/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/got/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", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5141,9 +5704,9 @@ "license": "MIT" }, "node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -5156,14 +5719,27 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true, "license": "BSD-2-Clause" }, @@ -5358,6 +5934,19 @@ "node": ">=8" } }, + "node_modules/index-to-position": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.1.0.tgz", + "integrity": "sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5766,6 +6355,24 @@ "node": ">=8" } }, + "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": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -6061,13 +6668,13 @@ "license": "MIT" }, "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", "dev": true, "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "1.0.1", + "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } @@ -6158,13 +6765,13 @@ } }, "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "license": "MIT", "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "node_modules/loader-runner": { @@ -6192,6 +6799,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -6262,6 +6876,13 @@ "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/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -6349,20 +6970,21 @@ "license": "ISC" }, "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, "bin": { - "markdown-it": "bin/markdown-it.js" + "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/markdown-it/node_modules/argparse": { @@ -6372,16 +6994,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/markdown-it/node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -6392,9 +7004,9 @@ } }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true, "license": "MIT" }, @@ -6477,25 +7089,25 @@ } }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { "node": "20 || >=22" @@ -6775,9 +7387,9 @@ } }, "node_modules/node-abi": { - "version": "3.74.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", - "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", + "version": "3.75.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", + "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", "dev": true, "license": "MIT", "optional": true, @@ -6842,6 +7454,13 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -6862,6 +7481,20 @@ "dev": true, "license": "MIT" }, + "node_modules/node-sarif-builder": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.2.0.tgz", + "integrity": "sha512-kVIOdynrF2CRodHZeP/97Rh1syTUHBNiw17hUCIVhlhEsWlfJm19MuO56s4MdKbr22xWx6mzMnNAgXzVlIYM9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sarif": "^2.1.7", + "fs-extra": "^11.1.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/noms": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", @@ -6872,6 +7505,34 @@ "readable-stream": "~1.0.31" } }, + "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-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6883,9 +7544,9 @@ } }, "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.2.tgz", + "integrity": "sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==", "dev": true, "license": "MIT", "engines": { @@ -7179,16 +7840,16 @@ } }, "node_modules/open": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.1.tgz", - "integrity": "sha512-zy1wx4+P3PfhXSEPJNtZmJXfhkkIaxU1VauWIrDZw1O7uJRDRJtKr9n3Ic4NgbA16KyOxOXO2ng9gYwCdXuSXA==", + "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", - "is-wsl": "^3.1.0" + "wsl-utils": "^0.1.0" }, "engines": { "node": ">=18" @@ -7222,13 +7883,13 @@ "license": "MIT" }, "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", + "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">=14.16" } }, "node_modules/p-limit": { @@ -7326,6 +7987,37 @@ "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", @@ -7347,13 +8039,13 @@ } }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "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": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -7386,6 +8078,19 @@ "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/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -7562,6 +8267,16 @@ "node": ">=8" } }, + "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", @@ -7654,6 +8369,16 @@ "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.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", @@ -7729,6 +8454,39 @@ "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-config-loader/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/rc-config-loader/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "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", @@ -7750,7 +8508,40 @@ "mute-stream": "~0.0.4" }, "engines": { - "node": ">=0.8" + "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": { @@ -8113,10 +8904,102 @@ "dev": true, "license": "MIT" }, + "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/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/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/selenium-webdriver": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.31.0.tgz", - "integrity": "sha512-0MWEwypM0+c1NnZ87UEMxZdwphKoaK2UJ2qXzKWrJiM0gazFjgNVimxlHTOO90G2cOhphZqwpqSCJy62NTEzyA==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.35.0.tgz", + "integrity": "sha512-Baaeiuyu7BIIsSYf0SI7Mi55gsNmdI00KM0Hcofw1RnAY+0QEVpdh5yAxueDxgTZS8vcbGZFU0NJ6Qc1riIrLg==", "dev": true, "funding": [ { @@ -8133,10 +9016,10 @@ "@bazel/runfiles": "^6.3.1", "jszip": "^3.10.1", "tmp": "^0.2.3", - "ws": "^8.18.0" + "ws": "^8.18.2" }, "engines": { - "node": ">= 18.20.5" + "node": ">= 20.0.0" } }, "node_modules/semver": { @@ -8386,6 +9269,24 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "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/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8446,6 +9347,42 @@ "dev": true, "license": "ISC" }, + "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/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -8613,6 +9550,16 @@ "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/stubs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", @@ -8632,6 +9579,23 @@ "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/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -8664,6 +9628,47 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "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/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -8798,6 +9803,23 @@ "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/terser": { "version": "5.39.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", @@ -8904,6 +9926,22 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "license": "MIT" }, + "node_modules/textextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", + "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", + "dev": true, + "license": "Artistic-2.0", + "dependencies": { + "editions": "^6.21.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -9213,9 +10251,9 @@ } }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, "license": "MIT" }, @@ -9227,13 +10265,13 @@ "license": "MIT" }, "node_modules/undici": { - "version": "6.21.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz", - "integrity": "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.13.0.tgz", + "integrity": "sha512-l+zSMssRqrzDcb3fjMkjjLGmuiiK2pMIcV++mJaAc9vhjSGpvM7h43QgP+OAMb1GImHmbPyG2tBXeuyG5iY4gA==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.17" + "node": ">=20.18.1" } }, "node_modules/undici-types": { @@ -9275,6 +10313,20 @@ "node": ">=8" } }, + "node_modules/unzipper": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", + "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "^11.2.0", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -9384,6 +10436,17 @@ "dev": true, "license": "MIT" }, + "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/validator": { "version": "13.15.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.0.tgz", @@ -9393,29 +10456,43 @@ "node": ">= 0.10" } }, + "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/vscode-extension-tester": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-8.3.0.tgz", - "integrity": "sha512-x9/OiwUWDqlxyrf/ALHX25ChVHm38on1VHtmmS8NpDSGmbYsaeXaJg3Kw9c4mRUoV8eugNlowRwTG98fuT2rWA==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-8.17.0.tgz", + "integrity": "sha512-B97Aas11bEcM0dcXCn/D+hg58Xwugf0nSu464gvfq5uXYUCUVWNPM7r971DwXxuWd+mcREcuW6/bz07Mod6zBA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@redhat-developer/locators": "^1.1.2", - "@redhat-developer/page-objects": "^1.1.2", - "@types/selenium-webdriver": "^4.1.22", - "@vscode/vsce": "^2.27.0", - "c8": "^10.1.1", - "commander": "^12.1.0", - "compare-versions": "^6.1.0", + "@redhat-developer/locators": "^1.15.0", + "@redhat-developer/page-objects": "^1.15.0", + "@types/selenium-webdriver": "^4.1.28", + "@vscode/vsce": "^3.6.0", + "c8": "^10.1.3", + "commander": "^14.0.0", + "compare-versions": "^6.1.1", "find-up": "7.0.0", - "fs-extra": "^11.2.0", - "glob": "^10.4.1", - "got": "^13.0.0", + "fs-extra": "^11.3.0", + "glob": "^11.0.3", + "got": "^14.4.7", "hpagent": "^1.2.0", "js-yaml": "^4.1.0", "sanitize-filename": "^1.6.3", - "selenium-webdriver": "^4.21.0", - "targz": "^1.0.1" + "selenium-webdriver": "^4.34.0", + "targz": "^1.0.1", + "unzipper": "^0.12.3" }, "bin": { "extest": "out/cli.js" @@ -9444,16 +10521,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/vscode-extension-tester/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/vscode-extension-tester/node_modules/find-up": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", @@ -9473,22 +10540,41 @@ } }, "node_modules/vscode-extension-tester/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "dev": true, "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "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-extension-tester/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" } @@ -9522,20 +10608,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vscode-extension-tester/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/vscode-extension-tester/node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", "dev": true, "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "20 || >=22" } }, "node_modules/vscode-extension-tester/node_modules/p-limit": { @@ -9580,6 +10660,23 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/vscode-extension-tester/node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "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/vscode-extension-tester/node_modules/yocto-queue": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", @@ -9927,9 +11024,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "license": "MIT", "engines": { @@ -9948,6 +11045,22 @@ } } }, + "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/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", @@ -10136,4 +11249,4 @@ } } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 28e0b072..87ac0dea 100644 --- a/package.json +++ b/package.json @@ -560,7 +560,7 @@ } ], "menus": { - "ast-results.filterBy": [ + "ast-results.filterBy": [ { "command": "ast-results.filterConfirmedActive", "group": "navigation@1", @@ -1052,7 +1052,7 @@ "sinon": "^19.0.2", "ts-node": "^10.9.2", "typescript": "^5.6.3", - "vscode-extension-tester": "8.3.0", + "vscode-extension-tester": "8.17.0", "vscode-extension-tester-locators": "^3.12.2", "webpack": "^5.94.0", "webpack-cli": "^5.1.4" From 20a76670cb1e81fdcbe997c1d67554f89552d022 Mon Sep 17 00:00:00 2001 From: Itay Paz Date: Thu, 14 Aug 2025 11:58:26 +0300 Subject: [PATCH 08/12] Fix ignore logic with multi line iac and contanier --- src/commands/openAIChatCommand.ts | 9 +++++++++ .../scanners/containers/containersScannerService.ts | 12 ++++++++++++ .../scanners/iac/iacScannerService.ts | 10 ++++++++++ 3 files changed, 31 insertions(+) diff --git a/src/commands/openAIChatCommand.ts b/src/commands/openAIChatCommand.ts index c54e9508..b5cc6cbc 100644 --- a/src/commands/openAIChatCommand.ts +++ b/src/commands/openAIChatCommand.ts @@ -259,6 +259,11 @@ export class CopilotChatCommand { if (this.iacScanner && this.iacScanner.scan) { await this.iacScanner.scan(document, this.logs); } + if (this.containersScanner.hasAnySeverityDecorations()) { + await this.containersScanner.scan(document, this.logs); + + } + } else if (isSecretsHoverData(item)) { ignoreManager.addIgnoredEntrySecrets({ @@ -316,6 +321,10 @@ export class CopilotChatCommand { if (document && this.containersScanner && this.containersScanner.shouldScanFile(document)) { await this.containersScanner.scan(document, this.logs); } + if (this.iacScanner.hasAnySeverityDecorations()) { + await this.iacScanner.scan(document, this.logs); + + } } else { ignoreManager.addIgnoredEntry({ diff --git a/src/realtimeScanners/scanners/containers/containersScannerService.ts b/src/realtimeScanners/scanners/containers/containersScannerService.ts index 9dd7ff83..6d673084 100644 --- a/src/realtimeScanners/scanners/containers/containersScannerService.ts +++ b/src/realtimeScanners/scanners/containers/containersScannerService.ts @@ -739,4 +739,16 @@ export class ContainersScannerService extends BaseScannerService { getDiagnosticsMap(): Map { return this.diagnosticsMap; } + + public hasAnySeverityDecorations(): boolean { + return ( + this.maliciousDecorationsMap.size > 0 || + this.okDecorationsMap.size > 0 || + this.unknownDecorationsMap.size > 0 || + this.criticalDecorationsMap.size > 0 || + this.highDecorationsMap.size > 0 || + this.mediumDecorationsMap.size > 0 || + this.lowDecorationsMap.size > 0 + ); + } } diff --git a/src/realtimeScanners/scanners/iac/iacScannerService.ts b/src/realtimeScanners/scanners/iac/iacScannerService.ts index 255a5d7e..d3aff10d 100644 --- a/src/realtimeScanners/scanners/iac/iacScannerService.ts +++ b/src/realtimeScanners/scanners/iac/iacScannerService.ts @@ -436,4 +436,14 @@ export class IacScannerService extends BaseScannerService { this.lowDecorationsMap.clear(); this.ignoredDecorations.clear(); } + + + public hasAnySeverityDecorations(): boolean { + return ( + this.criticalDecorationsMap.size > 0 || + this.highDecorationsMap.size > 0 || + this.mediumDecorationsMap.size > 0 || + this.lowDecorationsMap.size > 0 + ); + } } From 960b6e0f101734c53167ce807947a311d223885a Mon Sep 17 00:00:00 2001 From: Itay Paz Date: Thu, 14 Aug 2025 12:49:38 +0300 Subject: [PATCH 09/12] fix conflicts --- src/commands/openAIChatCommand.ts | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/commands/openAIChatCommand.ts b/src/commands/openAIChatCommand.ts index 4d99a55d..78a21353 100644 --- a/src/commands/openAIChatCommand.ts +++ b/src/commands/openAIChatCommand.ts @@ -4,20 +4,19 @@ import { commands } from "../utils/common/commands"; import { constants, Platform } from "../utils/common/constants"; import { spawn } from "child_process"; import { - isCursorIDE, - isIDE, - isSecretsHoverData, - getWorkspaceFolder, - getInitializedIgnoreManager, - findAndIgnoreMatchingPackages, - rescanFiles, - isContainersHoverData, - isAscaHoverData, - isIacHoverData, - findAndIgnoreMatchingContainersInWorkspace, - rescanContainerFiles + isIDE, + getIDEName, + isSecretsHoverData, + getWorkspaceFolder, + getInitializedIgnoreManager, + findAndIgnoreMatchingPackages, + rescanFiles, + isContainersHoverData, + isAscaHoverData, + isIacHoverData, + findAndIgnoreMatchingContainersInWorkspace, + rescanContainerFiles } from "../utils/utils"; - import { HoverData, SecretsHoverData, AscaHoverData, ContainersHoverData, IacHoverData } from "../realtimeScanners/common/types"; import { SCA_EXPLANATION_PROMPT, From 2cb5ea93f8962b898edb25bd0ab4ef0709f725f7 Mon Sep 17 00:00:00 2001 From: Itay Paz Date: Thu, 14 Aug 2025 12:56:04 +0300 Subject: [PATCH 10/12] try to fix cx vul --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 87ac0dea..48619885 100644 --- a/package.json +++ b/package.json @@ -1079,7 +1079,8 @@ "prebuild-install": "^7.1.1", "bluebird": "^3.7.2", "xml2js": "^0.6.2", - "tar-fs": "^2.1.3" + "tar-fs": "^2.1.3", + "tmp": "^0.2.5" }, "lint-staged": { "**/*.{js,ts}": [ From 86120d5bedf911e66b6cfb7d34bc520644f5c21e Mon Sep 17 00:00:00 2001 From: Itay Paz Date: Thu, 14 Aug 2025 15:23:16 +0300 Subject: [PATCH 11/12] Fix iac and container multi lines --- .../containers/containersScannerService.ts | 65 ++++++++++++------- .../scanners/iac/iacScannerService.ts | 52 +++++++++------ 2 files changed, 74 insertions(+), 43 deletions(-) diff --git a/src/realtimeScanners/scanners/containers/containersScannerService.ts b/src/realtimeScanners/scanners/containers/containersScannerService.ts index 6d673084..702a9ccf 100644 --- a/src/realtimeScanners/scanners/containers/containersScannerService.ts +++ b/src/realtimeScanners/scanners/containers/containersScannerService.ts @@ -415,6 +415,18 @@ export class ContainersScannerService extends BaseScannerService { const allScanResults = (this.lastFullScanResults as CxContainerRealtimeResult[]) || scanResults; + const activeLineNumbers = new Set(); + scanResults.forEach(result => { + if (result.locations) { + result.locations.forEach(loc => activeLineNumbers.add(loc.line)); + } + }); + + const iacDiagnostics = vscode.languages.getDiagnostics(uri).filter(diagnostic => { + const diagnosticData = (diagnostic as vscode.Diagnostic & { data?: CxDiagnosticData }).data; + return diagnosticData?.cxType === constants.iacRealtimeScannerEngineName; + }); + Object.entries(ignoredData).forEach(([, entry]) => { if (entry.type !== constants.containersRealtimeScannerEngineName) { return; } const fileEntry = entry.files.find(f => f.path === relativePath && f.active); @@ -426,30 +438,35 @@ export class ContainersScannerService extends BaseScannerService { const resultKey = `${result.imageName}:${result.imageTag}`; if (resultKey === imageKey && result.locations) { result.locations.forEach(location => { - const range = new vscode.Range( - new vscode.Position(location.line, location.startIndex), - new vscode.Position(location.line, location.endIndex) - ); - ignoredDecorations.push({ range }); - - const hoverKey = `${filePath}:${location.line}`; - if (!this.containersHoverData.has(hoverKey)) { - this.containersHoverData.set(hoverKey, { - imageName: entry.imageName!, - imageTag: entry.imageTag!, - status: (entry.severity as CxRealtimeEngineStatus) || CxRealtimeEngineStatus.medium, - vulnerabilities: [], - location: { - line: location.line, - startIndex: location.startIndex, - endIndex: location.endIndex - }, - fileType: this.isDockerComposeFile(filePath) - ? 'docker-compose' - : constants.containersHelmExtensions.includes(path.extname(filePath).toLowerCase()) - ? 'helm' - : 'dockerfile' - }); + const hasActiveContainerFindings = activeLineNumbers.has(location.line); + const hasActiveIacFindings = iacDiagnostics.some(diag => diag.range.start.line === location.line); + + if (!hasActiveContainerFindings && !hasActiveIacFindings) { + const range = new vscode.Range( + new vscode.Position(location.line, location.startIndex), + new vscode.Position(location.line, location.endIndex) + ); + ignoredDecorations.push({ range }); + + const hoverKey = `${filePath}:${location.line}`; + if (!this.containersHoverData.has(hoverKey)) { + this.containersHoverData.set(hoverKey, { + imageName: entry.imageName!, + imageTag: entry.imageTag!, + status: (entry.severity as CxRealtimeEngineStatus) || CxRealtimeEngineStatus.medium, + vulnerabilities: [], + location: { + line: location.line, + startIndex: location.startIndex, + endIndex: location.endIndex + }, + fileType: this.isDockerComposeFile(filePath) + ? 'docker-compose' + : constants.containersHelmExtensions.includes(path.extname(filePath).toLowerCase()) + ? 'helm' + : 'dockerfile' + }); + } } }); } diff --git a/src/realtimeScanners/scanners/iac/iacScannerService.ts b/src/realtimeScanners/scanners/iac/iacScannerService.ts index d3aff10d..eb29061f 100644 --- a/src/realtimeScanners/scanners/iac/iacScannerService.ts +++ b/src/realtimeScanners/scanners/iac/iacScannerService.ts @@ -170,6 +170,15 @@ export class IacScannerService extends BaseScannerService { const relativePath = path.relative(vscode.workspace.workspaceFolders?.[0]?.uri.fsPath || '', filePath); const ignoredDecorations: vscode.DecorationOptions[] = []; + const activeLineNumbers = new Set(); + scanResults.forEach(result => { + result.locations.forEach(loc => activeLineNumbers.add(loc.line)); + }); + + const containerDiagnostics = vscode.languages.getDiagnostics(document.uri).filter(diagnostic => { + const diagnosticData = (diagnostic as vscode.Diagnostic & { data?: CxDiagnosticData }).data; + return diagnosticData?.cxType === constants.containersRealtimeScannerEngineName; + }); const iacLocations = new Map(); fullScanResults.forEach(result => { @@ -190,25 +199,30 @@ export class IacScannerService extends BaseScannerService { const lines = iacLocations.get(key) || []; lines.forEach(line => { - const adjustedLine = line; - const range = new vscode.Range( - new vscode.Position(adjustedLine, 0), - new vscode.Position(adjustedLine, 1000) - ); - ignoredDecorations.push({ range }); - - const hoverKey = `${filePath}:${adjustedLine}`; - if (!this.iacHoverData.has(hoverKey)) { - this.iacHoverData.set(hoverKey, [{ - similarityId: entry.similarityId, - title: entry.PackageName, - description: entry.description, - severity: entry.severity, - filePath, - originalFilePath: filePath, - location: { line: adjustedLine, startIndex: 0, endIndex: 1000 }, - fileType: path.extname(filePath).substring(1) - }]); + const hasActiveIacFindings = activeLineNumbers.has(line); + const hasActiveContainerFindings = containerDiagnostics.some(diag => diag.range.start.line === line); + + if (!hasActiveIacFindings && !hasActiveContainerFindings) { + const adjustedLine = line; + const range = new vscode.Range( + new vscode.Position(adjustedLine, 0), + new vscode.Position(adjustedLine, 1000) + ); + ignoredDecorations.push({ range }); + + const hoverKey = `${filePath}:${adjustedLine}`; + if (!this.iacHoverData.has(hoverKey)) { + this.iacHoverData.set(hoverKey, [{ + similarityId: entry.similarityId, + title: entry.PackageName, + description: entry.description, + severity: entry.severity, + filePath, + originalFilePath: filePath, + location: { line: adjustedLine, startIndex: 0, endIndex: 1000 }, + fileType: path.extname(filePath).substring(1) + }]); + } } }); }); From a4ea376184d8b476e617a40c49c537eaf4fe4e63 Mon Sep 17 00:00:00 2001 From: Itay Paz Date: Thu, 14 Aug 2025 16:01:54 +0300 Subject: [PATCH 12/12] Update js wrapper new relase --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1ffebaf8..087736cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "ast-results", "version": "2.34.0", "dependencies": { - "@checkmarxdev/ast-cli-javascript-wrapper": "0.0.140-rc-itay-Ignore-without-filepath.0", + "@checkmarxdev/ast-cli-javascript-wrapper": "0.0.140", "@popperjs/core": "^2.11.8", "@vscode/codicons": "^0.0.36", "axios": "^1.11.0", @@ -565,9 +565,9 @@ }, "node_modules/@checkmarxdev/ast-cli-javascript-wrapper": { "name": "@CheckmarxDev/ast-cli-javascript-wrapper", - "version": "0.0.140-rc-itay-Ignore-without-filepath.0", - "resolved": "https://npm.pkg.github.com/download/@CheckmarxDev/ast-cli-javascript-wrapper/0.0.140-rc-itay-Ignore-without-filepath.0/890b1d1a2e7a1ef588125208a1af0b99fbd4a252", - "integrity": "sha512-kshIKoK+2CF9QclRVIOkBcngWVbA1bQ2PtS56USt/ikywC3KFXhtDuczk0nJMLclmmzstBeVBdVKFspPcxD+7Q==", + "version": "0.0.140", + "resolved": "https://npm.pkg.github.com/download/@CheckmarxDev/ast-cli-javascript-wrapper/0.0.140/71b223eff754c0f9c841830f7c07fd2666bd020f", + "integrity": "sha512-ZOks7NhZNwK6VB/HvU/zpbEBd1FGR1jc/5pf4ac2M/Pt/PjvBpmRjSzbOh6yxwGOXS4EMT1YdE3f20NFzhthFw==", "license": "ISC", "dependencies": { "log4js": "^6.9.1" diff --git a/package.json b/package.json index 48619885..e7adcee5 100644 --- a/package.json +++ b/package.json @@ -1058,7 +1058,7 @@ "webpack-cli": "^5.1.4" }, "dependencies": { - "@checkmarxdev/ast-cli-javascript-wrapper": "0.0.140-rc-itay-Ignore-without-filepath.0", + "@checkmarxdev/ast-cli-javascript-wrapper": "0.0.140", "@popperjs/core": "^2.11.8", "@vscode/codicons": "^0.0.36", "axios": "^1.11.0",