diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..3e2e84b
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,2 @@
+build/
+node_modules/
diff --git a/test/gopls/configuration.test.ts b/test/gopls/configuration.test.ts
index a603127..918a3d5 100644
--- a/test/gopls/configuration.test.ts
+++ b/test/gopls/configuration.test.ts
@@ -1,3 +1,4 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
 /*---------------------------------------------------------
  * Copyright (C) Microsoft Corporation. All rights reserved.
  * Licensed under the MIT License. See License.txt in the project root for license information.
@@ -38,8 +39,8 @@
 					env: { foo: 'bar' },
 					hoverKind: 'NoDocumentation',
 					usePlaceholders: true,
-					linkTarget: 'godoc.org',
-				},
+					linkTarget: 'godoc.org'
+				}
 			},
 			{
 				name: 'user set extra gopls settings',
@@ -48,15 +49,15 @@
 					undefinedGoplsSetting: true
 				}),
 				want: {
-					undefinedGoplsSetting: true,
-				},
+					undefinedGoplsSetting: true
+				}
 			},
 			{
 				name: 'never returns undefined',
 				section: 'undefined.section',
 				input: undefined,
-				want: {},
-			},
+				want: {}
+			}
 		];
 		testCases.map((tc: TestCase) => {
 			const actual = lsp.filterGoplsDefaultConfigValues(tc.input, undefined);
@@ -89,7 +90,7 @@
 				goplsConfig: {},
 				goConfig: {
 					buildFlags: [],
-					buildTags: '',
+					buildTags: ''
 				},
 				want: {}
 			},
@@ -129,10 +130,10 @@
 			{
 				name: 'do not mutate misconfigured gopls.buildFlags',
 				goplsConfig: {
-					'build.buildFlags': '-modfile gopls.mod',  // misconfiguration
+					'build.buildFlags': '-modfile gopls.mod' // misconfiguration
 				},
 				goConfig: {
-					buildFlags: '-modfile go.mod -tags tag1 -modcacherw',
+					buildFlags: '-modfile go.mod -tags tag1 -modcacherw'
 				},
 				want: { 'build.buildFlags': '-modfile gopls.mod' }
 			},
@@ -140,19 +141,18 @@
 				name: 'do not overwrite gopls config if it is explicitly set',
 				goplsConfig: {
 					'build.env': { GOPROXY: 'direct' },
-					'build.buildFlags': [],  // empty
+					'build.buildFlags': [] // empty
 				},
 				goConfig: {
 					// expect only non-conflicting flags (tags, modcacherw) passing.
 					buildFlags: ['-modfile go.mod -tags tag1 -modcacherw'],
-					buildTags: 'tag3',
+					buildTags: 'tag3'
 				},
 				want: {
 					'build.env': { GOPROXY: 'direct' },
-					'build.buildFlags': [],
-				}  // gopls.buildFlags untouched.
-			},
-
+					'build.buildFlags': []
+				} // gopls.buildFlags untouched.
+			}
 		];
 		testCases.map((tc: TestCase) => {
 			const actual = lsp.passGoConfigToGoplsConfigValues(tc.goplsConfig, tc.goConfig);
diff --git a/test/gopls/extension.test.ts b/test/gopls/extension.test.ts
index 05d3523..0bdae7d 100644
--- a/test/gopls/extension.test.ts
+++ b/test/gopls/extension.test.ts
@@ -1,3 +1,4 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
 /*---------------------------------------------------------
  * Copyright (C) Microsoft Corporation. All rights reserved.
  * Licensed under the MIT License. See LICENSE in the project root for license information.
@@ -5,11 +6,11 @@
 import * as assert from 'assert';
 import { EventEmitter } from 'events';
 import * as path from 'path';
-import sinon = require('sinon');
 import * as vscode from 'vscode';
 import { LanguageClient } from 'vscode-languageclient/node';
 import { getGoConfig } from '../../src/config';
 import { buildLanguageClient, BuildLanguageClientOption, buildLanguageServerConfig } from '../../src/goLanguageServer';
+import sinon = require('sinon');
 
 // FakeOutputChannel is a fake output channel used to buffer
 // the output of the tested language client in an in-memory
@@ -18,7 +19,7 @@
 	public name = 'FakeOutputChannel';
 	public show = sinon.fake(); // no-empty
 	public hide = sinon.fake(); // no-empty
-	public dispose = sinon.fake();  // no-empty
+	public dispose = sinon.fake(); // no-empty
 
 	private buf = [] as string[];
 
@@ -34,10 +35,12 @@
 
 	public append = (v: string) => this.enqueue(v);
 	public appendLine = (v: string) => this.enqueue(v);
-	public clear = () => { this.buf = []; };
+	public clear = () => {
+		this.buf = [];
+	};
 	public toString = () => {
 		return this.buf.join('\n');
-	}
+	};
 
 	private enqueue = (v: string) => {
 		this.registeredPatterns?.forEach((p) => {
@@ -46,9 +49,11 @@
 			}
 		});
 
-		if (this.buf.length > 1024) { this.buf.shift(); }
+		if (this.buf.length > 1024) {
+			this.buf.shift();
+		}
 		this.buf.push(v.trim());
-	}
+	};
 }
 
 // Env is a collection of test-related variables and lsp client.
@@ -81,17 +86,18 @@
 		});
 	}
 
-	public async setup(filePath: string) {  // file path to open.
+	public async setup(filePath: string) {
+		// file path to open.
 		this.fakeOutputChannel = new FakeOutputChannel();
 		const pkgLoadingDone = this.onMessageInTrace('Finished loading packages.', 60_000);
 
 		// Start the language server with the fakeOutputChannel.
 		const goConfig = Object.create(getGoConfig(), {
 			useLanguageServer: { value: true },
-			languageServerFlags: { value: ['-rpc.trace'] },  // enable rpc tracing to monitor progress reports
+			languageServerFlags: { value: ['-rpc.trace'] } // enable rpc tracing to monitor progress reports
 		});
 		const cfg: BuildLanguageClientOption = buildLanguageServerConfig(goConfig);
-		cfg.outputChannel = this.fakeOutputChannel;  // inject our fake output channel.
+		cfg.outputChannel = this.fakeOutputChannel; // inject our fake output channel.
 		this.languageClient = await buildLanguageClient(cfg);
 		this.disposables.push(this.languageClient.start());
 
@@ -145,13 +151,21 @@
 			['inside a number', new vscode.Position(28, 16), null, null], // inside a number
 			['func main()', new vscode.Position(22, 5), 'func main()', null],
 			['import "math"', new vscode.Position(40, 23), 'package math', '`math` on'],
-			['func Println()', new vscode.Position(19, 6), 'func fmt.Println(a ...interface{}) (n int, err error)', 'Println formats '],
+			[
+				'func Println()',
+				new vscode.Position(19, 6),
+				'func fmt.Println(a ...interface{}) (n int, err error)',
+				'Println formats '
+			],
 			['func print()', new vscode.Position(23, 4), 'func print(txt string)', 'This is an unexported function ']
 		];
 
 		const promises = testCases.map(async ([name, position, expectedSignature, expectedDoc]) => {
-			const hovers = await vscode.commands.executeCommand(
-				'vscode.executeHoverProvider', uri, position) as vscode.Hover[];
+			const hovers = (await vscode.commands.executeCommand(
+				'vscode.executeHoverProvider',
+				uri,
+				position
+			)) as vscode.Hover[];
 
 			if (expectedSignature === null && expectedDoc === null) {
 				assert.equal(hovers.length, 0, `check hovers over ${name} failed: unexpected non-empty hover message.`);
@@ -159,21 +173,24 @@
 			}
 
 			const hover = hovers[0];
-			assert.equal(hover.contents.length, 1, `check hovers over ${name} failed: unexpected number of hover messages.`);
+			assert.equal(
+				hover.contents.length,
+				1,
+				`check hovers over ${name} failed: unexpected number of hover messages.`
+			);
 			const gotMessage = (<vscode.MarkdownString>hover.contents[0]).value;
 			assert.ok(
-				gotMessage.includes('```go\n' + expectedSignature + '\n```')
-				&& (!expectedDoc || gotMessage.includes(expectedDoc)),
-				`check hovers over ${name} failed: got ${gotMessage}`);
+				gotMessage.includes('```go\n' + expectedSignature + '\n```') &&
+					(!expectedDoc || gotMessage.includes(expectedDoc)),
+				`check hovers over ${name} failed: got ${gotMessage}`
+			);
 		});
 		return Promise.all(promises);
 	});
 
 	test('Completion middleware', async () => {
 		const { uri } = await env.openDoc(testdataDir, 'gogetdocTestData', 'test.go');
-		const testCases: [string, vscode.Position, string][] = [
-			['fmt.P<>', new vscode.Position(19, 6), 'Print'],
-		];
+		const testCases: [string, vscode.Position, string][] = [['fmt.P<>', new vscode.Position(19, 6), 'Print']];
 		for (const [name, position, wantFilterText] of testCases) {
 			let list: vscode.CompletionList<vscode.CompletionItem>;
 			// Query completion items. We expect the hard coded filter text hack
@@ -184,8 +201,11 @@
 			// Retry a couple of times if we see a complete result as a workaround.
 			// (github.com/golang/vscode-go/issues/363)
 			for (let i = 0; i < 3; i++) {
-				list = await vscode.commands.executeCommand(
-					'vscode.executeCompletionItemProvider', uri, position) as vscode.CompletionList;
+				list = (await vscode.commands.executeCommand(
+					'vscode.executeCompletionItemProvider',
+					uri,
+					position
+				)) as vscode.CompletionList;
 				if (list.isIncomplete) {
 					break;
 				}
@@ -194,7 +214,7 @@
 			}
 			// Confirm that the hardcoded filter text hack has been applied.
 			if (!list.isIncomplete) {
-				assert.fail(`gopls should provide an incomplete list by default`);
+				assert.fail('gopls should provide an incomplete list by default');
 			}
 
 			// vscode.executeCompletionItemProvider will return results from all
@@ -203,13 +223,24 @@
 			// prevent us from detecting problems caused by issues between the language
 			// client library and the vscode.
 			for (const item of list.items) {
-				if (item.kind === vscode.CompletionItemKind.Snippet) { continue; }  // gopls does not supply Snippet yet.
-				assert.strictEqual(item.filterText ?? item.label, wantFilterText,
+				if (item.kind === vscode.CompletionItemKind.Snippet) {
+					continue;
+				} // gopls does not supply Snippet yet.
+				assert.strictEqual(
+					item.filterText ?? item.label,
+					wantFilterText,
 					`${uri}:${name} failed, unexpected filter text ` +
-					`(got ${item.filterText ?? item.label}, want ${wantFilterText})\n` +
-					`${JSON.stringify(item, null, 2)}`);
-				if (item.kind === vscode.CompletionItemKind.Method || item.kind === vscode.CompletionItemKind.Function) {
-					assert.ok(item.command, `${uri}:${name}: expected command associated with ${item.label}, found none`);
+						`(got ${item.filterText ?? item.label}, want ${wantFilterText})\n` +
+						`${JSON.stringify(item, null, 2)}`
+				);
+				if (
+					item.kind === vscode.CompletionItemKind.Method ||
+					item.kind === vscode.CompletionItemKind.Function
+				) {
+					assert.ok(
+						item.command,
+						`${uri}:${name}: expected command associated with ${item.label}, found none`
+					);
 				}
 			}
 		}
diff --git a/test/gopls/index.ts b/test/gopls/index.ts
index eae81d7..f332137 100644
--- a/test/gopls/index.ts
+++ b/test/gopls/index.ts
@@ -1,3 +1,5 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+/* eslint-disable node/no-unpublished-import */
 /*---------------------------------------------------------
  * Copyright (C) Microsoft Corporation. All rights reserved.
  * Licensed under the MIT License. See LICENSE in the project root for license information.
diff --git a/test/gopls/report.test.ts b/test/gopls/report.test.ts
index 7cdcc37..e378264 100644
--- a/test/gopls/report.test.ts
+++ b/test/gopls/report.test.ts
@@ -16,33 +16,40 @@
 		}
 		const testCases: TestCase[] = [
 			{
-				name: `panic trace`,
+				name: 'panic trace',
 				in: traceFromIssueGo41435,
-				want: sanitizedTraceFromIssueGo41435,
+				want: sanitizedTraceFromIssueGo41435
 			},
 			{
-				name: `initialization error message`,
+				name: 'initialization error message',
 				in: traceFromIssueVSCodeGo572,
 				want: sanitizedTraceFromIssuVSCodeGo572
 			},
 			{
-				name: `incomplete panic trace`,
-				in: `panic: \nsecret\n`,
-				wantReason: `incomplete panic trace`
+				name: 'incomplete panic trace',
+				in: 'panic: \nsecret\n',
+				wantReason: 'incomplete panic trace'
 			},
 			{
-				name: `incomplete initialization error message`,
-				in: `Secret Starting client failed.\nAnoter Secret\n`,
-				wantReason: `unrecognized crash pattern`
+				name: 'incomplete initialization error message',
+				in: 'Secret Starting client failed.\nAnoter Secret\n',
+				wantReason: 'unrecognized crash pattern'
 			}
 		];
 
 		testCases.map((tc: TestCase) => {
-			const {sanitizedLog, failureReason}  = sanitizeGoplsTrace(tc.in);
-			assert.strictEqual(sanitizedLog, tc.want, `sanitizeGoplsTrace(${tc.name}) returned unexpected sanitizedLog result`);
-			assert.strictEqual(failureReason, tc.wantReason, `sanitizeGoplsTrace(${tc.name}) returned unexpected failureReason result`);
+			const { sanitizedLog, failureReason } = sanitizeGoplsTrace(tc.in);
+			assert.strictEqual(
+				sanitizedLog,
+				tc.want,
+				`sanitizeGoplsTrace(${tc.name}) returned unexpected sanitizedLog result`
+			);
+			assert.strictEqual(
+				failureReason,
+				tc.wantReason,
+				`sanitizeGoplsTrace(${tc.name}) returned unexpected failureReason result`
+			);
 		});
-
 	});
 });
 
diff --git a/test/gopls/survey.test.ts b/test/gopls/survey.test.ts
index 405c6af..b5b8424 100644
--- a/test/gopls/survey.test.ts
+++ b/test/gopls/survey.test.ts
@@ -13,10 +13,7 @@
 		// global state -> offer survey
 		const testCases: [goLanguageServer.SurveyConfig, boolean][] = [
 			// User who is activating the extension for the first time.
-			[
-				{},
-				true,
-			],
+			[{}, true],
 			// User who has already taken the survey.
 			[
 				{
@@ -24,35 +21,35 @@
 					dateComputedPromptThisMonth: new Date('2020-04-10'),
 					lastDatePrompted: new Date('2020-04-02'),
 					prompt: true,
-					promptThisMonth: false,
+					promptThisMonth: false
 				},
-				undefined,
+				undefined
 			],
 			// User who has declined survey prompting.
 			[
 				{
 					dateComputedPromptThisMonth: new Date('2020-04-10'),
 					lastDatePrompted: new Date('2020-04-02'),
-					prompt: false,
+					prompt: false
 				},
-				undefined,
+				undefined
 			],
 			// User who hasn't activated the extension in a while, but has opted in to prompting.
 			[
 				{
 					dateComputedPromptThisMonth: new Date('2019-04-10'),
 					lastDatePrompted: new Date('2019-01-02'),
-					prompt: true,
+					prompt: true
 				},
-				true,
+				true
 			],
 			// User who hasn't activated the extension in a while, and has never been prompted.
 			[
 				{
 					dateComputedPromptThisMonth: new Date('2019-04-10'),
-					lastDatePrompted: new Date('2019-01-02'),
+					lastDatePrompted: new Date('2019-01-02')
 				},
-				true,
+				true
 			],
 			// User who should get prompted this month, but hasn't been yet.
 			[
@@ -61,10 +58,10 @@
 					dateComputedPromptThisMonth: new Date('2020-04-10'),
 					lastDatePrompted: new Date('2019-01-02'),
 					prompt: true,
-					promptThisMonth: true,
+					promptThisMonth: true
 				},
-				true,
-			],
+				true
+			]
 		];
 		testCases.map(([testConfig, wantPrompt], i) => {
 			// Replace Math.Random so that it always returns 1. This means
@@ -101,10 +98,10 @@
 		[{}, 'Not now', 1],
 		[{}, 'Never', 2],
 		// // Saved config, doesn't matter what the user chooses.
-		[{ prompt: false, }, '', 0],
+		[{ prompt: false }, '', 0],
 		[{ prompt: false, lastDatePrompted: new Date() }, '', 0],
-		[{ prompt: true, }, '', 1],
-		[{ prompt: true, lastDatePrompted: new Date() }, '', 0],
+		[{ prompt: true }, '', 1],
+		[{ prompt: true, lastDatePrompted: new Date() }, '', 0]
 	];
 
 	testCases.map(async ([testConfig, choice, wantCount], i) => {
diff --git a/test/gopls/update.test.ts b/test/gopls/update.test.ts
index d279fdb..8df0497 100644
--- a/test/gopls/update.test.ts
+++ b/test/gopls/update.test.ts
@@ -1,18 +1,20 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+/* eslint-disable node/no-deprecated-api */
+/* eslint-disable @typescript-eslint/no-unused-vars */
 /*---------------------------------------------------------
  * Copyright (C) Microsoft Corporation. All rights reserved.
  * Licensed under the MIT License. See License.txt in the project root for license information.
  *--------------------------------------------------------*/
 
 import * as assert from 'assert';
-import { defaultCipherList } from 'constants';
-import moment = require('moment');
-import semver = require('semver');
-import sinon = require('sinon');
 import * as vscode from 'vscode';
 import { getGoConfig } from '../../src/config';
 import * as lsp from '../../src/goLanguageServer';
 import { getTool, Tool } from '../../src/goTools';
 import { getCheckForToolsUpdatesConfig as getCheckForToolUpdatesConfig } from '../../src/util';
+import moment = require('moment');
+import semver = require('semver');
+import sinon = require('sinon');
 
 suite('getCheckForToolUpdatesConfig tests', () => {
 	const CHECK_FOR_UPDATES = 'toolsManagement.checkForUpdates';
@@ -23,8 +25,14 @@
 		const { key, defaultValue, globalValue, workspaceValue } = defaultConfigInspector;
 		assert.deepStrictEqual(
 			{ key, defaultValue, globalValue, workspaceValue },
-			{ key: `go.${CHECK_FOR_UPDATES}`, defaultValue: 'proxy', globalValue: undefined, workspaceValue: undefined },
-			CHECK_FOR_UPDATES);
+			{
+				key: `go.${CHECK_FOR_UPDATES}`,
+				defaultValue: 'proxy',
+				globalValue: undefined,
+				workspaceValue: undefined
+			},
+			CHECK_FOR_UPDATES
+		);
 		assert.strictEqual(getGoConfig().get(LEGACY_CHECK_FOR_UPDATES), true, LEGACY_CHECK_FOR_UPDATES);
 	});
 
@@ -32,19 +40,30 @@
 	// vscode.getConfiguration is read-only, and doesn't allow property modification
 	// so working with sinon directly doesn't seem possible.
 	class TestWorkspaceConfiguration implements vscode.WorkspaceConfiguration {
-		constructor(private _wrapped: vscode.WorkspaceConfiguration) { }
-		public get<T>(params: string) { return this._wrapped.get<T>(params); }
-		public has(params: string) { return this._wrapped.has(params); }
-		public inspect<T>(params: string) { return this._wrapped.inspect<T>(params); }
+		constructor(private _wrapped: vscode.WorkspaceConfiguration) {}
+		public get<T>(params: string) {
+			return this._wrapped.get<T>(params);
+		}
+		public has(params: string) {
+			return this._wrapped.has(params);
+		}
+		public inspect<T>(params: string) {
+			return this._wrapped.inspect<T>(params);
+		}
 		public update<T>(
-			section: string, value: any,
-			configurationTarget?: vscode.ConfigurationTarget | boolean, overrideInLanguage?: boolean) {
+			section: string,
+			value: any,
+			configurationTarget?: vscode.ConfigurationTarget | boolean,
+			overrideInLanguage?: boolean
+		) {
 			return this._wrapped.update(section, value, configurationTarget, overrideInLanguage);
 		}
 		[key: string]: any;
 	}
 
-	teardown(() => { sinon.restore(); });
+	teardown(() => {
+		sinon.restore();
+	});
 
 	test('default checkForUpdates returns proxy', () => {
 		const gocfg = getGoConfig();
@@ -52,28 +71,37 @@
 	});
 	test('local when new config is not set and legacy config is set to false', () => {
 		const gocfg = new TestWorkspaceConfiguration(getGoConfig());
-		sinon.stub(gocfg, 'get')
-			.withArgs(LEGACY_CHECK_FOR_UPDATES).returns(false);
+		sinon.stub(gocfg, 'get').withArgs(LEGACY_CHECK_FOR_UPDATES).returns(false);
 
 		assert.strictEqual(getCheckForToolUpdatesConfig(gocfg), 'local');
 	});
 	test('proxy when new config is "proxy" and legacy config is set to false', () => {
 		const gocfg = new TestWorkspaceConfiguration(getGoConfig());
-		sinon.stub(gocfg, 'get')
-			.withArgs(LEGACY_CHECK_FOR_UPDATES).returns(false)
-			.withArgs(CHECK_FOR_UPDATES).returns('proxy');
-		sinon.stub(gocfg, 'inspect').withArgs(CHECK_FOR_UPDATES).returns(
-			Object.assign({}, defaultConfigInspector, { globalValue: 'proxy' }));
+		sinon
+			.stub(gocfg, 'get')
+			.withArgs(LEGACY_CHECK_FOR_UPDATES)
+			.returns(false)
+			.withArgs(CHECK_FOR_UPDATES)
+			.returns('proxy');
+		sinon
+			.stub(gocfg, 'inspect')
+			.withArgs(CHECK_FOR_UPDATES)
+			.returns(Object.assign({}, defaultConfigInspector, { globalValue: 'proxy' }));
 
 		assert.strictEqual(getCheckForToolUpdatesConfig(gocfg), 'proxy');
 	});
 	test('off when new config (workspace) is "off" and legacy config is set to false', () => {
 		const gocfg = new TestWorkspaceConfiguration(getGoConfig());
-		sinon.stub(gocfg, 'get')
-			.withArgs(LEGACY_CHECK_FOR_UPDATES).returns(false)
-			.withArgs(CHECK_FOR_UPDATES).returns('off');
-		sinon.stub(gocfg, 'inspect').withArgs(CHECK_FOR_UPDATES).returns(
-			Object.assign({}, defaultConfigInspector, { workspaceValue: 'off' }));
+		sinon
+			.stub(gocfg, 'get')
+			.withArgs(LEGACY_CHECK_FOR_UPDATES)
+			.returns(false)
+			.withArgs(CHECK_FOR_UPDATES)
+			.returns('off');
+		sinon
+			.stub(gocfg, 'inspect')
+			.withArgs(CHECK_FOR_UPDATES)
+			.returns(Object.assign({}, defaultConfigInspector, { workspaceValue: 'off' }));
 		assert.strictEqual(getCheckForToolUpdatesConfig(gocfg), 'off');
 	});
 });
@@ -100,56 +128,26 @@
 			['developer version (pre-release)', '(devel)', true, null],
 			['nonsense version', 'nosuchversion', false, latestVersion],
 			['nonsense version (pre-release)', 'nosuchversion', true, latestPrereleaseVersion],
-			[
-				'latest pre-release',
-				'v0.4.2-pre1',
-				false, null,
-			],
-			[
-				'latest pre-release (pre-release)',
-				'v0.4.2-pre1',
-				true, null,
-			],
-			[
-				'outdated pre-release version',
-				'v0.3.1-pre1',
-				false, latestVersion,
-			],
-			[
-				'outdated pre-release version (pre-release)',
-				'v0.3.1-pre1',
-				true, latestPrereleaseVersion,
-			],
-			[
-				'recent pseudoversion after pre-release, 2020-05-20',
-				'v0.0.0-20200521000000-2212a7e161a5',
-				false, null,
-			],
-			[
-				'recent pseudoversion before pre-release, 2020-05-20',
-				'v0.0.0-20200515000000-2212a7e161a5',
-				false, null,
-			],
-			[
-				'recent pseudoversion after pre-release (pre-release)',
-				'v0.0.0-20200521000000-2212a7e161a5',
-				true, null,
-			],
+			['latest pre-release', 'v0.4.2-pre1', false, null],
+			['latest pre-release (pre-release)', 'v0.4.2-pre1', true, null],
+			['outdated pre-release version', 'v0.3.1-pre1', false, latestVersion],
+			['outdated pre-release version (pre-release)', 'v0.3.1-pre1', true, latestPrereleaseVersion],
+			['recent pseudoversion after pre-release, 2020-05-20', 'v0.0.0-20200521000000-2212a7e161a5', false, null],
+			['recent pseudoversion before pre-release, 2020-05-20', 'v0.0.0-20200515000000-2212a7e161a5', false, null],
+			['recent pseudoversion after pre-release (pre-release)', 'v0.0.0-20200521000000-2212a7e161a5', true, null],
 			[
 				'recent pseudoversion before pre-release (pre-release)',
 				'v0.0.0-20200515000000-2212a7e161a5',
-				true, latestPrereleaseVersion,
+				true,
+				latestPrereleaseVersion
 			],
-			[
-				'outdated pseudoversion',
-				'v0.0.0-20200309030707-2212a7e161a5',
-				false, latestVersion,
-			],
+			['outdated pseudoversion', 'v0.0.0-20200309030707-2212a7e161a5', false, latestVersion],
 			[
 				'outdated pseudoversion (pre-release)',
 				'v0.0.0-20200309030707-2212a7e161a5',
-				true, latestPrereleaseVersion,
-			],
+				true,
+				latestPrereleaseVersion
+			]
 		];
 		for (const [name, usersVersion, acceptPrerelease, want] of testCases) {
 			sinon.replace(lsp, 'getLocalGoplsVersion', async () => {
@@ -176,11 +174,11 @@
 				checkForUpdates: 'proxy',
 				env: {},
 				features: {
-					diagnostics: true,
+					diagnostics: true
 				},
 				flags: [],
 				modtime: new Date(),
-				serverName: 'gopls',
+				serverName: 'gopls'
 			});
 			assert.deepEqual(got, want, `${name}: failed (got: '${got}' ${typeof got} want: '${want}' ${typeof want})`);
 			sinon.restore();
diff --git a/test/integration/codelens.test.ts b/test/integration/codelens.test.ts
index 91fb23a..bee6b27 100644
--- a/test/integration/codelens.test.ts
+++ b/test/integration/codelens.test.ts
@@ -46,7 +46,7 @@
 
 		fs.removeSync(repoPath);
 		fs.copySync(fixtureSourcePath, fixturePath, {
-			recursive: true,
+			recursive: true
 		});
 		goConfig = getGoConfig();
 		const uri = vscode.Uri.file(path.join(fixturePath, 'codelens_test.go'));
@@ -117,8 +117,14 @@
 		const benchmarkDocument = await vscode.workspace.openTextDocument(uri);
 		const codeLenses = await codeLensProvider.provideCodeLenses(benchmarkDocument, cancellationTokenSource.token);
 		assert.equal(codeLenses.length, 6);
-		const wantCommands = ['go.test.package', 'go.test.file', 'go.benchmark.package',
-			'go.benchmark.file', 'go.benchmark.cursor', 'go.debug.cursor'];
+		const wantCommands = [
+			'go.test.package',
+			'go.test.file',
+			'go.benchmark.package',
+			'go.benchmark.file',
+			'go.benchmark.cursor',
+			'go.debug.cursor'
+		];
 		for (let i = 0; i < codeLenses.length; i++) {
 			assert.equal(codeLenses[i].command.command, wantCommands[i]);
 		}
diff --git a/test/integration/config.test.ts b/test/integration/config.test.ts
index e9fa344..1d7eee4 100644
--- a/test/integration/config.test.ts
+++ b/test/integration/config.test.ts
@@ -1,3 +1,5 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+/* eslint-disable @typescript-eslint/no-explicit-any */
 /*---------------------------------------------------------
  * Copyright 2021 The Go Authors. All rights reserved.
  * Licensed under the MIT License. See LICENSE in the project root for license information.
@@ -6,13 +8,13 @@
 'use strict';
 
 import * as assert from 'assert';
-import vscode = require('vscode');
 import { Configuration } from '../../src/config';
+import vscode = require('vscode');
 
 suite('GoConfiguration Tests', () => {
 	function check(trusted: boolean, workspaceConfig: { [key: string]: any }, key: string, expected: any) {
 		const getConfigurationFn = (section: string) => new MockCfg(workspaceConfig);
-		const cfg = (new Configuration(trusted, getConfigurationFn)).get('go');
+		const cfg = new Configuration(trusted, getConfigurationFn).get('go');
 
 		const got0 = JSON.stringify(cfg.get(key));
 		const got1 = JSON.stringify(cfg[key]);
@@ -45,7 +47,7 @@
 
 	function checkGopls(trusted: boolean, workspaceConfig: { [key: string]: any }, key: string, expected: any) {
 		const getConfigurationFn = (section: string) => new MockCfg(workspaceConfig);
-		const cfg = (new Configuration(trusted, getConfigurationFn)).get('gopls');
+		const cfg = new Configuration(trusted, getConfigurationFn).get('gopls');
 
 		const got0 = JSON.stringify(cfg.get(key));
 		const got1 = JSON.stringify(cfg[key]);
@@ -76,7 +78,7 @@
 		// getter
 		Object.defineProperties(this, Object.getOwnPropertyDescriptors(workspaceSettings));
 		this.map = new Map<string, any>(Object.entries(workspaceSettings));
-		this.wrapped = vscode.workspace.getConfiguration('go');  // intentionally using vscode API directly.
+		this.wrapped = vscode.workspace.getConfiguration('go'); // intentionally using vscode API directly.
 	}
 
 	// tslint:disable: no-any
@@ -103,9 +105,11 @@
 	}
 
 	public update(
-		section: string, value: any,
+		section: string,
+		value: any,
 		configurationTarget?: boolean | vscode.ConfigurationTarget,
-		overrideInLanguage?: boolean): Thenable<void> {
+		overrideInLanguage?: boolean
+	): Thenable<void> {
 		throw new Error('Method not implemented.');
 	}
 }
diff --git a/test/integration/coverage.test.ts b/test/integration/coverage.test.ts
index e0415d9..f49384e 100644
--- a/test/integration/coverage.test.ts
+++ b/test/integration/coverage.test.ts
@@ -1,3 +1,4 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
 /*---------------------------------------------------------
  * Copyright 2020 The Go Authors. All rights reserved.
  * Licensed under the MIT License. See LICENSE in the project root for license information.
@@ -6,13 +7,12 @@
 'use strict';
 
 import * as assert from 'assert';
+import { applyCodeCoverageToAllEditors, coverageFilesForTest, initForTest } from '../../src/goCover';
+import { updateGoVarsFromConfig } from '../../src/goInstallTools';
 import fs = require('fs-extra');
 import path = require('path');
 import sinon = require('sinon');
 import vscode = require('vscode');
-import { applyCodeCoverageToAllEditors, coverageFilesForTest, initForTest } from '../../src/goCover';
-import { updateGoVarsFromConfig } from '../../src/goInstallTools';
-import { getCurrentGoPath, getWorkspaceFolderPath } from '../../src/util';
 
 // The ideal test would check that each open editor containing a file with coverage
 // information is displayed correctly. We cannot see the applied decorations, so the
diff --git a/test/integration/extension.test.ts b/test/integration/extension.test.ts
index 2e21a00..0d28d30 100644
--- a/test/integration/extension.test.ts
+++ b/test/integration/extension.test.ts
@@ -1,12 +1,14 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+/* eslint-disable @typescript-eslint/no-unused-vars */
+/* eslint-disable eqeqeq */
+/* eslint-disable node/no-unpublished-import */
 /*---------------------------------------------------------
  * Copyright (C) Microsoft Corporation. All rights reserved.
  * Licensed under the MIT License. See LICENSE in the project root for license information.
  *--------------------------------------------------------*/
 
 import * as assert from 'assert';
-import cp = require('child_process');
 import * as fs from 'fs-extra';
-import os = require('os');
 import * as path from 'path';
 import * as sinon from 'sinon';
 import * as vscode from 'vscode';
@@ -36,11 +38,12 @@
 	getBinPath,
 	getCurrentGoPath,
 	getImportPath,
-	getToolsGopath,
 	handleDiagnosticErrors,
 	ICheckResult,
 	isVendorSupported
 } from '../../src/util';
+import cp = require('child_process');
+import os = require('os');
 
 const testAll = (isModuleMode: boolean) => {
 	const dummyCancellationSource = new vscode.CancellationTokenSource();
@@ -187,7 +190,9 @@
 	}
 
 	test('Test Definition Provider using godoc', async function () {
-		if (isModuleMode) { this.skip(); } // not working in module mode.
+		if (isModuleMode) {
+			this.skip();
+		} // not working in module mode.
 
 		const config = Object.create(getGoConfig(), {
 			docsTool: { value: 'godoc' }
@@ -196,7 +201,9 @@
 	});
 
 	test('Test Definition Provider using gogetdoc', async function () {
-		if (isModuleMode) {	this.skip(); }  // not working in module mode.
+		if (isModuleMode) {
+			this.skip();
+		} // not working in module mode.
 		const gogetdocPath = getBinPath('gogetdoc');
 		if (gogetdocPath === 'gogetdoc') {
 			// gogetdoc is not installed, so skip the test
@@ -209,7 +216,9 @@
 	});
 
 	test('Test SignatureHelp Provider using godoc', async function () {
-		if (isModuleMode) { this.skip(); }  // not working in module mode
+		if (isModuleMode) {
+			this.skip();
+		} // not working in module mode
 
 		const printlnDoc = `Println formats using the default formats for its operands and writes to
 standard output. Spaces are always added between operands and a newline is
@@ -227,7 +236,7 @@
 			[
 				new vscode.Position(23, 7),
 				'print(txt string)',
-				`This is an unexported function so couldn't get this comment on hover :( Not\nanymore!!\n`,
+				"This is an unexported function so couldn't get this comment on hover :( Not\nanymore!!\n",
 				['txt string']
 			],
 			[
@@ -250,7 +259,9 @@
 	});
 
 	test('Test SignatureHelp Provider using gogetdoc', async function () {
-		if (isModuleMode) {	this.skip(); }  // not working in module mode.
+		if (isModuleMode) {
+			this.skip();
+		} // not working in module mode.
 		const gogetdocPath = getBinPath('gogetdoc');
 		if (gogetdocPath === 'gogetdoc') {
 			// gogetdoc is not installed, so skip the test
@@ -271,7 +282,7 @@
 			[
 				new vscode.Position(23, 7),
 				'print(txt string)',
-				`This is an unexported function so couldn't get this comment on hover :(\nNot anymore!!\n`,
+				"This is an unexported function so couldn't get this comment on hover :(\nNot anymore!!\n",
 				['txt string']
 			],
 			[
@@ -294,7 +305,9 @@
 	});
 
 	test('Test Hover Provider using godoc', async function () {
-		if (isModuleMode) { this.skip(); }  // not working in module mode
+		if (isModuleMode) {
+			this.skip();
+		} // not working in module mode
 
 		const printlnDoc = `Println formats using the default formats for its operands and writes to
 standard output. Spaces are always added between operands and a newline is
@@ -313,7 +326,7 @@
 			[
 				new vscode.Position(23, 4),
 				'print func(txt string)',
-				`This is an unexported function so couldn't get this comment on hover :( Not\nanymore!!\n`
+				"This is an unexported function so couldn't get this comment on hover :( Not\nanymore!!\n"
 			]
 		];
 		const config = Object.create(getGoConfig(), {
@@ -323,7 +336,9 @@
 	});
 
 	test('Test Hover Provider using gogetdoc', async function () {
-		if (isModuleMode) {	this.skip(); }  // not working in module mode.
+		if (isModuleMode) {
+			this.skip();
+		} // not working in module mode.
 
 		const gogetdocPath = getBinPath('gogetdoc');
 		if (gogetdocPath === 'gogetdoc') {
@@ -344,7 +359,7 @@
 			[
 				new vscode.Position(23, 4),
 				'func print(txt string)',
-				`This is an unexported function so couldn't get this comment on hover :(\nNot anymore!!\n`
+				"This is an unexported function so couldn't get this comment on hover :(\nNot anymore!!\n"
 			],
 			[
 				new vscode.Position(40, 23),
@@ -355,7 +370,7 @@
 			[
 				new vscode.Position(27, 14),
 				'type ABC struct {\n    a int\n    b int\n    c int\n}',
-				`ABC is a struct, you coudn't use Goto Definition or Hover info on this before\nNow you can due to gogetdoc and go doc\n`
+				"ABC is a struct, you coudn't use Goto Definition or Hover info on this before\nNow you can due to gogetdoc and go doc\n"
 			],
 			[
 				new vscode.Position(28, 6),
@@ -390,19 +405,31 @@
 			goLint(vscode.Uri.file(path.join(fixturePath, 'linterTest', 'linter_2.go')), config)
 		]);
 		assert.equal(util.runTool.callCount, 2, 'should have launched 2 lint jobs');
-		assert.equal(processutil.killProcessTree.callCount, 1, 'should have killed 1 lint job before launching the next');
+		assert.equal(
+			processutil.killProcessTree.callCount,
+			1,
+			'should have killed 1 lint job before launching the next'
+		);
 	});
 
 	test('Linting - lint errors with multiple open files', async () => {
 		// handleDiagnosticErrors may adjust the lint errors' ranges to make the error more visible.
 		// This adjustment applies only to the text documents known to vscode. This test checks
 		// the adjustment is made consistently across multiple open text documents.
-		const file1 = await vscode.workspace.openTextDocument(vscode.Uri.file(path.join(fixturePath, 'linterTest', 'linter_1.go')));
-		const file2 = await vscode.workspace.openTextDocument(vscode.Uri.file(path.join(fixturePath, 'linterTest', 'linter_2.go')));
-		const warnings = await goLint(file2.uri, Object.create(getGoConfig(), {
-			lintTool: { value: 'golint' },
-			lintFlags: { value: [] }
-		}), 'package');
+		const file1 = await vscode.workspace.openTextDocument(
+			vscode.Uri.file(path.join(fixturePath, 'linterTest', 'linter_1.go'))
+		);
+		const file2 = await vscode.workspace.openTextDocument(
+			vscode.Uri.file(path.join(fixturePath, 'linterTest', 'linter_2.go'))
+		);
+		const warnings = await goLint(
+			file2.uri,
+			Object.create(getGoConfig(), {
+				lintTool: { value: 'golint' },
+				lintFlags: { value: [] }
+			}),
+			'package'
+		);
 
 		const diagnosticCollection = vscode.languages.createDiagnosticCollection('linttest');
 		handleDiagnosticErrors(file2, warnings, diagnosticCollection);
@@ -430,12 +457,14 @@
 				line: 7,
 				severity: 'warning',
 				msg: 'exported function Print2 should have comment or be unexported'
-			},
+			}
 		];
 		// If a user has enabled diagnostics via a language server,
 		// then we disable running build or vet to avoid duplicate errors and warnings.
 		const lspConfig = buildLanguageServerConfig(getGoConfig());
-		const expectedBuildVetErrors = lspConfig.enabled ? [] : [{ line: 11, severity: 'error', msg: 'undefined: prin' }];
+		const expectedBuildVetErrors = lspConfig.enabled
+			? []
+			: [{ line: 11, severity: 'error', msg: 'undefined: prin' }];
 
 		const expected = [...expectedLintErrors, ...expectedBuildVetErrors];
 		const diagnostics = await check(vscode.Uri.file(path.join(fixturePath, 'errorsTest', 'errors.go')), config);
@@ -445,7 +474,7 @@
 				diagnostics.map((x) => x.errors)
 			)
 			.sort((a: any, b: any) => a.line - b.line);
-		assert.equal(sortedDiagnostics.length > 0, true, `Failed to get linter results`);
+		assert.equal(sortedDiagnostics.length > 0, true, 'Failed to get linter results');
 
 		const matchCount = expected.filter((expectedItem) => {
 			return sortedDiagnostics.some((diag: any) => {
@@ -456,7 +485,11 @@
 				);
 			});
 		});
-		assert.equal(matchCount.length >= expected.length, true, `Failed to match expected errors \n${JSON.stringify(sortedDiagnostics)} \n VS\n ${JSON.stringify(expected)}`);
+		assert.equal(
+			matchCount.length >= expected.length,
+			true,
+			`Failed to match expected errors \n${JSON.stringify(sortedDiagnostics)} \n VS\n ${JSON.stringify(expected)}`
+		);
 	});
 
 	test('Test Generate unit tests skeleton for file', async function () {
@@ -510,7 +543,9 @@
 
 	test('Test diffUtils.getEditsFromUnifiedDiffStr', async function () {
 		// Run this test only in module mode.
-		if (!isModuleMode) { this.skip(); }
+		if (!isModuleMode) {
+			this.skip();
+		}
 
 		if (process.platform === 'win32') {
 			// This test requires diff tool that's not available on windows
@@ -552,7 +587,9 @@
 	});
 
 	test('Test diffUtils.getEdits', async function () {
-		if (!isModuleMode) { this.skip(); }  // Run this test only in module mode.
+		if (!isModuleMode) {
+			this.skip();
+		} // Run this test only in module mode.
 
 		const file1path = path.join(fixturePath, 'diffTest2Data', 'file1.go');
 		const file2path = path.join(fixturePath, 'diffTest2Data', 'file2.go');
@@ -674,13 +711,13 @@
 	});
 
 	test('Replace vendor packages with relative path', async function () {
-		if (isModuleMode) {	this.skip(); }  // not working in module mode.
+		if (isModuleMode) {
+			this.skip();
+		} // not working in module mode.
 		const vendorSupport = await isVendorSupported();
 		const filePath = path.join(fixturePath, 'vendoring', 'main.go');
 		const workDir = path.dirname(filePath);
-		const vendorPkgsFullPath = [
-			'test/testfixture/vendoring/vendor/example.com/vendorpls',
-		];
+		const vendorPkgsFullPath = ['test/testfixture/vendoring/vendor/example.com/vendorpls'];
 		const vendorPkgsRelativePath = ['example.com/vendorpls'];
 
 		const gopkgsPromise = getAllPackages(workDir).then((pkgMap) => {
@@ -735,12 +772,12 @@
 	});
 
 	test('Vendor pkgs from other projects should not be allowed to import', async function () {
-		if (isModuleMode) {	this.skip(); }  // not working in module mode.
+		if (isModuleMode) {
+			this.skip();
+		} // not working in module mode.
 		const vendorSupport = await isVendorSupported();
 		const filePath = path.join(fixturePath, 'baseTest', 'test.go');
-		const vendorPkgs = [
-			'test/testfixture/vendoring/vendor/example.com/vendorpls',
-		];
+		const vendorPkgs = ['test/testfixture/vendoring/vendor/example.com/vendorpls'];
 
 		const gopkgsPromise = new Promise<void>((resolve, reject) => {
 			const cmd = cp.spawn(getBinPath('gopkgs'), ['-format', '{{.ImportPath}}'], {
@@ -1158,7 +1195,9 @@
 	});
 
 	test('Test Completion on unimported packages', async function () {
-		if (isModuleMode) { this.skip(); }
+		if (isModuleMode) {
+			this.skip();
+		}
 		// gocode-gomod does not handle unimported package completion.
 		// Skip if we run in module mode.
 
@@ -1261,7 +1300,8 @@
 				assert.equal(
 					expected.length,
 					labels.length,
-					`expected number of completions: ${expected.length} Actual: ${labels.length} at position(${position.line + 1
+					`expected number of completions: ${expected.length} Actual: ${labels.length} at position(${
+						position.line + 1
 					},${position.character + 1}) ${labels}`
 				);
 				expected.forEach((entry, index) => {
@@ -1406,28 +1446,40 @@
 			}) as vscode.WorkspaceConfiguration;
 
 			const diagnostics = await check(fileUri, cfg);
-			return ([] as string[]).concat(...diagnostics.map<string[]>((d) => {
-				return d.errors.map((e) => e.msg) as string[];
-			}));
+			return ([] as string[]).concat(
+				...diagnostics.map<string[]>((d) => {
+					return d.errors.map((e) => e.msg) as string[];
+				})
+			);
 		};
 
 		const errors1 = await checkWithTags('randomtag');
-		assert.deepEqual(errors1, ['undefined: fmt.Prinln'], 'check with buildtag "randomtag" failed. Unexpected errors found.');
+		assert.deepEqual(
+			errors1,
+			['undefined: fmt.Prinln'],
+			'check with buildtag "randomtag" failed. Unexpected errors found.'
+		);
 
 		// TODO(hyangah): after go1.13, -tags expects a comma-separated tag list.
 		// For backwards compatibility, space-separated tag lists are still recognized,
 		// but change to a space-separated list once we stop testing with go1.12.
 		const errors2 = await checkWithTags('randomtag other');
-		assert.deepEqual(errors2, ['undefined: fmt.Prinln'],
-			'check with multiple buildtags "randomtag,other" failed. Unexpected errors found.');
+		assert.deepEqual(
+			errors2,
+			['undefined: fmt.Prinln'],
+			'check with multiple buildtags "randomtag,other" failed. Unexpected errors found.'
+		);
 
 		const errors3 = await checkWithTags('');
-		assert.equal(errors3.length, 1,
-			'check without buildtag failed. Unexpected number of errors found' + JSON.stringify(errors3));
+		assert.equal(
+			errors3.length,
+			1,
+			'check without buildtag failed. Unexpected number of errors found' + JSON.stringify(errors3)
+		);
 		const errMsg = errors3[0];
 		assert.ok(
-			errMsg.includes(`can't load package: package test/testfixture/buildTags`) ||
-			errMsg.includes(`build constraints exclude all Go files`),
+			errMsg.includes("can't load package: package test/testfixture/buildTags") ||
+				errMsg.includes('build constraints exclude all Go files'),
 			`check without buildtags failed. Go files not excluded. ${errMsg}`
 		);
 	});
@@ -1483,7 +1535,7 @@
 		if (eol === vscode.EndOfLine.LF) {
 			return strWithLF;
 		}
-		return strWithLF.split('\n').join('\r\n');  // replaceAll.
+		return strWithLF.split('\n').join('\r\n'); // replaceAll.
 	}
 
 	test('Add imports when no imports', async () => {
@@ -1510,9 +1562,9 @@
 		await vscode.window.showTextDocument(document);
 		const eol = document.eol;
 
-		const expectedText = document.getText().replace(
-			fixEOL(eol, '\t"fmt"\n\t"math"'),
-			fixEOL(eol, '\t"bytes"\n\t"fmt"\n\t"math"'));
+		const expectedText = document
+			.getText()
+			.replace(fixEOL(eol, '\t"fmt"\n\t"math"'), fixEOL(eol, '\t"bytes"\n\t"fmt"\n\t"math"'));
 		const edits = getTextEditForAddImport('bytes');
 		const edit = new vscode.WorkspaceEdit();
 		edit.set(document.uri, edits);
@@ -1547,10 +1599,7 @@
 
 		const expectedText = document
 			.getText()
-			.replace(
-				fixEOL(eol, 'import "math"'),
-				fixEOL(eol, 'import (\n\t"bytes"\n\t"math"\n)')
-			);
+			.replace(fixEOL(eol, 'import "math"'), fixEOL(eol, 'import (\n\t"bytes"\n\t"math"\n)'));
 		const edits = getTextEditForAddImport('bytes');
 		const edit = new vscode.WorkspaceEdit();
 		edit.set(document.uri, edits);
diff --git a/test/integration/goDebug.test.ts b/test/integration/goDebug.test.ts
index e3b48ee..d907739 100644
--- a/test/integration/goDebug.test.ts
+++ b/test/integration/goDebug.test.ts
@@ -1,12 +1,15 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+/* eslint-disable @typescript-eslint/no-unused-vars */
+/* eslint-disable node/no-unsupported-features/node-builtins */
+/* eslint-disable no-async-promise-executor */
+/* eslint-disable node/no-unpublished-import */
 import * as assert from 'assert';
 import * as cp from 'child_process';
 import * as fs from 'fs';
-import getPort = require('get-port');
 import * as http from 'http';
 import { tmpdir } from 'os';
 import * as path from 'path';
 import * as sinon from 'sinon';
-import util = require('util');
 import { DebugConfiguration } from 'vscode';
 import { DebugClient } from 'vscode-debugadapter-testsupport';
 import { ILocation } from 'vscode-debugadapter-testsupport/lib/debugClient';
@@ -16,11 +19,13 @@
 	escapeGoModPath,
 	GoDebugSession,
 	PackageBuildInfo,
-	RemoteSourcesAndPackages,
+	RemoteSourcesAndPackages
 } from '../../src/debugAdapter/goDebug';
 import { GoDebugConfigurationProvider } from '../../src/goDebugConfiguration';
-import { getBinPath, getGoVersion, rmdirRecursive } from '../../src/util';
+import { getBinPath, rmdirRecursive } from '../../src/util';
 import { killProcessTree } from '../../src/utils/processUtils';
+import getPort = require('get-port');
+import util = require('util');
 
 suite('Path Manipulation Tests', () => {
 	test('escapeGoModPath works', () => {
@@ -43,7 +48,7 @@
 		process.env.GOPATH = '/usr/gopath';
 		process.env.GOROOT = '/usr/goroot';
 		remoteSourcesAndPackages = new RemoteSourcesAndPackages();
-		fileSystem = { existsSync: () => false } as unknown as typeof fs;
+		fileSystem = ({ existsSync: () => false } as unknown) as typeof fs;
 		delve.program = workspaceFolder;
 		delve.isApiV1 = false;
 		goDebugSession = new GoDebugSession(true, false, fileSystem);
@@ -64,7 +69,8 @@
 		remoteSourcesAndPackages.remoteSourceFilesNameGrouping = sourceFileMapping;
 
 		const inferredPath = goDebugSession['inferRemotePathFromLocalPath'](
-			'C:\\Users\\Documents\\src\\hello-world\\main.go');
+			'C:\\Users\\Documents\\src\\hello-world\\main.go'
+		);
 		assert.strictEqual(inferredPath, '/app/hello-world/main.go');
 	});
 
@@ -259,7 +265,7 @@
 	let remoteSourcesAndPackages: RemoteSourcesAndPackages;
 	let delve: Delve;
 	setup(() => {
-		delve = { callPromise: () => ({}), isApiV1: false } as unknown as Delve;
+		delve = ({ callPromise: () => ({}), isApiV1: false } as unknown) as Delve;
 		remoteSourcesAndPackages = new RemoteSourcesAndPackages();
 	});
 
@@ -269,10 +275,10 @@
 
 	test('initializeRemotePackagesAndSources retrieves remote packages and sources', async () => {
 		const stub = sinon.stub(delve, 'callPromise');
-		stub.withArgs('ListPackagesBuildInfo', [{ IncludeFiles: true }])
-			.returns(Promise.resolve({ List: [helloPackage, testPackage] }));
-		stub.withArgs('ListSources', [{}])
-			.returns(Promise.resolve({ Sources: sources }));
+		stub.withArgs('ListPackagesBuildInfo', [{ IncludeFiles: true }]).returns(
+			Promise.resolve({ List: [helloPackage, testPackage] })
+		);
+		stub.withArgs('ListSources', [{}]).returns(Promise.resolve({ Sources: sources }));
 
 		await remoteSourcesAndPackages.initializeRemotePackagesAndSources(delve);
 		assert.deepEqual(remoteSourcesAndPackages.remoteSourceFiles, sources);
@@ -297,7 +303,7 @@
 		request: 'attach',
 		mode: 'remote',
 		host: '127.0.0.1',
-		port: 3456,
+		port: 3456
 	};
 
 	let dc: DebugClient;
@@ -323,8 +329,11 @@
 	 * running vs stopped/killed.
 	 */
 	async function setUpRemoteProgram(
-		dlvPort: number, serverPort: number,
-		acceptMultiClient = true, continueOnStart = true): Promise<cp.ChildProcess> {
+		dlvPort: number,
+		serverPort: number,
+		acceptMultiClient = true,
+		continueOnStart = true
+	): Promise<cp.ChildProcess> {
 		const serverFolder = path.join(DATA_ROOT, 'helloWorldServer');
 		const toolPath = getBinPath('dlv');
 		const args = ['debug', '--api-version=2', '--headless', `--listen=127.0.0.1:${dlvPort}`];
@@ -334,8 +343,10 @@
 		if (continueOnStart) {
 			args.push('--continue');
 		}
-		const childProcess = cp.spawn(toolPath, args,
-			{ cwd: serverFolder, env: { PORT: `${serverPort}`, ...process.env } });
+		const childProcess = cp.spawn(toolPath, args, {
+			cwd: serverFolder,
+			env: { PORT: `${serverPort}`, ...process.env }
+		});
 
 		// Give dlv a few seconds to start.
 		await new Promise((resolve) => setTimeout(resolve, 10_000));
@@ -351,7 +362,7 @@
 	 */
 	async function setUpRemoteAttach(config: DebugConfiguration, breakpoints: ILocation[] = []): Promise<void> {
 		const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
-		console.log(`Sending initializing request for remote attach setup.`);
+		console.log('Sending initializing request for remote attach setup.');
 		const initializedResult = await dc.initializeRequest();
 		assert.ok(initializedResult.success);
 
@@ -368,15 +379,18 @@
 		]);
 
 		if (breakpoints.length) {
-			console.log(`Sending set breakpoints request for remote attach setup.`);
-			const breakpointsResult = await dc.setBreakpointsRequest({ source: { path: breakpoints[0].path }, breakpoints });
+			console.log('Sending set breakpoints request for remote attach setup.');
+			const breakpointsResult = await dc.setBreakpointsRequest({
+				source: { path: breakpoints[0].path },
+				breakpoints
+			});
 			assert.ok(breakpointsResult.success && breakpointsResult.body.breakpoints.length === breakpoints.length);
 			// Verify that there are no non-verified breakpoints.
 			breakpointsResult.body.breakpoints.forEach((breakpoint) => {
 				assert.ok(breakpoint.verified);
 			});
 		}
-		console.log(`Sending configuration done request for remote attach setup.`);
+		console.log('Sending configuration done request for remote attach setup.');
 		const configurationDoneResult = await dc.configurationDoneRequest();
 		assert.ok(configurationDoneResult.success);
 	}
@@ -424,18 +438,18 @@
 	}
 
 	suite('basic', () => {
-
 		test('unknown request should produce error', (done) => {
-			dc.send('illegal_request').then(() => {
-				done(new Error('does not report error on unknown request'));
-			}).catch(() => {
-				done();
-			});
+			dc.send('illegal_request')
+				.then(() => {
+					done(new Error('does not report error on unknown request'));
+				})
+				.catch(() => {
+					done();
+				});
 		});
 	});
 
 	suite('initialize', () => {
-
 		test('should return supported features', () => {
 			return dc.initializeRequest().then((response) => {
 				response.body = response.body || {};
@@ -445,24 +459,25 @@
 			});
 		});
 
-		test('should produce error for invalid \'pathFormat\'', (done) => {
+		test("should produce error for invalid 'pathFormat'", (done) => {
 			dc.initializeRequest({
 				adapterID: 'mock',
 				linesStartAt1: true,
 				columnsStartAt1: true,
 				pathFormat: 'url'
-			}).then((response) => {
-				done(new Error('does not report error on invalid \'pathFormat\' attribute'));
-			}).catch((err) => {
-				// error expected
-				done();
-			});
+			})
+				.then((response) => {
+					done(new Error("does not report error on invalid 'pathFormat' attribute"));
+				})
+				.catch((err) => {
+					// error expected
+					done();
+				});
 		});
 	});
 
 	suite('launch', () => {
 		test('should run program to the end', async () => {
-
 			const PROGRAM = path.join(DATA_ROOT, 'baseTest');
 
 			const config = {
@@ -470,15 +485,11 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: PROGRAM,
+				program: PROGRAM
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			return Promise.all([
-				dc.configurationSequence(),
-				dc.launch(debugConfig),
-				dc.waitForEvent('terminated')
-			]);
+			return Promise.all([dc.configurationSequence(), dc.launch(debugConfig), dc.waitForEvent('terminated')]);
 		});
 
 		test('should stop on entry', async () => {
@@ -514,16 +525,12 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: PROGRAM,
+				program: PROGRAM
 			};
 
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			return Promise.all([
-				dc.configurationSequence(),
-				dc.launch(debugConfig),
-				dc.waitForEvent('terminated')
-			]);
+			return Promise.all([dc.configurationSequence(), dc.launch(debugConfig), dc.waitForEvent('terminated')]);
 		});
 
 		test('should debug a single test', async () => {
@@ -534,19 +541,12 @@
 				request: 'launch',
 				mode: 'test',
 				program: PROGRAM,
-				args: [
-					'-test.run',
-					'TestMe'
-				]
+				args: ['-test.run', 'TestMe']
 			};
 
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			return Promise.all([
-				dc.configurationSequence(),
-				dc.launch(debugConfig),
-				dc.waitForEvent('terminated')
-			]);
+			return Promise.all([dc.configurationSequence(), dc.launch(debugConfig), dc.waitForEvent('terminated')]);
 		});
 
 		test('should debug a test package', async () => {
@@ -561,11 +561,7 @@
 
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			return Promise.all([
-				dc.configurationSequence(),
-				dc.launch(debugConfig),
-				dc.waitForEvent('terminated')
-			]);
+			return Promise.all([dc.configurationSequence(), dc.launch(debugConfig), dc.waitForEvent('terminated')]);
 		});
 
 		test('invalid flags are passed to dlv but should be caught by dlv', async () => {
@@ -600,7 +596,7 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: PROGRAM,
+				program: PROGRAM
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
@@ -611,7 +607,7 @@
 					});
 				}),
 				dc.launch(debugConfig),
-				dc.waitForEvent('terminated'),
+				dc.waitForEvent('terminated')
 			]);
 		});
 
@@ -625,15 +621,11 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: PROGRAM,
+				program: PROGRAM
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			await Promise.all([
-				dc.configurationSequence(),
-				dc.launch(debugConfig),
-				dc.waitForEvent('terminated')
-			]);
+			await Promise.all([dc.configurationSequence(), dc.launch(debugConfig), dc.waitForEvent('terminated')]);
 
 			const response = await dc.threadsRequest();
 			assert.ok(response.success);
@@ -647,15 +639,11 @@
 				request: 'launch',
 				mode: 'auto',
 				program: PROGRAM,
-				dlvFlags: ['--listen=127.0.0.1:80'],
+				dlvFlags: ['--listen=127.0.0.1:80']
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			return Promise.all([
-				dc.configurationSequence(),
-				dc.launch(debugConfig),
-				dc.waitForEvent('terminated')
-			]);
+			return Promise.all([dc.configurationSequence(), dc.launch(debugConfig), dc.waitForEvent('terminated')]);
 		});
 	});
 
@@ -672,7 +660,7 @@
 				request: 'launch',
 				mode: 'auto',
 				program: PROGRAM,
-				cwd: WD,
+				cwd: WD
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
@@ -692,7 +680,7 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: PROGRAM,
+				program: PROGRAM
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
@@ -713,7 +701,7 @@
 				request: 'launch',
 				mode: 'auto',
 				program: PROGRAM,
-				cwd: WD,
+				cwd: WD
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
@@ -733,7 +721,7 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: PROGRAM,
+				program: PROGRAM
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
@@ -831,7 +819,6 @@
 				})
 			]);
 		});
-
 	});
 
 	suite('remote attach', () => {
@@ -851,26 +838,23 @@
 			await new Promise((resolve) => setTimeout(resolve, 2_000));
 		});
 
-		test('can connect and initialize using external dlv --headless --accept-multiclient=true --continue=true',
-			async () => {
-				childProcess = await setUpRemoteProgram(remoteAttachConfig.port, server, true, true);
+		test('can connect and initialize using external dlv --headless --accept-multiclient=true --continue=true', async () => {
+			childProcess = await setUpRemoteProgram(remoteAttachConfig.port, server, true, true);
 
-				await setUpRemoteAttach(debugConfig);
-			});
+			await setUpRemoteAttach(debugConfig);
+		});
 
-		test('can connect and initialize using external dlv --headless --accept-multiclient=false --continue=false',
-			async () => {
-				childProcess = await setUpRemoteProgram(remoteAttachConfig.port, server, false, false);
+		test('can connect and initialize using external dlv --headless --accept-multiclient=false --continue=false', async () => {
+			childProcess = await setUpRemoteProgram(remoteAttachConfig.port, server, false, false);
 
-				await setUpRemoteAttach(debugConfig);
-			});
+			await setUpRemoteAttach(debugConfig);
+		});
 
-		test('can connect and initialize using external dlv --headless --accept-multiclient=true --continue=false',
-			async () => {
-				childProcess = await setUpRemoteProgram(remoteAttachConfig.port, server, true, false);
+		test('can connect and initialize using external dlv --headless --accept-multiclient=true --continue=false', async () => {
+			childProcess = await setUpRemoteProgram(remoteAttachConfig.port, server, true, false);
 
-				await setUpRemoteAttach(debugConfig);
-			});
+			await setUpRemoteAttach(debugConfig);
+		});
 	});
 
 	// The file paths returned from delve use '/' not the native path
@@ -886,11 +870,13 @@
 		setup(async () => {
 			server = await getPort();
 			remoteAttachConfig.port = await getPort();
-			remoteAttachDebugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, remoteAttachConfig);
+			remoteAttachDebugConfig = await debugConfigProvider.resolveDebugConfiguration(
+				undefined,
+				remoteAttachConfig
+			);
 		});
 
 		test('should stop on a breakpoint', async () => {
-
 			const PROGRAM = path.join(DATA_ROOT, 'baseTest');
 
 			const FILE = path.join(DATA_ROOT, 'baseTest', 'test.go');
@@ -901,7 +887,7 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: PROGRAM,
+				program: PROGRAM
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
@@ -909,7 +895,6 @@
 		});
 
 		test('should stop on a breakpoint in test file', async () => {
-
 			const PROGRAM = path.join(DATA_ROOT, 'baseTest');
 
 			const FILE = path.join(DATA_ROOT, 'baseTest', 'sample_test.go');
@@ -940,7 +925,8 @@
 			// Calls the helloworld server to make the breakpoint hit.
 			await waitForBreakpoint(
 				() => http.get(`http://localhost:${server}`).on('error', (data) => console.log(data)),
-				breakpointLocation);
+				breakpointLocation
+			);
 
 			await dc.disconnectRequest({ restart: false });
 			await killProcessTree(remoteProgram);
@@ -957,14 +943,17 @@
 
 			// Now sets a breakpoint.
 			const breakpointLocation = getBreakpointLocation(FILE, BREAKPOINT_LINE);
-			const breakpointsResult = await dc.setBreakpointsRequest(
-				{ source: { path: breakpointLocation.path }, breakpoints: [breakpointLocation] });
+			const breakpointsResult = await dc.setBreakpointsRequest({
+				source: { path: breakpointLocation.path },
+				breakpoints: [breakpointLocation]
+			});
 			assert.ok(breakpointsResult.success && breakpointsResult.body.breakpoints[0].verified);
 
 			// Calls the helloworld server to make the breakpoint hit.
 			await waitForBreakpoint(
 				() => http.get(`http://localhost:${server}`).on('error', (data) => console.log(data)),
-				breakpointLocation);
+				breakpointLocation
+			);
 
 			await dc.disconnectRequest({ restart: false });
 			await killProcessTree(remoteProgram);
@@ -984,7 +973,8 @@
 			// Calls the helloworld server to make the breakpoint hit.
 			await waitForBreakpoint(
 				() => http.get(`http://localhost:${server}`).on('error', (data) => console.log(data)),
-				breakpointLocation);
+				breakpointLocation
+			);
 
 			await dc.disconnectRequest({ restart: false });
 			await killProcessTree(remoteProgram);
@@ -1007,10 +997,7 @@
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			await Promise.all([
-				dc.configurationSequence(),
-				dc.launch(debugConfig),
-			]);
+			await Promise.all([dc.configurationSequence(), dc.launch(debugConfig)]);
 
 			return Promise.all([
 				dc.setBreakpointsRequest({
@@ -1085,7 +1072,6 @@
 
 	suite('conditionalBreakpoints', () => {
 		test('should stop on conditional breakpoint', async () => {
-
 			const PROGRAM = path.join(DATA_ROOT, 'condbp');
 			const FILE = path.join(DATA_ROOT, 'condbp', 'condbp.go');
 			const BREAKPOINT_LINE = 7;
@@ -1096,25 +1082,26 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: PROGRAM,
+				program: PROGRAM
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 			return Promise.all([
-
-				dc.waitForEvent('initialized').then(() => {
-					return dc.setBreakpointsRequest({
-						lines: [location.line],
-						breakpoints: [{ line: location.line, condition: 'i == 2' }],
-						source: { path: location.path }
-					});
-				}).then(() => {
-					return dc.configurationDoneRequest();
-				}),
+				dc
+					.waitForEvent('initialized')
+					.then(() => {
+						return dc.setBreakpointsRequest({
+							lines: [location.line],
+							breakpoints: [{ line: location.line, condition: 'i == 2' }],
+							source: { path: location.path }
+						});
+					})
+					.then(() => {
+						return dc.configurationDoneRequest();
+					}),
 
 				dc.launch(debugConfig),
 
 				dc.assertStoppedLocation('breakpoint', location)
-
 			]).then(() =>
 				// The program is stopped at the breakpoint, check to make sure 'i == 1'.
 				assertVariableValue('i', '2')
@@ -1122,7 +1109,6 @@
 		});
 
 		test('should add breakpoint condition', async () => {
-
 			const PROGRAM = path.join(DATA_ROOT, 'condbp');
 			const FILE = path.join(DATA_ROOT, 'condbp', 'condbp.go');
 			const BREAKPOINT_LINE = 7;
@@ -1133,33 +1119,37 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: PROGRAM,
+				program: PROGRAM
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			return dc.hitBreakpoint(debugConfig, location).then(() =>
-				// The program is stopped at the breakpoint, check to make sure 'i == 0'.
-				assertVariableValue('i', '0')
-			).then(() =>
-				// Add a condition to the breakpoint, and make sure it runs until 'i == 2'.
-				dc.setBreakpointsRequest({
-					lines: [location.line],
-					breakpoints: [{ line: location.line, condition: 'i == 2' }],
-					source: { path: location.path }
-				}).then(() =>
-					Promise.all([
-						dc.continueRequest({ threadId: 1 }),
-						dc.assertStoppedLocation('breakpoint', location)
-					]).then(() =>
-						// The program is stopped at the breakpoint, check to make sure 'i == 2'.
-						assertVariableValue('i', '2')
-					)
+			return dc
+				.hitBreakpoint(debugConfig, location)
+				.then(() =>
+					// The program is stopped at the breakpoint, check to make sure 'i == 0'.
+					assertVariableValue('i', '0')
 				)
-			);
+				.then(() =>
+					// Add a condition to the breakpoint, and make sure it runs until 'i == 2'.
+					dc
+						.setBreakpointsRequest({
+							lines: [location.line],
+							breakpoints: [{ line: location.line, condition: 'i == 2' }],
+							source: { path: location.path }
+						})
+						.then(() =>
+							Promise.all([
+								dc.continueRequest({ threadId: 1 }),
+								dc.assertStoppedLocation('breakpoint', location)
+							]).then(() =>
+								// The program is stopped at the breakpoint, check to make sure 'i == 2'.
+								assertVariableValue('i', '2')
+							)
+						)
+				);
 		});
 
 		test('should remove breakpoint condition', async () => {
-
 			const PROGRAM = path.join(DATA_ROOT, 'condbp');
 			const FILE = path.join(DATA_ROOT, 'condbp', 'condbp.go');
 			const BREAKPOINT_LINE = 7;
@@ -1170,51 +1160,54 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: PROGRAM,
+				program: PROGRAM
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 			return Promise.all([
-
-				dc.waitForEvent('initialized').then(() => {
-					return dc.setBreakpointsRequest({
-						lines: [location.line],
-						breakpoints: [{ line: location.line, condition: 'i == 2' }],
-						source: { path: location.path }
-					});
-				}).then(() => {
-					return dc.configurationDoneRequest();
-				}),
+				dc
+					.waitForEvent('initialized')
+					.then(() => {
+						return dc.setBreakpointsRequest({
+							lines: [location.line],
+							breakpoints: [{ line: location.line, condition: 'i == 2' }],
+							source: { path: location.path }
+						});
+					})
+					.then(() => {
+						return dc.configurationDoneRequest();
+					}),
 
 				dc.launch(debugConfig),
 
 				dc.assertStoppedLocation('breakpoint', location)
-
-			]).then(() =>
-				// The program is stopped at the breakpoint, check to make sure 'i == 2'.
-				assertVariableValue('i', '2')
-			).then(() =>
-				// Remove the breakpoint condition, and make sure the program runs until 'i == 3'.
-				dc.setBreakpointsRequest({
-					lines: [location.line],
-					breakpoints: [{ line: location.line }],
-					source: { path: location.path }
-				}).then(() =>
-					Promise.all([
-						dc.continueRequest({ threadId: 1 }),
-						dc.assertStoppedLocation('breakpoint', location)
-					]).then(() =>
-						// The program is stopped at the breakpoint, check to make sure 'i == 3'.
-						assertVariableValue('i', '3')
-					)
+			])
+				.then(() =>
+					// The program is stopped at the breakpoint, check to make sure 'i == 2'.
+					assertVariableValue('i', '2')
 				)
-			);
+				.then(() =>
+					// Remove the breakpoint condition, and make sure the program runs until 'i == 3'.
+					dc
+						.setBreakpointsRequest({
+							lines: [location.line],
+							breakpoints: [{ line: location.line }],
+							source: { path: location.path }
+						})
+						.then(() =>
+							Promise.all([
+								dc.continueRequest({ threadId: 1 }),
+								dc.assertStoppedLocation('breakpoint', location)
+							]).then(() =>
+								// The program is stopped at the breakpoint, check to make sure 'i == 3'.
+								assertVariableValue('i', '3')
+							)
+						)
+				);
 		});
 	});
 
 	suite('panicBreakpoints', () => {
-
 		test('should stop on panic', async () => {
-
 			const PROGRAM_WITH_EXCEPTION = path.join(DATA_ROOT, 'panic');
 
 			const config = {
@@ -1222,19 +1215,21 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: PROGRAM_WITH_EXCEPTION,
+				program: PROGRAM_WITH_EXCEPTION
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
 			return Promise.all([
-
-				dc.waitForEvent('initialized').then(() => {
-					return dc.setExceptionBreakpointsRequest({
-						filters: ['all']
-					});
-				}).then(() => {
-					return dc.configurationDoneRequest();
-				}),
+				dc
+					.waitForEvent('initialized')
+					.then(() => {
+						return dc.setExceptionBreakpointsRequest({
+							filters: ['all']
+						});
+					})
+					.then(() => {
+						return dc.configurationDoneRequest();
+					}),
 
 				dc.launch(debugConfig),
 
@@ -1262,7 +1257,7 @@
 			let response = '';
 			await new Promise<void>((resolve) => {
 				http.get(`http://localhost:${server}`, (res) => {
-					res.on('data', (data) => response += data);
+					res.on('data', (data) => (response += data));
 					res.on('end', () => resolve());
 				});
 			});
@@ -1272,7 +1267,7 @@
 			let secondResponse = '';
 			await new Promise<void>((resolve) => {
 				http.get(`http://localhost:${server}`, (res) => {
-					res.on('data', (data) => secondResponse += data);
+					res.on('data', (data) => (secondResponse += data));
 					res.on('end', () => resolve());
 				});
 			});
@@ -1295,15 +1290,9 @@
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			await Promise.all([
-				dc.configurationSequence(),
-				dc.launch(debugConfig)
-			]);
+			await Promise.all([dc.configurationSequence(), dc.launch(debugConfig)]);
 
-			return Promise.all([
-				dc.disconnectRequest({ restart: false }),
-				dc.waitForEvent('terminated')
-			]);
+			return Promise.all([dc.disconnectRequest({ restart: false }), dc.waitForEvent('terminated')]);
 		});
 
 		test('should disconnect with multiple disconnectRequests', async () => {
@@ -1319,15 +1308,10 @@
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			await Promise.all([
-				dc.configurationSequence(),
-				dc.launch(debugConfig)
-			]);
+			await Promise.all([dc.configurationSequence(), dc.launch(debugConfig)]);
 
 			await Promise.all([
-				dc.disconnectRequest({ restart: false }).then(() =>
-					dc.disconnectRequest({ restart: false })
-				),
+				dc.disconnectRequest({ restart: false }).then(() => dc.disconnectRequest({ restart: false })),
 				dc.waitForEvent('terminated')
 			]);
 		});
@@ -1345,18 +1329,12 @@
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			await Promise.all([
-				dc.configurationSequence(),
-				dc.launch(debugConfig)
-			]);
+			await Promise.all([dc.configurationSequence(), dc.launch(debugConfig)]);
 
 			const continueResponse = await dc.continueRequest({ threadId: 1 });
 			assert.ok(continueResponse.success);
 
-			return Promise.all([
-				dc.disconnectRequest({ restart: false }),
-				dc.waitForEvent('terminated')
-			]);
+			return Promise.all([dc.disconnectRequest({ restart: false }), dc.waitForEvent('terminated')]);
 		});
 
 		test('should disconnect while nexting', async () => {
@@ -1380,10 +1358,7 @@
 			const nextResponse = await dc.nextRequest({ threadId: 1 });
 			assert.ok(nextResponse.success);
 
-			return Promise.all([
-				dc.disconnectRequest({ restart: false }),
-				dc.waitForEvent('terminated')
-			]);
+			return Promise.all([dc.disconnectRequest({ restart: false }), dc.waitForEvent('terminated')]);
 		});
 
 		test('should disconnect while paused on pause', async () => {
@@ -1394,22 +1369,16 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: PROGRAM,
+				program: PROGRAM
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			await Promise.all([
-				dc.configurationSequence(),
-				dc.launch(debugConfig)
-			]);
+			await Promise.all([dc.configurationSequence(), dc.launch(debugConfig)]);
 
 			const pauseResponse = await dc.pauseRequest({ threadId: 1 });
 			assert.ok(pauseResponse.success);
 
-			return Promise.all([
-				dc.disconnectRequest({ restart: false }),
-				dc.waitForEvent('terminated'),
-			]);
+			return Promise.all([dc.disconnectRequest({ restart: false }), dc.waitForEvent('terminated')]);
 		});
 
 		test('should disconnect while paused on breakpoint', async () => {
@@ -1422,16 +1391,13 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: PROGRAM,
+				program: PROGRAM
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
 			await dc.hitBreakpoint(debugConfig, getBreakpointLocation(FILE, BREAKPOINT_LINE));
 
-			return Promise.all([
-				dc.disconnectRequest({ restart: false }),
-				dc.waitForEvent('terminated')
-			]);
+			return Promise.all([dc.disconnectRequest({ restart: false }), dc.waitForEvent('terminated')]);
 		});
 
 		test('should disconnect while paused on entry', async () => {
@@ -1447,15 +1413,9 @@
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			await Promise.all([
-				dc.configurationSequence(),
-				dc.launch(debugConfig)
-			]);
+			await Promise.all([dc.configurationSequence(), dc.launch(debugConfig)]);
 
-			return Promise.all([
-				dc.disconnectRequest({ restart: false }),
-				dc.waitForEvent('terminated')
-			]);
+			return Promise.all([dc.disconnectRequest({ restart: false }), dc.waitForEvent('terminated')]);
 		});
 
 		test('should disconnect while paused on next', async () => {
@@ -1471,18 +1431,12 @@
 			};
 			const debugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			await Promise.all([
-				dc.configurationSequence(),
-				dc.launch(debugConfig)
-			]);
+			await Promise.all([dc.configurationSequence(), dc.launch(debugConfig)]);
 
 			const nextResponse = await dc.nextRequest({ threadId: 1 });
 			assert.ok(nextResponse.success);
 
-			return Promise.all([
-				dc.disconnectRequest({ restart: false }),
-				dc.waitForEvent('terminated')
-			]);
+			return Promise.all([dc.disconnectRequest({ restart: false }), dc.waitForEvent('terminated')]);
 		});
 	});
 
@@ -1511,9 +1465,9 @@
 		async function buildGoProgram(cwd: string, outputFile: string): Promise<string> {
 			const goRuntimePath = getBinPath('go');
 			const execFile = util.promisify(cp.execFile);
-			const child = await execFile(goRuntimePath,
-				['build', '-o', outputFile, `--gcflags='all=-N -l'`, '.'],
-				{ cwd });
+			const child = await execFile(goRuntimePath, ['build', '-o', outputFile, "--gcflags='all=-N -l'", '.'], {
+				cwd
+			});
 			if (child.stderr.length > 0) {
 				throw Error(child.stderr);
 			}
@@ -1530,7 +1484,7 @@
 				rmdirRecursive(goBuildOutput);
 			});
 
-			async function copyBuildDelete(program: string): Promise<{ program: string, output: string }> {
+			async function copyBuildDelete(program: string): Promise<{ program: string; output: string }> {
 				const wd = copyDirectory(program);
 				const output = await buildGoProgram(wd, path.join(goBuildOutput, program));
 				rmdirRecursive(wd);
@@ -1569,7 +1523,10 @@
 			setup(async () => {
 				server = await getPort();
 				remoteAttachConfig.port = await getPort();
-				remoteAttachDebugConfig = await debugConfigProvider.resolveDebugConfiguration(undefined, remoteAttachConfig);
+				remoteAttachDebugConfig = await debugConfigProvider.resolveDebugConfiguration(
+					undefined,
+					remoteAttachConfig
+				);
 			});
 
 			suiteSetup(() => {
@@ -1590,15 +1547,14 @@
 				// Setup attach with a breakpoint.
 				remoteAttachDebugConfig.cwd = tmpDir;
 				remoteAttachDebugConfig.remotePath = '';
-				remoteAttachDebugConfig.substitutePath = [
-					{ from: helloWorldLocal, to: helloWorldRemote }
-				];
+				remoteAttachDebugConfig.substitutePath = [{ from: helloWorldLocal, to: helloWorldRemote }];
 				await setUpRemoteAttach(remoteAttachDebugConfig, [breakpointLocation]);
 
 				// Calls the helloworld server to make the breakpoint hit.
 				await waitForBreakpoint(
 					() => http.get(`http://localhost:${server}`).on('error', (data) => console.log(data)),
-					breakpointLocation);
+					breakpointLocation
+				);
 
 				await dc.disconnectRequest({ restart: false });
 				await killProcessTree(remoteProgram);
@@ -1617,15 +1573,14 @@
 				remoteAttachDebugConfig.cwd = helloWorldLocal;
 				remoteAttachDebugConfig.remotePath = helloWorldRemote;
 				// This is a bad mapping, make sure that the remotePath config is used first.
-				remoteAttachDebugConfig.substitutePath = [
-					{ from: helloWorldLocal, to: helloWorldLocal }
-				];
+				remoteAttachDebugConfig.substitutePath = [{ from: helloWorldLocal, to: helloWorldLocal }];
 				await setUpRemoteAttach(remoteAttachDebugConfig, [breakpointLocation]);
 
 				// Calls the helloworld server to make the breakpoint hit.
 				await waitForBreakpoint(
 					() => http.get(`http://localhost:${server}`).on('error', (data) => console.log(data)),
-					breakpointLocation);
+					breakpointLocation
+				);
 
 				await dc.disconnectRequest({ restart: false });
 				await killProcessTree(remoteProgram);
@@ -1633,5 +1588,4 @@
 			});
 		});
 	});
-
 });
diff --git a/test/integration/goDebugConfiguration.test.ts b/test/integration/goDebugConfiguration.test.ts
index 17b761d..aabc703 100644
--- a/test/integration/goDebugConfiguration.test.ts
+++ b/test/integration/goDebugConfiguration.test.ts
@@ -1,3 +1,6 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+/* eslint-disable @typescript-eslint/no-unused-vars */
+/* eslint-disable no-prototype-builtins */
 import assert = require('assert');
 import fs = require('fs');
 import os = require('os');
@@ -7,9 +10,9 @@
 import parse = require('yargs-parser');
 import { getGoConfig } from '../../src/config';
 import { GoDebugConfigurationProvider } from '../../src/goDebugConfiguration';
-import goEnv = require('../../src/goEnv');
 import { updateGoVarsFromConfig } from '../../src/goInstallTools';
 import { rmdirRecursive } from '../../src/util';
+import goEnv = require('../../src/goEnv');
 
 suite('Debug Environment Variable Merge Test', () => {
 	const debugConfigProvider = new GoDebugConfigurationProvider();
@@ -33,7 +36,6 @@
 	setup(() => {
 		tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'godebugconfig_test'));
 		sandbox = sinon.createSandbox();
-
 	});
 
 	teardown(() => {
@@ -54,7 +56,7 @@
 			name: 'Launch',
 			request: 'launch',
 			env: input.env,
-			envFile: input.envFile,
+			envFile: input.envFile
 		});
 
 		const actual = config.env;
@@ -71,18 +73,24 @@
 			GOOS: 'valueFromToolsEnv'
 		};
 
-		runTest({ toolsEnv }, {
-			GOPATH: '/gopath',
-			GOOS: 'valueFromToolsEnv'
-		});
+		runTest(
+			{ toolsEnv },
+			{
+				GOPATH: '/gopath',
+				GOOS: 'valueFromToolsEnv'
+			}
+		);
 	});
 
 	test('preserves settings from launchArgs.env', () => {
 		const env = { GOPATH: 'valueFromEnv', GOOS: 'valueFromEnv2' };
-		runTest({ env }, {
-			GOPATH: 'valueFromEnv',
-			GOOS: 'valueFromEnv2'
-		});
+		runTest(
+			{ env },
+			{
+				GOPATH: 'valueFromEnv',
+				GOOS: 'valueFromEnv2'
+			}
+		);
 	});
 
 	test('preserves settings from launchArgs.envFile', () => {
@@ -94,14 +102,15 @@
 	test('launchArgs.env overwrites launchArgs.envFile', () => {
 		const env = { SOMEVAR1: 'valueFromEnv' };
 		const envFile = path.join(tmpDir, 'env');
-		fs.writeFileSync(envFile, [
-			'SOMEVAR1=valueFromEnvFile1',
-			'SOMEVAR2=valueFromEnvFile2'].join('\n'));
+		fs.writeFileSync(envFile, ['SOMEVAR1=valueFromEnvFile1', 'SOMEVAR2=valueFromEnvFile2'].join('\n'));
 
-		runTest({ env, envFile }, {
-			SOMEVAR1: 'valueFromEnv',
-			SOMEVAR2: 'valueFromEnvFile2'
-		});
+		runTest(
+			{ env, envFile },
+			{
+				SOMEVAR1: 'valueFromEnv',
+				SOMEVAR2: 'valueFromEnvFile2'
+			}
+		);
 	});
 
 	test('launchArgs.env overwrites toolsEnvVar', () => {
@@ -112,11 +121,14 @@
 		};
 
 		const env = { SOMEVAR1: 'valueFromEnv' };
-		runTest({ env, toolsEnv }, {
-			GOPATH: '/gopath',
-			SOMEVAR1: 'valueFromEnv',
-			SOMEVAR2: 'valueFromToolsEnvVar2'
-		});
+		runTest(
+			{ env, toolsEnv },
+			{
+				GOPATH: '/gopath',
+				SOMEVAR1: 'valueFromEnv',
+				SOMEVAR2: 'valueFromToolsEnvVar2'
+			}
+		);
 	});
 
 	test('launchArgs.envFile overwrites toolsEnvVar', () => {
@@ -126,14 +138,16 @@
 			SOMEVAR2: 'valueFromToolsEnvVar2'
 		};
 		const envFile = path.join(tmpDir, 'env');
-		fs.writeFileSync(envFile, [
-			'SOMEVAR2=valueFromEnvFile2'].join('\n'));
+		fs.writeFileSync(envFile, ['SOMEVAR2=valueFromEnvFile2'].join('\n'));
 
-		runTest({ toolsEnv, envFile }, {
-			GOPATH: '/gopath',
-			SOMEVAR1: 'valueFromToolsEnvVar1',
-			SOMEVAR2: 'valueFromEnvFile2'
-		});
+		runTest(
+			{ toolsEnv, envFile },
+			{
+				GOPATH: '/gopath',
+				SOMEVAR1: 'valueFromToolsEnvVar1',
+				SOMEVAR2: 'valueFromEnvFile2'
+			}
+		);
 	});
 });
 
@@ -143,7 +157,7 @@
 
 	teardown(() => sinon.restore());
 
-	suite(`merge 'go' config from settings.json`, () => {
+	suite("merge 'go' config from settings.json", () => {
 		test('go flags config does not affect debug config', async () => {
 			// This tests that the testFlags and GOOS and GOARCH set
 			// in settings.json do not affect the resolved debug configuration.
@@ -155,15 +169,15 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: '${fileDirname}',
+				program: '${fileDirname}'
 			};
 
 			const emptyResult = await debugConfigProvider.resolveDebugConfiguration(undefined, cfg1);
 			const goConfig = Object.create(getGoConfig(), {
-				testFlags: {value: '-tags=myTagTest'},
-				buildFlags: {value: '-tags=myTagBuild'},
-				goroot: {value: '/path/to/goroot'},
-				gopath: {value: '/path/to/gopath'}
+				testFlags: { value: '-tags=myTagTest' },
+				buildFlags: { value: '-tags=myTagBuild' },
+				goroot: { value: '/path/to/goroot' },
+				gopath: { value: '/path/to/gopath' }
 			}) as vscode.WorkspaceConfiguration;
 
 			// Adjust the workspace config.
@@ -174,7 +188,7 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: '${fileDirname}',
+				program: '${fileDirname}'
 			};
 
 			const filledResult = await debugConfigProvider.resolveDebugConfiguration(undefined, cfg2);
@@ -196,7 +210,8 @@
 
 			// Run resolveDebugConfiguration with the default workspace settings.
 			const goConfig = Object.create(getGoConfig(), {
-				delveConfig: { value: {
+				delveConfig: {
+					value: {
 						dlvLoadConfig: {
 							followPointers: false,
 							maxVariableRecurse: 3,
@@ -216,7 +231,7 @@
 				type: 'go',
 				request: 'launch',
 				mode: 'auto',
-				program: '${fileDirname}',
+				program: '${fileDirname}'
 			};
 
 			const result = await debugConfigProvider.resolveDebugConfiguration(undefined, cfg);
@@ -237,7 +252,8 @@
 
 			// Run resolveDebugConfiguration with the default workspace settings.
 			const goConfig = Object.create(getGoConfig(), {
-				delveConfig: { value: {
+				delveConfig: {
+					value: {
 						dlvLoadConfig: {
 							followPointers: false,
 							maxVariableRecurse: 3,
@@ -266,7 +282,7 @@
 					maxStringLen: 128,
 					maxArrayValues: 128,
 					maxStructFields: -1
-				},
+				}
 			};
 
 			const result = await debugConfigProvider.resolveDebugConfiguration(undefined, cfg);
@@ -287,7 +303,7 @@
 
 	function checkBuildFlags(input: string, expected: { [key: string]: any }) {
 		// Parse the string result.
-		const actual = parse(input, {configuration: {'short-option-groups': false}} );
+		const actual = parse(input, { configuration: { 'short-option-groups': false } });
 
 		// Delete the empty entry that is created by parse.
 		delete actual['_'];
@@ -311,7 +327,7 @@
 		}
 		actualKeys.sort();
 
-		for (let i = 0; i < expectedKeys.length; i ++) {
+		for (let i = 0; i < expectedKeys.length; i++) {
 			assert.strictEqual(actualKeys[i], expectedKeys[i]);
 			assert.strictEqual(actual[actualKeys[i]], expected[expectedKeys[i]]);
 		}
@@ -342,7 +358,7 @@
 				mode: 'auto',
 				program: '${fileDirname}',
 				env: {},
-				buildFlags: `-gcflags all=-l`
+				buildFlags: '-gcflags all=-l'
 			};
 
 			debugConfigProvider.resolveDebugConfiguration(undefined, config);
@@ -363,7 +379,7 @@
 
 			debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			checkBuildFlags(config.buildFlags, {race: true, mod: 'mod'});
+			checkBuildFlags(config.buildFlags, { race: true, mod: 'mod' });
 		});
 
 		test('preserve empty buildFlags', () => {
@@ -395,7 +411,7 @@
 
 			debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			checkBuildFlags(config.buildFlags, {race: true, mod: 'mod'});
+			checkBuildFlags(config.buildFlags, { race: true, mod: 'mod' });
 		});
 
 		test('remove user set --gcflags in GOFLAGS', () => {
@@ -405,12 +421,12 @@
 				request: 'launch',
 				mode: 'auto',
 				program: '${fileDirname}',
-				env: {GOFLAGS: '-race --gcflags=-l --mod=mod'},
+				env: { GOFLAGS: '-race --gcflags=-l --mod=mod' }
 			};
 
 			debugConfigProvider.resolveDebugConfiguration(undefined, config);
 
-			checkBuildFlags(config.env.GOFLAGS, {race: true, mod: 'mod'});
+			checkBuildFlags(config.env.GOFLAGS, { race: true, mod: 'mod' });
 		});
 	});
 });
diff --git a/test/integration/goversion.test.ts b/test/integration/goversion.test.ts
index 758f3a1..5cfc2a7 100644
--- a/test/integration/goversion.test.ts
+++ b/test/integration/goversion.test.ts
@@ -1,3 +1,6 @@
+/* eslint-disable prettier/prettier */
+/* eslint-disable @typescript-eslint/no-unused-vars */
+/* eslint-disable node/no-unpublished-import */
 /*---------------------------------------------------------
  * Copyright 2020 The Go Authors. All rights reserved.
  * Licensed under the MIT License. See LICENSE in the project root for license information.
@@ -7,22 +10,14 @@
 import { describe, it } from 'mocha';
 import * as sinon from 'sinon';
 import * as vscode from 'vscode';
+import { getLatestGoVersions, GoEnvironmentOption, latestGoVersionKey } from '../../src/goEnvironmentStatus';
+import { getGlobalState, setGlobalState, updateGlobalState } from '../../src/stateUtils';
+import { MockMemento } from '../mocks/MockMemento';
 
 import moment = require('moment');
 import semver = require('semver');
 import WebRequest = require('web-request');
 
-import {
-	getLatestGoVersions,
-	GoEnvironmentOption,
-	latestGoVersionKey,
-} from '../../src/goEnvironmentStatus';
-import {
-	getGlobalState,
-	setGlobalState,
-	updateGlobalState,
-} from '../../src/stateUtils';
-import { MockMemento } from '../mocks/MockMemento';
 
 describe('#getLatestGoVersion()', function () {
 	this.timeout(40000);
@@ -45,22 +40,21 @@
 		sandbox = sinon.createSandbox();
 		setGlobalState(new MockMemento());
 
-		webrequest.expects('json')
+		webrequest
+			.expects('json')
 			.withArgs('https://golang.org/dl/?mode=json')
 			.returns([
 				{
 					version: 'go1.15.1',
-					stable: true,
+					stable: true
 				},
 				{
 					version: 'go1.14.2',
-					stable: true,
-				},
+					stable: true
+				}
 			]);
 
-		mmnt.expects('now')
-			.returns(now);
-
+		mmnt.expects('now').returns(now);
 	});
 
 	this.afterEach(async () => {
@@ -70,12 +64,12 @@
 	it('should get latest go versions from golang.org/dl with empty cache', async () => {
 		const results = await getLatestGoVersions();
 		const want = [
-				{label: 'Go 1.15.1', binpath: 'go get golang.org/dl/go1.15.1'},
-				{label: 'Go 1.14.2', binpath: 'go get golang.org/dl/go1.14.2'},
+			{ label: 'Go 1.15.1', binpath: 'go get golang.org/dl/go1.15.1' },
+			{ label: 'Go 1.14.2', binpath: 'go get golang.org/dl/go1.14.2' }
 		];
 
 		assert(results.length === want.length);
-		for (let i = 0; i < results.length; i ++) {
+		for (let i = 0; i < results.length; i++) {
 			assert(results[i].label === want[i].label);
 			assert(results[i].binpath === want[i].binpath);
 		}
@@ -83,26 +77,26 @@
 
 	const cacheVersions = [
 		new GoEnvironmentOption('go get golang.org/dl/go1.14.7', 'Go 1.14.7'),
-		new GoEnvironmentOption('go get golang.org/dl/go1.13.2', 'Go 1.13.2'),
+		new GoEnvironmentOption('go get golang.org/dl/go1.13.2', 'Go 1.13.2')
 	];
 
 	it('should get latest go versions from golang.org/dl with timed out cache', async () => {
 		// add a timed out cache entry
 		await updateGlobalState(latestGoVersionKey, {
 			timestamp: now - (oneday + 1), // more than one day ago
-			goVersions: cacheVersions,
+			goVersions: cacheVersions
 		});
 
 		// run test
 		const results = await getLatestGoVersions();
 		const want = [
-				{label: 'Go 1.15.1', binpath: 'go get golang.org/dl/go1.15.1'},
-				{label: 'Go 1.14.2', binpath: 'go get golang.org/dl/go1.14.2'},
+			{ label: 'Go 1.15.1', binpath: 'go get golang.org/dl/go1.15.1' },
+			{ label: 'Go 1.14.2', binpath: 'go get golang.org/dl/go1.14.2' }
 		];
 
 		// check results
 		assert(results.length === want.length);
-		for (let i = 0; i < results.length; i ++) {
+		for (let i = 0; i < results.length; i++) {
 			assert(results[i].label === want[i].label);
 			assert(results[i].binpath === want[i].binpath);
 		}
@@ -112,19 +106,19 @@
 		// add a valid cache entry
 		await updateGlobalState(latestGoVersionKey, {
 			timestamp: now - (oneday - 100), // less than one day ago
-			goVersions: cacheVersions,
+			goVersions: cacheVersions
 		});
 
 		// run test
 		const results = await getLatestGoVersions();
 		const want = [
-				{label: 'Go 1.14.7', binpath: 'go get golang.org/dl/go1.14.7'},
-				{label: 'Go 1.13.2', binpath: 'go get golang.org/dl/go1.13.2'},
+			{ label: 'Go 1.14.7', binpath: 'go get golang.org/dl/go1.14.7' },
+			{ label: 'Go 1.13.2', binpath: 'go get golang.org/dl/go1.13.2' }
 		];
 
 		// check results
 		assert(results.length === want.length);
-		for (let i = 0; i < results.length; i ++) {
+		for (let i = 0; i < results.length; i++) {
 			assert(results[i].label === want[i].label);
 			assert(results[i].binpath === want[i].binpath);
 		}
diff --git a/test/integration/index.ts b/test/integration/index.ts
index 0cc6ddd..d6549f0 100644
--- a/test/integration/index.ts
+++ b/test/integration/index.ts
@@ -1,3 +1,5 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+/* eslint-disable node/no-unpublished-import */
 /*---------------------------------------------------------
  * Copyright (C) Microsoft Corporation. All rights reserved.
  * Licensed under the MIT License. See LICENSE in the project root for license information.
@@ -7,7 +9,7 @@
 import * as path from 'path';
 export function run(): Promise<void> {
 	const mocha = new Mocha({
-		ui: 'tdd',
+		ui: 'tdd'
 	});
 
 	// @types/mocha is outdated
diff --git a/test/integration/install.test.ts b/test/integration/install.test.ts
index d2104e4..e5bf64d 100644
--- a/test/integration/install.test.ts
+++ b/test/integration/install.test.ts
@@ -1,3 +1,4 @@
+/* eslint-disable no-async-promise-executor */
 /*---------------------------------------------------------
  * Copyright (C) Microsoft Corporation. All rights reserved.
  * Licensed under the MIT License. See License.txt in the project root for license information.
@@ -5,6 +6,12 @@
 
 import AdmZip = require('adm-zip');
 import * as assert from 'assert';
+import { getGoConfig } from '../../src/config';
+import { toolInstallationEnvironment } from '../../src/goEnv';
+import { installTools } from '../../src/goInstallTools';
+import { allToolsInformation, getConfiguredTools, getTool, getToolAtVersion } from '../../src/goTools';
+import { getBinPath, getGoVersion, GoVersion, rmdirRecursive } from '../../src/util';
+import { correctBinname } from '../../src/utils/pathUtils';
 import cp = require('child_process');
 import fs = require('fs');
 import os = require('os');
@@ -13,12 +20,6 @@
 import url = require('url');
 import util = require('util');
 import vscode = require('vscode');
-import { getGoConfig } from '../../src/config';
-import { toolInstallationEnvironment } from '../../src/goEnv';
-import { installTools } from '../../src/goInstallTools';
-import { allToolsInformation, getConfiguredTools, getTool, getToolAtVersion } from '../../src/goTools';
-import { getBinPath, getGoVersion, GoVersion, rmdirRecursive } from '../../src/util';
-import { correctBinname } from '../../src/utils/pathUtils';
 
 suite('Installation Tests', function () {
 	// Disable timeout when we are running slow tests.
@@ -58,7 +59,7 @@
 			envForTest['GOPATH'] = p;
 			const execFile = util.promisify(cp.execFile);
 			await execFile(goRuntimePath, ['clean', '-modcache'], {
-				env: envForTest,
+				env: envForTest
 			});
 			rmdirRecursive(p);
 		}
@@ -75,9 +76,9 @@
 				toolsEnvVars: {
 					value: {
 						GOPROXY: url.pathToFileURL(proxyDir),
-						GOSUMDB: 'off',
+						GOSUMDB: 'off'
 					}
-				},
+				}
 			});
 			configStub = sandbox.stub(vscode.workspace, 'getConfiguration').returns(goConfig);
 		} else {
@@ -94,14 +95,16 @@
 		const checks: Promise<void>[] = [];
 		const exists = util.promisify(fs.exists);
 		for (const tool of testCases) {
-			checks.push(new Promise<void>(async (resolve) => {
-				// Check that the expect tool has been installed to $GOPATH/bin.
-				const ok = await exists(path.join(tmpToolsGopath, 'bin', correctBinname(tool)));
-				if (!ok) {
-					assert.fail(`expected ${tmpToolsGopath}/bin/${tool}, not found`);
-				}
-				return resolve();
-			}));
+			checks.push(
+				new Promise<void>(async (resolve) => {
+					// Check that the expect tool has been installed to $GOPATH/bin.
+					const ok = await exists(path.join(tmpToolsGopath, 'bin', correctBinname(tool)));
+					if (!ok) {
+						assert.fail(`expected ${tmpToolsGopath}/bin/${tool}, not found`);
+					}
+					return resolve();
+				})
+			);
 		}
 		await Promise.all(checks);
 
@@ -129,7 +132,6 @@
 		const tools = Object.keys(allToolsInformation);
 		await runTest(tools);
 	});
-
 });
 
 // buildFakeProxy creates a fake file-based proxy used for testing. The code is
@@ -139,7 +141,7 @@
 	for (const toolName of tools) {
 		const tool = getTool(toolName);
 		const module = tool.importPath;
-		const version = `v1.0.0`; // hardcoded for now
+		const version = 'v1.0.0'; // hardcoded for now
 		const dir = path.join(proxyDir, module, '@v');
 		fs.mkdirSync(dir, { recursive: true });
 
@@ -150,11 +152,14 @@
 		fs.writeFileSync(path.join(dir, `${version}.mod`), `module ${module}\n`);
 
 		// Write the info file.
-		fs.writeFileSync(path.join(dir, `${version}.info`), `{ "Version": "${version}", "Time": "2020-04-07T14:45:07Z" } `);
+		fs.writeFileSync(
+			path.join(dir, `${version}.info`),
+			`{ "Version": "${version}", "Time": "2020-04-07T14:45:07Z" } `
+		);
 
 		// Write the zip file.
 		const zip = new AdmZip();
-		const content = `package main; func main() {};`;
+		const content = 'package main; func main() {};';
 		zip.addFile(`${module}@${version}/main.go`, Buffer.alloc(content.length, content));
 		zip.writeZip(path.join(dir, `${version}.zip`));
 	}
diff --git a/test/integration/pickProcess.test.ts b/test/integration/pickProcess.test.ts
index 17f344e..c525853 100644
--- a/test/integration/pickProcess.test.ts
+++ b/test/integration/pickProcess.test.ts
@@ -12,30 +12,22 @@
 		const tt = [
 			{
 				input: '/path/to/process/a: go1.16.2\n/path/to/process/b: go1.15.4\n/path/to/process/a b c: go1.8.0\n',
-				want: [
-					'/path/to/process/a',
-					'/path/to/process/b',
-					'/path/to/process/a b c',
-				],
+				want: ['/path/to/process/a', '/path/to/process/b', '/path/to/process/a b c']
 			},
 			{
-				input: 'C:\\path\\to\\process\\a: go1.16.2\nC:\\path\\to\\process\\b: go1.15.4\nC:\\path\\to\\process\\a b c: go1.8.0',
-				want: [
-					'C:\\path\\to\\process\\a',
-					'C:\\path\\to\\process\\b',
-					'C:\\path\\to\\process\\a b c',
-				],
+				input:
+					'C:\\path\\to\\process\\a: go1.16.2\nC:\\path\\to\\process\\b: go1.15.4\nC:\\path\\to\\process\\a b c: go1.8.0',
+				want: ['C:\\path\\to\\process\\a', 'C:\\path\\to\\process\\b', 'C:\\path\\to\\process\\a b c']
 			},
 			{
 				input: 'go version go1.15.7 darwin/amd64',
-				want: [],
-			},
-
+				want: []
+			}
 		];
 		for (const tc of tt) {
 			const got = parseGoVersionOutput(tc.input);
 			assert.strictEqual(got.length, tc.want.length);
-			for (let i = 0; i < got.length; i ++) {
+			for (let i = 0; i < got.length; i++) {
 				assert.strictEqual(got[i], tc.want[i]);
 			}
 		}
@@ -56,21 +48,21 @@
 				want: [
 					{
 						id: '1010',
-						executable: '/Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper (Renderer).app/Contents/MacOS/Code Helper (Renderer)'
+						executable:
+							'/Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper (Renderer).app/Contents/MacOS/Code Helper (Renderer)'
 					},
 					{
 						id: '2020',
 						executable: '/User/name/go/bin/go'
 					}
-
-				],
-			},
+				]
+			}
 		];
 		for (const tc of tt) {
 			const got = parseLsofProcesses(tc.input);
 			got.sort(compareByProcessId);
 			assert.strictEqual(got.length, tc.want.length);
-			for (let i = 0; i < got.length; i ++) {
+			for (let i = 0; i < got.length; i++) {
 				assert.strictEqual(got[i].id, tc.want[i].id);
 				assert.strictEqual(got[i].executable, tc.want[i].executable);
 			}
@@ -110,12 +102,12 @@
 					{
 						id: '50',
 						label: '',
-						executable: '/path/to/b',
+						executable: '/path/to/b'
 					},
 					{
 						id: '300',
 						label: '',
-						executable: '/path/to/c',
+						executable: '/path/to/c'
 					}
 				],
 
@@ -124,7 +116,7 @@
 						id: '50',
 						processName: 'b',
 						label: 'b',
-						executable: '/path/to/b',
+						executable: '/path/to/b'
 					},
 					{
 						id: '100',
@@ -140,16 +132,16 @@
 						id: '300',
 						processName: 'c',
 						label: 'c',
-						executable: '/path/to/c',
+						executable: '/path/to/c'
 					}
-				],
-			},
+				]
+			}
 		];
 		for (const tc of tt) {
 			mergeExecutableAttachItem(tc.processes, tc.execInfo);
 			tc.processes.sort(compareByProcessId);
 			assert.strictEqual(tc.processes.length, tc.want.length);
-			for (let i = 0; i < tc.processes.length; i ++) {
+			for (let i = 0; i < tc.processes.length; i++) {
 				assert.strictEqual(tc.processes[i].id, tc.want[i].id);
 				assert.strictEqual(tc.processes[i].label, tc.want[i].label);
 				assert.strictEqual(tc.processes[i].processName, tc.want[i].processName);
diff --git a/test/integration/stateUtils.test.ts b/test/integration/stateUtils.test.ts
index cd80b12..be93197 100644
--- a/test/integration/stateUtils.test.ts
+++ b/test/integration/stateUtils.test.ts
@@ -1,3 +1,4 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
 /*---------------------------------------------------------
  * Copyright 2021 The Go Authors. All rights reserved.
  * Licensed under the MIT License. See LICENSE in the project root for license information.
@@ -5,7 +6,13 @@
 
 import * as assert from 'assert';
 import * as vscode from 'vscode';
-import { getMementoKeys, getWorkspaceState, resetItemsState, setWorkspaceState, updateWorkspaceState } from '../../src/stateUtils';
+import {
+	getMementoKeys,
+	getWorkspaceState,
+	resetItemsState,
+	setWorkspaceState,
+	updateWorkspaceState
+} from '../../src/stateUtils';
 import { MockMemento } from '../mocks/MockMemento';
 
 suite('Workspace State Modification Tests', () => {
@@ -26,9 +33,9 @@
 			want: string[];
 		}
 		const testCases: TestCase[] = [
-			{keys: [], values: [], want: []},
-			{keys: ['hello'], values: [false], want: ['hello']},
-			{keys: ['hello', 'goodbye'], values: [false, 25], want: ['hello', 'goodbye']},
+			{ keys: [], values: [], want: [] },
+			{ keys: ['hello'], values: [false], want: ['hello'] },
+			{ keys: ['hello', 'goodbye'], values: [false, 25], want: ['hello', 'goodbye'] }
 		];
 
 		testCases.forEach((tc) => {
@@ -38,7 +45,7 @@
 			const values = tc.values;
 			assert.strictEqual(keys.length, values.length, 'List of keys and values does not have same length');
 
-			for (let i = 0; i < keys.length; i ++) {
+			for (let i = 0; i < keys.length; i++) {
 				updateWorkspaceState(keys[i], values[i]);
 			}
 
@@ -60,19 +67,19 @@
 			want: string[];
 		}
 		const testCases: TestCase[] = [
-			{keys: [], values: [], items: undefined, want: []},
-			{keys: ['hello'], values: [false], items: undefined, want: ['hello']},
-			{keys: ['hello', 'goodbye'], values: [false, 25], items: undefined, want: ['hello', 'goodbye']},
+			{ keys: [], values: [], items: undefined, want: [] },
+			{ keys: ['hello'], values: [false], items: undefined, want: ['hello'] },
+			{ keys: ['hello', 'goodbye'], values: [false, 25], items: undefined, want: ['hello', 'goodbye'] },
 
-			{keys: [], values: [], items: [], want: []},
-			{keys: ['hello'], values: [false], items: [], want: ['hello']},
-			{keys: ['hello', 'goodbye'], values: [false, 25], items: [], want: ['hello', 'goodbye']},
+			{ keys: [], values: [], items: [], want: [] },
+			{ keys: ['hello'], values: [false], items: [], want: ['hello'] },
+			{ keys: ['hello', 'goodbye'], values: [false, 25], items: [], want: ['hello', 'goodbye'] },
 
-			{keys: ['hello'], values: [false], items: ['hello'], want: []},
-			{keys: ['hello', 'goodbye'], values: [false, 25], items: ['hello'], want: ['goodbye']},
+			{ keys: ['hello'], values: [false], items: ['hello'], want: [] },
+			{ keys: ['hello', 'goodbye'], values: [false, 25], items: ['hello'], want: ['goodbye'] },
 
-			{keys: ['hello'], values: [false], items: ['hello'], want: []},
-			{keys: ['hello', 'goodbye'], values: [false, 25], items: ['hello', 'goodbye'], want: []},
+			{ keys: ['hello'], values: [false], items: ['hello'], want: [] },
+			{ keys: ['hello', 'goodbye'], values: [false, 25], items: ['hello', 'goodbye'], want: [] }
 		];
 
 		testCases.forEach((tc) => {
@@ -82,7 +89,7 @@
 			const values = tc.values;
 			assert.strictEqual(keys.length, values.length, 'List of keys and values does not have same length');
 
-			for (let i = 0; i < keys.length; i ++) {
+			for (let i = 0; i < keys.length; i++) {
 				updateWorkspaceState(keys[i], values[i]);
 			}
 
@@ -96,5 +103,4 @@
 			});
 		});
 	});
-
 });
diff --git a/test/integration/statusbar.test.ts b/test/integration/statusbar.test.ts
index db3faa6..fd22f9e 100644
--- a/test/integration/statusbar.test.ts
+++ b/test/integration/statusbar.test.ts
@@ -1,3 +1,5 @@
+/* eslint-disable no-prototype-builtins */
+/* eslint-disable node/no-unpublished-import */
 /*---------------------------------------------------------
  * Copyright (C) Microsoft Corporation. All rights reserved.
  * Modification copyright 2020 The Go Authors. All rights reserved.
@@ -13,24 +15,24 @@
 import * as sinon from 'sinon';
 import * as util from 'util';
 import * as vscode from 'vscode';
-
 import {
 	formatGoVersion,
 	getGoEnvironmentStatusbarItem,
 	getSelectedGo,
 	GoEnvironmentOption,
-	setSelectedGo,
+	setSelectedGo
 } from '../../src/goEnvironmentStatus';
 import { updateGoVarsFromConfig } from '../../src/goInstallTools';
 import { disposeGoStatusBar } from '../../src/goStatus';
 import { getWorkspaceState, setWorkspaceState } from '../../src/stateUtils';
-import ourutil = require('../../src/util');
 import { getCurrentGoRoot } from '../../src/utils/pathUtils';
 import { MockMemento } from '../mocks/MockMemento';
 
+import ourutil = require('../../src/util');
+
 describe('#initGoStatusBar()', function () {
 	this.beforeAll(async () => {
-		await updateGoVarsFromConfig();  // should initialize the status bar.
+		await updateGoVarsFromConfig(); // should initialize the status bar.
 	});
 
 	this.afterAll(() => {
@@ -49,11 +51,7 @@
 		if (iconPos >= 0) {
 			label = label.substring(0, iconPos);
 		}
-		assert.equal(
-			label,
-			versionLabel,
-			'goroot version does not match status bar item text'
-		);
+		assert.equal(label, versionLabel, 'goroot version does not match status bar item text');
 	});
 });
 
@@ -137,8 +135,12 @@
 		const fixtureSourcePath = path.join(__dirname, '..', '..', '..', 'test', 'testdata', 'testhelpers');
 		const execFile = util.promisify(cp.execFile);
 		const goRuntimePath = ourutil.getBinPath('go');
-		const { stderr } = await execFile(
-			goRuntimePath, ['build', '-o', path.join(tmpRootBin, 'go'), path.join(fixtureSourcePath, 'fakego.go')]);
+		const { stderr } = await execFile(goRuntimePath, [
+			'build',
+			'-o',
+			path.join(tmpRootBin, 'go'),
+			path.join(fixtureSourcePath, 'fakego.go')
+		]);
 		if (stderr) {
 			assert.fail(`failed to build the fake go binary required for testing: ${stderr}`);
 		}
@@ -173,8 +175,11 @@
 
 		const b = getGoEnvironmentStatusbarItem();
 		assert.ok(b.text.startsWith('Go'), `go env statusbar item = ${b.text}, want "Go..."`);
-		assert.equal(pathEnvVar()[0], [path.join(getCurrentGoRoot(), 'bin')],
-			`the first element in PATH must match the current GOROOT/bin`);
+		assert.equal(
+			pathEnvVar()[0],
+			[path.join(getCurrentGoRoot(), 'bin')],
+			'the first element in PATH must match the current GOROOT/bin'
+		);
 	});
 
 	it('should recognize the adjusted goroot using go.goroot', async () => {
@@ -186,8 +191,11 @@
 
 		assert.equal((await ourutil.getGoVersion()).format(), '2.0.0');
 		assert.equal(getGoEnvironmentStatusbarItem().text, 'Go 2.0.0');
-		assert.equal(pathEnvVar()[0], [path.join(getCurrentGoRoot(), 'bin')],
-			`the first element in PATH must match the current GOROOT/bin`);
+		assert.equal(
+			pathEnvVar()[0],
+			[path.join(getCurrentGoRoot(), 'bin')],
+			'the first element in PATH must match the current GOROOT/bin'
+		);
 	});
 
 	it('should recognize the adjusted goroot using go.alternateTools', async () => {
@@ -201,7 +209,10 @@
 
 		assert.equal((await ourutil.getGoVersion()).format(), '3.0.0');
 		assert.equal(getGoEnvironmentStatusbarItem().text, 'Go 3.0.0');
-		assert.equal(pathEnvVar()[0], [path.join(getCurrentGoRoot(), 'bin')],
-			`the first element in PATH must match the current GOROOT/bin`);
+		assert.equal(
+			pathEnvVar()[0],
+			[path.join(getCurrentGoRoot(), 'bin')],
+			'the first element in PATH must match the current GOROOT/bin'
+		);
 	});
 });
diff --git a/test/integration/test.test.ts b/test/integration/test.test.ts
index 58e26fc..0896ea0 100644
--- a/test/integration/test.test.ts
+++ b/test/integration/test.test.ts
@@ -1,3 +1,4 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
 /*---------------------------------------------------------
  * Copyright 2020 The Go Authors. All rights reserved.
  * Licensed under the MIT License. See LICENSE in the project root for license information.
@@ -6,32 +7,34 @@
 'use strict';
 
 import * as assert from 'assert';
+import { getGoConfig } from '../../src/config';
+import { computeTestCommand, getTestFlags, goTest } from '../../src/testUtils';
+import { rmdirRecursive } from '../../src/util';
 import fs = require('fs-extra');
 import os = require('os');
 import path = require('path');
 import sinon = require('sinon');
 import vscode = require('vscode');
-import { getGoConfig } from '../../src/config';
-import { computeTestCommand, getTestFlags, goTest } from '../../src/testUtils';
-import { rmdirRecursive } from '../../src/util';
 
 suite('Test Go Test Args', () => {
 	function runTest(param: {
-		expectedArgs: string,
-		expectedOutArgs: string,
-		flags?: string[],
-		functions?: string[],
-		isBenchmark?: boolean
-		}) {
-
-		const {args, outArgs} = computeTestCommand({
-			dir: '',
-			goConfig: getGoConfig(),
-			flags: param.flags || [],
-			functions: param.functions || [],
-			isBenchmark: param.isBenchmark || false,
-			applyCodeCoverage: false,
-		}, ['./...']);
+		expectedArgs: string;
+		expectedOutArgs: string;
+		flags?: string[];
+		functions?: string[];
+		isBenchmark?: boolean;
+	}) {
+		const { args, outArgs } = computeTestCommand(
+			{
+				dir: '',
+				goConfig: getGoConfig(),
+				flags: param.flags || [],
+				functions: param.functions || [],
+				isBenchmark: param.isBenchmark || false,
+				applyCodeCoverage: false
+			},
+			['./...']
+		);
 
 		assert.strictEqual(args.join(' '), param.expectedArgs, 'actual command');
 		assert.strictEqual(outArgs.join(' '), param.expectedOutArgs, 'displayed command');
@@ -83,7 +86,7 @@
 			expectedArgs: 'test -benchmem -run=^$ -bench ^(TestA|TestB)$ ./...',
 			expectedOutArgs: 'test -benchmem -run=^$ -bench ^(TestA|TestB)$ ./...',
 			functions: ['TestA', 'TestB'],
-			isBenchmark: true,
+			isBenchmark: true
 		});
 	});
 	test('user -run flag is ignored when functions are provided', () => {
@@ -125,17 +128,17 @@
 				if (isModuleMode) {
 					return true;
 				}
-				return path.basename(src) !== 'go.mod';  // skip go.mod file.
-			},
+				return path.basename(src) !== 'go.mod'; // skip go.mod file.
+			}
 		});
 		process.env.GOPATH = tmpGopath;
 		process.env.GO111MODULE = isModuleMode ? 'on' : 'off';
 	}
 
 	async function runTest(
-		input: { isMod: boolean, includeSubDirectories: boolean, testFlags?: string[], applyCodeCoverage?: boolean },
-		wantFiles: string[]) {
-
+		input: { isMod: boolean; includeSubDirectories: boolean; testFlags?: string[]; applyCodeCoverage?: boolean },
+		wantFiles: string[]
+	) {
 		const config = Object.create(getGoConfig());
 		const outputChannel = new FakeOutputChannel();
 
@@ -153,7 +156,7 @@
 			// testCurrentPackage, testCurrentWorkspace, testCurrentFile
 			// which are closer to the features exposed to users.
 			const result = await goTest(testConfig);
-			assert.equal(result, false);  // we expect tests to fail.
+			assert.equal(result, false); // we expect tests to fail.
 		} catch (e) {
 			console.log('exception: ${e}');
 		}
@@ -166,40 +169,42 @@
 
 	test('resolves file names in logs (modules)', async () => {
 		setupRepo(true);
-		await runTest(
-			{ isMod: true, includeSubDirectories: true },
-			[path.join(repoPath, 'a_test.go'), path.join(repoPath, 'b', 'b_test.go')]);
-		await runTest(
-			{ isMod: true, includeSubDirectories: false },
-			[path.join(repoPath, 'a_test.go')]);
-		await runTest(
-			{ isMod: true, includeSubDirectories: true, testFlags: ['-v'] },
-			[path.join(repoPath, 'a_test.go'), path.join(repoPath, 'b', 'b_test.go')]);
-		await runTest(
-			{ isMod: true, includeSubDirectories: true, testFlags: ['-race'], applyCodeCoverage: true },
-			[path.join(repoPath, 'a_test.go'), path.join(repoPath, 'b', 'b_test.go')]);
-		await runTest(
-			{ isMod: true, includeSubDirectories: false, testFlags: ['-v'] },
-			[path.join(repoPath, 'a_test.go')]);
+		await runTest({ isMod: true, includeSubDirectories: true }, [
+			path.join(repoPath, 'a_test.go'),
+			path.join(repoPath, 'b', 'b_test.go')
+		]);
+		await runTest({ isMod: true, includeSubDirectories: false }, [path.join(repoPath, 'a_test.go')]);
+		await runTest({ isMod: true, includeSubDirectories: true, testFlags: ['-v'] }, [
+			path.join(repoPath, 'a_test.go'),
+			path.join(repoPath, 'b', 'b_test.go')
+		]);
+		await runTest({ isMod: true, includeSubDirectories: true, testFlags: ['-race'], applyCodeCoverage: true }, [
+			path.join(repoPath, 'a_test.go'),
+			path.join(repoPath, 'b', 'b_test.go')
+		]);
+		await runTest({ isMod: true, includeSubDirectories: false, testFlags: ['-v'] }, [
+			path.join(repoPath, 'a_test.go')
+		]);
 	});
 
 	test('resolves file names in logs (GOPATH)', async () => {
 		setupRepo(false);
-		await runTest(
-			{ isMod: false, includeSubDirectories: true },
-			[path.join(repoPath, 'a_test.go'), path.join(repoPath, 'b', 'b_test.go')]);
-		await runTest(
-			{ isMod: false, includeSubDirectories: false },
-			[path.join(repoPath, 'a_test.go')]);
-		await runTest(
-			{ isMod: false, includeSubDirectories: true, testFlags: ['-v'] },
-			[path.join(repoPath, 'a_test.go'), path.join(repoPath, 'b', 'b_test.go')]);
-		await runTest(
-			{ isMod: false, includeSubDirectories: true, testFlags: ['-race'], applyCodeCoverage: true },
-			[path.join(repoPath, 'a_test.go'), path.join(repoPath, 'b', 'b_test.go')]);
-		await runTest(
-			{ isMod: false, includeSubDirectories: false, testFlags: ['-v'] },
-			[path.join(repoPath, 'a_test.go')]);
+		await runTest({ isMod: false, includeSubDirectories: true }, [
+			path.join(repoPath, 'a_test.go'),
+			path.join(repoPath, 'b', 'b_test.go')
+		]);
+		await runTest({ isMod: false, includeSubDirectories: false }, [path.join(repoPath, 'a_test.go')]);
+		await runTest({ isMod: false, includeSubDirectories: true, testFlags: ['-v'] }, [
+			path.join(repoPath, 'a_test.go'),
+			path.join(repoPath, 'b', 'b_test.go')
+		]);
+		await runTest({ isMod: false, includeSubDirectories: true, testFlags: ['-race'], applyCodeCoverage: true }, [
+			path.join(repoPath, 'a_test.go'),
+			path.join(repoPath, 'b', 'b_test.go')
+		]);
+		await runTest({ isMod: false, includeSubDirectories: false, testFlags: ['-v'] }, [
+			path.join(repoPath, 'a_test.go')
+		]);
 	});
 });
 
@@ -210,19 +215,23 @@
 	public name = 'FakeOutputChannel';
 	public show = sinon.fake(); // no-empty
 	public hide = sinon.fake(); // no-empty
-	public dispose = sinon.fake();  // no-empty
+	public dispose = sinon.fake(); // no-empty
 
 	private buf = [] as string[];
 
 	public append = (v: string) => this.enqueue(v);
 	public appendLine = (v: string) => this.enqueue(v);
-	public clear = () => { this.buf = []; };
+	public clear = () => {
+		this.buf = [];
+	};
 	public toString = () => {
 		return this.buf.join('\n');
-	}
+	};
 
 	private enqueue = (v: string) => {
-		if (this.buf.length > 1024) { this.buf.shift(); }
+		if (this.buf.length > 1024) {
+			this.buf.shift();
+		}
 		this.buf.push(v.trim());
-	}
+	};
 }
diff --git a/test/integration/utils.test.ts b/test/integration/utils.test.ts
index e82dfd6..0911a87 100644
--- a/test/integration/utils.test.ts
+++ b/test/integration/utils.test.ts
@@ -1,12 +1,20 @@
+/* eslint-disable prettier/prettier */
+/* eslint-disable @typescript-eslint/no-unused-vars */
 /*---------------------------------------------------------
  * Copyright (C) Microsoft Corporation. All rights reserved.
  * Licensed under the MIT License. See LICENSE in the project root for license information.
  *--------------------------------------------------------*/
 
 import * as assert from 'assert';
-import path = require('path');
 import * as vscode from 'vscode';
-import { GoVersion, guessPackageNameFromFile, handleDiagnosticErrors, removeDuplicateDiagnostics, substituteEnv } from '../../src/util';
+import {
+	GoVersion,
+	guessPackageNameFromFile,
+
+	removeDuplicateDiagnostics,
+	substituteEnv
+} from '../../src/util';
+import path = require('path');
 
 suite('utils Tests', () => {
 	test('substituteEnv: default', () => {
@@ -26,67 +34,22 @@
 
 	test('build GoVersion', () => {
 		// [input, wantFormat, wantFormatIncludePrerelease, wantIsValid]
-		const testCases: [string|undefined, string, string, boolean][] = [
+		const testCases: [string | undefined, string, string, boolean][] = [
 			[
 				'go version devel +a295d59d Fri Jun 26 19:00:25 2020 +0000 darwin/amd64',
 				'devel +a295d59d',
 				'devel +a295d59d',
-				true,
+				true
 			],
-			[
-				'go version go1.14 darwin/amd64',
-				'1.14.0',
-				'1.14',
-				true,
-			],
-			[
-				'go version go1.14.1 linux/amd64',
-				'1.14.1',
-				'1.14.1',
-				true,
-			],
-			[
-				'go version go1.15rc1 darwin/amd64',
-				'1.15.0',
-				'1.15rc1',
-				true,
-			],
-			[
-				'go version go1.15.1rc2 windows/amd64',
-				'1.15.1',
-				'1.15.1rc2',
-				true,
-			],
-			[
-				'go version go1.15.3-beta.1 darwin/amd64',
-				'1.15.3',
-				'1.15.3-beta.1',
-				true,
-			],
-			[
-				'go version go1.15.3-beta.1.2.3 foobar/amd64',
-				'1.15.3',
-				'1.15.3-beta.1.2.3',
-				true,
-			],
-			[
-				'go version go10.0.1 js/amd64',
-				'unknown',
-				'unknown',
-				false,
-			],
-			[
-				undefined,
-				'unknown',
-				'unknown',
-				false,
-			],
-			[
-				'something wrong',
-				'unknown',
-				'unknown',
-				false,
-			]
+			['go version go1.14 darwin/amd64', '1.14.0', '1.14', true],
+			['go version go1.14.1 linux/amd64', '1.14.1', '1.14.1', true],
+			['go version go1.15rc1 darwin/amd64', '1.15.0', '1.15rc1', true],
+			['go version go1.15.1rc2 windows/amd64', '1.15.1', '1.15.1rc2', true],
+			['go version go1.15.3-beta.1 darwin/amd64', '1.15.3', '1.15.3-beta.1', true],
+			['go version go1.15.3-beta.1.2.3 foobar/amd64', '1.15.3', '1.15.3-beta.1.2.3', true],
+			['go version go10.0.1 js/amd64', 'unknown', 'unknown', false],
+			[undefined, 'unknown', 'unknown', false],
+			['something wrong', 'unknown', 'unknown', false]
 		];
 		for (const [input, wantFormat, wantFormatIncludePrerelease, wantIsValid] of testCases) {
 			const go = new GoVersion('/path/to/go', input);
@@ -145,44 +108,70 @@
 
 		// Populate the diagnostic collection
 		const diag1 = [
-			new vscode.Diagnostic(new vscode.Range(1, 2, 1, 3), 'first line diagnostic', vscode.DiagnosticSeverity.Warning),
-			new vscode.Diagnostic(new vscode.Range(2, 0, 2, 3), 'second line diagnostic', vscode.DiagnosticSeverity.Warning),
+			new vscode.Diagnostic(
+				new vscode.Range(1, 2, 1, 3),
+				'first line diagnostic',
+				vscode.DiagnosticSeverity.Warning
+			),
+			new vscode.Diagnostic(
+				new vscode.Range(2, 0, 2, 3),
+				'second line diagnostic',
+				vscode.DiagnosticSeverity.Warning
+			),
 			new vscode.Diagnostic(new vscode.Range(2, 3, 2, 5), 'second line error', vscode.DiagnosticSeverity.Error),
-			new vscode.Diagnostic(new vscode.Range(4, 0, 4, 3), 'fourth line diagnostic', vscode.DiagnosticSeverity.Warning),
+			new vscode.Diagnostic(
+				new vscode.Range(4, 0, 4, 3),
+				'fourth line diagnostic',
+				vscode.DiagnosticSeverity.Warning
+			)
 		];
 		const diag2 = [
-			new vscode.Diagnostic(new vscode.Range(1, 2, 1, 3), 'first line diagnostic', vscode.DiagnosticSeverity.Warning),
-			new vscode.Diagnostic(new vscode.Range(2, 0, 2, 3), 'second line diagnostic', vscode.DiagnosticSeverity.Warning),
+			new vscode.Diagnostic(
+				new vscode.Range(1, 2, 1, 3),
+				'first line diagnostic',
+				vscode.DiagnosticSeverity.Warning
+			),
+			new vscode.Diagnostic(
+				new vscode.Range(2, 0, 2, 3),
+				'second line diagnostic',
+				vscode.DiagnosticSeverity.Warning
+			),
 			new vscode.Diagnostic(new vscode.Range(2, 3, 2, 5), 'second line error', vscode.DiagnosticSeverity.Error),
-			new vscode.Diagnostic(new vscode.Range(4, 0, 4, 3), 'fourth line diagnostic', vscode.DiagnosticSeverity.Warning),
+			new vscode.Diagnostic(
+				new vscode.Range(4, 0, 4, 3),
+				'fourth line diagnostic',
+				vscode.DiagnosticSeverity.Warning
+			)
 		];
 		diagnosticCollection.set(uri1, diag1);
 		diagnosticCollection.set(uri2, diag2);
 
 		// After removing diagnostics from uri1, there should only be one diagnostic remaining, and
 		// the diagnostics for uri2 should not be changed.
-		const want1 = [
-			diag1[3],
-		];
+		const want1 = [diag1[3]];
 		const want2: vscode.Diagnostic[] = [];
 		diag2.forEach((diag) => {
 			want2.push(diag);
 		});
 
 		const newDiagnostics: vscode.Diagnostic[] = [
-			new vscode.Diagnostic(new vscode.Range(1, 2, 1, 3), 'first line diagnostic', vscode.DiagnosticSeverity.Warning),
-			new vscode.Diagnostic(new vscode.Range(2, 3, 2, 5), 'second line error', vscode.DiagnosticSeverity.Error),
+			new vscode.Diagnostic(
+				new vscode.Range(1, 2, 1, 3),
+				'first line diagnostic',
+				vscode.DiagnosticSeverity.Warning
+			),
+			new vscode.Diagnostic(new vscode.Range(2, 3, 2, 5), 'second line error', vscode.DiagnosticSeverity.Error)
 		];
 
 		removeDuplicateDiagnostics(diagnosticCollection, uri1, newDiagnostics);
 
 		assert.strictEqual(diagnosticCollection.get(uri1).length, want1.length);
-		for (let i = 0; i < want1.length; i ++) {
+		for (let i = 0; i < want1.length; i++) {
 			assert.strictEqual(diagnosticCollection.get(uri1)[i], want1[i]);
 		}
 
 		assert.strictEqual(diagnosticCollection.get(uri2).length, want2.length);
-		for (let i = 0; i < want2.length; i ++) {
+		for (let i = 0; i < want2.length; i++) {
 			assert.strictEqual(diagnosticCollection.get(uri2)[i], want2[i]);
 		}
 	});
diff --git a/test/integration/welcome.test.ts b/test/integration/welcome.test.ts
index a3856a1..c85ede7 100644
--- a/test/integration/welcome.test.ts
+++ b/test/integration/welcome.test.ts
@@ -45,15 +45,13 @@
 		[['0.22.0'], '0.22.1', '0.22.0', false],
 		[['0.22.0'], '0.22.1', '0.23.0', false],
 		[['0.22.0'], '0.22.1', '1.0.0', false],
-		[['0.22.0'], '0.22.1', '2021.1.100', false],
+		[['0.22.0'], '0.22.1', '2021.1.100', false]
 	];
 	testCases.forEach((c: testCase) => {
 		const [showVersions, newVersion, oldVersion, expected] = c;
 
 		test(`shouldShowGoWelcomePage(${JSON.stringify(showVersions)}, ${newVersion}, ${oldVersion})`, () => {
-			assert.strictEqual(
-				shouldShowGoWelcomePage(showVersions, newVersion, oldVersion), expected);
+			assert.strictEqual(shouldShowGoWelcomePage(showVersions, newVersion, oldVersion), expected);
 		});
 	});
-
 });
diff --git a/test/mocks/MockMemento.ts b/test/mocks/MockMemento.ts
index 4c55f16..5157fbe 100644
--- a/test/mocks/MockMemento.ts
+++ b/test/mocks/MockMemento.ts
@@ -1,3 +1,5 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+/* eslint-disable no-prototype-builtins */
 /*---------------------------------------------------------
  * Copyright (C) Microsoft Corporation. All rights reserved.
  * Modification copyright 2020 The Go Authors. All rights reserved.
diff --git a/test/runTest.ts b/test/runTest.ts
index 96d3c27..b44b2f7 100644
--- a/test/runTest.ts
+++ b/test/runTest.ts
@@ -1,3 +1,5 @@
+/* eslint-disable no-process-exit */
+/* eslint-disable node/no-unpublished-import */
 import * as path from 'path';
 import { runTests } from 'vscode-test';
 
@@ -28,7 +30,7 @@
 				'--user-data-dir=${workspaceFolder}/.user-data-dir-test',
 				// https://github.com/microsoft/vscode/issues/115794#issuecomment-774283222
 				'--force-disable-user-env'
-			],
+			]
 		});
 	} catch (err) {
 		console.error('Failed to run integration tests' + err);
@@ -45,11 +47,11 @@
 			extensionDevelopmentPath,
 			extensionTestsPath: path.resolve(__dirname, './gopls/index'),
 			launchArgs: [
-				'--disable-extensions',  // disable all other extensions
+				'--disable-extensions', // disable all other extensions
 				'--user-data-dir=${workspaceFolder}/.user-data-dir-test',
 				// https://github.com/microsoft/vscode/issues/115794#issuecomment-774283222
 				'--force-disable-user-env'
-			],
+			]
 		});
 	} catch (err) {
 		console.error('Failed to run gopls tests' + err);
diff --git a/test/unit/goDebug.test.ts b/test/unit/goDebug.test.ts
index 686b5bb..c75004e 100644
--- a/test/unit/goDebug.test.ts
+++ b/test/unit/goDebug.test.ts
@@ -11,16 +11,16 @@
 		const tt = [
 			{
 				input: 'path/to/file',
-				want: 'path/to/file',
+				want: 'path/to/file'
 			},
 			{
 				input: '\\path\\to\\file',
-				want: '/path/to/file',
+				want: '/path/to/file'
 			},
 			{
 				input: '/path/to\\file',
-				want: '/path/to/file',
-			},
+				want: '/path/to/file'
+			}
 		];
 
 		for (const tc of tt) {
@@ -32,27 +32,27 @@
 		const tt = [
 			{
 				input: 'C:/path/to/file',
-				want: 'C:/path/to/file',
+				want: 'C:/path/to/file'
 			},
 			{
 				input: 'c:/path/to/file',
-				want: 'C:/path/to/file',
+				want: 'C:/path/to/file'
 			},
 			{
 				input: 'C:/path/to/file',
-				want: 'C:/path/to/file',
+				want: 'C:/path/to/file'
 			},
 			{
 				input: 'C:\\path\\to\\file',
-				want: 'C:/path/to/file',
+				want: 'C:/path/to/file'
 			},
 			{
 				input: 'c:\\path\\to\\file',
-				want: 'C:/path/to/file',
+				want: 'C:/path/to/file'
 			},
 			{
 				input: 'c:\\path\\to\\file',
-				want: 'C:/path/to/file',
+				want: 'C:/path/to/file'
 			}
 		];
 
@@ -65,27 +65,27 @@
 		const tt = [
 			{
 				input: '../path/to/file',
-				want: '../path/to/file',
+				want: '../path/to/file'
 			},
 			{
 				input: './path/to/file',
-				want: './path/to/file',
+				want: './path/to/file'
 			},
 			{
 				input: '..\\path\\to\\file',
-				want: '../path/to/file',
+				want: '../path/to/file'
 			},
 			{
 				input: '.\\path\\to\\file',
-				want: './path/to/file',
+				want: './path/to/file'
 			},
 			{
 				input: '/path/to/../file',
-				want: '/path/to/../file',
+				want: '/path/to/../file'
 			},
 			{
 				input: 'c:\\path\\to\\..\\file',
-				want: 'C:/path/to/../file',
+				want: 'C:/path/to/../file'
 			}
 		];
 
@@ -94,5 +94,4 @@
 			assert.strictEqual(got, tc.want);
 		}
 	});
-
 });
diff --git a/test/unit/mutex.test.ts b/test/unit/mutex.test.ts
index 9972034..57818d1 100644
--- a/test/unit/mutex.test.ts
+++ b/test/unit/mutex.test.ts
@@ -57,4 +57,6 @@
 	});
 });
 
-function sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); }
+function sleep(ms: number) {
+	return new Promise((resolve) => setTimeout(resolve, ms));
+}
diff --git a/tslint.json b/tslint.json
deleted file mode 100644
index d9108ea..0000000
--- a/tslint.json
+++ /dev/null
@@ -1,166 +0,0 @@
-{
-	"rules": {
-		"adjacent-overload-signatures": true,
-		"align": {
-			"options": [
-				"parameters",
-				"statements"
-			]
-		},
-		"arrow-parens": true,
-		"arrow-return-shorthand": true,
-		"ban-types": {
-			"options": [
-				[
-					"Object",
-					"Avoid using the `Object` type. Did you mean `object`?"
-				],
-				[
-					"Function",
-					"Avoid using the `Function` type. Prefer a specific function type, like `() => void`."
-				],
-				[
-					"Boolean",
-					"Avoid using the `Boolean` type. Did you mean `boolean`?"
-				],
-				[
-					"Number",
-					"Avoid using the `Number` type. Did you mean `number`?"
-				],
-				[
-					"String",
-					"Avoid using the `String` type. Did you mean `string`?"
-				],
-				[
-					"Symbol",
-					"Avoid using the `Symbol` type. Did you mean `symbol`?"
-				]
-			]
-		},
-		"class-name": true,
-		"comment-format": [
-			true,
-			"check-space"
-		],
-		"curly": true,
-		"eofline": true,
-		"forin": true,
-		"import-spacing": true,
-		"indent": [
-			true,
-			"tabs"
-		],
-		"interface-over-type-literal": true,
-		"jsdoc-format": true,
-		"label-position": true,
-		"max-classes-per-file": {
-			"options": 2
-		},
-		"max-line-length": { "options": 120 },
-		"member-access": true,
-		"member-ordering": {
-			"options": {
-				"order": "statics-first"
-			}
-		},
-		"new-parens": true,
-		"no-arg": true,
-		"no-conditional-assignment": true,
-		"no-consecutive-blank-lines": true,
-		"no-construct": true,
-		"no-debugger": true,
-		"no-duplicate-super": true,
-		"no-duplicate-variable": true,
-		"no-empty": true,
-		"no-empty-interface": true,
-		"no-eval": true,
-		"no-internal-module": true,
-		"no-invalid-this": false,
-		"no-misused-new": true,
-		"no-namespace": true,
-		"no-reference": true,
-		"no-reference-import": true,
-		"no-shadowed-variable": true,
-		"no-string-throw": true,
-		"no-trailing-whitespace": true,
-		"no-unnecessary-initializer": true,
-		"no-unsafe-finally": true,
-		"no-unused-expression": true,
-		"no-var-keyword": true,
-		"no-var-requires": true,
-		"object-literal-key-quotes": { "options": "consistent-as-needed" },
-		"object-literal-shorthand": true,
-		"one-line": [
-			true,
-			"check-catch",
-			"check-else",
-			"check-finally",
-			"check-open-brace",
-			"check-whitespace"
-		],
-		"one-variable-per-declaration": { "options": ["ignore-for-loop"] },
-		"only-arrow-functions": {
-			"options": ["allow-declarations", "allow-named-functions"]
-		},
-		"ordered-imports": {
-			"options": {
-				"import-sources-order": "case-insensitive",
-				"module-source-path": "full",
-				"named-imports-order": "case-insensitive"
-			}
-		},
-		"prefer-const": true,
-		"prefer-for-of": true,
-		"quotemark": [
-			true,
-			"single"
-		],
-		"radix": true,
-		"semicolon": true,
-		"space-before-function-paren": {
-			"options": {
-				"anonymous": "always",
-				"asyncArrow": "always",
-				"constructor": "never",
-				"method": "never",
-				"named": "never"
-			}
-		},
-		"trailing-comma": {
-			"options": {
-				"esSpecCompliant": true
-			}
-		},
-		"triple-equals": [
-			true,
-			"allow-null-check"
-		],
-		"typedef-whitespace": [
-			true,
-			{
-				"call-signature": "nospace",
-				"index-signature": "nospace",
-				"parameter": "nospace",
-				"property-declaration": "nospace",
-				"variable-declaration": "nospace"
-			}
-		],
-		"unified-signatures": true,
-		"use-isnan": true,
-		"variable-name": [
-			true,
-			"ban-keywords",
-			"check-format",
-			"allow-pascal-case",
-			"allow-leading-underscore"
-		],
-		"whitespace": [
-			true,
-			"check-branch",
-			"check-decl",
-			"check-operator",
-			"check-separator",
-			"check-type"
-		]
-	}
-}
\ No newline at end of file
