diff --git a/src/cli-wrapper/cli-wrapper.ts b/src/cli-wrapper/cli-wrapper.ts index 9571811..332d247 100644 --- a/src/cli-wrapper/cli-wrapper.ts +++ b/src/cli-wrapper/cli-wrapper.ts @@ -1,4 +1,4 @@ -import { CommandParams, IgnoreCommandConfig } from "../types/commands"; +import { IgnoreCommandConfig } from "../types/commands"; import { CliCommands, CommandParameters } from "./constants"; import { CommandResult, IConfig, UserAgent } from "./types"; import { runCli } from "./runner"; @@ -70,6 +70,7 @@ export const cliWrapper = { workspaceFolderPath, commandParams, cliEnv, + printToOutput: true, }); }, runScaScan: async (params: { @@ -97,7 +98,8 @@ export const cliWrapper = { cliPath, workspaceFolderPath, commandParams, - cliEnv + cliEnv, + printToOutput: true, }); }, runAuth: async (params: { @@ -164,21 +166,6 @@ export const cliWrapper = { printToOutput: true, }); }, - runUsage: async (params: { - config: IConfig; - workspaceFolderPath?: string; - }): Promise => { - const { config, workspaceFolderPath } = params; - const { cliEnv, cliPath } = config; - - return await runCli({ - cliPath, - workspaceFolderPath, - commandParams: [CommandParameters.Usage], - cliEnv, - printToOutput: true, - }); - }, runIgnore: async (params: { config: IConfig; workspaceFolderPath?: string; @@ -201,6 +188,7 @@ export const cliWrapper = { workspaceFolderPath, commandParams, cliEnv, + printToOutput: true, }); }, }; diff --git a/src/cli-wrapper/constants.ts b/src/cli-wrapper/constants.ts index c498ac5..db1affa 100644 --- a/src/cli-wrapper/constants.ts +++ b/src/cli-wrapper/constants.ts @@ -20,4 +20,4 @@ export enum CommandParameters { SCAScanType = "sca", } -export const MinCLIVersion = "1.0.0"; +export const MinCLIVersion = "1.1.1"; diff --git a/src/cli-wrapper/runner.ts b/src/cli-wrapper/runner.ts index 36df539..8916ed0 100644 --- a/src/cli-wrapper/runner.ts +++ b/src/cli-wrapper/runner.ts @@ -13,14 +13,14 @@ interface RunCliArgs { let childProcess: ChildProcess | undefined = undefined; -const parseResult = (stdout: string): string | object => { +const parseResult = (out: string): object => { let result = {}; try { - if (stdout) { - result = JSON.parse(stdout); + if (out) { + result = JSON.parse(out); } } catch (error) { - result = { data: stdout }; + result = { data: out }; } return result; @@ -34,7 +34,7 @@ export const runCli = (args: RunCliArgs): Promise => { `Running command: "${cliPath} ${commandParams.join(" ")}"` ); - return new Promise((resolve, reject) => { + return new Promise((resolve, _) => { let stderr = ""; let stdout = ""; @@ -58,31 +58,33 @@ export const runCli = (args: RunCliArgs): Promise => { }); childProcess.on("exit", (code: number) => { + extensionOutput.info(`Command exited with code: ${code}`); resolve({ exitCode: code, - error: stderr, + stderr: stderr, result: parseResult(stdout), }); }); childProcess.on("error", (error: { errno: number }) => { handleErrorOutput(error); - resolve({ exitCode: error.errno, - error: stderr, + stderr: stderr, result: parseResult(stderr), }); }); childProcess.stdout?.on("data", (data) => { + if (printToOutput) { + extensionOutput.info(`Command stdout: ${data.toString()}`); + } + if (!data) { return; } + stdout += data.toString(); - if (printToOutput) { - extensionOutput.info(data.toString()); - } }); childProcess.stderr?.on("data", handleErrorOutput); diff --git a/src/cli-wrapper/types.ts b/src/cli-wrapper/types.ts index ffc5639..4cbbbbc 100644 --- a/src/cli-wrapper/types.ts +++ b/src/cli-wrapper/types.ts @@ -1,7 +1,7 @@ export type CommandResult = { exitCode: number; result: any; - error: string; + stderr: string; }; export interface IConfig { diff --git a/src/services/auth.ts b/src/services/auth.ts index f47991a..6c9bb35 100644 --- a/src/services/auth.ts +++ b/src/services/auth.ts @@ -27,15 +27,15 @@ export async function auth(params: CommandParams) { message: `Authenticating with Cycode...`, }); - const { result, error, exitCode } = await cliWrapper.runAuth(params); + const { result, stderr, exitCode } = await cliWrapper.runAuth(params); endAuthenticationProcess(); - if (validateCliCommonErrors(error, exitCode)) { + if (validateCliCommonErrors(stderr, exitCode)) { return; } - handleAuthStatus(exitCode, result, error); + handleAuthStatus(exitCode, result, stderr); } catch (error) { extensionOutput.error("Error while creating scan: " + error); onAuthFailure(); @@ -45,6 +45,7 @@ export async function auth(params: CommandParams) { } function handleAuthStatus(exitCode: number, result: any, error: string) { + // TODO(MarshalX): support JSON output if (exitCode !== 0 || (result.data && result.data.includes("failed"))) { onAuthFailure(); } else { diff --git a/src/services/auth_check.ts b/src/services/auth_check.ts index 8498f30..7e10875 100644 --- a/src/services/auth_check.ts +++ b/src/services/auth_check.ts @@ -21,12 +21,12 @@ export async function authCheck(config: IConfig): Promise { const authCheckResult = await cliWrapper.runAuthCheck(config); const { - error, + stderr, exitCode, result: { result: isAuthenticated }, } = authCheckResult; - if (validateCliCommonErrors(error, exitCode)) { + if (validateCliCommonErrors(stderr, exitCode)) { throw new Error("Failed to check auth status"); } diff --git a/src/services/ignore.ts b/src/services/ignore.ts index aa7f343..cbd0dae 100644 --- a/src/services/ignore.ts +++ b/src/services/ignore.ts @@ -8,8 +8,8 @@ import { IConfig } from "../cli-wrapper/types"; import { IgnoreCommandConfig } from "../types/commands"; import { secretScan } from "./scanner"; import TrayNotifications from "../utils/TrayNotifications"; -import { TreeView } from '../providers/tree-view/types'; -import { CommandParameters } from '../cli-wrapper/constants'; +import { TreeView } from "../providers/tree-view/types"; +import { CommandParameters } from "../cli-wrapper/constants"; export async function ignore( context: vscode.ExtensionContext, @@ -23,22 +23,18 @@ export async function ignore( } ) { try { - const { result, error, exitCode } = await cliWrapper.runIgnore(params); + const { stderr, exitCode } = await cliWrapper.runIgnore(params); - if (validateCliCommonErrors(error, exitCode)) { + if (validateCliCommonErrors(stderr, exitCode)) { return; } // throw error if (exitCode !== 0) { - throw new Error(error); + throw new Error(stderr); } onIgnoreComplete(); - extensionOutput.info( - "Ignore completed: " + JSON.stringify({ result, error }, null, 3) - ); - if (params.ignoreConfig.ignoreBy === CommandParameters.ByPath) { params.diagnosticCollection.delete(params.documentInitiatedIgnore.uri); params.treeView.provider.excludeViolationsByPath(params.ignoreConfig.param); @@ -56,7 +52,6 @@ export async function ignore( }, params.treeView ); - } catch (error) { extensionOutput.error("Error while ignoring: " + error); onIgnoreFailed(); diff --git a/src/services/install.ts b/src/services/install.ts index e8d4dce..6116d8c 100644 --- a/src/services/install.ts +++ b/src/services/install.ts @@ -23,21 +23,18 @@ export async function install( message: `Install with pip3...`, }); - const { result, error, exitCode } = await cliWrapper.runInstall(params); + const { stderr, exitCode } = await cliWrapper.runInstall(params); - if (validateCliCommonErrors(error, exitCode)) { + if (validateCliCommonErrors(stderr, exitCode)) { return; } // throw error if (exitCode !== 0) { - throw new Error(error); + throw new Error(stderr); } onInstallComplete(); - extensionOutput.info( - "Install completed: " + JSON.stringify({ result, error }, null, 3) - ); } catch (error) { extensionOutput.error("Error while installing: " + error); onInstallFailed(); diff --git a/src/services/scaScanner.ts b/src/services/scaScanner.ts index 1a1ef5b..678e670 100644 --- a/src/services/scaScanner.ts +++ b/src/services/scaScanner.ts @@ -1,4 +1,4 @@ -import * as path from 'path'; +import * as path from "path"; import * as vscode from "vscode"; import { extensionOutput } from "../logging/extension-output"; import { cliWrapper } from "../cli-wrapper/cli-wrapper"; @@ -9,14 +9,14 @@ import { extensionId, } from "../utils/texts"; import { validateCliCommonErrors } from "./common"; -import { getWorkspaceState, setContext, updateWorkspaceState } from '../utils/context'; +import { getWorkspaceState, setContext, updateWorkspaceState } from "../utils/context"; import { ScaDetection } from "../types/detection"; import { IConfig } from "../cli-wrapper/types"; import TrayNotifications from "../utils/TrayNotifications"; -import { TreeView } from '../providers/tree-view/types'; -import { refreshTreeViewData } from '../providers/tree-view/utils'; -import { getPackageFileForLockFile, isSupportedLockFile, ScanType } from '../constants'; -import { VscodeStates } from '../utils/states'; +import { TreeView } from "../providers/tree-view/types"; +import { refreshTreeViewData } from "../providers/tree-view/utils"; +import { getPackageFileForLockFile, isSupportedLockFile, ScanType } from "../constants"; +import { VscodeStates } from "../utils/states"; interface ScaScanParams { @@ -84,23 +84,19 @@ const _runCliScaScan = async (params: ScaScanParams): Promise => { config: params.config, }; - const { result, error, exitCode } = await cliWrapper.runScaScan( + const { result, stderr, exitCode } = await cliWrapper.runScaScan( cliParams ); - if (validateCliCommonErrors(error, exitCode)) { + if (validateCliCommonErrors(stderr, exitCode)) { return; } // Check if an error occurred - if (error && !result.detections?.length) { - throw new Error(error); + if (result.errors?.length || !result.detections?.length) { + throw new Error(result.errors || stderr); } - extensionOutput.info( - "Scan complete: " + JSON.stringify({ result, error }, null, 3) - ); - return result; }; diff --git a/src/services/scanner.ts b/src/services/scanner.ts index 586be58..3f10de0 100644 --- a/src/services/scanner.ts +++ b/src/services/scanner.ts @@ -56,27 +56,23 @@ export async function secretScan( workspaceFolderPath: params.workspaceFolderPath, config: params.config, }; - const { result, error, exitCode } = await cliWrapper.runScan(cliParams); + const { result, stderr, exitCode } = await cliWrapper.runScan(cliParams); updateWorkspaceState(VscodeStates.SecretsScanInProgress, false); - if (validateCliCommonErrors(error, exitCode)) { + if (validateCliCommonErrors(stderr, exitCode)) { return; } // Check if an error occurred - if (error && !result.detections?.length) { - throw new Error(error); + if (result.errors?.length || !result.detections?.length) { + throw new Error(result.errors || stderr); } if (result.error) { throw new Error(result.message); } - extensionOutput.info( - "Scan complete: " + JSON.stringify({ result, error }, null, 3) - ); - // Show in "problems" tab handleScanDetections( result, diff --git a/src/services/uninstall.ts b/src/services/uninstall.ts index f1d7c25..6a11bc6 100644 --- a/src/services/uninstall.ts +++ b/src/services/uninstall.ts @@ -22,23 +22,20 @@ export async function uninstall( message: `Uninstall cycode CLI...`, }); - const { result, error, exitCode } = await cliWrapper.runUninstall( + const { stderr, exitCode } = await cliWrapper.runUninstall( params ); - if (validateCliCommonErrors(error, exitCode)) { + if (validateCliCommonErrors(stderr, exitCode)) { return; } // throw error if (exitCode !== 0) { - throw new Error(error); + throw new Error(stderr); } onUninstallComplete(); - extensionOutput.info( - "Uninstall completed: " + JSON.stringify({ result, error }, null, 3) - ); } catch (error) { extensionOutput.error("Error while uninstalling: " + error); onUninstallFailed();