diff --git a/package-lock.json b/package-lock.json index a4deada5f..42ccacb68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,8 @@ "string-argv": "^0.3.1", "uuid": "^8.3.2", "validate-npm-package-name": "^3.0.0", - "vscode-languageclient": "8.1.0" + "vscode-languageclient": "8.1.0", + "vscode-languageserver-textdocument": "^1.0.8" }, "devDependencies": { "@amplitude/ampli": "^1.29.0", @@ -8126,6 +8127,11 @@ "vscode-languageserver-types": "3.17.3" } }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" + }, "node_modules/vscode-languageserver-types": { "version": "3.17.3", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", @@ -14604,6 +14610,11 @@ "vscode-languageserver-types": "3.17.3" } }, + "vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" + }, "vscode-languageserver-types": { "version": "3.17.3", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", diff --git a/package.json b/package.json index 72e4ed720..f0580ce9d 100644 --- a/package.json +++ b/package.json @@ -458,6 +458,7 @@ "string-argv": "^0.3.1", "uuid": "^8.3.2", "validate-npm-package-name": "^3.0.0", - "vscode-languageclient": "8.1.0" + "vscode-languageclient": "8.1.0", + "vscode-languageserver-textdocument":"^1.0.8" } } diff --git a/src/snyk/common/languageServer/languageServer.ts b/src/snyk/common/languageServer/languageServer.ts index b9ca37a04..f4f45ec66 100644 --- a/src/snyk/common/languageServer/languageServer.ts +++ b/src/snyk/common/languageServer/languageServer.ts @@ -81,7 +81,7 @@ export class LanguageServer implements ILanguageServer { const serverOptions: ServerOptions = { command: lsBinaryPath, - args: ['-l', 'info'], + args: ['-l', 'debug'], options: { env: processEnv, }, diff --git a/src/snyk/common/vscode/textdocument.ts b/src/snyk/common/vscode/textdocument.ts new file mode 100644 index 000000000..28e05dc0e --- /dev/null +++ b/src/snyk/common/vscode/textdocument.ts @@ -0,0 +1,12 @@ +import * as vlt from 'vscode-languageserver-textdocument'; +import { LSPTextDocument } from './types'; + +export interface ITextDocumentAdapter { + create(uri: string, language: string, version: number, content: string): LSPTextDocument; +} + +export class TextDocumentAdapter implements ITextDocumentAdapter { + create(uri: string, language: string, version: number, content: string): LSPTextDocument { + return vlt.TextDocument.create(uri, language, version, content); + } +} diff --git a/src/snyk/common/vscode/types.ts b/src/snyk/common/vscode/types.ts index e67c8622f..0ce5f0664 100644 --- a/src/snyk/common/vscode/types.ts +++ b/src/snyk/common/vscode/types.ts @@ -1,5 +1,6 @@ import * as vscode from 'vscode'; import * as lsc from 'vscode-languageclient/node'; +import * as lst from 'vscode-languageserver-textdocument'; // VS Code core type mappings export type Disposable = vscode.Disposable; @@ -57,3 +58,6 @@ export type ConfigurationParams = lsc.ConfigurationParams; export type CancellationToken = lsc.CancellationToken; export type ConfigurationRequestHandlerSignature = lsc.ConfigurationRequest.HandlerSignature; export type ResponseError = lsc.ResponseError; +export type InlineValueContext = lsc.InlineValueContext; +export type InlineValueText = lsc.InlineValueText; +export type LSPTextDocument = lst.TextDocument; diff --git a/src/snyk/extension.ts b/src/snyk/extension.ts index 71716fd2d..934091ce8 100644 --- a/src/snyk/extension.ts +++ b/src/snyk/extension.ts @@ -59,6 +59,7 @@ import { HoverAdapter } from './common/vscode/hover'; import { LanguageClientAdapter } from './common/vscode/languageClient'; import { vsCodeLanguages } from './common/vscode/languages'; import SecretStorageAdapter from './common/vscode/secretStorage'; +import { TextDocumentAdapter } from './common/vscode/textdocument'; import { ThemeColorAdapter } from './common/vscode/theme'; import { Range, Uri } from './common/vscode/types'; import { UriAdapter } from './common/vscode/uri'; @@ -74,10 +75,8 @@ import { CodeSuggestionWebviewProvider } from './snykCode/views/suggestion/codeS import { IacService } from './snykIac/iacService'; import IacIssueTreeProvider from './snykIac/views/iacIssueTreeProvider'; import { IacSuggestionWebviewProvider } from './snykIac/views/suggestion/iacSuggestionWebviewProvider'; -import { NpmTestApi } from './snykOss/api/npmTestApi'; import { EditorDecorator } from './snykOss/editor/editorDecorator'; import { OssService } from './snykOss/services/ossService'; -import { NpmModuleInfoFetchService } from './snykOss/services/vulnerabilityCount/npmModuleInfoFetchService'; import { OssVulnerabilityCountService } from './snykOss/services/vulnerabilityCount/ossVulnerabilityCountService'; import { ModuleVulnerabilityCountProvider } from './snykOss/services/vulnerabilityCount/vulnerabilityCountProvider'; import { OssVulnerabilityTreeProvider } from './snykOss/views/ossVulnerabilityTreeProvider'; @@ -361,16 +360,16 @@ class SnykExtension extends SnykLib implements IExtension { this.initDependencyDownload(); - const npmModuleInfoFetchService = new NpmModuleInfoFetchService( - configuration, - Logger, - new NpmTestApi(Logger, vsCodeWorkspace), - ); this.ossVulnerabilityCountService = new OssVulnerabilityCountService( vsCodeWorkspace, vsCodeWindow, vsCodeLanguages, - new ModuleVulnerabilityCountProvider(this.ossService, npmModuleInfoFetchService), + new ModuleVulnerabilityCountProvider( + this.ossService, + languageClientAdapter, + new UriAdapter(), + new TextDocumentAdapter(), + ), this.ossService, Logger, new EditorDecorator(vsCodeWindow, vsCodeLanguages, new ThemeColorAdapter()), diff --git a/src/snyk/snykOss/api/npmTestApi.ts b/src/snyk/snykOss/api/npmTestApi.ts deleted file mode 100644 index ed4493009..000000000 --- a/src/snyk/snykOss/api/npmTestApi.ts +++ /dev/null @@ -1,40 +0,0 @@ -import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; -import { DEFAULT_API_HEADERS } from '../../common/api/headers'; -import { configuration } from '../../common/configuration/instance'; -import { ILog } from '../../common/logger/interfaces'; -import { getAxiosConfig } from '../../common/proxy'; -import { IVSCodeWorkspace } from '../../common/vscode/workspace'; - -export class NpmTestApi { - private instance: Promise | null = null; - - constructor(private readonly logger: ILog, private readonly workspace: IVSCodeWorkspace) {} - - private get http(): Promise { - return this.instance != null ? this.instance : this.initHttp(); - } - - async initHttp(): Promise { - const http = axios.create({ - headers: DEFAULT_API_HEADERS, - responseType: 'json', - baseURL: configuration.authHost + '/test', - ...(await getAxiosConfig(this.workspace, configuration, this.logger)), - }); - - http.interceptors.response.use( - response => response, - error => { - this.logger.error(`Call to Snyk NPM Test API failed. ${error}`); - return Promise.reject(error); - }, - ); - - this.instance = Promise.resolve(http); - return http; - } - - async get>(url: string, config?: AxiosRequestConfig): Promise { - return (await this.http).get(url, config); - } -} diff --git a/src/snyk/snykOss/services/vulnerabilityCount/npmModuleInfoFetchService.ts b/src/snyk/snykOss/services/vulnerabilityCount/npmModuleInfoFetchService.ts deleted file mode 100644 index dbad848b3..000000000 --- a/src/snyk/snykOss/services/vulnerabilityCount/npmModuleInfoFetchService.ts +++ /dev/null @@ -1,129 +0,0 @@ -import _ from 'lodash'; -import { IConfiguration } from '../../../common/configuration/configuration'; -import { ErrorHandler } from '../../../common/error/errorHandler'; -import { ILog } from '../../../common/logger/interfaces'; -import { NpmTestApi } from '../../api/npmTestApi'; -import { ImportedModule, TestedImportedModule } from './importedModule'; - -export type NpmRegistryPackage = { - name: string; - version: string; -}; - -export type NpmTestApiResult = { - resultTitle: string; - totalVulns: number; -}; - -/** - * Responsible for caching & fetching npm module info - */ -export class NpmModuleInfoFetchService { - private readonly debounceIntervalInMs = 2000; - - private debouncedPromises: Record Promise> = {}; - - private npmPackageCache = new Map(); - private vulnerabilityCache = new Map | NpmTestApiResult>(); - - constructor( - private readonly config: IConfiguration, - private readonly logger: ILog, - private readonly npmTestApi: NpmTestApi, - ) {} - - async getModuleVulnerabilityInfo(module: ImportedModule): Promise { - const key = this.getVulnerabilityCacheKey(module); - if (!key) { - return { ...module, tested: false }; - } - - const testedModulePromise = this.vulnerabilityCache.get(key); - - if (testedModulePromise === undefined || testedModulePromise instanceof Promise) { - try { - const testedModule = await (testedModulePromise || this.lookupVulnerabilities(key, module.string)); - this.vulnerabilityCache.set(key, testedModule); - } catch (e) { - this.logger.info(`Failed to lookup vulnerabilities for ${key}. ${e}`); - this.vulnerabilityCache.delete(key); - - return { ...module, tested: false }; - } - } - - const result = await this.vulnerabilityCache.get(key); - if (!result) { - throw new Error(`Vulnerability result isn't available for ${key} due to missing cache entry.`); - } - - return { ...module, vulnerabilityCount: result.totalVulns, tested: true }; - } - - private getVulnerabilityCacheKey(module: ImportedModule): string | undefined { - try { - const npmPackage = this.getNpmRegistryPackage(module); - return `${npmPackage.name}@${npmPackage.version}`; - } catch (e) { - this.logger.error(ErrorHandler.stringifyError(e)); - return undefined; - } - } - - private getNpmRegistryPackage(module: ImportedModule) { - if (!module.string) { - throw new Error('Module source string must be provided to work with npm package cache.'); - } - if (!module.version || !module.name) { - throw new Error('Module name and version must be provided to fetch a package.'); - } - - const npmPackage = this.npmPackageCache.get(module.string) || { name: module.name, version: module.version }; - this.npmPackageCache.set(module.string, npmPackage); - - return npmPackage; - } - - private lookupVulnerabilities(vulnerabilityKey: string, npmPackageCacheKey: string): Promise { - const npmPackage = this.npmPackageCache.get(npmPackageCacheKey); - if (!npmPackage) { - throw new Error('Npm package is not in cache for some reason.'); - } - - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument - return this.debouncePromise(vulnerabilityKey, this.test.bind(this), npmPackage); - } - - private async test(npmPackage: NpmRegistryPackage): Promise { - const utm = `utm_medium=${this.config.source}&utm_source=${this.config.source}&utm_campaign=${this.config.source}`; - - const result = await this.npmTestApi.get( - `/npm/${npmPackage.name}/${npmPackage.version}?${utm}&type=json`, - ); - - return result.data; - } - - private async debouncePromise( - name: string, - fn: (...args: unknown[]) => Promise, - ...args: unknown[] - ): Promise { - if (!this.debouncedPromises[name]) { - const debounced = _.debounce((resolve, reject, args) => { - /* eslint-disable @typescript-eslint/no-unsafe-argument */ - fn(...args) - .then(resolve) - .catch(reject); - /* eslint-enable @typescript-eslint/no-unsafe-argument */ - }, this.debounceIntervalInMs); - - this.debouncedPromises[name] = (...args): Promise => - new Promise((resolve, reject) => { - debounced(resolve, reject, args); - }); - } - - return this.debouncedPromises[name](...args); - } -} diff --git a/src/snyk/snykOss/services/vulnerabilityCount/ossVulnerabilityCountService.ts b/src/snyk/snykOss/services/vulnerabilityCount/ossVulnerabilityCountService.ts index 92db37e09..26f23bc36 100644 --- a/src/snyk/snykOss/services/vulnerabilityCount/ossVulnerabilityCountService.ts +++ b/src/snyk/snykOss/services/vulnerabilityCount/ossVulnerabilityCountService.ts @@ -215,7 +215,7 @@ export class OssVulnerabilityCountService implements Disposable { emitter.startScanning(modules); const promises = modules - .map(module => this.vulnerabilityCountProvider.getVulnerabilityCount(module, language)) + .map(module => this.vulnerabilityCountProvider.getVulnerabilityCount(fileName, module, language)) .map(promise => promise.then(module => { emitter.scanned(module); diff --git a/src/snyk/snykOss/services/vulnerabilityCount/vulnerabilityCountProvider.ts b/src/snyk/snykOss/services/vulnerabilityCount/vulnerabilityCountProvider.ts index b7df8f849..c6d30f898 100644 --- a/src/snyk/snykOss/services/vulnerabilityCount/vulnerabilityCountProvider.ts +++ b/src/snyk/snykOss/services/vulnerabilityCount/vulnerabilityCountProvider.ts @@ -1,16 +1,25 @@ import { Language } from '../../../common/types'; +import { ILanguageClientAdapter } from '../../../common/vscode/languageClient'; +import { IUriAdapter } from '../../../common/vscode/uri'; import { isResultCliError, OssFileResult, OssResultBody, OssVulnerability } from '../../ossResult'; import { OssService } from '../ossService'; -import { ImportedModule, ModuleVulnerabilityCount, SeverityCounts, TestedImportedModule } from './importedModule'; -import { NpmModuleInfoFetchService } from './npmModuleInfoFetchService'; +import { ImportedModule, ModuleVulnerabilityCount, SeverityCounts } from './importedModule'; +import { InlineValueText, LSPTextDocument } from '../../../common/vscode/types'; +import { ITextDocumentAdapter } from '../../../common/vscode/textdocument'; export class ModuleVulnerabilityCountProvider { constructor( private readonly ossService: OssService, - private readonly npmModuleInfoFetchService: NpmModuleInfoFetchService, + private readonly lca: ILanguageClientAdapter, + private readonly uriAdapter: IUriAdapter, + private readonly textDocumentAdapter: ITextDocumentAdapter, ) {} - async getVulnerabilityCount(module: ImportedModule, language: Language): Promise { + async getVulnerabilityCount( + fileName: string, + module: ImportedModule, + language: Language, + ): Promise { const notCalculated = { name: module.name, fileName: module.fileName, @@ -20,15 +29,39 @@ export class ModuleVulnerabilityCountProvider { }; if ([Language.TypeScript, Language.JavaScript, Language.PJSON].includes(language)) { + // TODO use LS when OSS is moved to LS const ossResult = this.ossService.getResultArray(); if (!ossResult) { return notCalculated; } return this.mapOssResult(module, ossResult); - } else if (language == Language.HTML) { - const testedModuleInfo = await this.npmModuleInfoFetchService.getModuleVulnerabilityInfo(module); - return this.mapTestedImportedModule(testedModuleInfo); + } else if (language == Language.HTML && module.loc) { + const uri = this.uriAdapter.file(fileName).toString(); + const doc: LSPTextDocument = this.textDocumentAdapter.create(uri, 'HTML', 1, ''); + const line = module.loc.start.line - 1; + const param = { + textDocument: { uri: doc.uri }, + range: { + start: { line: line, character: module.loc.start.column }, + end: { line: line, character: module.loc.end.column }, + }, + }; + const inlineValues: InlineValueText[] = await this.lca + .getLanguageClient() + .sendRequest('textDocument/inlineValue', param); + + if (inlineValues.length > 0) { + return { + name: module.name, + version: module.version, + fileName: module.fileName, + line: module.line, + range: module.loc, + count: inlineValues[0].text, + hasCount: true, + } as unknown as ModuleVulnerabilityCount; + } } return notCalculated; @@ -41,23 +74,7 @@ export class ModuleVulnerabilityCountProvider { // File is considered to be part of OSS test if it has common root directory between OSS result path and filename path. // This is since package.json always lies in the root directory folder of a project. - if (filePath.startsWith(ossFileResult.path)) { - return true; - } - - return false; - } - - private mapTestedImportedModule(module: TestedImportedModule): ModuleVulnerabilityCount { - return { - name: module.name, - version: module.version, - fileName: module.fileName, - line: module.line, - range: module.loc, - count: module.vulnerabilityCount, - hasCount: module.tested, - }; + return filePath.startsWith(ossFileResult.path); } private mapOssResult(module: ImportedModule, ossResult: ReadonlyArray): ModuleVulnerabilityCount { @@ -116,7 +133,10 @@ export class ModuleVulnerabilityCountProvider { return directVulnerabilities .map(v => v.severity) .reduce( - (arr, severity) => ({ ...arr, [severity]: directVulnerabilities.filter(v => v.severity == severity).length }), + (arr, severity) => ({ + ...arr, + [severity]: directVulnerabilities.filter(v => v.severity == severity).length, + }), {} as SeverityCounts, ); } diff --git a/src/test/unit/snykOss/services/vulnerabilityCount/ossVulnerabilityCountService.test.ts b/src/test/unit/snykOss/services/vulnerabilityCount/ossVulnerabilityCountService.test.ts index d58770a1c..1e8277bc5 100644 --- a/src/test/unit/snykOss/services/vulnerabilityCount/ossVulnerabilityCountService.test.ts +++ b/src/test/unit/snykOss/services/vulnerabilityCount/ossVulnerabilityCountService.test.ts @@ -12,10 +12,12 @@ import { IVSCodeWorkspace } from '../../../../../snyk/common/vscode/workspace'; import { EditorDecorator } from '../../../../../snyk/snykOss/editor/editorDecorator'; import { OssFileResult } from '../../../../../snyk/snykOss/ossResult'; import { OssService } from '../../../../../snyk/snykOss/services/ossService'; -import { NpmModuleInfoFetchService } from '../../../../../snyk/snykOss/services/vulnerabilityCount/npmModuleInfoFetchService'; import { OssVulnerabilityCountService } from '../../../../../snyk/snykOss/services/vulnerabilityCount/ossVulnerabilityCountService'; import { ModuleVulnerabilityCountProvider } from '../../../../../snyk/snykOss/services/vulnerabilityCount/vulnerabilityCountProvider'; import { LoggerMock } from '../../../mocks/logger.mock'; +import { ILanguageClientAdapter } from '../../../../../snyk/common/vscode/languageClient'; +import { IUriAdapter } from '../../../../../snyk/common/vscode/uri'; +import { ITextDocumentAdapter } from '../../../../../snyk/common/vscode/textdocument'; suite('OSS VulnerabilityCountService', () => { let workspace: IVSCodeWorkspace; @@ -27,7 +29,6 @@ suite('OSS VulnerabilityCountService', () => { setup(() => { const logger = new LoggerMock(); - const npmModuleInfoFetchService = {} as NpmModuleInfoFetchService; ossService = { scanFinished$: EMPTY, } as unknown as OssService; @@ -40,7 +41,12 @@ suite('OSS VulnerabilityCountService', () => { registerCodeActionsProvider: sinon.fake(), registerHoverProvider: sinon.fake(), } as unknown as IVSCodeLanguages; - vulnerabilityCountProvider = new ModuleVulnerabilityCountProvider(ossService, npmModuleInfoFetchService); + vulnerabilityCountProvider = new ModuleVulnerabilityCountProvider( + ossService, + {} as ILanguageClientAdapter, + {} as IUriAdapter, + {} as ITextDocumentAdapter, + ); const editorDecorator = new EditorDecorator(window, languages, {} as IThemeColorAdapter); const codeActionProvider = { diff --git a/src/test/unit/snykOss/services/vulnerabilityCount/vulnerabilityCountProvider.test.ts b/src/test/unit/snykOss/services/vulnerabilityCount/vulnerabilityCountProvider.test.ts index 8f79644e1..8acdac9e8 100644 --- a/src/test/unit/snykOss/services/vulnerabilityCount/vulnerabilityCountProvider.test.ts +++ b/src/test/unit/snykOss/services/vulnerabilityCount/vulnerabilityCountProvider.test.ts @@ -5,8 +5,10 @@ import { Language } from '../../../../../snyk/common/types'; import { OssResultBody, OssVulnerability } from '../../../../../snyk/snykOss/ossResult'; import { OssService } from '../../../../../snyk/snykOss/services/ossService'; import { ImportedModule } from '../../../../../snyk/snykOss/services/vulnerabilityCount/importedModule'; -import { NpmModuleInfoFetchService } from '../../../../../snyk/snykOss/services/vulnerabilityCount/npmModuleInfoFetchService'; import { ModuleVulnerabilityCountProvider } from '../../../../../snyk/snykOss/services/vulnerabilityCount/vulnerabilityCountProvider'; +import { ILanguageClientAdapter } from '../../../../../snyk/common/vscode/languageClient'; +import { IUriAdapter } from '../../../../../snyk/common/vscode/uri'; +import { ITextDocumentAdapter } from '../../../../../snyk/common/vscode/textdocument'; suite('OSS ModuleVulnerabilityCountProvider', () => { let ossService: OssService; @@ -52,9 +54,13 @@ suite('OSS ModuleVulnerabilityCountProvider', () => { ]; setup(() => { - const npmModuleInfoFetchService = {} as NpmModuleInfoFetchService; ossService = {} as OssService; - vulnerabilityCountProvider = new ModuleVulnerabilityCountProvider(ossService, npmModuleInfoFetchService); + vulnerabilityCountProvider = new ModuleVulnerabilityCountProvider( + ossService, + {} as ILanguageClientAdapter, + {} as IUriAdapter, + {} as ITextDocumentAdapter, + ); }); teardown(() => { @@ -64,8 +70,13 @@ suite('OSS ModuleVulnerabilityCountProvider', () => { test('Not calculated if JS/TS results are not provided', async () => { ossService.getResultArray = () => undefined; - const tsCount = await vulnerabilityCountProvider.getVulnerabilityCount(sampleImportedModule, Language.TypeScript); + const tsCount = await vulnerabilityCountProvider.getVulnerabilityCount( + 'test.ts', + sampleImportedModule, + Language.TypeScript, + ); const jsCount = await vulnerabilityCountProvider.getVulnerabilityCount( + 'test.ts', { ...sampleImportedModule, fileName: 'test.ts', @@ -81,7 +92,11 @@ suite('OSS ModuleVulnerabilityCountProvider', () => { ossService.getResultArray = () => sampleOssResults; ossService.getUniqueVulnerabilities = () => sampleOssResults[0].vulnerabilities; - const count = await vulnerabilityCountProvider.getVulnerabilityCount(sampleImportedModule, Language.TypeScript); + const count = await vulnerabilityCountProvider.getVulnerabilityCount( + 'test.ts', + sampleImportedModule, + Language.TypeScript, + ); strictEqual(count.hasCount, true); strictEqual(count.count, 2); @@ -104,7 +119,11 @@ suite('OSS ModuleVulnerabilityCountProvider', () => { ossService.getResultArray = () => sampleOssResults; ossService.getUniqueVulnerabilities = () => sampleOssResults[0].vulnerabilities; - const count = await vulnerabilityCountProvider.getVulnerabilityCount(sampleImportedModule, Language.PJSON); + const count = await vulnerabilityCountProvider.getVulnerabilityCount( + 'test.ts', + sampleImportedModule, + Language.PJSON, + ); strictEqual(count.hasCount, true); }); @@ -129,7 +148,11 @@ suite('OSS ModuleVulnerabilityCountProvider', () => { ossService.getResultArray = () => ossResultsWithIndirectVulnerability; ossService.getUniqueVulnerabilities = () => ossResultsWithIndirectVulnerability[0].vulnerabilities; - const count = await vulnerabilityCountProvider.getVulnerabilityCount(sampleImportedModule, Language.TypeScript); + const count = await vulnerabilityCountProvider.getVulnerabilityCount( + 'test.ts', + sampleImportedModule, + Language.TypeScript, + ); strictEqual(count.hasCount, true); strictEqual(count.count, 1); @@ -157,7 +180,11 @@ suite('OSS ModuleVulnerabilityCountProvider', () => { ossService.getResultArray = () => ossResultsWithMultipleVersionsVulnerability; ossService.getUniqueVulnerabilities = () => ossResultsWithMultipleVersionsVulnerability[0].vulnerabilities; - const count = await vulnerabilityCountProvider.getVulnerabilityCount(sampleImportedModule, Language.TypeScript); + const count = await vulnerabilityCountProvider.getVulnerabilityCount( + 'test.ts', + sampleImportedModule, + Language.TypeScript, + ); strictEqual(count.version, version); }); @@ -183,16 +210,18 @@ suite('OSS ModuleVulnerabilityCountProvider', () => { ossService.getResultArray = () => ossResultsWithMultipleVersionsVulnerability; ossService.getUniqueVulnerabilities = () => ossResultsWithMultipleVersionsVulnerability[0].vulnerabilities; - const count = await vulnerabilityCountProvider.getVulnerabilityCount(sampleImportedModule, Language.TypeScript); + const count = await vulnerabilityCountProvider.getVulnerabilityCount( + 'test.ts', + sampleImportedModule, + Language.TypeScript, + ); strictEqual(count.version, undefined); }); test('File is part of OSS test', () => { const ossFileResult = sampleOssResults[0]; - const relatedFilePath = sampleFilePath; - - strictEqual(vulnerabilityCountProvider.isFilePartOfOssTest(relatedFilePath, ossFileResult), true); + strictEqual(vulnerabilityCountProvider.isFilePartOfOssTest(sampleFilePath, ossFileResult), true); }); test('File is not part of OSS test, if file path was not scanned by OSS test', () => {