From 23e29a1fdc16b884237819ed6be915735532328b Mon Sep 17 00:00:00 2001 From: Andrew Eisenberg Date: Mon, 24 Jan 2022 16:13:22 -0800 Subject: [PATCH] Update tsc to 4.5.5 The default version of tsc in vscode is now 4.5.4. This version has changed the type of the variable in the catch block. Previously, it was `any`. Now it is `unknown`. This change updates vscode so that it can build with 4.5.4. Previously, this had been a bit of a pain since sometimes running a compile task in vscode will use the global default version of tsc. --- extensions/ql-vscode/package-lock.json | 14 +++++------ extensions/ql-vscode/package.json | 2 +- extensions/ql-vscode/src/cli-version.ts | 3 ++- extensions/ql-vscode/src/cli.ts | 12 ++++----- extensions/ql-vscode/src/commandRunner.ts | 19 ++++++++------ .../src/compare/compare-interface.ts | 3 ++- extensions/ql-vscode/src/databaseFetcher.ts | 8 +++--- extensions/ql-vscode/src/databases-ui.ts | 9 +++---- extensions/ql-vscode/src/databases.ts | 7 +++--- extensions/ql-vscode/src/extension.ts | 19 +++++++------- extensions/ql-vscode/src/interface.ts | 11 ++++---- extensions/ql-vscode/src/pure/helpers-pure.ts | 12 +++++++++ extensions/ql-vscode/src/query-history.ts | 17 +++++++------ .../ql-vscode/src/query-serialization.ts | 6 ++--- extensions/ql-vscode/src/quick-query.ts | 3 ++- .../analyses-results-manager.ts | 3 ++- extensions/ql-vscode/src/run-queries.ts | 3 ++- extensions/ql-vscode/src/sarif-parser.ts | 25 ++++++++++--------- .../cli-integration/databases.test.ts | 6 ++--- .../cli-integration/packaging.test.ts | 5 ++-- .../cli-integration/queries.test.ts | 8 +++--- .../cli-integration/query.test.ts | 6 ++--- .../contextual/queryResolver.test.ts | 3 ++- .../no-workspace/query-history.test.ts | 7 +++--- .../no-workspace/remote-query-history.test.ts | 3 ++- .../no-workspace/telemetry.test.ts | 4 +-- .../test/pure-tests/helpers-pure.test.ts | 4 +-- 27 files changed, 124 insertions(+), 98 deletions(-) diff --git a/extensions/ql-vscode/package-lock.json b/extensions/ql-vscode/package-lock.json index 4465856d84e..33902326452 100644 --- a/extensions/ql-vscode/package-lock.json +++ b/extensions/ql-vscode/package-lock.json @@ -106,7 +106,7 @@ "ts-loader": "^8.1.0", "ts-node": "^8.3.0", "ts-protoc-gen": "^0.9.0", - "typescript": "^4.3.2", + "typescript": "^4.5.5", "typescript-formatter": "^7.2.2", "vsce": "^1.65.0", "vscode-test": "^1.4.0", @@ -12107,9 +12107,9 @@ "dev": true }, "node_modules/typescript": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", - "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -23202,9 +23202,9 @@ "dev": true }, "typescript": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", - "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "dev": true }, "typescript-formatter": { diff --git a/extensions/ql-vscode/package.json b/extensions/ql-vscode/package.json index 22cb67af97c..d29e71fa4f0 100644 --- a/extensions/ql-vscode/package.json +++ b/extensions/ql-vscode/package.json @@ -1179,7 +1179,7 @@ "ts-loader": "^8.1.0", "ts-node": "^8.3.0", "ts-protoc-gen": "^0.9.0", - "typescript": "^4.3.2", + "typescript": "^4.5.5", "typescript-formatter": "^7.2.2", "vsce": "^1.65.0", "vscode-test": "^1.4.0", diff --git a/extensions/ql-vscode/src/cli-version.ts b/extensions/ql-vscode/src/cli-version.ts index 5e981799e15..c5223bcd7ff 100644 --- a/extensions/ql-vscode/src/cli-version.ts +++ b/extensions/ql-vscode/src/cli-version.ts @@ -1,6 +1,7 @@ import * as semver from 'semver'; import { runCodeQlCliCommand } from './cli'; import { Logger } from './logging'; +import { getErrorMessage } from './pure/helpers-pure'; /** * Get the version of a CodeQL CLI. @@ -18,7 +19,7 @@ export async function getCodeQlCliVersion(codeQlPath: string, logger: Logger): P } catch (e) { // Failed to run the version command. This might happen if the cli version is _really_ old, or it is corrupted. // Either way, we can't determine compatibility. - void logger.log(`Failed to run 'codeql version'. Reason: ${e.message}`); + void logger.log(`Failed to run 'codeql version'. Reason: ${getErrorMessage(e)}`); return undefined; } } diff --git a/extensions/ql-vscode/src/cli.ts b/extensions/ql-vscode/src/cli.ts index b8f37858f6a..7ef6441720b 100644 --- a/extensions/ql-vscode/src/cli.ts +++ b/extensions/ql-vscode/src/cli.ts @@ -13,7 +13,7 @@ import { CancellationToken, Disposable, Uri } from 'vscode'; import { BQRSInfo, DecodedBqrsChunk } from './pure/bqrs-cli-types'; import { CliConfig } from './config'; import { DistributionProvider, FindDistributionResultKind } from './distribution'; -import { assertNever } from './pure/helpers-pure'; +import { assertNever, getErrorMessage, getErrorStack } from './pure/helpers-pure'; import { QueryMetadata, SortDirection } from './pure/interface-types'; import { Logger, ProgressReporter } from './logging'; import { CompilationMessage } from './pure/messages'; @@ -346,7 +346,7 @@ export class CodeQLCliServer implements Disposable { stderrBuffers.length == 0 ? new Error(`${description} failed: ${err}`) : new Error(`${description} failed: ${Buffer.concat(stderrBuffers).toString('utf8')}`); - newError.stack += (err.stack || ''); + newError.stack += getErrorStack(err); throw newError; } finally { void this.logger.log(Buffer.concat(stderrBuffers).toString('utf8')); @@ -448,7 +448,7 @@ export class CodeQLCliServer implements Disposable { try { yield JSON.parse(event) as EventType; } catch (err) { - throw new Error(`Parsing output of ${description} failed: ${err.stderr || err}`); + throw new Error(`Parsing output of ${description} failed: ${(err as any).stderr || getErrorMessage(err)}`); } } } @@ -503,7 +503,7 @@ export class CodeQLCliServer implements Disposable { try { return JSON.parse(result) as OutputType; } catch (err) { - throw new Error(`Parsing output of ${description} failed: ${err.stderr || err}`); + throw new Error(`Parsing output of ${description} failed: ${(err as any).stderr || getErrorMessage(err)}`); } } @@ -751,7 +751,7 @@ export class CodeQLCliServer implements Disposable { const dot = await this.readDotFiles(interpretedResultsPath); return dot; } catch (err) { - throw new Error(`Reading output of interpretation failed: ${err.stderr || err}`); + throw new Error(`Reading output of interpretation failed: ${getErrorMessage(err)}`); } } @@ -1050,7 +1050,7 @@ export async function runCodeQlCliCommand( void logger.log('CLI command succeeded.'); return result.stdout; } catch (err) { - throw new Error(`${description} failed: ${err.stderr || err}`); + throw new Error(`${description} failed: ${(err as any).stderr || getErrorMessage(err)}`); } } diff --git a/extensions/ql-vscode/src/commandRunner.ts b/extensions/ql-vscode/src/commandRunner.ts index 08c29b1e0d5..7a367788492 100644 --- a/extensions/ql-vscode/src/commandRunner.ts +++ b/extensions/ql-vscode/src/commandRunner.ts @@ -8,6 +8,7 @@ import { } from 'vscode'; import { showAndLogErrorMessage, showAndLogWarningMessage } from './helpers'; import { logger } from './logging'; +import { getErrorMessage, getErrorStack } from './pure/helpers-pure'; import { telemetryListener } from './telemetry'; export class UserCancellationException extends Error { @@ -121,8 +122,9 @@ export function commandRunner( try { return await task(...args); } catch (e) { - error = e; - const errorMessage = `${e.message || e} (${commandId})`; + const errorMessage = `${getErrorMessage(e) || e} (${commandId})`; + error = e instanceof Error ? e : new Error(errorMessage); + const errorStack = getErrorStack(e); if (e instanceof UserCancellationException) { // User has cancelled this action manually if (e.silent) { @@ -132,8 +134,8 @@ export function commandRunner( } } else { // Include the full stack in the error log only. - const fullMessage = e.stack - ? `${errorMessage}\n${e.stack}` + const fullMessage = errorStack + ? `${errorMessage}\n${errorStack}` : errorMessage; void showAndLogErrorMessage(errorMessage, { fullMessage @@ -173,8 +175,9 @@ export function commandRunnerWithProgress( try { return await withProgress(progressOptionsWithDefaults, task, ...args); } catch (e) { - error = e; - const errorMessage = `${e.message || e} (${commandId})`; + const errorMessage = `${getErrorMessage(e) || e} (${commandId})`; + error = e instanceof Error ? e : new Error(errorMessage); + const errorStack = getErrorStack(e); if (e instanceof UserCancellationException) { // User has cancelled this action manually if (e.silent) { @@ -184,8 +187,8 @@ export function commandRunnerWithProgress( } } else { // Include the full stack in the error log only. - const fullMessage = e.stack - ? `${errorMessage}\n${e.stack}` + const fullMessage = errorStack + ? `${errorMessage}\n${errorStack}` : errorMessage; void showAndLogErrorMessage(errorMessage, { outputLogger, diff --git a/extensions/ql-vscode/src/compare/compare-interface.ts b/extensions/ql-vscode/src/compare/compare-interface.ts index 1da1fc429c4..1c7d3773a96 100644 --- a/extensions/ql-vscode/src/compare/compare-interface.ts +++ b/extensions/ql-vscode/src/compare/compare-interface.ts @@ -21,6 +21,7 @@ import { getHtmlForWebview, jumpToLocation } from '../interface-utils'; import { transformBqrsResultSet, RawResultSet, BQRSInfo } from '../pure/bqrs-cli-types'; import resultsDiff from './resultsDiff'; import { CompletedLocalQueryInfo } from '../query-results'; +import { getErrorMessage } from '../pure/helpers-pure'; interface ComparePair { from: CompletedLocalQueryInfo; @@ -70,7 +71,7 @@ export class CompareInterfaceManager extends DisposableObject { try { rows = this.compareResults(fromResultSet, toResultSet); } catch (e) { - message = e.message; + message = getErrorMessage(e); } await this.postMessage({ diff --git a/extensions/ql-vscode/src/databaseFetcher.ts b/extensions/ql-vscode/src/databaseFetcher.ts index a3c9aa04c44..ce016abd389 100644 --- a/extensions/ql-vscode/src/databaseFetcher.ts +++ b/extensions/ql-vscode/src/databaseFetcher.ts @@ -22,7 +22,7 @@ import { import { logger } from './logging'; import { tmpDir } from './helpers'; import { Credentials } from './authentication'; -import { REPO_REGEX } from './pure/helpers-pure'; +import { REPO_REGEX, getErrorMessage } from './pure/helpers-pure'; /** * Prompts a user to fetch a database from a remote location. Database is assumed to be an archive file. @@ -230,7 +230,7 @@ export async function importArchiveDatabase( } return item; } catch (e) { - if (e.message.includes('unexpected end of file')) { + if (getErrorMessage(e).includes('unexpected end of file')) { throw new Error('Database is corrupt or too large. Try unzipping outside of VS Code and importing the unzipped folder instead.'); } else { // delegate @@ -491,7 +491,7 @@ export async function convertGithubNwoToDatabaseUrl( return `https://api.github.com/repos/${owner}/${repo}/code-scanning/codeql/databases/${language}`; } catch (e) { - void logger.log(`Error: ${e.message}`); + void logger.log(`Error: ${getErrorMessage(e)}`); throw new Error(`Unable to get database for '${githubRepo}'`); } } @@ -596,7 +596,7 @@ export async function convertLgtmUrlToDatabaseUrl( language, ].join('/')}`; } catch (e) { - void logger.log(`Error: ${e.message}`); + void logger.log(`Error: ${getErrorMessage(e)}`); throw new Error(`Invalid LGTM URL: ${lgtmUrl}`); } } diff --git a/extensions/ql-vscode/src/databases-ui.ts b/extensions/ql-vscode/src/databases-ui.ts index ee81b568f8c..cf474bfc5c6 100644 --- a/extensions/ql-vscode/src/databases-ui.ts +++ b/extensions/ql-vscode/src/databases-ui.ts @@ -38,7 +38,7 @@ import { promptImportLgtmDatabase, } from './databaseFetcher'; import { CancellationToken } from 'vscode'; -import { asyncFilter } from './pure/helpers-pure'; +import { asyncFilter, getErrorMessage } from './pure/helpers-pure'; import { Credentials } from './authentication'; type ThemableIconPath = { light: string; dark: string } | string; @@ -393,7 +393,7 @@ export class DatabaseUI extends DisposableObject { try { return await this.chooseAndSetDatabase(true, progress, token); } catch (e) { - void showAndLogErrorMessage(e.message); + void showAndLogErrorMessage(getErrorMessage(e)); return undefined; } }; @@ -461,7 +461,7 @@ export class DatabaseUI extends DisposableObject { try { return await this.chooseAndSetDatabase(false, progress, token); } catch (e) { - void showAndLogErrorMessage(e.message); + void showAndLogErrorMessage(getErrorMessage(e)); return undefined; } }; @@ -622,8 +622,7 @@ export class DatabaseUI extends DisposableObject { } catch (e) { // rethrow and let this be handled by default error handling. throw new Error( - `Could not set database to ${path.basename(uri.fsPath)}. Reason: ${e.message - }` + `Could not set database to ${path.basename(uri.fsPath)}. Reason: ${getErrorMessage(e)}` ); } }; diff --git a/extensions/ql-vscode/src/databases.ts b/extensions/ql-vscode/src/databases.ts index 9026f52ceb1..57740b19179 100644 --- a/extensions/ql-vscode/src/databases.ts +++ b/extensions/ql-vscode/src/databases.ts @@ -19,6 +19,7 @@ import { DisposableObject } from './pure/disposable-object'; import { Logger, logger } from './logging'; import { registerDatabases, Dataset, deregisterDatabases } from './pure/messages'; import { QueryServerClient } from './queryserver-client'; +import { getErrorMessage } from './pure/helpers-pure'; /** * databases.ts @@ -359,7 +360,7 @@ export class DatabaseItemImpl implements DatabaseItem { } catch (e) { this._contents = undefined; - this._error = e; + this._error = e instanceof Error ? e : new Error(String(e)); throw e; } } @@ -726,7 +727,7 @@ export class DatabaseManager extends DisposableObject { } } catch (e) { // database list had an unexpected type - nothing to be done? - void showAndLogErrorMessage(`Database list loading failed: ${e.message}`); + void showAndLogErrorMessage(`Database list loading failed: ${getErrorMessage(e)}`); } }); } @@ -841,7 +842,7 @@ export class DatabaseManager extends DisposableObject { void logger.log('Deleting database from filesystem.'); fs.remove(item.databaseUri.fsPath).then( () => void logger.log(`Deleted '${item.databaseUri.fsPath}'`), - e => void logger.log(`Failed to delete '${item.databaseUri.fsPath}'. Reason: ${e.message}`)); + e => void logger.log(`Failed to delete '${item.databaseUri.fsPath}'. Reason: ${getErrorMessage(e)}`)); } // note that we use undefined as the item in order to reset the entire tree diff --git a/extensions/ql-vscode/src/extension.ts b/extensions/ql-vscode/src/extension.ts index 39cca56ca9e..c3eb3f83221 100644 --- a/extensions/ql-vscode/src/extension.ts +++ b/extensions/ql-vscode/src/extension.ts @@ -65,7 +65,7 @@ import { showInformationMessageWithAction, tmpDir } from './helpers'; -import { assertNever } from './pure/helpers-pure'; +import { asError, assertNever, getErrorMessage } from './pure/helpers-pure'; import { spawnIdeServer } from './ide-server'; import { InterfaceManager } from './interface'; import { WebviewReveal } from './interface-utils'; @@ -489,7 +489,7 @@ async function activateWithInstalledDistribution( try { await cmpm.showResults(from, to); } catch (e) { - void showAndLogErrorMessage(e.message); + void showAndLogErrorMessage(getErrorMessage(e)); } } @@ -541,8 +541,9 @@ async function activateWithInstalledDistribution( // Note we must update the query history view after showing results as the // display and sorting might depend on the number of results } catch (e) { - e.message = `Error running query: ${e.message}`; - item.failureReason = e.message; + const err = asError(e); + err.message = `Error running query: ${err.message}`; + item.failureReason = err.message; throw e; } finally { await qhm.refreshTreeView(); @@ -567,11 +568,11 @@ async function activateWithInstalledDistribution( try { await cliServer.generateQueryHelp(pathToQhelp, absolutePathToMd); await commands.executeCommand('markdown.showPreviewToSide', uri); - } catch (err) { - const errorMessage = err.message.includes('Generating qhelp in markdown') ? ( + } catch (e) { + const errorMessage = getErrorMessage(e).includes('Generating qhelp in markdown') ? ( `Could not generate markdown from ${pathToQhelp}: Bad formatting in .qhelp file.` ) : `Could not open a preview of the generated file (${absolutePathToMd}).`; - void showAndLogErrorMessage(errorMessage, { fullMessage: `${errorMessage}\n${err}` }); + void showAndLogErrorMessage(errorMessage, { fullMessage: `${errorMessage}\n${e}` }); } } @@ -694,9 +695,9 @@ async function activateWithInstalledDistribution( for (const item of quickpick) { try { await compileAndRunQuery(false, uri, progress, token, item.databaseItem); - } catch (error) { + } catch (e) { skippedDatabases.push(item.label); - errors.push(error.message); + errors.push(getErrorMessage(e)); } } if (skippedDatabases.length > 0) { diff --git a/extensions/ql-vscode/src/interface.ts b/extensions/ql-vscode/src/interface.ts index 7954e1a46e0..d323e1585dc 100644 --- a/extensions/ql-vscode/src/interface.ts +++ b/extensions/ql-vscode/src/interface.ts @@ -15,7 +15,7 @@ import * as cli from './cli'; import { CodeQLCliServer } from './cli'; import { DatabaseEventKind, DatabaseItem, DatabaseManager } from './databases'; import { showAndLogErrorMessage, tmpDir } from './helpers'; -import { assertNever } from './pure/helpers-pure'; +import { assertNever, getErrorMessage, getErrorStack } from './pure/helpers-pure'; import { FromResultsViewMsg, Interpretation, @@ -353,8 +353,8 @@ export class InterfaceManager extends DisposableObject { assertNever(msg); } } catch (e) { - void showAndLogErrorMessage(e.message, { - fullMessage: e.stack + void showAndLogErrorMessage(getErrorMessage(e), { + fullMessage: getErrorStack(e) }); } } @@ -729,7 +729,7 @@ export class InterfaceManager extends DisposableObject { // If interpretation fails, accept the error and continue // trying to render uninterpreted results anyway. void showAndLogErrorMessage( - `Showing raw results instead of interpreted ones due to an error. ${e.message}` + `Showing raw results instead of interpreted ones due to an error. ${getErrorMessage(e)}` ); } } @@ -768,9 +768,8 @@ export class InterfaceManager extends DisposableObject { try { await this.showProblemResultsAsDiagnostics(interpretation, database); } catch (e) { - const msg = e instanceof Error ? e.message : e.toString(); void this.logger.log( - `Exception while computing problem results as diagnostics: ${msg}` + `Exception while computing problem results as diagnostics: ${getErrorMessage(e)}` ); this._diagnosticCollection.clear(); } diff --git a/extensions/ql-vscode/src/pure/helpers-pure.ts b/extensions/ql-vscode/src/pure/helpers-pure.ts index 1c98b59e49f..95a14f03bf2 100644 --- a/extensions/ql-vscode/src/pure/helpers-pure.ts +++ b/extensions/ql-vscode/src/pure/helpers-pure.ts @@ -42,3 +42,15 @@ export const THREE_HOURS_IN_MS = 1000 * 60 * 60 * 3; * - `repo` is made up of alphanumeric characters, hyphens, or underscores */ export const REPO_REGEX = /^(?:[a-zA-Z0-9]+-)*[a-zA-Z0-9]+\/[a-zA-Z0-9-_]+$/; + +export function getErrorMessage(e: any) { + return e instanceof Error ? e.message : String(e); +} + +export function getErrorStack(e: any) { + return e instanceof Error ? e.stack ?? '' : ''; +} + +export function asError(e: any): Error { + return e instanceof Error ? e : new Error(String(e)); +} diff --git a/extensions/ql-vscode/src/query-history.ts b/extensions/ql-vscode/src/query-history.ts index 6b35fd8c102..4f3438e0f28 100644 --- a/extensions/ql-vscode/src/query-history.ts +++ b/extensions/ql-vscode/src/query-history.ts @@ -28,7 +28,7 @@ import { URLSearchParams } from 'url'; import { QueryServerClient } from './queryserver-client'; import { DisposableObject } from './pure/disposable-object'; import { commandRunner } from './commandRunner'; -import { assertNever, ONE_HOUR_IN_MS, TWO_HOURS_IN_MS } from './pure/helpers-pure'; +import { assertNever, ONE_HOUR_IN_MS, TWO_HOURS_IN_MS, getErrorMessage, getErrorStack } from './pure/helpers-pure'; import { CompletedLocalQueryInfo, LocalQueryInfo as LocalQueryInfo, QueryHistoryInfo } from './query-results'; import { DatabaseManager } from './databases'; import { registerQueryHistoryScubber } from './query-history-scrubber'; @@ -663,7 +663,7 @@ export class QueryHistoryManager extends DisposableObject { await this.doCompareCallback(from as CompletedLocalQueryInfo, to as CompletedLocalQueryInfo); } } catch (e) { - void showAndLogErrorMessage(e.message); + void showAndLogErrorMessage(getErrorMessage(e)); } } @@ -740,7 +740,7 @@ export class QueryHistoryManager extends DisposableObject { try { await commands.executeCommand('revealFileInOS', Uri.file(p)); } catch (e) { - throw new Error(`Failed to open ${p}: ${e.message}`); + throw new Error(`Failed to open ${p}: ${getErrorMessage(e)}`); } } } @@ -920,11 +920,12 @@ export class QueryHistoryManager extends DisposableObject { try { await window.showTextDocument(uri, { preview: false }); } catch (e) { + const msg = getErrorMessage(e); if ( - e.message.includes( + msg.includes( 'Files above 50MB cannot be synchronized with extensions' ) || - e.message.includes('too large to open') + msg.includes('too large to open') ) { const res = await showBinaryChoiceDialog( `VS Code does not allow extensions to open files >50MB. This file @@ -937,13 +938,13 @@ the file in the file explorer and dragging it into the workspace.` try { await commands.executeCommand('revealFileInOS', uri); } catch (e) { - void showAndLogErrorMessage(e.message); + void showAndLogErrorMessage(getErrorMessage(e)); } } } else { void showAndLogErrorMessage(`Could not open file ${fileLocation}`); - void logger.log(e.message); - void logger.log(e.stack); + void logger.log(getErrorMessage(e)); + void logger.log(getErrorStack(e)); } } } diff --git a/extensions/ql-vscode/src/query-serialization.ts b/extensions/ql-vscode/src/query-serialization.ts index a242380e104..4738731dabf 100644 --- a/extensions/ql-vscode/src/query-serialization.ts +++ b/extensions/ql-vscode/src/query-serialization.ts @@ -3,7 +3,7 @@ import * as path from 'path'; import { QueryHistoryConfig } from './config'; import { showAndLogErrorMessage } from './helpers'; -import { asyncFilter } from './pure/helpers-pure'; +import { asyncFilter, getErrorMessage, getErrorStack } from './pure/helpers-pure'; import { CompletedQueryInfo, LocalQueryInfo, QueryHistoryInfo } from './query-results'; import { QueryEvaluationInfo } from './run-queries'; @@ -64,7 +64,7 @@ export async function slurpQueryHistory(fsPath: string, config: QueryHistoryConf }); } catch (e) { void showAndLogErrorMessage('Error loading query history.', { - fullMessage: ['Error loading query history.', e.stack].join('\n'), + fullMessage: ['Error loading query history.', getErrorStack(e)].join('\n'), }); // since the query history is invalid, it should be deleted so this error does not happen on next startup. await fs.remove(fsPath); @@ -94,6 +94,6 @@ export async function splatQueryHistory(queries: QueryHistoryInfo[], fsPath: str }, null, 2); await fs.writeFile(fsPath, data); } catch (e) { - throw new Error(`Error saving query history to ${fsPath}: ${e.message}`); + throw new Error(`Error saving query history to ${fsPath}: ${getErrorMessage(e)}`); } } diff --git a/extensions/ql-vscode/src/quick-query.ts b/extensions/ql-vscode/src/quick-query.ts index 5ca65f9d057..2c1cda05d34 100644 --- a/extensions/ql-vscode/src/quick-query.ts +++ b/extensions/ql-vscode/src/quick-query.ts @@ -21,6 +21,7 @@ import { ProgressCallback, UserCancellationException } from './commandRunner'; +import { getErrorMessage } from './pure/helpers-pure'; const QUICK_QUERIES_DIR_NAME = 'quick-queries'; const QUICK_QUERY_QUERY_NAME = 'quick-query.ql'; @@ -132,7 +133,7 @@ export async function displayQuickQuery( await Window.showTextDocument(await workspace.openTextDocument(qlFile)); } catch (e) { if (e instanceof ResponseError && e.code == ErrorCodes.RequestCancelled) { - throw new UserCancellationException(e.message); + throw new UserCancellationException(getErrorMessage(e)); } else { throw e; } diff --git a/extensions/ql-vscode/src/remote-queries/analyses-results-manager.ts b/extensions/ql-vscode/src/remote-queries/analyses-results-manager.ts index f33e9390b10..8383cabfc68 100644 --- a/extensions/ql-vscode/src/remote-queries/analyses-results-manager.ts +++ b/extensions/ql-vscode/src/remote-queries/analyses-results-manager.ts @@ -12,6 +12,7 @@ import { sarifParser } from '../sarif-parser'; import { extractAnalysisAlerts } from './sarif-processing'; import { CodeQLCliServer } from '../cli'; import { extractRawResults } from './bqrs-processing'; +import { getErrorMessage } from '../pure/helpers-pure'; export class AnalysesResultsManager { // Store for the results of various analyses for each remote query. @@ -118,7 +119,7 @@ export class AnalysesResultsManager { artifactPath = await downloadArtifactFromLink(credentials, this.storagePath, analysis.downloadLink); } catch (e) { - throw new Error(`Could not download the analysis results for ${analysis.nwo}: ${e.message}`); + throw new Error(`Could not download the analysis results for ${analysis.nwo}: ${getErrorMessage(e)}`); } const fileLinkPrefix = this.createGitHubDotcomFileLinkPrefix(analysis.nwo, analysis.databaseSha); diff --git a/extensions/ql-vscode/src/run-queries.ts b/extensions/ql-vscode/src/run-queries.ts index 37bfffc197c..9acd7fda1cb 100644 --- a/extensions/ql-vscode/src/run-queries.ts +++ b/extensions/ql-vscode/src/run-queries.ts @@ -36,6 +36,7 @@ import { compileDatabaseUpgradeSequence, hasNondestructiveUpgradeCapabilities, u import { ensureMetadataIsComplete } from './query-results'; import { SELECT_QUERY_NAME } from './contextual/locationFinder'; import { DecodedBqrsChunk } from './pure/bqrs-cli-types'; +import { getErrorMessage } from './pure/helpers-pure'; /** * run-queries.ts @@ -790,7 +791,7 @@ export async function compileAndRunQueryAgainstDatabase( await upgradeDir?.cleanup(); } catch (e) { void qs.logger.log( - `Could not clean up the upgrades dir. Reason: ${e.message || e}`, + `Could not clean up the upgrades dir. Reason: ${getErrorMessage(e)}`, { additionalLogLocation: query.logPath } ); } diff --git a/extensions/ql-vscode/src/sarif-parser.ts b/extensions/ql-vscode/src/sarif-parser.ts index eed080b4639..c08d93c5ef2 100644 --- a/extensions/ql-vscode/src/sarif-parser.ts +++ b/extensions/ql-vscode/src/sarif-parser.ts @@ -4,17 +4,18 @@ import { parser } from 'stream-json'; import { pick } from 'stream-json/filters/Pick'; import Assembler = require('stream-json/Assembler'); import { chain } from 'stream-chain'; +import { getErrorMessage } from './pure/helpers-pure'; -const DUMMY_TOOL : Sarif.Tool = {driver: {name: ''}}; +const DUMMY_TOOL: Sarif.Tool = { driver: { name: '' } }; -export async function sarifParser(interpretedResultsPath: string) : Promise { +export async function sarifParser(interpretedResultsPath: string): Promise { try { // Parse the SARIF file into token streams, filtering out only the results array. const p = parser(); const pipeline = chain([ fs.createReadStream(interpretedResultsPath), p, - pick({filter: 'runs.0.results'}) + pick({ filter: 'runs.0.results' }) ]); // Creates JavaScript objects from the token stream @@ -26,23 +27,23 @@ export async function sarifParser(interpretedResultsPath: string) : Promise { reject(error); }); - + asm.on('done', (asm) => { - const log : Sarif.Log = { - version: '2.1.0', + const log: Sarif.Log = { + version: '2.1.0', runs: [ - { - tool: DUMMY_TOOL, + { + tool: DUMMY_TOOL, results: asm.current ?? [] } ] }; - + resolve(log); }); }); - } catch (err) { - throw new Error(`Parsing output of interpretation failed: ${err.stderr || err}`); + } catch (e) { + throw new Error(`Parsing output of interpretation failed: ${(e as any).stderr || getErrorMessage(e)}`); } -} \ No newline at end of file +} diff --git a/extensions/ql-vscode/src/vscode-tests/cli-integration/databases.test.ts b/extensions/ql-vscode/src/vscode-tests/cli-integration/databases.test.ts index 496ca0c4002..048e70fc230 100644 --- a/extensions/ql-vscode/src/vscode-tests/cli-integration/databases.test.ts +++ b/extensions/ql-vscode/src/vscode-tests/cli-integration/databases.test.ts @@ -18,7 +18,7 @@ describe('Databases', function() { this.timeout(60000); const LGTM_URL = 'https://lgtm.com/projects/g/aeisenberg/angular-bind-notifier/'; - + let databaseManager: DatabaseManager; let sandbox: sinon.SinonSandbox; let inputBoxStub: sinon.SinonStub; @@ -40,7 +40,7 @@ describe('Databases', function() { progressCallback = sandbox.spy(); inputBoxStub = sandbox.stub(window, 'showInputBox'); } catch (e) { - fail(e); + fail(e as Error); } }); @@ -48,7 +48,7 @@ describe('Databases', function() { try { sandbox.restore(); } catch (e) { - fail(e); + fail(e as Error); } }); diff --git a/extensions/ql-vscode/src/vscode-tests/cli-integration/packaging.test.ts b/extensions/ql-vscode/src/vscode-tests/cli-integration/packaging.test.ts index 29d5bdb2b88..343b7bb869b 100644 --- a/extensions/ql-vscode/src/vscode-tests/cli-integration/packaging.test.ts +++ b/extensions/ql-vscode/src/vscode-tests/cli-integration/packaging.test.ts @@ -8,6 +8,7 @@ import * as pq from 'proxyquire'; import { CliVersionConstraint, CodeQLCliServer } from '../../cli'; import { CodeQLExtensionInterface } from '../../extension'; import { expect } from 'chai'; +import { getErrorMessage } from '../../pure/helpers-pure'; const proxyquire = pq.noPreserveCache(); @@ -121,8 +122,8 @@ describe('Packaging commands', function() { await mod.handleInstallPackDependencies(cli, progress); // This line should not be reached expect(true).to.be.false; - } catch (error) { - expect(error.message).to.contain('Unable to install pack dependencies'); + } catch (e) { + expect(getErrorMessage(e)).to.contain('Unable to install pack dependencies'); } }); }); diff --git a/extensions/ql-vscode/src/vscode-tests/cli-integration/queries.test.ts b/extensions/ql-vscode/src/vscode-tests/cli-integration/queries.test.ts index bd6cee7d8ca..990093ffec6 100644 --- a/extensions/ql-vscode/src/vscode-tests/cli-integration/queries.test.ts +++ b/extensions/ql-vscode/src/vscode-tests/cli-integration/queries.test.ts @@ -78,7 +78,7 @@ describe('Queries', function() { } dbItem = maybeDbItem; } catch (e) { - fail(e); + fail(e as Error); } }); @@ -86,7 +86,7 @@ describe('Queries', function() { try { sandbox.restore(); } catch (e) { - fail(e); + fail(e as Error); } }); @@ -107,7 +107,7 @@ describe('Queries', function() { expect(result.result.resultType).to.eq(QueryResultType.SUCCESS); } catch (e) { console.error('Test Failed'); - fail(e); + fail(e as Error); } }); @@ -131,7 +131,7 @@ describe('Queries', function() { expect(result.result.resultType).to.eq(QueryResultType.SUCCESS); } catch (e) { console.error('Test Failed'); - fail(e); + fail(e as Error); } }); diff --git a/extensions/ql-vscode/src/vscode-tests/cli-integration/query.test.ts b/extensions/ql-vscode/src/vscode-tests/cli-integration/query.test.ts index ea1681cbdf0..ce6113a64a2 100644 --- a/extensions/ql-vscode/src/vscode-tests/cli-integration/query.test.ts +++ b/extensions/ql-vscode/src/vscode-tests/cli-integration/query.test.ts @@ -113,7 +113,7 @@ describe('using the query server', function() { throw new Error('Extension not initialized. Make sure cli is downloaded and installed properly.'); } } catch (e) { - fail(e); + fail(e as Error); } }); @@ -163,7 +163,7 @@ describe('using the query server', function() { await compilationSucceeded.resolve(); } catch (e) { - await compilationSucceeded.reject(e); + await compilationSucceeded.reject(e as Error); } }); @@ -190,7 +190,7 @@ describe('using the query server', function() { await qs.sendRequest(messages.runQueries, params, token, () => { /**/ }); } catch (e) { - await evaluationSucceeded.reject(e); + await evaluationSucceeded.reject(e as Error); } }); diff --git a/extensions/ql-vscode/src/vscode-tests/no-workspace/contextual/queryResolver.test.ts b/extensions/ql-vscode/src/vscode-tests/no-workspace/contextual/queryResolver.test.ts index ea1b3a6b6ef..450d4f0c889 100644 --- a/extensions/ql-vscode/src/vscode-tests/no-workspace/contextual/queryResolver.test.ts +++ b/extensions/ql-vscode/src/vscode-tests/no-workspace/contextual/queryResolver.test.ts @@ -7,6 +7,7 @@ import * as chai from 'chai'; import * as sinonChai from 'sinon-chai'; import * as pq from 'proxyquire'; import { KeyType } from '../../../contextual/keyType'; +import { getErrorMessage } from '../../../pure/helpers-pure'; const proxyquire = pq.noPreserveCache().noCallThru(); chai.use(chaiAsPromised); @@ -70,7 +71,7 @@ describe('queryResolver', () => { // should reject expect(true).to.be.false; } catch (e) { - expect(e.message).to.eq( + expect(getErrorMessage(e)).to.eq( 'Couldn\'t find any queries tagged ide-contextual-queries/local-definitions in any of the following packs: my-qlpack.' ); } diff --git a/extensions/ql-vscode/src/vscode-tests/no-workspace/query-history.test.ts b/extensions/ql-vscode/src/vscode-tests/no-workspace/query-history.test.ts index 966c02bee6d..d3bbe0b0c60 100644 --- a/extensions/ql-vscode/src/vscode-tests/no-workspace/query-history.test.ts +++ b/extensions/ql-vscode/src/vscode-tests/no-workspace/query-history.test.ts @@ -19,6 +19,7 @@ import { DatabaseManager } from '../../databases'; import * as tmp from 'tmp-promise'; import { ONE_DAY_IN_MS, ONE_HOUR_IN_MS, TWO_HOURS_IN_MS, THREE_HOURS_IN_MS } from '../../pure/helpers-pure'; import { tmpDir } from '../../helpers'; +import { getErrorMessage } from '../../pure/helpers-pure'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -162,7 +163,7 @@ describe('query-history', () => { await (queryHistoryManager as any).findOtherQueryToCompare(thisQuery, [thisQuery, allHistory[0]]); assert(false, 'Should have thrown'); } catch (e) { - expect(e.message).to.eq('Please select a successful query.'); + expect(getErrorMessage(e)).to.eq('Please select a successful query.'); } }); @@ -175,7 +176,7 @@ describe('query-history', () => { await (queryHistoryManager as any).findOtherQueryToCompare(allHistory[0], [allHistory[0], allHistory[1]]); assert(false, 'Should have thrown'); } catch (e) { - expect(e.message).to.eq('Query databases must be the same.'); + expect(getErrorMessage(e)).to.eq('Query databases must be the same.'); } }); @@ -187,7 +188,7 @@ describe('query-history', () => { await (queryHistoryManager as any).findOtherQueryToCompare(thisQuery, [thisQuery, allHistory[0], allHistory[1]]); assert(false, 'Should have thrown'); } catch (e) { - expect(e.message).to.eq('Please select no more than 2 queries.'); + expect(getErrorMessage(e)).to.eq('Please select no more than 2 queries.'); } }); }); diff --git a/extensions/ql-vscode/src/vscode-tests/no-workspace/remote-query-history.test.ts b/extensions/ql-vscode/src/vscode-tests/no-workspace/remote-query-history.test.ts index c83054a7b45..448ff8f966f 100644 --- a/extensions/ql-vscode/src/vscode-tests/no-workspace/remote-query-history.test.ts +++ b/extensions/ql-vscode/src/vscode-tests/no-workspace/remote-query-history.test.ts @@ -18,6 +18,7 @@ import { RemoteQueryResult } from '../../remote-queries/shared/remote-query-resu import { DisposableBucket } from '../disposable-bucket'; import { testDisposeHandler } from '../test-dispose-handler'; import { walkDirectory } from '../../helpers'; +import { getErrorMessage } from '../../pure/helpers-pure'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -291,7 +292,7 @@ describe('Remote queries and query history manager', function() { } as CancellationToken, publisher); expect.fail('Should have thrown'); } catch (e) { - expect(e.message).to.contain('cancelled'); + expect(getErrorMessage(e)).to.contain('cancelled'); } expect(publisher).not.to.have.been.called; diff --git a/extensions/ql-vscode/src/vscode-tests/no-workspace/telemetry.test.ts b/extensions/ql-vscode/src/vscode-tests/no-workspace/telemetry.test.ts index 2ed2f2b0e98..e3391e6bb4a 100644 --- a/extensions/ql-vscode/src/vscode-tests/no-workspace/telemetry.test.ts +++ b/extensions/ql-vscode/src/vscode-tests/no-workspace/telemetry.test.ts @@ -87,7 +87,7 @@ describe('telemetry reporting', function() { const reporter: any = telemetryListener._reporter; expect(reporter.userOptIn).to.eq(false); // disabled } catch (e) { - fail(e); + fail(e as Error); } }); @@ -98,7 +98,7 @@ describe('telemetry reporting', function() { expect(telemetryListener._reporter).to.be.undefined; } catch (e) { - fail(e); + fail(e as Error); } }); diff --git a/extensions/ql-vscode/test/pure-tests/helpers-pure.test.ts b/extensions/ql-vscode/test/pure-tests/helpers-pure.test.ts index caa51edb95c..d51ea641db7 100644 --- a/extensions/ql-vscode/test/pure-tests/helpers-pure.test.ts +++ b/extensions/ql-vscode/test/pure-tests/helpers-pure.test.ts @@ -1,7 +1,7 @@ import { fail } from 'assert'; import { expect } from 'chai'; -import { asyncFilter } from '../../src/pure/helpers-pure'; +import { asyncFilter, getErrorMessage } from '../../src/pure/helpers-pure'; describe('helpers-pure', () => { it('should filter asynchronously', async () => { @@ -17,7 +17,7 @@ describe('helpers-pure', () => { await asyncFilter([1, 2, 3], rejects); fail('Should have thrown'); } catch (e) { - expect(e.message).to.eq('opps'); + expect(getErrorMessage(e)).to.eq('opps'); } }); });