[ts][lint] Improve typecheck and linting #5

Include the `stylistic.configs.recommended` preset configuration and
refactor code to fix the new lint warnings.

Bug: 497015838
Change-Id: Idc09e642e51ad345e09ec91733fa8a9e58bd384e
Reviewed-on: https://fuchsia-review.googlesource.com/c/vscode-plugins/+/1559521
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Jacob Rutherford <jruthe@google.com>
diff --git a/.ci/ci-tsc.mjs b/.ci/ci-tsc.mjs
index 2a4805f..1d8aad9 100644
--- a/.ci/ci-tsc.mjs
+++ b/.ci/ci-tsc.mjs
@@ -25,7 +25,7 @@
 let stdout;
 let stderr;
 try {
-  ( { stdout, stderr } = await execFile('npx', ['tsc', '--pretty', 'false']) ); // pretty=false should be the default but better safe than sorry
+  ({ stdout, stderr } = await execFile('npx', ['tsc', '--pretty', 'false'])); // pretty=false should be the default but better safe than sorry
 } catch (ex) {
   if (ex.errno !== undefined) {
     // this was something like a failure to run the command at all, just bail
@@ -34,7 +34,7 @@
     process.exit(1);
   }
   console.error(`tsc returned code ${ex.code} with error\n${ex}`);
-  ( { code, stdout, stderr } = ex );
+  ({ code, stdout, stderr } = ex);
 }
 
 // results are on stdout, so stderr is purely info, so just print it so it gets
@@ -52,8 +52,8 @@
 }
 
 // process the results
-let infos = lines.
-  map((raw) => {
+let infos = lines
+  .map((raw) => {
     // some/file.ts(line,col): kind code: message
     let match = raw.match(/^([^(]+)\((\d+),(\d+)\): (\w+) (\w+): (.+)$/);
     if (!match) {
@@ -62,16 +62,16 @@
     }
     let [, path, line, column, kind, code, message] = match;
     return { path, line, column, kind, code, message };
-  }).
-  filter((info) => !!info); // filter out the invalid outputs
+  })
+  .filter(info => !!info); // filter out the invalid outputs
 
 // write the results
-const numErrs = infos.filter((info) => info.kind === 'error').length;
+const numErrs = infos.filter(info => info.kind === 'error').length;
 const numOther = infos.length - numErrs;
 await fs.writeFile(outXML, `<testsuites>
 <testsuite name="tsc" tests="1" errors="${numErrs}" failures="${numOther}">
 <testcase name="tsc" tests="1" errors="${numErrs}" failures="${numOther}">
-${infos.map((info) => formatMessage(info)).join('\n')}
+${infos.map(info => formatMessage(info)).join('\n')}
 </testcase>
 </testsuite>
 </testsuites>`);
diff --git a/.ci/eslint-formatter.js b/.ci/eslint-formatter.js
index dc26dc2..860d231 100644
--- a/.ci/eslint-formatter.js
+++ b/.ci/eslint-formatter.js
@@ -21,7 +21,7 @@
  * @param {string} file - The file name.
  * @returns {string} The XML representation of the message.
  */
-function formatMessage({ruleId, severity, message, line, column}, file) {
+function formatMessage({ ruleId, severity, message, line, column }, file) {
   const tag = severity >= 2 ? 'error' : 'failure';
   const type = severity >= 2 ? 'Error' : 'Warning';
   return `      <${tag} message="${message.replace(/"/g, '&quot;')}" type="lint">
@@ -36,22 +36,22 @@
 // (x.y.ClassName), and therefore would only ever display `ts`, which is not
 // helpful.  otoh, testcase names are displayed in full
 
-module.exports = function(results) {
+module.exports = function (results) {
   const suites = results.map((file) => {
     const fileName = path.relative(rootDir, file.filePath);
-    let cases = file.messages.map((inst) => formatMessage(inst, fileName));
+    let cases = file.messages.map(inst => formatMessage(inst, fileName));
     return `  <testcase name="${fileName}" classname="eslint">
 ${cases.join('\n')}
   </testcase>`;
   });
 
   const numErrs = results.reduce(
-    (total, file) => total + file.messages.filter((msg) => msg.severity >= 2).length,
-    0
+    (total, file) => total + file.messages.filter(msg => msg.severity >= 2).length,
+    0,
   );
   const numOther = results.reduce(
-    (total, file) => total + file.messages.filter((msg) => msg.severity === 1).length,
-    0
+    (total, file) => total + file.messages.filter(msg => msg.severity === 1).length,
+    0,
   );
   return `
 <testsuites>
diff --git a/build-helpers.mjs b/build-helpers.mjs
index 8f81b9f..e47684c 100644
--- a/build-helpers.mjs
+++ b/build-helpers.mjs
@@ -56,7 +56,7 @@
         watchFiles: [srcFile],
       };
     });
-  }
+  },
 };
 
 /// locates and bundles all test files
@@ -92,10 +92,10 @@
  *   (e.g., 'syntax/cpp').
  */
 export async function allSyntax() {
-  return (await fs.readdir('syntax')).
-    filter((file) => path.extname(file) === '.ts').
-    map((file) => path.basename(file).slice(0, -3)).
-    map((name) => `syntax/${name}`);
+  return (await fs.readdir('syntax'))
+    .filter(file => path.extname(file) === '.ts')
+    .map(file => path.basename(file).slice(0, -3))
+    .map(name => `syntax/${name}`);
 }
 
 /**
@@ -109,8 +109,8 @@
  */
 export function formatMachineOutput({ errors, warnings }, name) {
   return [
-    ...(errors ?? []).map((err) => formatMessageForMachine(err, 'error', name)),
-    ...(warnings ?? []).map((warning) => formatMessageForMachine(warning, 'warning', name)),
+    ...(errors ?? []).map(err => formatMessageForMachine(err, 'error', name)),
+    ...(warnings ?? []).map(warning => formatMessageForMachine(warning, 'warning', name)),
   ].join('\n');
 }
 
@@ -149,11 +149,14 @@
           // on the incremental API.
           if (error) {
             const out = formatMachineOutput(error, name);
-            if (out) { console.error(out); }
-          }
-          else {
+            if (out) {
+              console.error(out);
+            }
+          } else {
             const out = formatMachineOutput(result, name);
-            if (out) { console.log(out); }
+            if (out) {
+              console.log(out);
+            }
           }
         },
       };
@@ -180,11 +183,11 @@
 </${tag}>
 `;
   };
-  let cases = results.
-    map(([name, { errors, warnings }]) => {
+  let cases = results
+    .map(([name, { errors, warnings }]) => {
       return `    <testcase name="${name}" status="run" result="completed">
-      ${errors.map((msg) => formatMessage('error', msg))}
-      ${warnings.map((msg) => formatMessage('warning', msg))}
+      ${errors.map(msg => formatMessage('error', msg))}
+      ${warnings.map(msg => formatMessage('warning', msg))}
     </testcase>`;
     });
 
diff --git a/build.mjs b/build.mjs
index 28163cb..2e242b4 100644
--- a/build.mjs
+++ b/build.mjs
@@ -7,7 +7,7 @@
 
 import {
   syntaxPlugin, testsPlugin,
-  allSyntax, formatMachineOutput, resultsToXML
+  allSyntax, formatMachineOutput, resultsToXML,
 } from './build-helpers.mjs';
 
 /// determines if we generate sourcemaps & such
@@ -36,7 +36,7 @@
   sourcemap: IS_DEV ? 'linked' : '',
   minify: !IS_DEV,
   logLevel,
-}).catch((res) => res);
+}).catch(res => res);
 
 const resCfg = esbuild.build({
   entryPoints: syntaxFiles,
@@ -45,7 +45,7 @@
   outbase: '.',
   outdir: 'dist',
   logLevel,
-}).catch((res) => res);
+}).catch(res => res);
 
 const testCfg = esbuild.build({
   bundle: true,
@@ -61,7 +61,7 @@
   sourcemap: true,
   plugins: [testsPlugin('./src/**/*.test.ts')],
   logLevel,
-}).catch((res) => res);
+}).catch(res => res);
 
 // awaiting will print the results, but we want the results as objects (mapped
 // to their names) in case we need to write test xml for CI
@@ -82,10 +82,15 @@
 if (IS_MACHINE) {
   for (const [name, res] of results) {
     const out = formatMachineOutput(res, name);
-    if (!out) {continue;}
+    if (!out) {
+      continue;
+    }
 
-    if (res instanceof Error) { console.error(out); }
-    else { console.log(out); }
+    if (res instanceof Error) {
+      console.error(out);
+    } else {
+      console.log(out);
+    }
   }
 }
 
diff --git a/eslint.config.mjs b/eslint.config.mjs
index 8dec09e..f656c35 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -29,10 +29,15 @@
     },
 
     // Shared JS and TS rules
+    stylistic.configs.customize({
+      indent: 2,
+      quotes: 'single',
+      semi: true,
+      braceStyle: '1tbs',
+    }),
     {
       plugins: {
         '@jsdoc': jsdoc,
-        '@stylistic': stylistic,
       },
       rules: {
         // Best Practices
@@ -45,14 +50,12 @@
         '@jsdoc/require-description': 'error',
 
         // Stylistic
-        '@stylistic/indent': ['error', 2],
         '@stylistic/max-len': ['error', {
           code: 100,
           ignoreComments: true,
           ignoreStrings: true,
         }],
-        '@stylistic/quotes': ['error', 'single'],
-        '@stylistic/semi': ['error', 'always'],
+        '@stylistic/operator-linebreak': ['error', 'after'],
       },
     },
 
diff --git a/src/analytics/environment_status.ts b/src/analytics/environment_status.ts
index 12396cd..3c341bb 100644
--- a/src/analytics/environment_status.ts
+++ b/src/analytics/environment_status.ts
@@ -21,10 +21,9 @@
   'BUILD_ID',
   'TEAMCITY_VERSION',
   'TRAVIS',
-  'TEST_ONLY_ENV_END'
+  'TEST_ONLY_ENV_END',
 ];
 
-
 /**
  * See below:
  * @returns whether analytics is set to be disabled by envrionment variables
@@ -46,5 +45,4 @@
   return false;
 }
 
-
 export const TEST_ONLY = { botEnvrionments: BOT_ENVIRONMENTS };
diff --git a/src/analytics/ga4.ts b/src/analytics/ga4.ts
index 96ca267..a79cbab 100644
--- a/src/analytics/ga4.ts
+++ b/src/analytics/ga4.ts
@@ -11,7 +11,6 @@
 import * as https from 'https';
 import * as logger from '../logger';
 
-
 const QUERY_STRING = '?measurement_id=G-HHSGJ8EXW0&api_secret=Am2AYuPcTnK1KtJJloeLRg';
 
 export interface Measurement {
@@ -36,10 +35,8 @@
 
 export type UserProperties = Record<string, UserProperty<string | number | boolean> | undefined>;
 
-
 export type Item = Record<string, string | number | boolean>;
 
-
 /**
  * Send a measurement to GA4 endpoint
  * @param measurement  the Measurement object to send
@@ -127,7 +124,6 @@
   return Date.now() * 1000;
 }
 
-
 /**
  * Create an Event with name and params.
  * @param name Event name
@@ -138,7 +134,7 @@
   params?: Record<string, string | number | boolean | undefined>): Event {
   const event: Event = {
     name: name,
-    timestamp_micros: getTimestampMicros()
+    timestamp_micros: getTimestampMicros(),
   };
   if (params !== undefined) {
     event.params = params;
@@ -160,7 +156,7 @@
     client_id: client_id,
     events: events,
     timestamp_micros: getTimestampMicros(),
-    non_personalized_ads: true
+    non_personalized_ads: true,
   };
   if (user_properties !== undefined) {
     measurement.user_properties = user_properties;
diff --git a/src/analytics/ga4_events.ts b/src/analytics/ga4_events.ts
index 67b6fd6..efc55df 100644
--- a/src/analytics/ga4_events.ts
+++ b/src/analytics/ga4_events.ts
@@ -8,7 +8,6 @@
 
 import { createEvent, type Event } from './ga4';
 
-
 /**
  * Create a `command_execution` event.
  * @param command - the command being executed
diff --git a/src/analytics/init.ts b/src/analytics/init.ts
index c022607..35e5670 100644
--- a/src/analytics/init.ts
+++ b/src/analytics/init.ts
@@ -66,7 +66,7 @@
       category: 'fuchsia-authors.vscode-fuchsia#fuchsia.welcome',
       step: `fuchsia-authors.vscode-fuchsia#fuchsia.analytics.${messageId}`,
     },
-    false // force: false
+    false, // force: false
   );
 }
 
@@ -121,8 +121,8 @@
    * Analytics initialization process specific to internal users.
    */
   async init(): Promise<void> {
-    if (await PersistentStatus.internal.isNewUser()
-      || await PersistentStatus.internal.isExistingUnmigratedOptedInUser()) {
+    if (await PersistentStatus.internal.isNewUser() ||
+      await PersistentStatus.internal.isExistingUnmigratedOptedInUser()) {
       if (vscode.env.isTelemetryEnabled) {
         await showMessage('internal_on');
       } else {
diff --git a/src/analytics/lib.ts b/src/analytics/lib.ts
index 3753ae1..f004cfd 100644
--- a/src/analytics/lib.ts
+++ b/src/analytics/lib.ts
@@ -11,7 +11,6 @@
 import { AnalyticsInfo } from './info';
 import { AnalyticsState } from './state';
 
-
 interface FuchsiaUserProperties {
   [key: string]: string | number | boolean | undefined;
   os?: string;
@@ -38,7 +37,7 @@
  * @param event the Event to send
  */
 export async function addEvent(event: Event): Promise<void> {
-  if (AnalyticsState.optInLevel === 0) {
+  if (AnalyticsState.optInLevel === 0 || !AnalyticsInfo.uuid) {
     return;
   }
 
@@ -48,12 +47,10 @@
       arch: AnalyticsInfo.arch,
       version: AnalyticsInfo.extensionVersion,
       internal: AnalyticsInfo.isInternalUser,
-      metrics_level: AnalyticsState.optInLevel
+      metrics_level: AnalyticsState.optInLevel,
     });
 
-  const measurement: Measurement =
-    createMeasurement(AnalyticsInfo.uuid!, [event], userProperties);
-
+  const measurement: Measurement = createMeasurement(AnalyticsInfo.uuid, [event], userProperties);
 
   await send(measurement, AnalyticsState.debugLevel);
 }
diff --git a/src/analytics/metric_properties.ts b/src/analytics/metric_properties.ts
index 427aa04..1516670 100644
--- a/src/analytics/metric_properties.ts
+++ b/src/analytics/metric_properties.ts
@@ -7,7 +7,6 @@
 import * as path from 'path';
 import * as process from 'process';
 
-
 // Functions to read/write metric properties (e.g. UUID, opt-in/out status), which are stored in
 // ~/.fuchsia/metrics/<property-name>
 
@@ -46,7 +45,7 @@
 export async function set(name: string, value: string): Promise<void> {
   try {
     await fs.mkdir(getMetricDirectory(), { recursive: true, mode: 0o700 });
-    await fs.writeFile(getMetricPropertyPath(name), value + '\n', { 'mode': 0o600 });
+    await fs.writeFile(getMetricPropertyPath(name), value + '\n', { mode: 0o600 });
   } catch (err) {
     if (err instanceof Error) {
       console.log(`Warning: unable to set analytics property ${name}`);
diff --git a/src/analytics/persistent_status.ts b/src/analytics/persistent_status.ts
index f2f80b8..4636612 100644
--- a/src/analytics/persistent_status.ts
+++ b/src/analytics/persistent_status.ts
@@ -86,22 +86,22 @@
    * Returns true if the user is new
    */
   async isNewUser(): Promise<boolean> {
-    return (! await MetricProperties.exists(ENABLED_PROPERTY)) &&
-      (! await MetricProperties.exists(INTERNAL_PROPERTY));
+    return (!await MetricProperties.exists(ENABLED_PROPERTY)) &&
+      (!await MetricProperties.exists(INTERNAL_PROPERTY));
   },
 
   /**
    * Returns true if the user has enabled external analytics but haven't opt-in/out for internal analytics
    */
   async isExistingUnmigratedOptedInUser(): Promise<boolean> {
-    return (! await MetricProperties.exists(INTERNAL_PROPERTY)) && await external.isEnabled();
+    return (!await MetricProperties.exists(INTERNAL_PROPERTY)) && await external.isEnabled();
   },
 
   /**
    * Returns true if the user has disabled external analytics but haven't opt-in/out for internal analytics
    */
   async isExistingUnmigratedOptedOutUser(): Promise<boolean> {
-    return (! await MetricProperties.exists(INTERNAL_PROPERTY)) && (! await external.isEnabled());
+    return (!await MetricProperties.exists(INTERNAL_PROPERTY)) && (!await external.isEnabled());
   },
 
   /**
diff --git a/src/analytics/setup.ts b/src/analytics/setup.ts
index 51165d6..20dbc4a 100644
--- a/src/analytics/setup.ts
+++ b/src/analytics/setup.ts
@@ -23,14 +23,13 @@
   await init(context);
 }
 
-
 /**
  * Hook up event triggers for sending analytics.
  */
 export function setUpAnalyticsEvents(context: vscode.ExtensionContext) {
-  context.subscriptions.push(vscodeEvents.onWillExecuteCommand(event => {
+  context.subscriptions.push(vscodeEvents.onWillExecuteCommand((event) => {
     void /* in bg */ addEvent(
-      ga4Events.createCommandExecutionEvent(event.command)
+      ga4Events.createCommandExecutionEvent(event.command),
     );
   }));
 }
diff --git a/src/analytics/state.ts b/src/analytics/state.ts
index bd14cac..8ffe794 100644
--- a/src/analytics/state.ts
+++ b/src/analytics/state.ts
@@ -9,23 +9,21 @@
 import * as PersistentStatus from './persistent_status';
 import { AnalyticsInfo } from './info';
 
-
 /* eslint-disable @typescript-eslint/naming-convention */
 /**
  * Specifies whether/how to send analytics when the extension is running
  * in development mode or test mode.
  */
 enum AnalyticsModeInDevOrTest {
-  NO_SEND,  // this should be the default behavior
+  NO_SEND, // this should be the default behavior
   // The following two modes are for development/debugging of the analytics library itself
-  DEBUG,  // send analytics to debug endpoint (non-logging) for validation
-  SEND    // send analytics directly (recommended to be used with a test GA account/property)
+  DEBUG, // send analytics to debug endpoint (non-logging) for validation
+  SEND, // send analytics directly (recommended to be used with a test GA account/property)
 }
 /* eslint-enable @typescript-eslint/naming-convention */
 
 const ANALYTICS_MODE_IN_DEV_OR_TEST: AnalyticsModeInDevOrTest = AnalyticsModeInDevOrTest.NO_SEND;
 
-
 export class AnalyticsState {
   private static instanceInternal: AnalyticsState;
 
diff --git a/src/analytics/vscode_events.ts b/src/analytics/vscode_events.ts
index 60a0fac..c84c9d7 100644
--- a/src/analytics/vscode_events.ts
+++ b/src/analytics/vscode_events.ts
@@ -33,7 +33,7 @@
 export function registerCommandWithAnalyticsEvent<T extends unknown[], S>(
   command: string,
   callback: (...args: T) => S,
-  thisArg?: unknown
+  thisArg?: unknown,
 ): vscode.Disposable {
   return vscode.commands.registerCommand(
     command,
@@ -41,6 +41,6 @@
       onWillExecuteCommandEmitter.fire({ command });
       return callback(...args);
     },
-    thisArg
+    thisArg,
   );
 }
diff --git a/src/common-config.ts b/src/common-config.ts
index 2992ef0..84b462b 100644
--- a/src/common-config.ts
+++ b/src/common-config.ts
@@ -2,13 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-
 /**
  * Constants to consistently refer to configuration parameters configured in
  * package.json.
  */
 
-
 /**
  * This is the root key for all configuration items for this extension.
  */
diff --git a/src/components.ts b/src/components.ts
index 51342e9..ed5879e 100644
--- a/src/components.ts
+++ b/src/components.ts
@@ -9,9 +9,9 @@
 import { registerCommandWithAnalyticsEvent } from './analytics/vscode_events';
 
 interface CommandOptions {
-  args: string[],
-  requiresURL?: boolean,
-  refresh?: boolean
+  args: string[];
+  requiresURL?: boolean;
+  refresh?: boolean;
 }
 
 interface ComponentJson {
@@ -81,7 +81,7 @@
   const componentExplorer = new ComponentExplorerDataProvider(setup.ffx);
   vscode.window.registerTreeDataProvider('vscode-fuchsia.componentExplorer', componentExplorer);
   vscode.commands.registerCommand('fuchsia.refreshComponentExplorer', () =>
-    componentExplorer.refresh()
+    componentExplorer.refresh(),
   );
 
   registerCommandWithAnalyticsEvent('fuchsia.component.show', async (moniker?: string) => {
@@ -89,7 +89,7 @@
       moniker = await vscode.window.showInputBox({
         placeHolder: '(e.g. core/ui/scenic)',
         value: '',
-        prompt: 'Enter a component moniker'
+        prompt: 'Enter a component moniker',
       });
     }
     if (!moniker) {
@@ -110,7 +110,7 @@
           moniker = await vscode.window.showInputBox({
             placeHolder: '(e.g. core/ui/scenic)',
             value: '',
-            prompt: 'Enter a component moniker'
+            prompt: 'Enter a component moniker',
           });
         }
         if (!moniker) {
@@ -123,7 +123,7 @@
             url = await vscode.window.showInputBox({
               placeHolder: '(e.g. fuchsia-pkg://fuchsia.com/hello-world-cpp#meta/hello-world-cpp.cm)',
               value: '',
-              prompt: 'Enter a component URL'
+              prompt: 'Enter a component URL',
             });
           }
           if (!url) {
@@ -143,7 +143,7 @@
   const taskExplorer = new TaskExplorerDataProvider(setup.ffx);
   vscode.window.registerTreeDataProvider('vscode-fuchsia.taskExplorer', taskExplorer);
   vscode.commands.registerCommand('fuchsia.refreshTaskExplorer', () =>
-    taskExplorer.refresh()
+    taskExplorer.refresh(),
   );
 }
 
@@ -232,7 +232,7 @@
   private tree: ComponentTree | null = null;
 
   constructor(
-    private readonly ffx: Ffx
+    private readonly ffx: Ffx,
   ) {
     this.ffx.onSetTarget((device: FuchsiaDevice | null) => {
       if (this.currentDevice?.nodeName !== device?.nodeName) {
@@ -244,6 +244,7 @@
 
   private _onDidChangeTreeData: vscode.EventEmitter<ComponentInfo | undefined | null | void> =
     new vscode.EventEmitter<ComponentInfo | undefined | null | void>();
+
   readonly onDidChangeTreeData: vscode.Event<ComponentInfo | undefined | null | void> =
     this._onDidChangeTreeData.event;
 
@@ -283,7 +284,7 @@
 
   constructor(
     public readonly info: ComponentInfo,
-    public readonly collapsibleState: vscode.TreeItemCollapsibleState
+    public readonly collapsibleState: vscode.TreeItemCollapsibleState,
   ) {
     super(info.moniker.basename, collapsibleState);
     this.description = info.url;
@@ -306,7 +307,7 @@
   const contents = await ffx.runFfx(['component', 'show', moniker]);
   const document = await vscode.workspace.openTextDocument({
     language: 'plaintext',
-    content: contents
+    content: contents,
   });
   await vscode.window.showTextDocument(document);
 }
@@ -370,7 +371,7 @@
   private tree: TaskTree | null = null;
 
   constructor(
-    private readonly ffx: Ffx
+    private readonly ffx: Ffx,
   ) {
     this.ffx.onSetTarget((device: FuchsiaDevice | null) => {
       if (this.currentDevice?.nodeName !== device?.nodeName) {
@@ -382,6 +383,7 @@
 
   private _onDidChangeTreeData: vscode.EventEmitter<TaskInfo | undefined | null | void> =
     new vscode.EventEmitter<TaskInfo | undefined | null | void>();
+
   readonly onDidChangeTreeData: vscode.Event<TaskInfo | undefined | null | void> =
     this._onDidChangeTreeData.event;
 
@@ -426,7 +428,7 @@
 
   constructor(
     public readonly info: TaskInfo,
-    public readonly collapsibleState: vscode.TreeItemCollapsibleState
+    public readonly collapsibleState: vscode.TreeItemCollapsibleState,
   ) {
     super(info.name, collapsibleState);
     this.description = info.koid.toString();
diff --git a/src/doc_provider.ts b/src/doc_provider.ts
index 8a4679f..28f1de3 100644
--- a/src/doc_provider.ts
+++ b/src/doc_provider.ts
@@ -21,9 +21,8 @@
  */
 export class FuchsiaDocumentLinkProvider implements vscode.DocumentLinkProvider {
   provideDocumentLinks(
-    document: vscode.TextDocument
+    document: vscode.TextDocument,
   ): vscode.ProviderResult<vscode.DocumentLink[]> {
-
     const links: vscode.DocumentLink[] = [];
     const workspaceFolder = vscode.workspace.workspaceFolders;
 
@@ -41,7 +40,7 @@
 
     for (const fileMatch of matches) {
       // Remove null items in matcher groups
-      const match = fileMatch.filter((item) => !!item);
+      const match = fileMatch.filter(item => !!item);
 
       const linkText = match[0];
       const filePath = match[1];
@@ -59,7 +58,7 @@
       // Link format is file:///path/to/file.ts#Lline,column
       const link = new vscode.DocumentLink(
         linkRange,
-        fileUri.with({ fragment: `L${line},${column}` })
+        fileUri.with({ fragment: `L${line},${column}` }),
       );
       link.tooltip =
         `Go to line ${line}${isNaN(column) ? '' : `:${column}`} in ${path.basename(filePath)}`;
diff --git a/src/extension.ts b/src/extension.ts
index ed16bb1..0028774 100644
--- a/src/extension.ts
+++ b/src/extension.ts
@@ -28,7 +28,6 @@
  * contains common bits needed by the various setup functions below
  */
 export class Setup {
-
   /**
    * a ToolFinder instance
    */
@@ -97,7 +96,7 @@
       logger.show();
     }),
 
-    vscode.languages.registerDocumentLinkProvider(fuchsiaOutput, new FuchsiaDocumentLinkProvider()
+    vscode.languages.registerDocumentLinkProvider(fuchsiaOutput, new FuchsiaDocumentLinkProvider(),
     ),
   );
 
@@ -131,7 +130,7 @@
   ctx.subscriptions.push(
     registerCommandWithAnalyticsEvent('fuchsia.viewLogs', () => {
       logView.output?.show();
-    })
+    }),
   );
 }
 
@@ -159,7 +158,7 @@
                 `error with ${commandName}, see output for details`);
             }
           });
-        })
+        }),
     );
   };
 
@@ -196,7 +195,7 @@
               `error with ${commandName}, see output for details`);
           }
         });
-      })
+      }),
   );
 
   // set up commands...
@@ -231,7 +230,7 @@
         if (await vscode.window.showInformationMessage(msg, 'Open folder')) {
           spawn('xdg-open', [path]);
         }
-      })
+      }),
   );
 
   ctx.subscriptions.push(
@@ -243,7 +242,7 @@
         }
 
         setup.ffx.targetDevice = device;
-      })
+      }),
   );
 
   // ...and the status bar item
diff --git a/src/ffx.ts b/src/ffx.ts
index 06e871f..56bd39f 100644
--- a/src/ffx.ts
+++ b/src/ffx.ts
@@ -39,17 +39,17 @@
 
   public static fromNodename(nodename: string, connected = false): FuchsiaDevice {
     // eslint-disable-next-line @typescript-eslint/naming-convention
-    return new FuchsiaDevice({nodename, 'rcs_state': connected ? 'Y' : 'N'});
+    return new FuchsiaDevice({ nodename, rcs_state: connected ? 'Y' : 'N' });
   }
 
   disconnected(): FuchsiaDevice {
     // eslint-disable-next-line @typescript-eslint/naming-convention
-    return new FuchsiaDevice({...this._data, 'rcs_state': 'N'});
+    return new FuchsiaDevice({ ...this._data, rcs_state: 'N' });
   }
 }
 
 interface SpawnOptions {
-  cwd?: string
+  cwd?: string;
 }
 
 export enum FfxEventType {
@@ -58,7 +58,7 @@
 };
 
 export interface FfxInvocationEvent {
-  args: string[]
+  args: string[];
 }
 
 // TODO: Should we make this value configuable? We already have the configuration key
@@ -112,7 +112,7 @@
       // initialization time, which may take longer to run ffx commands. This
       // setter side-effect isn't blocking anyways, so there's no real harm in
       // letting it run longer.
-      this.refreshTargets(5000).catch(err => {
+      this.refreshTargets(5000).catch((err) => {
         logger.warn(`Unable to refresh target list: ${err}`);
       });
     }
@@ -280,7 +280,7 @@
     }
     throw new Error(
       `Target "${(device ?? this.targetDevice)?.nodeName}" ` +
-      `failed to come online within ${timeout} seconds.`
+      `failed to come online within ${timeout} seconds.`,
     );
   }
 
@@ -354,7 +354,7 @@
     // Determine the default target in the following precedence:
     // 1. Preserve the last selected device if ffx is still tracking it.
     const sameDefaultDevice = () => discoveredDevices.find(
-      device => device.nodeName === this.defaultTarget?.nodeName
+      device => device.nodeName === this.defaultTarget?.nodeName,
     );
 
     // 2. Preserve the last selected device and mark as disconnected.
@@ -369,23 +369,23 @@
 
     // 3. Use the ffx default device.
     const ffxDefaultDevice = () => discoveredDevices.find(
-      device => device.isFfxDefault
+      device => device.isFfxDefault,
     );
 
     // 4. Fallback to the first connected device.
     const firstConnectedDevice = () => discoveredDevices.find(
-      device => device.connected
+      device => device.connected,
     );
 
     // 5. Fallback to a remaining disconnected device.
     const anyDiscoveredDevice = () => discoveredDevices[0];
 
-    return sameDefaultDevice()
-        ?? lostDefaultDevice()
-        ?? ffxDefaultDevice()
-        ?? firstConnectedDevice()
-        ?? anyDiscoveredDevice()
-        ?? null;
+    return sameDefaultDevice() ??
+      lostDefaultDevice() ??
+      ffxDefaultDevice() ??
+      firstConnectedDevice() ??
+      anyDiscoveredDevice() ??
+      null;
   }
 
   /**
@@ -410,8 +410,8 @@
    */
   private buildCommandLine(
     args: string[],
-    device?: string | null
-  ): { cmd: string, args: string[] } | undefined {
+    device?: string | null,
+  ): { cmd: string; args: string[] } | undefined {
     if (!this.path) {
       return;
     }
@@ -440,7 +440,7 @@
    */
   public runFfxStreaming(
     args: string[],
-    device?: string | null
+    device?: string | null,
   ): ChildProcessWithoutNullStreams | undefined {
     const fullargs = this.buildCommandLine(args, device);
     if (!fullargs) {
@@ -534,15 +534,19 @@
       }
 
       let output = '';
-      cmd?.stdout.on('data', (data) => { output += data; });
+      cmd?.stdout.on('data', (data) => {
+        output += data;
+      });
 
       let errorOutput = '';
-      cmd?.stderr.on('data', (data) => { errorOutput += data; });
+      cmd?.stderr.on('data', (data) => {
+        errorOutput += data;
+      });
 
       // Keep track of the error state so that the 'close' event handler below won't handle the
       // error again.
       let hasError = false;
-      cmd?.on('error', err => {
+      cmd?.on('error', (err) => {
         logger.warn(`exit: ${err}`, 'ffx');
         hasError = true;
         return reject(err);
diff --git a/src/fx.ts b/src/fx.ts
index 25d92e1..16d2030 100644
--- a/src/fx.ts
+++ b/src/fx.ts
@@ -51,15 +51,19 @@
     return new Promise<string>((resolve, reject) => {
       let output = '';
       const cmd = this.runStreaming(args);
-      cmd?.stdout.on('data', (data) => { output += data; });
+      cmd?.stdout.on('data', (data) => {
+        output += data;
+      });
 
       let errorOutput = '';
-      cmd?.stderr.on('data', (data) => { errorOutput += data; });
+      cmd?.stderr.on('data', (data) => {
+        errorOutput += data;
+      });
 
       // Keep track of the error state so that the 'close' event handler below won't handle the
       // error again.
       let hasError = false;
-      cmd?.on('error', err => {
+      cmd?.on('error', (err) => {
         logger.warn(`exit: ${err}`, 'ffx');
         hasError = true;
         return reject(err);
@@ -92,7 +96,7 @@
    */
   public runJsonStreaming(
     args: string[],
-    onData: (data: object) => void
+    onData: (data: object) => void,
   ): JsonStreamProcess {
     return new JsonStreamProcess(
       this.runStreaming(args),
@@ -101,5 +105,4 @@
         logger.warn(`Error [fx ${args.join(' ')}]: ${data.toString()}`);
       });
   }
-
 }
diff --git a/src/git_helper.ts b/src/git_helper.ts
index e63c5b1..ef5d5ad 100644
--- a/src/git_helper.ts
+++ b/src/git_helper.ts
@@ -10,7 +10,7 @@
 
 // The object received when the extension is called from context-menu / right click
 interface ContextMenuCommandArg {
-  path: string,
+  path: string;
 }
 
 /**
@@ -44,8 +44,7 @@
 function getPathSegment(arg?: ContextMenuCommandArg) {
   const root = getRoot()?.fsPath;
 
-  const fullPath =
-    arg?.path ?? // Try to use the passed in path, if available
+  const fullPath = arg?.path ?? // Try to use the passed in path, if available
     vscode.window.activeTextEditor?.document.fileName ?? // Fallback to the active editor's path
     root ?? // Fallback to the root of the workspace
     '';
diff --git a/src/log_view.ts b/src/log_view.ts
index bcf056d..974c3a4 100644
--- a/src/log_view.ts
+++ b/src/log_view.ts
@@ -14,7 +14,9 @@
   public output?: vscode.OutputChannel;
 
   constructor(readonly ffx: Ffx) {
-    ffx.onSetTarget(target => { this.watch(target); });
+    ffx.onSetTarget((target) => {
+      this.watch(target);
+    });
   }
 
   watch(device: FuchsiaDevice | null) {
diff --git a/src/logger.ts b/src/logger.ts
index 9efbd07..8570c4d 100644
--- a/src/logger.ts
+++ b/src/logger.ts
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-
-
 /**
  *  The logger module encapsulates capturing information for logging activity done in the
  * extension and proving uniform methods for presenting information and notifications to
@@ -19,10 +17,8 @@
  * containing more information that is reasonable to show to the user.
  */
 
-
 import * as vscode from 'vscode';
 
-
 /**
  * Internal method for formatting logging category
  */
@@ -47,7 +43,6 @@
     this.output = output;
   }
 
-
   /**
    * Log a message at the vscode.LogLevel.Trace level.
    * @param message data.
@@ -75,7 +70,6 @@
     this.output.info(formatCategory(category), message, ...args);
   }
 
-
   /**
    * Log warning message.
    * @param message data.
@@ -85,7 +79,6 @@
     this.output.warn(formatCategory(category), message, ...args);
   }
 
-
   /**
    * Log error message.
    * @param message data.
@@ -119,7 +112,6 @@
   logger = new Logger(channel);
 }
 
-
 /**
  * Log a message at the vscode.LogLevel.Trace level.
  * @param message data.
diff --git a/src/process.ts b/src/process.ts
index 2adad98..3772360 100644
--- a/src/process.ts
+++ b/src/process.ts
@@ -16,14 +16,14 @@
     this.process.stdout.on('data', (chunk: unknown) => {
       const buffer = Buffer.isBuffer(chunk) ?
         chunk :
-        Buffer.from(typeof chunk === 'string' ? chunk : String(chunk));
+          Buffer.from(typeof chunk === 'string' ? chunk : String(chunk));
       this.outputChunks.push(buffer);
       onData(buffer);
     });
     this.process.stderr.on('data', (chunk: unknown) => {
       const buffer = Buffer.isBuffer(chunk) ?
         chunk :
-        Buffer.from(typeof chunk === 'string' ? chunk : String(chunk));
+          Buffer.from(typeof chunk === 'string' ? chunk : String(chunk));
       this.outputChunks.push(buffer);
       onError(buffer);
     });
@@ -40,7 +40,7 @@
    * A future that resolves when the process exits.
    */
   public get exitCode(): Promise<number | null> {
-    return new Promise(resolve => {
+    return new Promise((resolve) => {
       this.process.on('exit', resolve);
     });
   }
@@ -79,7 +79,6 @@
       this.process = new DataStreamProcess(process, (chunk) => {
         this.parser.write(chunk);
       }, onError);
-
     }
     this.parser.onValue = (value: unknown) => {
       if (this.parser.stack.length === 0) {
diff --git a/src/target_status_bar_item.ts b/src/target_status_bar_item.ts
index 564a2dd..140ba6f 100644
--- a/src/target_status_bar_item.ts
+++ b/src/target_status_bar_item.ts
@@ -129,7 +129,7 @@
           await this.toolFinder?.updateFfxPath(false);
         }
 
-        this.ffxTools.refreshTargets().then(async targetList => {
+        this.ffxTools.refreshTargets().then(async (targetList) => {
           const items = this.buildTargetQuickPickItems(targetList);
           if (items.length > 0) {
             const action = await vscode.window.showQuickPick(items);
@@ -139,18 +139,19 @@
             await vscode.commands.executeCommand(action.command, action.device);
           } else {
             const msg = Object.keys(targetList).length > 0 ?
-              'No available devices found.' : 'No devices found.';
+              'No available devices found.' :
+              'No devices found.';
             logger.warn(msg);
             void vscode.window.showWarningMessage(msg);
           }
         })
           // If there is a problem getting the list, just log it. The quickpick
           // will be empty.
-          .catch(err => {
+          .catch((err) => {
             logger.warn(`Could not build target list: ${err}`);
             void vscode.window.showWarningMessage('Failed to retrieve devices.');
           });
-      })
+      }),
     );
 
     // Target status-bar item
@@ -159,20 +160,20 @@
     this.fuchsiaStatusBarItem.command = 'fuchsia.target.attach';
     this.fuchsiaStatusBarItem.tooltip = 'Fuchsia target device.';
     contextSubscriptions.push(this.fuchsiaStatusBarItem);
-    this.setBarItemText(/*targetName*/ undefined, /*connected*/ false);
+    this.setBarItemText(/* targetName */ undefined, /* connected */ false);
     this.fuchsiaStatusBarItem.show();
 
     // Clear the default target if there is no ffx found.
-    this.ffxTools.onDidChangeConfiguration(eventType => {
+    this.ffxTools.onDidChangeConfiguration((eventType) => {
       switch (eventType) {
         case FfxEventType.ffxPathReset:
-          this.setBarItemText(/*targetName*/ undefined, /*connected*/ false);
+          this.setBarItemText(/* targetName */ undefined, /* connected */ false);
           break;
       }
     });
 
     // When the default target is set, update the item text.
-    this.ffxTools.onSetTarget(target => {
+    this.ffxTools.onSetTarget((target) => {
       this.setBarItemText(target?.nodeName, target?.connected ?? false);
     });
   }
diff --git a/src/test/suite/analytics/metric_properties.test.ts b/src/test/suite/analytics/metric_properties.test.ts
index 5e5bd67..8449e7c 100644
--- a/src/test/suite/analytics/metric_properties.test.ts
+++ b/src/test/suite/analytics/metric_properties.test.ts
@@ -60,7 +60,6 @@
     });
   });
 
-
   describe('getBoolean() and setBoolean()', function () {
     it('work as intended', async function () {
       await MetricProperties.setBoolean('true', true);
@@ -124,7 +123,6 @@
     await fs.rm(tmpPath, { force: true, recursive: true });
   });
 
-
   it('do nothing when there are neither old or new directories', async function () {
     await MetricProperties.migrateMetricDirectory();
     assert.strictEqual(await fsExists(oldMetricDirectory), false);
diff --git a/src/test/suite/analytics/persistent_status.test.ts b/src/test/suite/analytics/persistent_status.test.ts
index ab817fa..475f46b 100644
--- a/src/test/suite/analytics/persistent_status.test.ts
+++ b/src/test/suite/analytics/persistent_status.test.ts
@@ -35,7 +35,6 @@
   });
 
   it('works as intended', async function () {
-
     assert.strictEqual(await PersistentStatus.external.isFirstLaunchOfFirstTool(), true);
 
     await PersistentStatus.external.enable();
diff --git a/src/test/suite/commands.test.ts b/src/test/suite/commands.test.ts
index 667390c..337bcec 100644
--- a/src/test/suite/commands.test.ts
+++ b/src/test/suite/commands.test.ts
@@ -9,10 +9,10 @@
 
 import { describe, it, before } from 'mocha';
 
-describe('commands', function() {
+describe('commands', function () {
   let userCommands: string[];
   let registeredCommands: string[];
-  before(async function() {
+  before(async function () {
     const packageDir = path.join(__dirname, '..');
     const packageJSON = JSON.parse(await fs.readFile(path.join(packageDir, 'package.json'), 'utf8')) as {
       contributes: {
@@ -21,12 +21,12 @@
     };
 
     // sort to make comparison easier
-    userCommands = packageJSON.contributes.commands.
-      map((cmd: {command: string}) => cmd.command).
-      sort();
-    registeredCommands = (await vscode.commands.getCommands(true /* filterInternal */)).
-      filter((cmd) => cmd.startsWith('fuchsia.')).
-      sort();
+    userCommands = packageJSON.contributes.commands
+      .map((cmd: { command: string }) => cmd.command)
+      .sort();
+    registeredCommands = (await vscode.commands.getCommands(true /* filterInternal */))
+      .filter(cmd => cmd.startsWith('fuchsia.'))
+      .sort();
   });
 
   // two separate equalities to make the errors a bit clearer
@@ -38,7 +38,7 @@
     }
 
     // package.json commands (actual) should contain registered non-internal commands (expected)
-    const nonInternalRegistered = registeredCommands.filter((cmd) => !cmd.startsWith('fuchsia.internal.'));
+    const nonInternalRegistered = registeredCommands.filter(cmd => !cmd.startsWith('fuchsia.internal.'));
     for (const cmd of nonInternalRegistered) {
       assert.ok(userCommands.includes(cmd), `Unexpected registered command: ${cmd}`);
     }
diff --git a/src/test/suite/ffx.test.ts b/src/test/suite/ffx.test.ts
index e298915..b54c513 100644
--- a/src/test/suite/ffx.test.ts
+++ b/src/test/suite/ffx.test.ts
@@ -14,17 +14,17 @@
 
 import { type MockedCommandInvocation, StubbedSpawn, noTimeout, setupMockFfx } from './utils';
 
-describe('FuchsiaDevice', function() {
-  describe('#constructor()', function() {
+describe('FuchsiaDevice', function () {
+  describe('#constructor()', function () {
     it('creates an instance of FuchsiaDevice from the json returned from ffx target list',
-      function() {
+      function () {
         const data = {
-          'nodename': 'test-device',
-          'rcs_state': 'Y',
-          'serial': '<unknown>',
-          'target_type': 'workstation.qemu-x64',
-          'target_state': 'Product',
-          'addresses': ['fe80::3bee:1d4:e205:777e%brqemu', '172.1.1.1']
+          nodename: 'test-device',
+          rcs_state: 'Y',
+          serial: '<unknown>',
+          target_type: 'workstation.qemu-x64',
+          target_state: 'Product',
+          addresses: ['fe80::3bee:1d4:e205:777e%brqemu', '172.1.1.1'],
         };
 
         const device = new FuchsiaDevice(data);
@@ -42,30 +42,30 @@
   });
 });
 
-describe('Ffx', function() {
+describe('Ffx', function () {
   const sandbox = createSandbox();
   const TEST_FFX = '/path/to/ffx';
   const TEST_CWD = '/path/to/workspace';
   let stubbedSpawn: StubbedSpawn;
 
-  this.beforeEach(function() {
+  this.beforeEach(function () {
     stubbedSpawn = new StubbedSpawn(sandbox);
     const log = vscode.window.createOutputChannel('tool_finder.test', { log: true });
     logger.initLogger(log);
   });
 
-  this.afterEach(function() {
+  this.afterEach(function () {
     sandbox.restore();
   });
 
   const SAMPLE_DEVICE = new FuchsiaDevice({
-    'nodename': 'sample-device',
-    'rcs_state': 'Y',
-    'serial': 'serial-54321',
-    'target_type': 'sample-product',
-    'target_state': 'Product',
-    'addresses': ['fe80::f76b:3c1e:a01c:0851%en12'],
-    'is_default': false
+    nodename: 'sample-device',
+    rcs_state: 'Y',
+    serial: 'serial-54321',
+    target_type: 'sample-product',
+    target_state: 'Product',
+    addresses: ['fe80::f76b:3c1e:a01c:0851%en12'],
+    is_default: false,
   });
 
   const mockFfx = (...ffxInvocations: MockedCommandInvocation[]) => setupMockFfx(
@@ -75,33 +75,33 @@
     ffxInvocations,
   );
 
-  describe('#constructor', function() {
-    it('creates an instance of ffx', function() {
+  describe('#constructor', function () {
+    it('creates an instance of ffx', function () {
       new Ffx(TEST_CWD, TEST_FFX);
     });
   });
 
-  describe('#rebootTarget', function() {
-    it('calls ffx target reboot for the default device successfully', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+  describe('#rebootTarget', function () {
+    it('calls ffx target reboot for the default device successfully', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'sample-device', 'target', 'reboot'],
-          'output': 'restarted sample-device',
+          args: ['--target', 'sample-device', 'target', 'reboot'],
+          output: 'restarted sample-device',
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [],
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'sample-device', 'rcs_state': 'N'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'sample-device', rcs_state: 'N' },
           ],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'sample-device', 'rcs_state': 'Y'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'sample-device', rcs_state: 'Y' },
           ],
         },
       );
@@ -118,8 +118,8 @@
       assert.strictEqual(ffx.targetDevice?.connected, true);
     });
 
-    it('does not call ffx target reboot without a target', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx();
+    it('does not call ffx target reboot without a target', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx();
 
       const ffx = new Ffx(TEST_CWD, TEST_FFX);
 
@@ -128,30 +128,30 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('calls ffx target reboot the specified device', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('calls ffx target reboot the specified device', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'test-device', 'target', 'reboot'],
-          'output': 'restarted test-device',
+          args: ['--target', 'test-device', 'target', 'reboot'],
+          output: 'restarted test-device',
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'sample-device', 'rcs_state': 'Y'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'sample-device', rcs_state: 'Y' },
           ],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'sample-device', 'rcs_state': 'Y'},
-            {'nodename': 'test-device', 'rcs_state': 'N'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'sample-device', rcs_state: 'Y' },
+            { nodename: 'test-device', rcs_state: 'N' },
           ],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'sample-device', 'rcs_state': 'Y'},
-            {'nodename': 'test-device', 'rcs_state': 'Y'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'sample-device', rcs_state: 'Y' },
+            { nodename: 'test-device', rcs_state: 'Y' },
           ],
         },
       );
@@ -159,7 +159,7 @@
       const ffx = new Ffx(TEST_CWD, TEST_FFX);
       ffx.targetDevice = SAMPLE_DEVICE;
 
-      const device = new FuchsiaDevice({ 'nodename': 'test-device' });
+      const device = new FuchsiaDevice({ nodename: 'test-device' });
       const stdout = await ffx.rebootTarget(device);
       assert.strictEqual(stdout, 'restarted test-device');
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
@@ -169,12 +169,12 @@
       assert.strictEqual(ffx.targetDevice?.connected, true);
     });
 
-    it('fails when the reboot command fails to issue', async function() {
+    it('fails when the reboot command fails to issue', async function () {
       const errorMessage = 'Cannot reboot device';
-      const {actualInvocations, expectedInvocations} = mockFfx(
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'sample-device', 'target', 'reboot'],
-          'output': new Error(errorMessage),
+          args: ['--target', 'sample-device', 'target', 'reboot'],
+          output: new Error(errorMessage),
         },
       );
 
@@ -188,20 +188,20 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('handles target list errors', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('handles target list errors', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'sample-device', 'target', 'reboot'],
-          'output': 'restarted sample-device',
+          args: ['--target', 'sample-device', 'target', 'reboot'],
+          output: 'restarted sample-device',
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': new Error('sample error'),
+          args: ['--machine', 'json', 'target', 'list'],
+          output: new Error('sample error'),
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'sample-device', 'rcs_state': 'Y'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'sample-device', rcs_state: 'Y' },
           ],
         },
       );
@@ -218,20 +218,20 @@
       assert.strictEqual(ffx.targetDevice?.connected, true);
     });
 
-    it('fails when device does not reconnect', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('fails when device does not reconnect', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'sample-device', 'target', 'reboot'],
-          'output': 'restarted sample-device',
+          args: ['--target', 'sample-device', 'target', 'reboot'],
+          output: 'restarted sample-device',
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [],
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'sample-device', 'rcs_state': 'N'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'sample-device', rcs_state: 'N' },
           ],
         },
       );
@@ -240,7 +240,7 @@
       ffx.targetDevice = SAMPLE_DEVICE;
 
       await assert.rejects(
-        () => ffx.rebootTarget(SAMPLE_DEVICE, .19),
+        () => ffx.rebootTarget(SAMPLE_DEVICE, 0.19),
         new Error('Target "sample-device" failed to come online within 0.19 seconds.'),
       );
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
@@ -251,18 +251,18 @@
     });
   });
 
-  describe('#startEmulator', function() {
-    it('calls ffx emu start with the default emulator name and updates default target', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+  describe('#startEmulator', function () {
+    it('calls ffx emu start with the default emulator name and updates default target', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['emu', 'start', '--name', 'fuchsia-emulator'],
-          'output': 'started fuchsia-emulator',
+          args: ['emu', 'start', '--name', 'fuchsia-emulator'],
+          output: 'started fuchsia-emulator',
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'sample-device', 'rcs_state': 'Y', 'is_default': true},
-            {'nodename': 'fuchsia-emulator', 'rcs_state': 'Y'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'sample-device', rcs_state: 'Y', is_default: true },
+            { nodename: 'fuchsia-emulator', rcs_state: 'Y' },
           ],
         },
       );
@@ -279,17 +279,17 @@
       assert.strictEqual(ffx.targetDevice?.connected, true);
     });
 
-    it('calls ffx emu start headless with a specified emulator name and updates default target', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('calls ffx emu start headless with a specified emulator name and updates default target', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['emu', 'start', '--name', 'fuchsia-emulator2', '--headless'],
-          'output': 'started fuchsia-emulator2',
+          args: ['emu', 'start', '--name', 'fuchsia-emulator2', '--headless'],
+          output: 'started fuchsia-emulator2',
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'sample-device', 'rcs_state': 'Y', 'is_default': true},
-            {'nodename': 'fuchsia-emulator2', 'rcs_state': 'Y'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'sample-device', rcs_state: 'Y', is_default: true },
+            { nodename: 'fuchsia-emulator2', rcs_state: 'Y' },
           ],
         },
       );
@@ -306,12 +306,12 @@
       assert.strictEqual(ffx.targetDevice?.connected, true);
     });
 
-    it('handles emu start failures', async function() {
+    it('handles emu start failures', async function () {
       const errorMessage = 'Cannot start the emulator';
-      const {actualInvocations, expectedInvocations} = mockFfx(
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['emu', 'start', '--name', 'fuchsia-emulator'],
-          'output': new Error(errorMessage),
+          args: ['emu', 'start', '--name', 'fuchsia-emulator'],
+          output: new Error(errorMessage),
         },
       );
 
@@ -330,17 +330,17 @@
     });
   });
 
-  describe('#stopEmulator', function() {
-    it('calls ffx emu stop for the default emulator name', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+  describe('#stopEmulator', function () {
+    it('calls ffx emu stop for the default emulator name', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['emu', 'stop', 'fuchsia-emulator'],
-          'output': 'stopped fuchsia-emulator',
+          args: ['emu', 'stop', 'fuchsia-emulator'],
+          output: 'stopped fuchsia-emulator',
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'test-device', 'rcs_state': 'Y'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'test-device', rcs_state: 'Y' },
           ],
         },
       );
@@ -357,16 +357,16 @@
       assert.strictEqual(ffx.targetDevice?.connected, false);
     });
 
-    it('calls ffx emu stop with a specified emulator name', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('calls ffx emu stop with a specified emulator name', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['emu', 'stop', 'fuchsia-emulator2'],
-          'output': 'stopped fuchsia-emulator2',
+          args: ['emu', 'stop', 'fuchsia-emulator2'],
+          output: 'stopped fuchsia-emulator2',
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'default-device', 'rcs_state': 'Y', 'is_default': true},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'default-device', rcs_state: 'Y', is_default: true },
           ],
         },
       );
@@ -383,16 +383,16 @@
       assert.strictEqual(ffx.targetDevice?.connected, false);
     });
 
-    it('switches to a new default target if the emulator default is stopped', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('switches to a new default target if the emulator default is stopped', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['emu', 'stop', 'sample-device'],
-          'output': 'stopped sample-device',
+          args: ['emu', 'stop', 'sample-device'],
+          output: 'stopped sample-device',
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'new-default-device', 'rcs_state': 'Y'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'new-default-device', rcs_state: 'Y' },
           ],
         },
       );
@@ -409,17 +409,17 @@
       assert.strictEqual(ffx.targetDevice?.connected, true);
     });
 
-    it('fails and refreshes target status but does not switch default target', async function() {
+    it('fails and refreshes target status but does not switch default target', async function () {
       const errorMessage = 'Cannot stop the emulator';
-      const {actualInvocations, expectedInvocations} = mockFfx(
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['emu', 'stop', 'fuchsia-emulator'],
-          'output': new Error(errorMessage),
+          args: ['emu', 'stop', 'fuchsia-emulator'],
+          output: new Error(errorMessage),
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'default-device', 'rcs_state': 'Y', 'is_default': true},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'default-device', rcs_state: 'Y', is_default: true },
           ],
         },
       );
@@ -439,17 +439,17 @@
     });
   });
 
-  describe('#poweroffTarget', function() {
-    it('calls ffx target off for the default device successfully', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+  describe('#poweroffTarget', function () {
+    it('calls ffx target off for the default device successfully', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'sample-device', 'target', 'off'],
-          'output': 'powered off sample-device',
+          args: ['--target', 'sample-device', 'target', 'off'],
+          output: 'powered off sample-device',
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'test-device', 'rcs_state': 'Y'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'test-device', rcs_state: 'Y' },
           ],
         },
       );
@@ -466,26 +466,26 @@
       assert.strictEqual(ffx.targetDevice?.connected, true);
     });
 
-    it('does not call ffx target off without a target', async function() {
+    it('does not call ffx target off without a target', async function () {
       const ffx = new Ffx(TEST_CWD, TEST_FFX);
 
       const errorMessage = 'Unable to resolve the default target for ffx command: target off';
-      const {actualInvocations, expectedInvocations} = mockFfx();
+      const { actualInvocations, expectedInvocations } = mockFfx();
       await assert.rejects(() => ffx.poweroffTarget(), new Error(errorMessage));
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('calls ffx target off the specified device', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('calls ffx target off the specified device', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'test-device', 'target', 'off'],
-          'output': 'powered off test-device',
+          args: ['--target', 'test-device', 'target', 'off'],
+          output: 'powered off test-device',
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'sample-device', 'rcs_state': 'Y'},
-            {'nodename': 'default-device', 'rcs_state': 'Y', 'is_default': true},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'sample-device', rcs_state: 'Y' },
+            { nodename: 'default-device', rcs_state: 'Y', is_default: true },
           ],
         },
       );
@@ -493,7 +493,7 @@
       const ffx = new Ffx(TEST_CWD, TEST_FFX);
       ffx.targetDevice = SAMPLE_DEVICE;
 
-      const device = new FuchsiaDevice({ 'nodename': 'test-device' });
+      const device = new FuchsiaDevice({ nodename: 'test-device' });
       const stdout = await ffx.poweroffTarget(device);
       assert.strictEqual(stdout, 'powered off test-device');
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
@@ -503,12 +503,12 @@
       assert.strictEqual(ffx.targetDevice?.connected, true);
     });
 
-    it('fails when target off command fails to issue', async function() {
+    it('fails when target off command fails to issue', async function () {
       const errorMessage = 'Cannot power off the device';
-      const {actualInvocations, expectedInvocations} = mockFfx(
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'sample-device', 'target', 'off'],
-          'output': new Error(errorMessage),
+          args: ['--target', 'sample-device', 'target', 'off'],
+          output: new Error(errorMessage),
         },
       );
 
@@ -523,35 +523,35 @@
     });
   });
 
-  describe('#waitForTarget', function() {
-    it('calls ffx target list repeatedly on the specified device', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+  describe('#waitForTarget', function () {
+    it('calls ffx target list repeatedly on the specified device', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'default-device', 'rcs_state': 'Y'},
-            {'nodename': 'test-device', 'rcs_state': 'N'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'default-device', rcs_state: 'Y' },
+            { nodename: 'test-device', rcs_state: 'N' },
           ],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'default-device', 'rcs_state': 'Y'},
-            {'nodename': 'test-device', 'rcs_state': 'N'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'default-device', rcs_state: 'Y' },
+            { nodename: 'test-device', rcs_state: 'N' },
           ],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'default-device', 'rcs_state': 'Y'},
-            {'nodename': 'test-device', 'rcs_state': 'N'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'default-device', rcs_state: 'Y' },
+            { nodename: 'test-device', rcs_state: 'N' },
           ],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'default-device', 'rcs_state': 'Y'},
-            {'nodename': 'test-device', 'rcs_state': 'Y'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'default-device', rcs_state: 'Y' },
+            { nodename: 'test-device', rcs_state: 'Y' },
           ],
         },
       );
@@ -571,27 +571,27 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('throws when ffx target wait times out', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('throws when ffx target wait times out', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'default-device', 'rcs_state': 'Y'},
-            {'nodename': 'test-device', 'rcs_state': 'N'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'default-device', rcs_state: 'Y' },
+            { nodename: 'test-device', rcs_state: 'N' },
           ],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'default-device', 'rcs_state': 'Y'},
-            {'nodename': 'test-device', 'rcs_state': 'N'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'default-device', rcs_state: 'Y' },
+            { nodename: 'test-device', rcs_state: 'N' },
           ],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'default-device', 'rcs_state': 'Y'},
-            {'nodename': 'test-device', 'rcs_state': 'N'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'default-device', rcs_state: 'Y' },
+            { nodename: 'test-device', rcs_state: 'N' },
           ],
         },
       );
@@ -606,20 +606,19 @@
 
       // Wait for `test-device` to be available.
       await assert.rejects(
-        () => ffx.waitForTarget(testDevice, .19),
+        () => ffx.waitForTarget(testDevice, 0.19),
         new Error('Target "test-device" failed to come online within 0.19 seconds.'),
       );
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
   });
 
-
-  describe('#showTarget', function() {
-    it('calls ffx target show for the default device successfully', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+  describe('#showTarget', function () {
+    it('calls ffx target show for the default device successfully', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'sample-device', 'target', 'show'],
-          'output': 'TARGET_SHOW_SENTINAL',
+          args: ['--target', 'sample-device', 'target', 'show'],
+          output: 'TARGET_SHOW_SENTINAL',
         },
       );
 
@@ -631,12 +630,12 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('calls ffx target show for the default device and fails', async function() {
+    it('calls ffx target show for the default device and fails', async function () {
       const errorMessage = 'Cannot show device';
-      const {actualInvocations, expectedInvocations} = mockFfx(
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'sample-device', 'target', 'show'],
-          'output': new Error(errorMessage),
+          args: ['--target', 'sample-device', 'target', 'show'],
+          output: new Error(errorMessage),
         },
       );
 
@@ -650,8 +649,8 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('does not call ffx target show without a target', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx();
+    it('does not call ffx target show without a target', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx();
       const ffx = new Ffx(TEST_CWD, TEST_FFX);
 
       const errorMessage = 'Unable to resolve the default target for ffx command: target show';
@@ -659,30 +658,30 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('calls ffx target show for the specified device', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('calls ffx target show for the specified device', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'test-device', 'target', 'show'],
-          'output': 'TARGET_SHOW_SENTINAL',
+          args: ['--target', 'test-device', 'target', 'show'],
+          output: 'TARGET_SHOW_SENTINAL',
         },
       );
 
       const ffx = new Ffx(TEST_CWD, TEST_FFX);
       ffx.targetDevice = SAMPLE_DEVICE;
 
-      const device = new FuchsiaDevice({ 'nodename': 'test-device' });
+      const device = new FuchsiaDevice({ nodename: 'test-device' });
       const stdout = await ffx.showTarget(device);
       assert.strictEqual(stdout, 'TARGET_SHOW_SENTINAL');
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
   });
 
-  describe('#ExportSnapshot', function() {
-    it('calls ffx target snapshot for the default device successfully', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+  describe('#ExportSnapshot', function () {
+    it('calls ffx target snapshot for the default device successfully', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'sample-device', 'target', 'snapshot', '-d', TEST_CWD],
-          'output': 'TARGET_SNAPSHOT_SENTINAL',
+          args: ['--target', 'sample-device', 'target', 'snapshot', '-d', TEST_CWD],
+          output: 'TARGET_SNAPSHOT_SENTINAL',
         },
       );
 
@@ -694,12 +693,12 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('calls ffx target snapshot for the default device and fails', async function() {
+    it('calls ffx target snapshot for the default device and fails', async function () {
       const errorMessage = 'Cannot snapshot device';
-      const {actualInvocations, expectedInvocations} = mockFfx(
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'sample-device', 'target', 'snapshot', '-d', TEST_CWD],
-          'output': new Error(errorMessage),
+          args: ['--target', 'sample-device', 'target', 'snapshot', '-d', TEST_CWD],
+          output: new Error(errorMessage),
         },
       );
       const ffx = new Ffx(TEST_CWD, TEST_FFX);
@@ -712,8 +711,8 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('does not call ffx target snapshot without a target', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx();
+    it('does not call ffx target snapshot without a target', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx();
       const ffx = new Ffx(TEST_CWD, TEST_FFX);
 
       const errorMessage = 'Unable to resolve the default target for ffx command: target snapshot -d /path/to/workspace';
@@ -721,40 +720,40 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('calls ffx target snapshot for the specified device', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('calls ffx target snapshot for the specified device', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
-          'args': ['--target', 'test-device', 'target', 'snapshot', '-d', TEST_CWD],
-          'output': 'TARGET_SNAPSHOT_SENTINAL',
+          args: ['--target', 'test-device', 'target', 'snapshot', '-d', TEST_CWD],
+          output: 'TARGET_SNAPSHOT_SENTINAL',
         },
       );
       const ffx = new Ffx(TEST_CWD, TEST_FFX);
       ffx.targetDevice = SAMPLE_DEVICE;
 
-      const device = new FuchsiaDevice({ 'nodename': 'test-device' });
+      const device = new FuchsiaDevice({ nodename: 'test-device' });
       const output = await ffx.exportSnapshotToCWD(device);
       assert.strictEqual(output, TEST_CWD);
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
   });
 
-  describe('#events', function() {
-    it('Verify set path events', async function() {
-      const {actualInvocations, expectedInvocations, singleCommandDuration} = mockFfx(
+  describe('#events', function () {
+    it('Verify set path events', async function () {
+      const { actualInvocations, expectedInvocations, singleCommandDuration } = mockFfx(
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': new Error('should be caught'),
+          args: ['--machine', 'json', 'target', 'list'],
+          output: new Error('should be caught'),
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'test-device', 'rcs_state': 'Y'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'test-device', rcs_state: 'Y' },
           ],
         },
       );
       const ffx = new Ffx(TEST_CWD, TEST_FFX);
       let lastEvent: FfxEventType | undefined;
-      ffx.onDidChangeConfiguration(event => {
+      ffx.onDidChangeConfiguration((event) => {
         lastEvent = event;
       });
       await singleCommandDuration(); // constructor shouldn't have any command execution side-effects.
@@ -780,50 +779,54 @@
     });
   });
 
-  describe('#onSetTarget', function() {
-    it('fired events are consistent with ffx targetDevice', async function() {
-      const {actualInvocations, expectedInvocations, singleCommandDuration} = mockFfx(
+  describe('#onSetTarget', function () {
+    it('fired events are consistent with ffx targetDevice', async function () {
+      const { actualInvocations, expectedInvocations, singleCommandDuration } = mockFfx(
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [],
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [{'nodename': 'device1'}],
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [{ nodename: 'device1' }],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [
-            {'nodename': 'sample-device', 'rcs_state': 'N'},
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [
+            { nodename: 'sample-device', rcs_state: 'N' },
           ],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [{'nodename': 'device2', 'rcs_state': 'Y'}],
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [{ nodename: 'device2', rcs_state: 'Y' }],
         },
         {
-          'args': ['--machine', 'json', 'target', 'list'],
-          'output': [{'nodename': 'device2', 'rcs_state': 'Y'}],
+          args: ['--machine', 'json', 'target', 'list'],
+          output: [{ nodename: 'device2', rcs_state: 'Y' }],
         },
       );
 
       const ffx = new Ffx(TEST_CWD, TEST_FFX);
 
       const seenDevices: ([Error | string | undefined, Error | boolean | undefined])[] = [];
-      ffx.onSetTarget(dev => {
+      ffx.onSetTarget((dev) => {
         seenDevices.push([
-          ffx.targetDevice?.nodeName === dev?.nodeName ? dev?.nodeName : (
-            new Error(
-              `onSetTarget device ${dev?.nodeName} !== ` +
-              `ffx.targetDevice?.nodeName ${ffx.targetDevice?.nodeName}`
-            )
-          ),
-          ffx.targetDevice?.connected === dev?.connected ? dev?.connected : (
-            new Error(
-              `onSetTarget connected ${dev?.connected} !== ` +
-              `ffx.targetDevice?.connected ${ffx.targetDevice?.connected}`
-            )
-          ),
+          ffx.targetDevice?.nodeName === dev?.nodeName ?
+            dev?.nodeName :
+              (
+                new Error(
+                  `onSetTarget device ${dev?.nodeName} !== ` +
+                  `ffx.targetDevice?.nodeName ${ffx.targetDevice?.nodeName}`,
+                )
+              ),
+          ffx.targetDevice?.connected === dev?.connected ?
+            dev?.connected :
+              (
+                new Error(
+                  `onSetTarget connected ${dev?.connected} !== ` +
+                  `ffx.targetDevice?.connected ${ffx.targetDevice?.connected}`,
+                )
+              ),
         ]);
       });
 
@@ -875,71 +878,71 @@
     });
   });
 
-  describe('#refreshTargets', function() {
+  describe('#refreshTargets', function () {
     // targetListData: Targets = 2, DefaultTargetCount = 1, ConnectedTargetCount = 2
     const targetListData = [
       {
-        'nodename': 'test-device',
-        'rcs_state': 'Y',
-        'serial': 'serial-11111',
-        'target_type': 'test-product',
-        'target_state': 'Product',
-        'addresses': ['fe80::41e7:ace8:59b7:3cb7%en11'],
-        'is_default': false
+        nodename: 'test-device',
+        rcs_state: 'Y',
+        serial: 'serial-11111',
+        target_type: 'test-product',
+        target_state: 'Product',
+        addresses: ['fe80::41e7:ace8:59b7:3cb7%en11'],
+        is_default: false,
       },
       {
-        'nodename': 'another-device',
-        'rcs_state': 'Y',
-        'serial': 'serial-222222',
-        'target_type': 'test-product',
-        'target_state': 'Product',
-        'addresses': ['fe80::1010:1010:1010:1010%en11'],
-        'is_default': true
-      }
+        nodename: 'another-device',
+        rcs_state: 'Y',
+        serial: 'serial-222222',
+        target_type: 'test-product',
+        target_state: 'Product',
+        addresses: ['fe80::1010:1010:1010:1010%en11'],
+        is_default: true,
+      },
     ];
 
     // newTargetList: Targets = 3, DefaultTargetCount = 1, ConnectedTargetCount = 2
     const newTargetList = [
       {
-        'nodename': 'dev1',
-        'rcs_state': 'Y',
-        'serial': 'na', 'target_type': 'na', 'target_state': 'na', 'addresses': ['127.0.0.1'],
-        'is_default': true
+        nodename: 'dev1',
+        rcs_state: 'Y',
+        serial: 'na', target_type: 'na', target_state: 'na', addresses: ['127.0.0.1'],
+        is_default: true,
       },
       {
-        'nodename': 'dev2',
-        'rcs_state': 'Y',
-        'serial': 'na', 'target_type': 'na', 'target_state': 'na', 'addresses': ['127.0.0.1'],
-        'is_default': false
+        nodename: 'dev2',
+        rcs_state: 'Y',
+        serial: 'na', target_type: 'na', target_state: 'na', addresses: ['127.0.0.1'],
+        is_default: false,
       },
       {
-        'nodename': 'dev3',
-        'rcs_state': 'N',
-        'serial': 'na', 'target_type': 'na', 'target_state': 'na', 'addresses': ['127.0.0.1'],
-        'is_default': false
-      }
+        nodename: 'dev3',
+        rcs_state: 'N',
+        serial: 'na', target_type: 'na', target_state: 'na', addresses: ['127.0.0.1'],
+        is_default: false,
+      },
     ];
 
     // newTargetListError: Targets = 2, DefaultTargetCount = 0, ConnectedTargetCount = 0
     const newTargetListError = [
       {
-        'nodename': '<unknown1>',
-        'rcs_state': 'N',
-        'serial': 'na', 'target_type': 'na', 'target_state': 'na', 'addresses': ['127.0.0.1'],
-        'is_default': false
+        nodename: '<unknown1>',
+        rcs_state: 'N',
+        serial: 'na', target_type: 'na', target_state: 'na', addresses: ['127.0.0.1'],
+        is_default: false,
       },
       {
-        'nodename': '<unknown2>',
-        'rcs_state': 'N',
-        'serial': 'na', 'target_type': 'na', 'target_state': 'na', 'addresses': ['127.0.0.1'],
-        'is_default': false
-      }
+        nodename: '<unknown2>',
+        rcs_state: 'N',
+        serial: 'na', target_type: 'na', target_state: 'na', addresses: ['127.0.0.1'],
+        is_default: false,
+      },
     ];
 
     const TARGET_LIST_ARGS = ['--machine', 'json', 'target', 'list'];
 
-    it('gets a map of device name to FuchsiaDevice and sets default to ffx default target', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('gets a map of device name to FuchsiaDevice and sets default to ffx default target', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
           args: TARGET_LIST_ARGS,
           output: targetListData,
@@ -958,8 +961,8 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('Verify device list and same default target after targetListData and then empty', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('Verify device list and same default target after targetListData and then empty', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
           args: TARGET_LIST_ARGS,
           output: targetListData,
@@ -983,8 +986,8 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('Verify device list and same default target after targetListData and then newTargetList', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('Verify device list and same default target after targetListData and then newTargetList', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
           args: TARGET_LIST_ARGS,
           output: targetListData,
@@ -1014,8 +1017,8 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('Verify device list and same default target after targetListData and then newTargetListError', async function() {
-      const {actualInvocations, expectedInvocations} = mockFfx(
+    it('Verify device list and same default target after targetListData and then newTargetListError', async function () {
+      const { actualInvocations, expectedInvocations } = mockFfx(
         {
           args: TARGET_LIST_ARGS,
           output: targetListData,
@@ -1044,10 +1047,10 @@
     });
   });
 
-  it('Timeout while calling FFX Target List', async function() {
+  it('Timeout while calling FFX Target List', async function () {
     const ffx = new Ffx(TEST_CWD, TEST_FFX);
 
-    stubbedSpawn.spawnStubInfo.callsFake(function() {
+    stubbedSpawn.spawnStubInfo.callsFake(function () {
       return stubbedSpawn.spawnEvent;
     });
 
@@ -1064,10 +1067,10 @@
     }
   });
 
-  it('calling FFX Target List with custom timeout', async function() {
+  it('calling FFX Target List with custom timeout', async function () {
     const ffx = new Ffx(TEST_CWD, TEST_FFX);
 
-    stubbedSpawn.spawnStubInfo.callsFake(function() {
+    stubbedSpawn.spawnStubInfo.callsFake(function () {
       setTimeout(() => {
         stubbedSpawn.spawnEvent.stdout?.emit('data', '[]');
         stubbedSpawn.spawnEvent.kill(0);
diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts
index 37348f4..52faffa 100644
--- a/src/test/suite/index.ts
+++ b/src/test/suite/index.ts
@@ -31,7 +31,7 @@
   return new Promise((c, e) => {
     try {
       // Run the mocha test
-      mocha.run(failures => {
+      mocha.run((failures) => {
         if (failures > 0) {
           e(Error(`${failures} tests failed.`));
         } else {
diff --git a/src/test/suite/problem_matcher.test.ts b/src/test/suite/problem_matcher.test.ts
index 90ca7ee..631536d 100644
--- a/src/test/suite/problem_matcher.test.ts
+++ b/src/test/suite/problem_matcher.test.ts
@@ -11,7 +11,7 @@
   const case1 = [
     '../../examples/file.cc:10:1: error: expected expression',
     '../../examples/file.cc:15:3: note: this should be logged :)',
-    'The fog in SF is nicknamed Karl'
+    'The fog in SF is nicknamed Karl',
   ];
 
   const case2 = [
diff --git a/src/test/suite/reporter.ts b/src/test/suite/reporter.ts
index dcd01cc..490d52b 100644
--- a/src/test/suite/reporter.ts
+++ b/src/test/suite/reporter.ts
@@ -6,12 +6,11 @@
 import * as fs from 'fs';
 import * as stream from 'stream';
 
-
 type SuiteChild = Suite | Test;
 
 interface Suite {
   name: string;
-  children: SuiteChild[],
+  children: SuiteChild[];
   tests: number;
   failures: number;
   skipped: number;
@@ -59,7 +58,9 @@
     };
 
     runner.on('suite', (suite) => {
-      if (suite.root) { return; }
+      if (suite.root) {
+        return;
+      }
       suiteStack.push(currentSuite);
       currentSuite = {
         name: suite.title,
@@ -160,4 +161,3 @@
     this.out.write('</testcase>\n');
   }
 }
-
diff --git a/src/test/suite/snap.test.ts b/src/test/suite/snap.test.ts
index fc78fd1..046fc35 100644
--- a/src/test/suite/snap.test.ts
+++ b/src/test/suite/snap.test.ts
@@ -17,13 +17,15 @@
   const onigWasmPath = require.resolve('vscode-oniguruma').replace(/main\.js$/, 'onig.wasm');
   const onigWasmRaw = await fs.readFile(onigWasmPath);
   const onigLib = onig.loadWASM(
-    onigWasmRaw.byteOffset === 0 ? onigWasmRaw.buffer : onigWasmRaw.buffer.slice(
-      onigWasmRaw.byteOffset,
-      onigWasmRaw.byteOffset + onigWasmRaw.byteLength
-    )
+    onigWasmRaw.byteOffset === 0 ?
+      onigWasmRaw.buffer :
+        onigWasmRaw.buffer.slice(
+          onigWasmRaw.byteOffset,
+          onigWasmRaw.byteOffset + onigWasmRaw.byteLength,
+        ),
   ).then(() => ({
     createOnigScanner(patterns: string[]) { return new onig.OnigScanner(patterns); },
-    createOnigString(s: string) { return new onig.OnigString(s); }
+    createOnigString(s: string) { return new onig.OnigString(s); },
   }));
 
   return new tm.Registry({
@@ -50,7 +52,7 @@
 
       // need the filename to indicate that this is JSON, no a plist
       return tm.parseRawGrammar(contents, `${ext}.json`);
-    }
+    },
   });
 }
 
@@ -86,7 +88,9 @@
   }
   const parsedLines = [];
   const splitLine = (line: string): ['#' | '>', string] => {
-    if (line.length < 1) { throw new Error('empty line in snapshot'); }
+    if (line.length < 1) {
+      throw new Error('empty line in snapshot');
+    }
     const [indicator, contents] = [line[0], line.slice(1)];
     if (indicator !== '#' && indicator !== '>') {
       throw new Error(`unknown snapshot line start character '${indicator}'`);
@@ -188,9 +192,9 @@
   for (const kind of kinds) {
     const snapDir = path.join(rootSnapDir, kind);
     // filter out the `.snap` files, so we're only left with the base input files
-    const files: [string, string][] = (await fs.readdir(snapDir)).
-      filter((file) => path.extname(file) === `.${kind}`).
-      map((file) => [file, path.join(snapDir, file)]);
+    const files: [string, string][] = (await fs.readdir(snapDir))
+      .filter(file => path.extname(file) === `.${kind}`)
+      .map(file => [file, path.join(snapDir, file)]);
     snapFiles.set(kind, files);
   }
 
diff --git a/src/test/suite/target_status_bar_item.test.ts b/src/test/suite/target_status_bar_item.test.ts
index c55c4da..3cd66a4 100644
--- a/src/test/suite/target_status_bar_item.test.ts
+++ b/src/test/suite/target_status_bar_item.test.ts
@@ -9,7 +9,7 @@
 
 import {
   TargetStatusBarItem, TargetPickAction, STATUS_PREFIX_CONNECTED,
-  STATUS_PREFIX_NOT_CONNECTED, STATUS_PREFIX_EMPTY
+  STATUS_PREFIX_NOT_CONNECTED, STATUS_PREFIX_EMPTY,
 }
   from '../../target_status_bar_item';
 import { Ffx, FfxEventType, FuchsiaDevice } from '../../ffx';
@@ -24,7 +24,7 @@
 let device1: FuchsiaDevice;
 let device2: FuchsiaDevice;
 
-describe('TargetStatusBarItemTest', function() {
+describe('TargetStatusBarItemTest', function () {
   const sandbox = createSandbox();
   let onDidChangeConfiguration: vscode.EventEmitter<FfxEventType>;
   let onDefaultTargetChange: vscode.EventEmitter<FuchsiaDevice | null>;
@@ -35,7 +35,7 @@
   let targetList: Record<string, FuchsiaDevice>;
   let commands: Record<string, (...args: unknown[]) => unknown>;
 
-  this.beforeEach(function() {
+  this.beforeEach(function () {
     // Reset device settings for each test.
     // eslint-disable-next-line @typescript-eslint/naming-convention
     device0 = new FuchsiaDevice({ nodename: DEVICE_NAME_0, rcs_state: 'Y' });
@@ -47,7 +47,7 @@
     targetList = {
       [DEVICE_NAME_0]: device0,
       [DEVICE_NAME_1]: device1,
-      [DEVICE_NAME_2]: device2
+      [DEVICE_NAME_2]: device2,
     };
     this.log = sandbox.spy(vscode.window.createOutputChannel)('test_ffx', { log: true });
     ffxTools = createStubInstance(Ffx);
@@ -74,7 +74,7 @@
     sandbox.stub(toolFinder, 'ffx').get(() => ffxTools);
   });
 
-  this.afterEach(function() {
+  this.afterEach(function () {
     onDidChangeConfiguration.dispose();
     for (const subscription of subscriptions) {
       subscription.dispose();
@@ -84,13 +84,13 @@
     sandbox.restore();
   });
 
-  describe('#constructor', function() {
-    it('creates an instance of TargetStatusBarItem', function() {
+  describe('#constructor', function () {
+    it('creates an instance of TargetStatusBarItem', function () {
       new TargetStatusBarItem(subscriptions, toolFinder);
     });
   });
 
-  describe('#behavior', function() {
+  describe('#behavior', function () {
     it('Test Status bar', async () => {
       const statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 0);
       sandbox.stub(vscode.window, 'createStatusBarItem').callsFake(() => {
@@ -164,7 +164,7 @@
           // Check that the item selected exists.
           if (!itemSelection) {
             quickPickErrors.push(new Error(
-              `Selection = "${selection ?? 'undefined'}" is not in items = [${items.map(e => e.label).join(', ')}]`
+              `Selection = "${selection ?? 'undefined'}" is not in items = [${items.map(e => e.label).join(', ')}]`,
             ));
           }
 
diff --git a/src/test/suite/test_controller/discovery.test.ts b/src/test/suite/test_controller/discovery.test.ts
index 0f03180..25c49ac 100644
--- a/src/test/suite/test_controller/discovery.test.ts
+++ b/src/test/suite/test_controller/discovery.test.ts
@@ -5,9 +5,9 @@
 import * as assert from 'assert';
 import * as vscode from 'vscode';
 import { describe, it } from 'mocha';
-import {createSandbox, type SinonStub} from 'sinon';
+import { createSandbox, type SinonStub } from 'sinon';
 
-import {Fx} from '../../../fx';
+import { Fx } from '../../../fx';
 import {
   cacheTestCases,
   discoverTestCasesLogic,
@@ -16,17 +16,17 @@
   TestcaseDiscoveryQueue,
 } from '../../../test_controller/discovery';
 
-import {macrotask, type MockedCommandInvocation, setupMockedCommand, StubbedSpawn} from '../utils';
-import {Logger, initLogger} from '../../../logger';
-import {Ffx} from '../../../ffx';
+import { macrotask, type MockedCommandInvocation, setupMockedCommand, StubbedSpawn } from '../utils';
+import { Logger, initLogger } from '../../../logger';
+import { Ffx } from '../../../ffx';
 
-describe('Test Controller Discovery', function() {
+describe('Test Controller Discovery', function () {
   const sandbox = createSandbox();
   const TEST_CWD = '/path/to/workspace';
   let controller: vscode.TestController;
   let fx: Fx;
 
-  this.beforeEach(function() {
+  this.beforeEach(function () {
     controller = vscode.tests.createTestController('TestControllerDiscovery', 'TestControllerDiscovery');
     const log = vscode.window.createOutputChannel('test_controller.test', { log: true });
     initLogger(log);
@@ -34,15 +34,15 @@
     fx = new Fx(TEST_CWD, ffx);
   });
 
-  this.afterEach(function() {
+  this.afterEach(function () {
     controller.dispose();
     sandbox.restore();
   });
 
-  describe('#fxListTestCases', function() {
+  describe('#fxListTestCases', function () {
     let stubbedSpawn: StubbedSpawn;
 
-    this.beforeEach(function() {
+    this.beforeEach(function () {
       stubbedSpawn = new StubbedSpawn(sandbox);
     });
 
@@ -52,9 +52,9 @@
       commandInvocations,
     );
 
-    it('resolves if no tests are discovered', async function() {
+    it('resolves if no tests are discovered', async function () {
       const TEST_URL = 'fuchsia-pkg://a_repo/test_pkg#meta/foo_test_component.cm';
-      const {actualInvocations, expectedInvocations} = mockCommands(
+      const { actualInvocations, expectedInvocations } = mockCommands(
         {
           args: ['fx', `--invoker=Extension: ${vscode.env.appName}`, 'test', '--logpath=-', '--list', TEST_URL],
           output: {},
@@ -69,9 +69,9 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('populates a TestItem', async function() {
+    it('populates a TestItem', async function () {
       const TEST_URL = 'fuchsia-pkg://a_repo/test_pkg#meta/bar_test_component.cm';
-      const {actualInvocations, expectedInvocations} = mockCommands(
+      const { actualInvocations, expectedInvocations } = mockCommands(
         {
           args: ['fx', `--invoker=Extension: ${vscode.env.appName}`, 'test', '--logpath=-', '--list', TEST_URL],
           output: {
@@ -83,9 +83,9 @@
                   'BarTest.testA',
                   'BarTest.testB',
                   'BarTest.testC',
-                ]
-              }
-            }
+                ],
+              },
+            },
           },
         },
       );
@@ -101,9 +101,9 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('specifies --no-build', async function() {
+    it('specifies --no-build', async function () {
       const TEST_URL = 'fuchsia-pkg://a_repo/test_pkg#meta/bar_test_component.cm';
-      const {actualInvocations, expectedInvocations} = mockCommands(
+      const { actualInvocations, expectedInvocations } = mockCommands(
         {
           args: ['fx', `--invoker=Extension: ${vscode.env.appName}`, 'test', '--logpath=-', '--list', TEST_URL, '--no-build'],
           output: {
@@ -113,9 +113,9 @@
                 // eslint-disable-next-line @typescript-eslint/naming-convention
                 test_case_names: [
                   'BarTest.testA',
-                ]
-              }
-            }
+                ],
+              },
+            },
           },
         },
       );
@@ -129,9 +129,9 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('attaches the FuchsiaTest tag', async function() {
+    it('attaches the FuchsiaTest tag', async function () {
       const TEST_URL = 'fuchsia-pkg://a_repo/test_pkg#meta/bar_test_component.cm';
-      const {actualInvocations, expectedInvocations} = mockCommands(
+      const { actualInvocations, expectedInvocations } = mockCommands(
         {
           args: ['fx', `--invoker=Extension: ${vscode.env.appName}`, 'test', '--logpath=-', '--list', TEST_URL],
           output: {
@@ -141,9 +141,9 @@
                 // eslint-disable-next-line @typescript-eslint/naming-convention
                 test_case_names: [
                   'BarTest.testA',
-                ]
-              }
-            }
+                ],
+              },
+            },
           },
         },
       );
@@ -160,9 +160,9 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('does not attach the FuchsiaTest tag', async function() {
+    it('does not attach the FuchsiaTest tag', async function () {
       const TEST_URL = 'fuchsia-pkg://a_repo/test_pkg#meta/bar_test_component.cm';
-      const {actualInvocations, expectedInvocations} = mockCommands(
+      const { actualInvocations, expectedInvocations } = mockCommands(
         {
           args: ['fx', `--invoker=Extension: ${vscode.env.appName}`, 'test', '--logpath=-', '--list', TEST_URL],
           output: {
@@ -172,9 +172,9 @@
                 // eslint-disable-next-line @typescript-eslint/naming-convention
                 test_case_names: [
                   'BarTest.testA',
-                ]
-              }
-            }
+                ],
+              },
+            },
           },
         },
       );
@@ -190,9 +190,9 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('throws if fx test errors', async function() {
+    it('throws if fx test errors', async function () {
       const TEST_URL = 'fuchsia-pkg://a_repo/test_pkg#meta/foo_test_component.cm';
-      const {actualInvocations, expectedInvocations} = mockCommands(
+      const { actualInvocations, expectedInvocations } = mockCommands(
         {
           args: ['fx', `--invoker=Extension: ${vscode.env.appName}`, 'test', '--logpath=-', '--list', TEST_URL],
           output: new Error('{}'),
@@ -205,7 +205,7 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('ignores irrelevant JSON objects', async function() {
+    it('ignores irrelevant JSON objects', async function () {
       const TEST_URL = 'fuchsia-pkg://a_repo/test_pkg#meta/foo_test_component.cm';
       const MOCK_FX_JSON_OUTPUTS = [
         undefined,
@@ -248,7 +248,7 @@
           },
         },
       ];
-      const {actualInvocations, expectedInvocations} = mockCommands(
+      const { actualInvocations, expectedInvocations } = mockCommands(
         {
           args: ['fx', `--invoker=Extension: ${vscode.env.appName}`, 'test', '--logpath=-', '--list', TEST_URL],
           output: MOCK_FX_JSON_OUTPUTS.map(obj => JSON.stringify(obj)).join('\n'),
@@ -264,9 +264,9 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('deduplicates test cases', async function() {
+    it('deduplicates test cases', async function () {
       const TEST_URL = 'fuchsia-pkg://a_repo/test_pkg#meta/foo_test_component.cm';
-      const {actualInvocations, expectedInvocations} = mockCommands(
+      const { actualInvocations, expectedInvocations } = mockCommands(
         {
           args: ['fx', `--invoker=Extension: ${vscode.env.appName}`, 'test', '--logpath=-', '--list', TEST_URL],
           output: JSON.stringify({
@@ -300,9 +300,9 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('throws if test_case_names is the wrong type', async function() {
+    it('throws if test_case_names is the wrong type', async function () {
       const TEST_URL = 'fuchsia-pkg://a_repo/test_pkg#meta/foo_test_component.cm';
-      const {actualInvocations, expectedInvocations} = mockCommands(
+      const { actualInvocations, expectedInvocations } = mockCommands(
         {
           args: ['fx', `--invoker=Extension: ${vscode.env.appName}`, 'test', '--logpath=-', '--list', TEST_URL],
           output: {
@@ -311,10 +311,10 @@
               enumerate_test_cases: {
                 // eslint-disable-next-line @typescript-eslint/naming-convention
                 test_case_names: {
-                  fooTest: TEST_URL
-                }
-              }
-            }
+                  fooTest: TEST_URL,
+                },
+              },
+            },
           },
         },
       );
@@ -325,9 +325,9 @@
       assert.deepStrictEqual(actualInvocations, expectedInvocations);
     });
 
-    it('throws if test_case_names entries are the wrong type', async function() {
+    it('throws if test_case_names entries are the wrong type', async function () {
       const TEST_URL = 'fuchsia-pkg://a_repo/test_pkg#meta/foo_test_component.cm';
-      const {actualInvocations, expectedInvocations} = mockCommands(
+      const { actualInvocations, expectedInvocations } = mockCommands(
         {
           args: ['fx', `--invoker=Extension: ${vscode.env.appName}`, 'test', '--logpath=-', '--list', TEST_URL],
           output: {
@@ -337,9 +337,9 @@
                 // eslint-disable-next-line @typescript-eslint/naming-convention
                 test_case_names: [
                   123,
-                ]
-              }
-            }
+                ],
+              },
+            },
           },
         },
       );
@@ -351,17 +351,16 @@
     });
   });
 
-  describe('TestcaseDiscoveryQueue', function() {
-    describe('#discover', function() {
-      it('populates independent TestItem discovery requests', async function() {
+  describe('TestcaseDiscoveryQueue', function () {
+    describe('#discover', function () {
+      it('populates independent TestItem discovery requests', async function () {
         const fooTestItem = controller.createTestItem('foo', 'foo');
         const barTestItem = controller.createTestItem('bar', 'bar');
 
-
         const discoverFn = sandbox.stub().callsFake(
           (_controller, _fx, testItem: vscode.TestItem) => {
             testItem.children.add(
-              controller.createTestItem(`${testItem.id}.testCase`, `${testItem.id}.testCase`)
+              controller.createTestItem(`${testItem.id}.testCase`, `${testItem.id}.testCase`),
             );
             return Promise.resolve();
           });
@@ -380,7 +379,7 @@
         assert.ok(discoverFn.secondCall.calledWith(controller, fx, barTestItem));
       });
 
-      it('performs TestItem discovery requests in parallel', async function() {
+      it('performs TestItem discovery requests in parallel', async function () {
         const fooTestItem = controller.createTestItem('foo', 'foo');
         const barTestItem = controller.createTestItem('bar', 'bar');
 
@@ -388,7 +387,7 @@
           async (_controller, _fx, testItem: vscode.TestItem) => {
             await new Promise(resolve => setTimeout(resolve, 50));
             testItem.children.add(
-              controller.createTestItem(`${testItem.id}.testCase`, `${testItem.id}.testCase`)
+              controller.createTestItem(`${testItem.id}.testCase`, `${testItem.id}.testCase`),
             );
           });
 
@@ -415,10 +414,10 @@
         assert.ok(discoverFn.secondCall.calledWith(controller, fx, barTestItem));
       });
 
-      it('populates varied concurrent TestItem discovery requests', async function() {
+      it('populates varied concurrent TestItem discovery requests', async function () {
         const MOCK_DISCOVERY_DURATION = 10;
         const discoverFn = sandbox.stub().callsFake(
-          (_controller, _fx, testItem: vscode.TestItem) => new Promise<void>(resolve => {
+          (_controller, _fx, testItem: vscode.TestItem) => new Promise<void>((resolve) => {
             setTimeout(() => {
               const child = controller.createTestItem(
                 `${testItem.id}.testCase`,
@@ -427,7 +426,7 @@
               testItem.children.add(child);
               resolve();
             }, MOCK_DISCOVERY_DURATION);
-          })
+          }),
         );
 
         const queue = TestcaseDiscoveryQueue.createForTesting(controller, fx, discoverFn);
@@ -455,7 +454,7 @@
         await initialPromise;
         assert.deepStrictEqual(
           discovered,
-          {initial: true, synchronous: false, microtask: false, macrotask: false, timed: false},
+          { initial: true, synchronous: false, microtask: false, macrotask: false, timed: false },
         );
         assert.strictEqual(initialTestItem.children.size, 1);
         assert.ok(initialTestItem.children.get('initial.testCase'));
@@ -469,7 +468,7 @@
         await synchronousPromise;
         assert.deepStrictEqual(
           discovered,
-          {initial: true, synchronous: true, microtask: false, macrotask: false, timed: false},
+          { initial: true, synchronous: true, microtask: false, macrotask: false, timed: false },
         );
         assert.strictEqual(synchronousTestItem.children.size, 1);
         assert.ok(synchronousTestItem.children.get('synchronous.testCase'));
@@ -483,7 +482,7 @@
         await microtaskPromise;
         assert.deepStrictEqual(
           discovered,
-          {initial: true, synchronous: true, microtask: true, macrotask: false, timed: false},
+          { initial: true, synchronous: true, microtask: true, macrotask: false, timed: false },
         );
         assert.strictEqual(microtaskTestItem.children.size, 1);
         assert.ok(microtaskTestItem.children.get('microtask.testCase'));
@@ -496,7 +495,7 @@
         await macrotaskPromise;
         assert.deepStrictEqual(
           discovered,
-          {initial: true, synchronous: true, microtask: true, macrotask: true, timed: false},
+          { initial: true, synchronous: true, microtask: true, macrotask: true, timed: false },
         );
         assert.strictEqual(macrotaskTestItem.children.size, 1);
         assert.ok(macrotaskTestItem.children.get('macrotask.testCase'));
@@ -505,7 +504,7 @@
         await timedPromise;
         assert.deepStrictEqual(
           discovered,
-          {initial: true, synchronous: true, microtask: true, macrotask: true, timed: true},
+          { initial: true, synchronous: true, microtask: true, macrotask: true, timed: true },
         );
         assert.strictEqual(timedTestItem.children.size, 1);
         assert.ok(timedTestItem.children.get('timed.testCase'));
@@ -515,7 +514,7 @@
         assert.strictEqual(discoverFn.callCount, 5);
       });
 
-      it('issues a notification without resolving if discovery fails', async function() {
+      it('issues a notification without resolving if discovery fails', async function () {
         const discoverFn = sandbox.stub().rejects(new Error('Discovery failed'));
         const stubShowErrorMessage = sandbox.stub(vscode.window, 'showErrorMessage') as unknown as sinon.SinonStub;
         stubShowErrorMessage.resolves('Dismiss');
@@ -537,7 +536,7 @@
         assert.strictEqual(testItem.children.size, 0);
       });
 
-      it('shows error logs if the user clicks show logs', async function() {
+      it('shows error logs if the user clicks show logs', async function () {
         const CHOICES = ['Show Logs'];
         const stubShowErrorMessage = sandbox.stub(vscode.window, 'showErrorMessage') as unknown as sinon.SinonStub;
         stubShowErrorMessage.callsFake(() => {
@@ -559,7 +558,7 @@
         assert.strictEqual(testItem.children.size, 0);
       });
 
-      it('reattempts a discovery and fails again', async function() {
+      it('reattempts a discovery and fails again', async function () {
         const CHOICES = ['Retry'];
         const stubShowErrorMessage = sandbox.stub(vscode.window, 'showErrorMessage') as unknown as sinon.SinonStub;
         stubShowErrorMessage.callsFake(() => {
@@ -584,7 +583,7 @@
         assert.strictEqual(discoverFn.callCount, 2);
       });
 
-      it('issues one notification when multiple TestItems fail in a batch', async function() {
+      it('issues one notification when multiple TestItems fail in a batch', async function () {
         const spyShowErrorMessage = sandbox.spy(vscode.window, 'showErrorMessage');
 
         const discoverFn = sandbox.stub().rejects(new Error('Discovery failed'));
@@ -611,7 +610,7 @@
         assert.strictEqual(discoverFn.callCount, 2);
       });
 
-      it('batches previous failures onto future discoveries', async function() {
+      it('batches previous failures onto future discoveries', async function () {
         const CHOICES = [
           undefined, // User clicks the (x) button on the notification.
           'Retry',
@@ -655,7 +654,7 @@
         assert.strictEqual(barTestItem.children.size, 0);
       });
 
-      it('reattempts a discovery and succeeds', async function() {
+      it('reattempts a discovery and succeeds', async function () {
         const CHOICES = ['Retry'];
         const stubShowErrorMessage = sandbox.stub(vscode.window, 'showErrorMessage') as unknown as sinon.SinonStub;
         stubShowErrorMessage.callsFake(() => {
@@ -681,7 +680,7 @@
         assert.ok(testItem.children.get('TestCase.testA'));
       });
 
-      it('only retries failing discoveries when mixed with successful discoveries', async function() {
+      it('only retries failing discoveries when mixed with successful discoveries', async function () {
         const CHOICES = ['Retry'];
         const stubShowErrorMessage = sandbox.stub(vscode.window, 'showErrorMessage') as unknown as sinon.SinonStub;
         stubShowErrorMessage.callsFake(() => {
@@ -721,7 +720,7 @@
         assert.ok(barTestItem.children.get('bar'));
       });
 
-      it('batches failing discoveries onto future discoveries when mixed with successful discoveries', async function() {
+      it('batches failing discoveries onto future discoveries when mixed with successful discoveries', async function () {
         const spyShowErrorMessage = sandbox.spy(vscode.window, 'showErrorMessage');
 
         const fooTestItem = controller.createTestItem('foo', 'foo');
@@ -768,11 +767,11 @@
         assert.ok(discoverFn.getCall(3).calledWith(controller, fx, bazTestItem));
       });
 
-      it('deduplicates 2 retry buttons rapidly clicked', async function() {
+      it('deduplicates 2 retry buttons rapidly clicked', async function () {
         const pendingErrorMessageToasts: ((choice: string | undefined) => void)[] = [];
         const stubShowErrorMessage = sandbox.stub(vscode.window, 'showErrorMessage') as unknown as sinon.SinonStub;
         stubShowErrorMessage.callsFake(() => {
-          return new Promise<string | undefined>(resolve => {
+          return new Promise<string | undefined>((resolve) => {
             pendingErrorMessageToasts.push(resolve);
           });
         });
@@ -808,17 +807,17 @@
         assert.strictEqual(stubShowErrorMessage.callCount, 3);
 
         // Final state check
-        assert.deepStrictEqual(resolved, {foo: false, bar: false});
+        assert.deepStrictEqual(resolved, { foo: false, bar: false });
         assert.strictEqual(fooTestItem.children.size, 0);
         assert.strictEqual(barTestItem.children.size, 0);
       });
     });
   });
 
-  describe('Test Case Caching', function() {
+  describe('Test Case Caching', function () {
     let memento: vscode.Memento;
 
-    this.beforeEach(function() {
+    this.beforeEach(function () {
       const storage = new Map<string, unknown>();
       memento = {
         keys: () => [...storage.keys()],
@@ -832,7 +831,7 @@
       };
     });
 
-    it('saves and restores TestItems from the cache', async function() {
+    it('saves and restores TestItems from the cache', async function () {
       const TEST_ID = 'fuchsia-pkg://a_repo/test_pkg#meta/foo_test_component.cm';
       const TEST_URI = vscode.Uri.parse('file:///path/to/workspace/foo_test.cc');
       const testCases: vscode.TestItem[] = [
@@ -860,12 +859,12 @@
       assert.strictEqual(restoredTestB.tags.length, 0);
     });
 
-    it('returns undefined for a cache miss', function() {
+    it('returns undefined for a cache miss', function () {
       const restoredTestCases = queryTestCaseCache(memento, controller, 'non-existent-id');
       assert.deepStrictEqual(restoredTestCases, undefined);
     });
 
-    it('handles test items without URIs or tags', async function() {
+    it('handles test items without URIs or tags', async function () {
       const TEST_ID = 'test-id-no-uri';
       const testCases: vscode.TestItem[] = [
         controller.createTestItem('NoUri.test', 'NoUri.test'),
@@ -883,14 +882,14 @@
     });
   });
 
-  describe('#discoverTestCasesLogic', function() {
+  describe('#discoverTestCasesLogic', function () {
     let queryCacheStub: SinonStub;
     let listTestCasesNoBuildStub: SinonStub;
     let listTestCasesWithBuildStub: SinonStub;
     let updateChildrenStub: SinonStub;
     let cacheResultStub: SinonStub;
 
-    this.beforeEach(function() {
+    this.beforeEach(function () {
       queryCacheStub = sandbox.stub();
       listTestCasesNoBuildStub = sandbox.stub();
       listTestCasesWithBuildStub = sandbox.stub();
@@ -898,7 +897,7 @@
       cacheResultStub = sandbox.stub();
     });
 
-    it('should populate children from cache first, then no-build, then with-build', async function() {
+    it('should populate children from cache first, then no-build, then with-build', async function () {
       const cachedChildren = [controller.createTestItem('cached', 'Testcase (cached)')];
       const noBuildChildren = [controller.createTestItem('no-build', 'Testcase (no-build)')];
       const withBuildChildren = [controller.createTestItem('with-build', 'Testcase (with-build)')];
@@ -913,7 +912,7 @@
         listTestCasesNoBuildStub,
         listTestCasesWithBuildStub,
         updateChildrenStub,
-        cacheResultStub
+        cacheResultStub,
       );
 
       // Verify that the cache query, cached children update, no-build discovery, and with-build
@@ -938,7 +937,7 @@
       assert.ok(cacheResultStub.getCall(1).calledWith(withBuildChildren));
     });
 
-    it('should not block on no-build results', async function() {
+    it('should not block on no-build results', async function () {
       const cachedChildren = [controller.createTestItem('cached', 'Testcase (cached)')];
       const withBuildChildren = [controller.createTestItem('with-build', 'Testcase (with-build)')];
 
@@ -952,7 +951,7 @@
         listTestCasesNoBuildStub,
         listTestCasesWithBuildStub,
         updateChildrenStub,
-        cacheResultStub
+        cacheResultStub,
       );
 
       // Verify that the cache query, cached children update, no-build discovery, and with-build
@@ -975,7 +974,7 @@
       assert.ok(cacheResultStub.calledWith(withBuildChildren));
     });
 
-    it('should reject and update with no-build results if with-build fails', async function() {
+    it('should reject and update with no-build results if with-build fails', async function () {
       const cachedChildren = [controller.createTestItem('cached', 'Testcase (cached)')];
       const noBuildChildren = [controller.createTestItem('no-build', 'Testcase (no-build)')];
 
@@ -991,10 +990,9 @@
         listTestCasesNoBuildStub,
         listTestCasesWithBuildStub,
         updateChildrenStub,
-        cacheResultStub
+        cacheResultStub,
       ));
 
-
       // Verify that the cache query, cached children update, no-build discovery, and with-build
       // discovery are all stated synchronously.
       assert.ok(queryCacheStub.calledOnce);
@@ -1015,14 +1013,14 @@
       assert.ok(cacheResultStub.calledWith(noBuildChildren));
     });
 
-    it('should not update with no-build results if with-build has already updated', async function() {
+    it('should not update with no-build results if with-build has already updated', async function () {
       const cachedChildren = [controller.createTestItem('cached', 'Testcase (cached)')];
       const noBuildChildren = [controller.createTestItem('no-build', 'Testcase (no-build)')];
       const withBuildChildren = [controller.createTestItem('with-build', 'Testcase (with-build)')];
 
       queryCacheStub.returns(cachedChildren);
       listTestCasesNoBuildStub.returns(new Promise(
-        resolve => setTimeout(() => resolve(noBuildChildren), 50)
+        resolve => setTimeout(() => resolve(noBuildChildren), 50),
       )); // Finishes slower.
       listTestCasesWithBuildStub.resolves(withBuildChildren); // Finishes quicker.
       cacheResultStub.resolves();
@@ -1032,7 +1030,7 @@
         listTestCasesNoBuildStub,
         listTestCasesWithBuildStub,
         updateChildrenStub,
-        cacheResultStub
+        cacheResultStub,
       );
 
       // Verify that the cache query, cached children update, no-build discovery, and with-build
@@ -1056,7 +1054,7 @@
       assert.ok(cacheResultStub.calledWith(withBuildChildren));
     });
 
-    it('should populate from no-build, then with-build when cache is unavailable', async function() {
+    it('should populate from no-build, then with-build when cache is unavailable', async function () {
       const noBuildChildren = [controller.createTestItem('no-build', 'Testcase (no-build)')];
       const withBuildChildren = [controller.createTestItem('with-build', 'Testcase (with-build)')];
 
@@ -1070,10 +1068,9 @@
         listTestCasesNoBuildStub,
         listTestCasesWithBuildStub,
         updateChildrenStub,
-        cacheResultStub
+        cacheResultStub,
       );
 
-
       // Verify that the cache query, and both discoveries are all stated synchronously.
       assert.ok(queryCacheStub.calledOnce);
       assert.ok(listTestCasesNoBuildStub.calledOnce);
@@ -1093,7 +1090,7 @@
       assert.ok(cacheResultStub.getCall(1).calledWith(withBuildChildren));
     });
 
-    it('should handle when no test cases are available from any source', async function() {
+    it('should handle when no test cases are available from any source', async function () {
       queryCacheStub.returns(undefined);
       listTestCasesNoBuildStub.rejects(new Error('failed to connect to target device'));
       listTestCasesWithBuildStub.rejects(new Error('failed to connect to target device'));
@@ -1104,7 +1101,7 @@
         listTestCasesNoBuildStub,
         listTestCasesWithBuildStub,
         updateChildrenStub,
-        cacheResultStub
+        cacheResultStub,
       ));
 
       // Verify that the cache query, no-build discovery, and with-build discovery are all called.
@@ -1122,7 +1119,7 @@
       assert.strictEqual(cacheResultStub.callCount, 0);
     });
 
-    it('resolves when only built testcase results are available', async function() {
+    it('resolves when only built testcase results are available', async function () {
       const withBuildChildren = [controller.createTestItem('with-build', 'Testcase (with-build)')];
       queryCacheStub.returns(undefined);
       listTestCasesNoBuildStub.rejects(new Error('test not built yet'));
@@ -1134,7 +1131,7 @@
         listTestCasesNoBuildStub,
         listTestCasesWithBuildStub,
         updateChildrenStub,
-        cacheResultStub
+        cacheResultStub,
       );
 
       // Verify that the cache query, no-build discovery, and with-build discovery are all called.
diff --git a/src/test/suite/tool_finder.test.ts b/src/test/suite/tool_finder.test.ts
index f90660d..7817b0b 100644
--- a/src/test/suite/tool_finder.test.ts
+++ b/src/test/suite/tool_finder.test.ts
@@ -17,7 +17,6 @@
   other: string;
   home: string;
 
-
   constructor() {
     this.baseDir = path.join(vscode.workspace.workspaceFolders![0].uri.path, '..');
     this.path = path.join(this.baseDir, 'workspace');
@@ -34,7 +33,7 @@
   async setFfxPath(test: Mocha.Context, newPath: string, tools: ToolFinder) {
     // first, register to be notified when the config changes
     // (needa do this before changing it so we don't race)...
-    const didChange = anEventOf(tools.onDidUpdateFfx, (evt) => !evt.isInitial);
+    const didChange = anEventOf(tools.onDidUpdateFfx, evt => !evt.isInitial);
 
     // ...then, change the config...
     await noTimeout(test, vscode.workspace.getConfiguration('fuchsia').update('ffxPath', newPath));
@@ -102,7 +101,7 @@
       // configuration.
 
       // gotta wait till we see that we went through the trouble of updating it first
-      await anEventOf(tools.onDidUpdateFfx, (evt) => evt.isInitial);
+      await anEventOf(tools.onDidUpdateFfx, evt => evt.isInitial);
       assert.strictEqual(tools.ffxPath, workspace.defaultFfx);
     });
 
diff --git a/src/test/suite/utils.ts b/src/test/suite/utils.ts
index 9e93fdb..8c1b1cd 100644
--- a/src/test/suite/utils.ts
+++ b/src/test/suite/utils.ts
@@ -48,16 +48,18 @@
 export async function separateTimeoutBudget<T>(
   test: Mocha.Context,
   task: Thenable<T>,
-  timeout: number | null
+  timeout: number | null,
 ): Promise<T> {
   const testTimeout = test.timeout();
   test.timeout(0);
   const initial = Date.now();
-  const taskDeadline = timeout === null ? [] : [
-    new Promise<T>((_, reject) =>
-      setTimeout(() => reject(new Error(`Task timeout budget ${timeout} exceeded.`)), timeout)
-    )
-  ];
+  const taskDeadline = timeout === null ?
+      [] :
+      [
+        new Promise<T>((_, reject) =>
+          setTimeout(() => reject(new Error(`Task timeout budget ${timeout} exceeded.`)), timeout),
+        ),
+      ];
   const result = await Promise.race([
     task,
     ...taskDeadline,
@@ -111,9 +113,9 @@
     // imports.  this is a teeensy bit janky, but we're on thin
     // ice with runtime stubs anyway.  we should prob use something
     // like jest or esbuild's module-replacing functionality
-    this.spawnStubInfo = sandbox.
-      stub(childProcess, 'spawn').
-      returns(this.spawnEvent) as
+    this.spawnStubInfo = sandbox
+      .stub(childProcess, 'spawn')
+      .returns(this.spawnEvent) as
       SinonStub<[
         command: string,
         args: readonly string[],
@@ -144,11 +146,11 @@
   stubbedSpawn: StubbedSpawn,
   cwd: string,
   ffxPath: string,
-  ffxInvocations: MockedCommandInvocation[]
+  ffxInvocations: MockedCommandInvocation[],
 ): {
-  actualInvocations: string[][],
-  expectedInvocations: string[][],
-  singleCommandDuration: () => Promise<void>
+  actualInvocations: string[][];
+  expectedInvocations: string[][];
+  singleCommandDuration: () => Promise<void>;
 } {
   const ANALYTICS_FLAG = ['--config', `fuchsia.analytics.ffx_invoker=Extension: ${vscode.env.appName}`];
   return setupMockedCommand(
@@ -224,11 +226,11 @@
 export function setupMockedCommand(
   stubbedSpawn: StubbedSpawn,
   cwd: string,
-  commandInvocations: MockedCommandInvocation[]
+  commandInvocations: MockedCommandInvocation[],
 ): {
-  actualInvocations: string[][],
-  expectedInvocations: string[][],
-  singleCommandDuration: () => Promise<void>
+  actualInvocations: string[][];
+  expectedInvocations: string[][];
+  singleCommandDuration: () => Promise<void>;
 } {
   const expectedInvocations = commandInvocations.map(inv => inv.args);
   const actualInvocations: string[][] = [];
@@ -236,7 +238,7 @@
   stubbedSpawn.spawnStubInfo.callsFake((
     command: string,
     args: readonly string[],
-    options: SpawnOptions
+    options: SpawnOptions,
   ) => {
     const fakeSpawnedProcess = createFakeChildProcess();
 
@@ -257,7 +259,7 @@
       if (command !== expectedInvocations[idx]?.at(0)) {
         console.warn(
           `[setupMockedCommand] Ignoring non-matching command ${command}, ` +
-          `${JSON.stringify(args)}, ${JSON.stringify(options)}`
+          `${JSON.stringify(args)}, ${JSON.stringify(options)}`,
         );
         fakeSpawnedProcess.emit('exit', 0);
         fakeSpawnedProcess.emit('close', 0);
diff --git a/src/test/suite/workflow.test.ts b/src/test/suite/workflow.test.ts
index 3107580..18fbaa6 100644
--- a/src/test/suite/workflow.test.ts
+++ b/src/test/suite/workflow.test.ts
@@ -11,7 +11,6 @@
 import { BUILD_MATCHER, logOutput } from '../../workflow/build';
 
 describe('WorkflowTest', function () {
-
   const sandbox = createSandbox();
   let logger: Logger;
   let info: SinonSpy<[message: string, category?: string | undefined, ...args: unknown[]], void>;
@@ -31,7 +30,7 @@
   describe('for fx set', function () {
     const mockMemento = {
       get: sandbox.stub(),
-      update: sandbox.stub()
+      update: sandbox.stub(),
     } as unknown as vscode.Memento;
     const pkgHistory = new PkgHistory(mockMemento);
     const prevBuild = {
@@ -41,45 +40,45 @@
           boards: {
             notes: '//boards/Product1.gni',
             title: 'Board',
-            value: 'BoardB'
+            value: 'BoardB',
           },
           // eslint-disable-next-line @typescript-eslint/naming-convention
           compilation_mode: {
             notes: null,
             title: 'Compilation mode',
-            value: 'debug'
+            value: 'debug',
           },
           products: {
             notes: '//products/BoardB.gni',
             title: 'Product',
-            value: 'Product1'
+            value: 'Product1',
           },
           // eslint-disable-next-line @typescript-eslint/naming-convention
           base_package_labels: {
             notes: '--with-base argument of `fx set`',
             title: 'Base packages',
-            value: ['//other:tests']
+            value: ['//other:tests'],
           },
           // eslint-disable-next-line @typescript-eslint/naming-convention
           cache_package_labels: {
             notes: '--with-cache argument of `fx set`',
             title: 'Cache packages',
-            value: ['//src/other:tests']
+            value: ['//src/other:tests'],
           },
           // eslint-disable-next-line @typescript-eslint/naming-convention
           developer_test_labels: {
             notes: '--with-test argument of `fx set`',
             title: 'Developer tests',
-            value: ['//other:tests']
+            value: ['//other:tests'],
           },
           // eslint-disable-next-line @typescript-eslint/naming-convention
           universe_package_labels: {
             notes: '--with argument of `fx set`',
             title: 'Universe packages',
-            value: ['//examples', '//examples:tests']
-          }
-        }
-      }
+            value: ['//examples', '//examples:tests'],
+          },
+        },
+      },
     };
     const products = ['Product1', 'Product2'];
     const boards = ['BoardA', 'BoardB', 'BoardC'];
@@ -122,11 +121,11 @@
 
     it('Has one package selected in list', () => {
       const selection = pkgHistory.update([{
-        'title': 'Universe packages',
-        'value': [
-          '//examples'
+        title: 'Universe packages',
+        value: [
+          '//examples',
         ],
-        'notes': '--with argument of `fx set`'
+        notes: '--with argument of `fx set`',
       }] as Packages[]);
       const packageList = pkgHistory.toList(selection);
       assert.equal(selection.get('Universe packages')?.size, 1);
@@ -159,7 +158,7 @@
     const expectedOutput = [
       '[1/45][  4%/00:01](959)',
       '[4/45][  8%/00:04](0)',
-      '[45/45][  100%/00:10](0)'
+      '[45/45][  100%/00:10](0)',
     ];
 
     it('Test build matcher for notification msg', () => {
@@ -181,12 +180,11 @@
           message: msg,
           category: 'fx build',
           inMatcher: !!msg.match(BUILD_MATCHER),
-          logChannel: logger
+          logChannel: logger,
         });
       });
       sandbox.assert.callCount(info, 5);
       sandbox.assert.callCount(error, 2);
     });
   });
-
 });
diff --git a/src/test/suite/zxdb/async_backtrace.test.ts b/src/test/suite/zxdb/async_backtrace.test.ts
index 6e856cc..b0f94c4 100644
--- a/src/test/suite/zxdb/async_backtrace.test.ts
+++ b/src/test/suite/zxdb/async_backtrace.test.ts
@@ -99,7 +99,7 @@
 
         const child = result.children[0];
         assert.strictEqual(child.viewId, 'root::task1::file1.ts::123::task2::file2.ts::0');
-      }
+      },
     );
 
     it('should create a nested AsyncTasks without ids, files, or lines', function () {
@@ -220,11 +220,11 @@
               name: 'task-b1',
               file: '/path/to/b1.ts',
               line: 20,
-              children: []
-            }
-          ]
-        }
-      ]
+              children: [],
+            },
+          ],
+        },
+      ],
     }, 'session-1');
 
     threadFoo2 = new AsyncBacktrace({
@@ -242,11 +242,11 @@
               name: 'task-b2',
               file: '/path/to/b2.ts',
               line: 21,
-              children: []
-            }
-          ]
-        }
-      ]
+              children: [],
+            },
+          ],
+        },
+      ],
     }, 'session-2');
 
     threadBar = new AsyncBacktrace({
@@ -258,15 +258,15 @@
           name: longName,
           file: 'relative/path/to/long.ts',
           line: 12,
-          children: []
-        }
-      ]
+          children: [],
+        },
+      ],
     }, 'session-1');
 
     threadBaz = new AsyncBacktrace({
       id: 3,
       name: 'baz',
-      tasks: []
+      tasks: [],
     }, 'session-1');
 
     taskA1 = threadFoo1.children[0];
@@ -343,7 +343,7 @@
       const expectedPath = vscode.Uri.file('/path/to/a1.ts').fsPath;
       assert.strictEqual((cmd.arguments[0] as vscode.Uri).fsPath, expectedPath);
       assert.deepStrictEqual(cmd.arguments[1], {
-        selection: new vscode.Range(9, 0, 9, 0)
+        selection: new vscode.Range(9, 0, 9, 0),
       });
     });
 
@@ -357,7 +357,7 @@
       const expectedPath = vscode.Uri.file('/some/workspace/relative/path/to/long.ts').fsPath;
       assert.strictEqual((cmd.arguments[0] as vscode.Uri).fsPath, expectedPath);
       assert.deepStrictEqual(cmd.arguments[1], {
-        selection: new vscode.Range(11, 0, 11, 0)
+        selection: new vscode.Range(11, 0, 11, 0),
       });
     });
   });
@@ -407,7 +407,7 @@
       const updatedThread = new AsyncBacktrace({
         id: 1,
         name: 'foo1-updated',
-        tasks: []
+        tasks: [],
       }, 'session-1');
       updatedThread.children.push(taskB1);
       provider.updateAsyncBacktrace(updatedThread);
@@ -429,7 +429,7 @@
       const newThread = new AsyncBacktrace({
         id: 4,
         name: 'new-thread',
-        tasks: []
+        tasks: [],
       }, 'session-1');
       provider.updateAsyncBacktrace(newThread);
 
@@ -448,7 +448,7 @@
       const emptyThread = new AsyncBacktrace({
         id: 1,
         name: 'foo1',
-        tasks: []
+        tasks: [],
       }, 'session-1');
       provider.updateAsyncBacktrace(emptyThread);
 
@@ -466,7 +466,7 @@
       const updatedThreadFoo1 = new AsyncBacktrace({
         id: 1,
         name: 'foo1-updated',
-        tasks: []
+        tasks: [],
       }, 'session-1');
       provider.updateAsyncBacktrace(updatedThreadFoo1);
 
@@ -547,7 +547,7 @@
       provider.updateAsyncBacktrace(threadFoo1);
 
       const newThread = (provider.getChildren() as AsyncBacktrace[]).find(
-        t => t.sessionId === 'session-1' && t.koid === 1
+        t => t.sessionId === 'session-1' && t.koid === 1,
       )!;
       const newTaskA = newThread.children[0];
 
@@ -564,7 +564,7 @@
       provider.updateAsyncBacktrace(threadFoo1);
 
       const newThread = (provider.getChildren() as AsyncBacktrace[]).find(
-        t => t.sessionId === 'session-1' && t.koid === 1
+        t => t.sessionId === 'session-1' && t.koid === 1,
       )!;
       const newTaskA = newThread.children[0];
 
@@ -607,7 +607,9 @@
 
     it('should fire event', function () {
       let eventsFired = 0;
-      provider.onDidChangeTreeData(() => { eventsFired++; });
+      provider.onDidChangeTreeData(() => {
+        eventsFired++;
+      });
 
       provider.reset('session-1');
       assert.strictEqual(eventsFired, 1);
@@ -622,7 +624,7 @@
       // Simulate reattach + thread state update.
       provider.updateAsyncBacktrace(threadFoo1);
       const newThread = (provider.getChildren() as AsyncBacktrace[]).find(
-        t => t.sessionId === 'session-1' && t.koid === 1
+        t => t.sessionId === 'session-1' && t.koid === 1,
       )!;
       const newTaskA = newThread.children[0];
 
diff --git a/src/test/suite/zxdb/console.test.ts b/src/test/suite/zxdb/console.test.ts
index 77e3ba6..4a2ee51 100644
--- a/src/test/suite/zxdb/console.test.ts
+++ b/src/test/suite/zxdb/console.test.ts
@@ -35,8 +35,11 @@
       this.waitResolve = resolve;
     });
   };
+
   public trigger() {
-    if (!this.waitResolve) { return; }
+    if (!this.waitResolve) {
+      return;
+    }
     this.waitResolve();
     this.waitResolve = undefined;
   }
@@ -128,7 +131,7 @@
       return {
         address: '',
         family: '',
-        port: portNumber++
+        port: portNumber++,
       };
     });
     server.listen.callsFake((listeningListener: () => void) => {
@@ -136,7 +139,9 @@
       return server;
     });
     server.close.callsFake((callback?: ((err?: Error) => void)) => {
-      if (callback) { callback(); }
+      if (callback) {
+        callback();
+      }
       return server;
     });
     sandbox.stub(mutableNet, 'createServer').returns(server);
@@ -144,9 +149,9 @@
     const session = {} as vscode.DebugSession;
     zxdbPortNumber = undefined;
     zxdbException = '';
-    return console.lauchZxdb(session, /*timeout ms*/ 50).then((portNumber) => {
+    return console.lauchZxdb(session, /* timeout ms */ 50).then((portNumber) => {
       zxdbPortNumber = portNumber;
-    }).catch(err => {
+    }).catch((err) => {
       assert.strictEqual(err instanceof Error, true);
       zxdbException = (err as Error).message.toLowerCase();
     });
@@ -315,6 +320,5 @@
       assert.deepStrictEqual(socketDestroyCallCount, socketConnectCallCount);
       assert.deepStrictEqual(zxdbProcessesRunning, [false, false]);
     });
-
   });
 });
diff --git a/src/test_controller/discovery.ts b/src/test_controller/discovery.ts
index 8672dfd..842ac11 100644
--- a/src/test_controller/discovery.ts
+++ b/src/test_controller/discovery.ts
@@ -24,13 +24,13 @@
   const testcaseDiscoveryQueue = TestcaseDiscoveryQueue.create(controller, setup.fx, savedState);
   controller.refreshHandler = async () => {
     // TODO(https://fxbug.dev/441360934): Re-enable watching when file watchers are properly managed.
-    await discoverTests(controller, /*watch=*/ false);
+    await discoverTests(controller, /* watch= */ false);
   };
 
   controller.resolveHandler = async (testItem?: TestItem) => {
     if (!testItem) {
       // TODO(https://fxbug.dev/441360934): Re-enable watching when file watchers are properly managed.
-      await discoverTests(controller, /*watch=*/ false);
+      await discoverTests(controller, /* watch= */ false);
     } else {
       await testcaseDiscoveryQueue.discover(testItem);
     }
@@ -113,7 +113,7 @@
    *   `TestItem` are discovered successfully.
    */
   discover(testItem: TestItem): Promise<void> {
-    return new Promise(resolve => {
+    return new Promise((resolve) => {
       this.queue.push([testItem, resolve]);
       this.discoverFromQueue();
     });
@@ -219,7 +219,8 @@
           }
           const relativePath = testData.relativePath;
           const uri = relativePath ?
-            vscode.Uri.joinPath(workspaceFolder.uri, relativePath) : undefined;
+              vscode.Uri.joinPath(workspaceFolder.uri, relativePath) :
+            undefined;
           const testItem = controller.createTestItem(testData.name, testData.prettyName, uri);
           if (testData.os === 'fuchsia') {
             testItem.tags = [new vscode.TestTag('FuchsiaTest')];
@@ -270,7 +271,7 @@
         // The .fx-build-dir file doesn't exist yet.
         logger.debug(`Unable to scan .fx-build-dir: ${String(ex)}`);
       }
-    })
+    }),
   );
 }
 
@@ -298,7 +299,7 @@
     () => fxListTestCases(controller, fx, testItem, true),
     () => fxListTestCases(controller, fx, testItem, false),
     (children: TestItem[]) => testItem.children.replace(children),
-    (children: TestItem[]) => cacheTestCases(savedState, testItem.id, children)
+    (children: TestItem[]) => cacheTestCases(savedState, testItem.id, children),
   );
 }
 
@@ -313,7 +314,7 @@
   listTestCasesNoBuild: () => Promise<TestItem[]>,
   listTestCasesWithBuild: () => Promise<TestItem[]>,
   updateChildren: (children: TestItem[]) => void,
-  cacheResult: (children: TestItem[]) => Promise<void>
+  cacheResult: (children: TestItem[]) => Promise<void>,
 ) {
   // 1. Restore test cases from cache, if available.
   let children = queryCache();
@@ -362,8 +363,8 @@
   controller: TestController,
   testId: string,
 ): TestItem[] | undefined {
-  return savedState.get<{id: string, label: string, uri?: string, tags: string[]}[]>(testId)
-    ?.map(({id, label, uri, tags}) => {
+  return savedState.get<{ id: string; label: string; uri?: string; tags: string[] }[]>(testId)
+    ?.map(({ id, label, uri, tags }) => {
       const child = controller.createTestItem(
         id,
         label,
@@ -444,8 +445,8 @@
 
   if (error) {
     throw new Error(
-      'Test case discovery failed due to a non-zero exit code or JSON parsing error.'
-      + `\nCommand output:\n${process.rawOutput}`
+      'Test case discovery failed due to a non-zero exit code or JSON parsing error.' +
+      `\nCommand output:\n${process.rawOutput}`,
     );
   }
   return testCases;
diff --git a/src/test_controller/test_controller.ts b/src/test_controller/test_controller.ts
index 91e47bb..6ebe7fa 100644
--- a/src/test_controller/test_controller.ts
+++ b/src/test_controller/test_controller.ts
@@ -25,7 +25,7 @@
     vscode.TestRunProfileKind.Run,
     (request) => {
       void runTest(controller, setup.fx, false, request);
-    }
+    },
   );
 
   controller.createRunProfile(
@@ -35,7 +35,7 @@
       void runTest(controller, setup.fx, true, request);
     },
     false,
-    new vscode.TestTag('FuchsiaTest')
+    new vscode.TestTag('FuchsiaTest'),
   );
 }
 
@@ -63,7 +63,7 @@
   controller: TestController,
   fx: Fx,
   debug: boolean,
-  request: vscode.TestRunRequest
+  request: vscode.TestRunRequest,
 ) {
   const run = controller.createTestRun(request);
   try {
@@ -100,7 +100,7 @@
           const message = new vscode.TestMessage(
             `Unable to attach zxdb to ${testURL}\n` +
             'See "Fuchsia Extension" in the `Output` tab for more details.\n' +
-            'Alternatively, you can run the test without debugging.'
+            'Alternatively, you can run the test without debugging.',
           );
           run.errored(testItem, message);
           continue;
diff --git a/src/tool_finder.ts b/src/tool_finder.ts
index 3d54ca1..97db81e 100644
--- a/src/tool_finder.ts
+++ b/src/tool_finder.ts
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-
 import * as vscode from 'vscode';
 import * as fs from 'fs';
 import * as logger from './logger';
@@ -34,10 +33,10 @@
 
     this.ffxInternal = new Ffx(cwd, undefined);
     this.fxInternal = new Fx(cwd, this.ffxInternal);
-    this.updateFfxPath(true).catch((err) => logger.error('unable to configure initial ffx location', undefined, err));
-    vscode.workspace.onDidChangeConfiguration(event => {
+    this.updateFfxPath(true).catch(err => logger.error('unable to configure initial ffx location', undefined, err));
+    vscode.workspace.onDidChangeConfiguration((event) => {
       if (event.affectsConfiguration(`${CONFIG_ROOT_NAME}.ffxPath`)) {
-        this.updateFfxPath(false).catch((err) => logger.error('unable to reconfigure ffx location', undefined, err));
+        this.updateFfxPath(false).catch(err => logger.error('unable to reconfigure ffx location', undefined, err));
       }
     });
   }
diff --git a/src/workflow/build.ts b/src/workflow/build.ts
index a26d873..7661d89 100644
--- a/src/workflow/build.ts
+++ b/src/workflow/build.ts
@@ -64,7 +64,7 @@
   category: string,
   collection: FuchsiaDiagnostics,
   progress: vscode.Progress<{ message?: string; increment?: number }>,
-  percentage: { value: number }
+  percentage: { value: number },
 ) {
   const msg = new TextDecoder().decode(buffer);
   const match = BUILD_MATCHER.exec(msg);
@@ -108,8 +108,8 @@
         const percentage = { value: 0 };
         const cmd = setup.fx.runAsync(
           ['build'],
-          (buffer) => handleData(buffer, 'fx build', collection, progress, percentage),
-          (buffer) => handleData(buffer, 'fx build', collection, progress, percentage)
+          buffer => handleData(buffer, 'fx build', collection, progress, percentage),
+          buffer => handleData(buffer, 'fx build', collection, progress, percentage),
         );
 
         token.onCancellationRequested(() => {
@@ -125,11 +125,11 @@
         if (exitCode === 1) {
           logger.error('fx build stopped: failed [code=1]', 'fx build');
           void window.showErrorMessage(
-            'Build stopped, [see output for details](command:fuchsia.showOutput)'
+            'Build stopped, [see output for details](command:fuchsia.showOutput)',
           );
           return Promise.reject(new Error(`fx build failed with exit code ${exitCode}`));
         }
-      }
+      },
     );
   });
 }
@@ -149,8 +149,8 @@
         const percentage = { value: 0 };
         const cmd = setup.fx.runAsync(
           ['ota', '--build'],
-          (buffer) => handleData(buffer, 'fx ota', collection, progress, percentage),
-          (buffer) => handleData(buffer, 'fx ota', collection, progress, percentage)
+          buffer => handleData(buffer, 'fx ota', collection, progress, percentage),
+          buffer => handleData(buffer, 'fx ota', collection, progress, percentage),
         );
 
         token.onCancellationRequested(() => {
@@ -161,10 +161,10 @@
         progress.report({ message: '[(details)](command:fuchsia.showOutput)' });
 
         const exitCode = await cmd?.exitCode;
-        return exitCode === 0
-          ? Promise.resolve()
-          : Promise.reject(new Error(`fx ota failed with exit code ${exitCode}`));
-      }
+        return exitCode === 0 ?
+            Promise.resolve() :
+            Promise.reject(new Error(`fx ota failed with exit code ${exitCode}`));
+      },
     );
   });
 }
@@ -184,8 +184,8 @@
         const percentage = { value: 0 };
         const cmd = setup.fx.runAsync(
           ['ota', '--no-build'],
-          (buffer) => handleData(buffer, 'fx ota', collection, progress, percentage),
-          (buffer) => handleData(buffer, 'fx ota', collection, progress, percentage)
+          buffer => handleData(buffer, 'fx ota', collection, progress, percentage),
+          buffer => handleData(buffer, 'fx ota', collection, progress, percentage),
         );
 
         token.onCancellationRequested(() => {
@@ -196,10 +196,10 @@
         progress.report({ message: '[(details)](command:fuchsia.showOutput)' });
 
         const exitCode = await cmd?.exitCode;
-        return exitCode === 0
-          ? Promise.resolve()
-          : Promise.reject(new Error(`fx ota failed with exit code ${exitCode}`));
-      }
+        return exitCode === 0 ?
+            Promise.resolve() :
+            Promise.reject(new Error(`fx ota failed with exit code ${exitCode}`));
+      },
     );
   });
 }
@@ -213,7 +213,7 @@
 export function registerBuildCommands(
   _ctx: vscode.ExtensionContext,
   setup: Setup,
-  collection: FuchsiaDiagnostics
+  collection: FuchsiaDiagnostics,
 ) {
   registerFxBuild(setup, collection);
   registerFxoOta(setup, collection);
diff --git a/src/workflow/index.ts b/src/workflow/index.ts
index 3179497..3d7d04b 100644
--- a/src/workflow/index.ts
+++ b/src/workflow/index.ts
@@ -28,7 +28,7 @@
     void window.withProgress({
       location: vscode.ProgressLocation.Notification,
       title: 'fx serve',
-      cancellable: true
+      cancellable: true,
     }, async (progress, token) => {
       const cmd = setup.fx.runAsync(['serve', '--background'], handleData, handleData);
 
@@ -38,9 +38,9 @@
       });
 
       const exitCode = await cmd?.exitCode;
-      return exitCode === 0
-        ? Promise.resolve()
-        : Promise.reject(new Error(`fx serve failed with exit code ${exitCode}`));
+      return exitCode === 0 ?
+          Promise.resolve() :
+          Promise.reject(new Error(`fx serve failed with exit code ${exitCode}`));
 
       /** callback to handle buffer from process */
       function handleData(buffer: Buffer) {
@@ -79,7 +79,7 @@
           const msg = new TextDecoder().decode(data);
           const list = toList(msg.split('\n'));
           const selected = await window.showQuickPick(list, {
-            title: 'Select build directory'
+            title: 'Select build directory',
           });
           const dir = selected?.label;
 
@@ -100,8 +100,7 @@
         })();
       }, () => {
         // Ignore since err returns 'INFO: listing build directories:'
-      }
+      },
     );
   });
-
 }
diff --git a/src/workflow/problem_matcher.ts b/src/workflow/problem_matcher.ts
index c39510c..51e37f9 100644
--- a/src/workflow/problem_matcher.ts
+++ b/src/workflow/problem_matcher.ts
@@ -6,9 +6,9 @@
 import * as vscode from 'vscode';
 
 const buildSeverity: Record<string, vscode.DiagnosticSeverity> = {
-  'error': vscode.DiagnosticSeverity.Error,
-  'warn': vscode.DiagnosticSeverity.Warning,
-  'note': vscode.DiagnosticSeverity.Information
+  error: vscode.DiagnosticSeverity.Error,
+  warn: vscode.DiagnosticSeverity.Warning,
+  note: vscode.DiagnosticSeverity.Information,
 };
 
 interface ProblemMatcher {
@@ -53,7 +53,7 @@
    */
   match(msg: string) {
     const matcher = this.fuchsiaProblemMatcher.find(
-      (item: { name: string; }) => item.name === 'cpp-rust-build');
+      (item: { name: string }) => item.name === 'cpp-rust-build');
     const pattern = new RegExp(matcher!.pattern.regexp, 'g');
     const matches = msg.matchAll(pattern);
 
@@ -78,7 +78,7 @@
             parseInt(match[matcher!.pattern.column]) - 1),
           new vscode.Position(parseInt(match[matcher!.pattern.line]) - 1,
             parseInt(match[matcher!.pattern.column]) - 1)),
-        severity: buildSeverity[match[matcher!.pattern.severity]]
+        severity: buildSeverity[match[matcher!.pattern.severity]],
       }]]);
     }
     this.collection.set(this.entries);
diff --git a/src/workflow/set.ts b/src/workflow/set.ts
index 9ffa589..050cb7f 100644
--- a/src/workflow/set.ts
+++ b/src/workflow/set.ts
@@ -43,16 +43,16 @@
 export function toList(
   output: string[],
   currentPick?: string,
-  placeholders?: Map<string, string>
+  placeholders?: Map<string, string>,
 ): vscode.QuickPickItem[] {
   const list = output
-    .filter((item) => item)
-    .map<vscode.QuickPickItem>((item) => ({
+    .filter(item => item)
+    .map<vscode.QuickPickItem>(item => ({
       label: item,
       detail: placeholders?.get(item),
     }));
 
-  const currentPickIndex = list.findIndex((item) => item.label === currentPick);
+  const currentPickIndex = list.findIndex(item => item.label === currentPick);
   if (currentPickIndex > -1) {
     const [currentItem] = list.splice(currentPickIndex, 1);
     currentItem.description = '(Current)';
@@ -84,14 +84,14 @@
    */
   remove(items: { title: string; value: string }[]): void {
     const removePackageFromGroup = (title: string, value: string) => {
-      const group = this.pkgHistory.find((p) => p.title === title);
+      const group = this.pkgHistory.find(p => p.title === title);
       if (group) {
-        group.value = group.value.filter((v) => v !== value);
+        group.value = group.value.filter(v => v !== value);
       }
     };
-    items.forEach((item) => removePackageFromGroup(item.title, item.value));
+    items.forEach(item => removePackageFromGroup(item.title, item.value));
     // Remove empty groups
-    this.pkgHistory = this.pkgHistory.filter((p) => p.value.length > 0);
+    this.pkgHistory = this.pkgHistory.filter(p => p.value.length > 0);
 
     void this.memento.update('pkgHistory', this.pkgHistory);
   }
@@ -153,7 +153,7 @@
     }
 
     // Merge status packages into history
-    const historyMap = new Map(this.pkgHistory.map((pkg) => [pkg.title, pkg]));
+    const historyMap = new Map(this.pkgHistory.map(pkg => [pkg.title, pkg]));
     statusPkgs.forEach((statusPkg) => {
       const existingPkg = historyMap.get(statusPkg.title);
       // If the package group is new, add it to the history.
@@ -189,8 +189,8 @@
       const statusData = data as {
         buildInfo: {
           items: Record<string,
-            | { value: string; title?: string; notes?: string }
-            | Packages
+          | { value: string; title?: string; notes?: string } |
+          Packages
           >;
         };
       };
@@ -210,7 +210,7 @@
             status.packages.push(buildInfo[item] as Packages);
         }
       }
-    }
+    },
   );
   await process.exitCode;
   return status;
@@ -221,7 +221,7 @@
  */
 async function promptForProduct(
   products: string[],
-  currentProduct: string
+  currentProduct: string,
 ): Promise<string | undefined> {
   const list = toList(products, currentProduct, PRODUCT_PLACEHOLDERS);
   const selected = await window.showQuickPick(list, { title: 'Select Product' });
@@ -233,7 +233,7 @@
  */
 async function promptForBoard(
   boards: string[],
-  currentBoard: string
+  currentBoard: string,
 ): Promise<string | undefined> {
   const list = toList(boards, currentBoard);
   const selected = await window.showQuickPick(list, { title: 'Select Board' });
@@ -244,7 +244,7 @@
  * Prompts the user to select a compilation mode.
  */
 async function promptForCompilation(
-  currentCompilation: string
+  currentCompilation: string,
 ): Promise<string | undefined> {
   const list = toList(Object.keys(CompilationModes), currentCompilation);
   const selected = await window.showQuickPick(list, {
@@ -258,7 +258,7 @@
  */
 async function promptForPackages(
   pkgHistory: PkgHistory,
-  currentPackages: Packages[]
+  currentPackages: Packages[],
 ): Promise<vscode.QuickPickItem[] | undefined> {
   if (currentPackages.length === 0 && pkgHistory.get().length === 0) {
     return [];
@@ -311,7 +311,7 @@
     board?: string;
     compilation?: string;
     packages?: vscode.QuickPickItem[];
-  }
+  },
 ): boolean {
   const lastMode =
     CompilationModes[last.compilation as keyof typeof CompilationModes];
@@ -343,7 +343,7 @@
   product: string,
   board: string,
   compilation: string,
-  packages: vscode.QuickPickItem[]
+  packages: vscode.QuickPickItem[],
 ): string[] {
   const args = [
     'set',
@@ -374,8 +374,8 @@
     async (_progress, token) => {
       const cmd = setup.fx.runAsync(
         args,
-        (buffer) => logger.info(new TextDecoder().decode(buffer), 'fx set'),
-        (buffer) => logger.error(new TextDecoder().decode(buffer), 'fx set')
+        buffer => logger.info(new TextDecoder().decode(buffer), 'fx set'),
+        buffer => logger.error(new TextDecoder().decode(buffer), 'fx set'),
       );
 
       token.onCancellationRequested(() => {
@@ -388,12 +388,12 @@
         void window.showInformationMessage('fx set completed');
         logger.info(
           'fx set process executed successfully [exit code = 0]',
-          'fx set'
+          'fx set',
         );
       } else {
         logger.warn(`fx set stopped with exit code: ${exitCode}`, 'fx set');
       }
-    }
+    },
   );
 }
 
@@ -401,7 +401,7 @@
 export function registerSetCommand(
   _ctx: vscode.ExtensionContext,
   setup: Setup,
-  pkgHistory: PkgHistory
+  pkgHistory: PkgHistory,
 ) {
   registerCommandWithAnalyticsEvent(
     'fuchsia.fx.set',
@@ -409,7 +409,7 @@
       product?: string,
       board?: string,
       compilation?: string,
-      packages?: vscode.QuickPickItem[]
+      packages?: vscode.QuickPickItem[],
     ) => {
       const status = await getStatus(setup);
 
@@ -456,32 +456,32 @@
         selectedProduct,
         selectedBoard,
         selectedCompilation,
-        selectedPackages
+        selectedPackages,
       );
 
       runFuchsiaSet(setup, args);
-    }
+    },
   );
 }
 
 /** Registers the `fuchsia.clearPackageHistory` command. */
 export function registerClearPackageHistoryCommand(
   _ctx: vscode.ExtensionContext,
-  pkgHistory: PkgHistory
+  pkgHistory: PkgHistory,
 ) {
   registerCommandWithAnalyticsEvent(
     'fuchsia.clearPackageHistory',
     () => {
       pkgHistory.clear();
       void window.showInformationMessage('Fuchsia package history cleared.');
-    }
+    },
   );
 }
 
 /** Registers the `fuchsia.removePackageFromHistory` command. */
 export function registerRemovePackageCommand(
   _ctx: vscode.ExtensionContext,
-  pkgHistory: PkgHistory
+  pkgHistory: PkgHistory,
 ) {
   registerCommandWithAnalyticsEvent(
     'fuchsia.removePackageFromHistory',
@@ -524,14 +524,14 @@
 
       if (selected && selected.length > 0) {
         const itemsToRemove = selected
-          .map((item) => itemMap.get(item))
+          .map(item => itemMap.get(item))
           .filter((i): i is { title: string; value: string } => !!i);
 
         pkgHistory.remove(itemsToRemove);
         void window.showInformationMessage(
-          `Removed ${itemsToRemove.length} item(s) from package history.`
+          `Removed ${itemsToRemove.length} item(s) from package history.`,
         );
       }
-    }
+    },
   );
 }
diff --git a/src/workflow/task_provider.ts b/src/workflow/task_provider.ts
index e7b6064..89e8a96 100644
--- a/src/workflow/task_provider.ts
+++ b/src/workflow/task_provider.ts
@@ -12,21 +12,21 @@
     provideTasks(): vscode.Task[] {
       const buildTask = new vscode.Task(
         {
-          type: 'fuchsia', 'presentation': {
-            'showReuseMessage': false,
-          }
+          type: 'fuchsia', presentation: {
+            showReuseMessage: false,
+          },
         },
         vscode.TaskScope.Workspace,
         'fx build',
         'Fuchsia Extension',
         new vscode.ShellExecution('fx build'),
-        '$cpp-rust-build'
+        '$cpp-rust-build',
       );
       buildTask.group = vscode.TaskGroup.Build;
       return [buildTask];
     },
     resolveTask(task: vscode.Task): vscode.ProviderResult<vscode.Task> {
       return task;
-    }
+    },
   });
 }
diff --git a/src/zxdb/async_backtrace.ts b/src/zxdb/async_backtrace.ts
index 7a04b40..27b4426 100644
--- a/src/zxdb/async_backtrace.ts
+++ b/src/zxdb/async_backtrace.ts
@@ -42,10 +42,10 @@
 
   constructor(
     { viewId, name, children }: {
-      viewId: string,
-      name: string,
-      children: AsyncTask[]
-    }
+      viewId: string;
+      name: string;
+      children: AsyncTask[];
+    },
   ) {
     this.viewId = viewId;
     this.name = name;
@@ -110,6 +110,7 @@
 
   private _onDidChangeTreeData: vscode.EventEmitter<AsyncObject | void> =
     new vscode.EventEmitter<AsyncObject | void>();
+
   readonly onDidChangeTreeData: vscode.Event<AsyncObject | void> = this._onDidChangeTreeData.event;
 
   /**
@@ -130,16 +131,16 @@
   public getTreeItem(element: AsyncObject): vscode.TreeItem {
     // Task names often come with verbose, less useful namespace prefixes, so truncate them to
     // better fit the relevant part of that name.
-    const label = element instanceof AsyncTask && element.name.length > kMaxLabelLength
-      ? '…' + element.name.slice(-(kMaxLabelLength - 1))
-      : element.name;
+    const label = element instanceof AsyncTask && element.name.length > kMaxLabelLength ?
+      '…' + element.name.slice(-(kMaxLabelLength - 1)) :
+      element.name;
     const item = new vscode.TreeItem(label);
     item.id = element.viewId;
 
     if (element.children.length) {
-      item.collapsibleState = this.expandedViewIds.has(element.viewId)
-        ? vscode.TreeItemCollapsibleState.Expanded
-        : vscode.TreeItemCollapsibleState.Collapsed;
+      item.collapsibleState = this.expandedViewIds.has(element.viewId) ?
+        vscode.TreeItemCollapsibleState.Expanded :
+        vscode.TreeItemCollapsibleState.Collapsed;
     } else {
       item.collapsibleState = vscode.TreeItemCollapsibleState.None;
     }
@@ -151,13 +152,13 @@
     } else if (element instanceof AsyncTask && element.file) {
       item.description = `${path.basename(element.file)}${element.line ? `:${element.line}` : ''}`;
 
-      const filePath = path.isAbsolute(element.file)
-        ? element.file
-        : path.resolve(this.workspaceRoot, element.file);
+      const filePath = path.isAbsolute(element.file) ?
+        element.file :
+          path.resolve(this.workspaceRoot, element.file);
       const args: unknown[] = [vscode.Uri.file(filePath)];
       if (element.line) {
         args.push({
-          selection: new vscode.Range(element.line - 1, 0, element.line - 1, 0)
+          selection: new vscode.Range(element.line - 1, 0, element.line - 1, 0),
         });
       }
 
@@ -185,7 +186,7 @@
       throw new Error('AsyncBacktrace.threadExists must be true.');
     }
     const existingIndex = this.asyncBacktraces.findIndex(
-      t => t.sessionId === backtrace.sessionId && t.koid === backtrace.koid
+      t => t.sessionId === backtrace.sessionId && t.koid === backtrace.koid,
     );
     // This `backtrace`'s thread is either new or has been updated.
     // Either add it to the async-backtrace pane, or update the existing entry if it's already
@@ -210,7 +211,7 @@
       throw new Error('AsyncBacktrace.threadExists must be false.');
     }
     const existingIndex = this.asyncBacktraces.findIndex(
-      t => t.sessionId === thread.sessionId && t.koid === thread.koid
+      t => t.sessionId === thread.sessionId && t.koid === thread.koid,
     );
     if (existingIndex === -1) {
       logger.error(
@@ -223,7 +224,7 @@
 
     // Prune `expandedViewIds`.
     this.expandedViewIds.delete(thread.viewId);
-    this.expandedViewIds.forEach(id => {
+    this.expandedViewIds.forEach((id) => {
       if (id.startsWith(`${thread.viewId}::`)) {
         this.expandedViewIds.delete(id);
       }
@@ -253,7 +254,7 @@
    */
   public reset(sessionId: string) {
     this.asyncBacktraces = this.asyncBacktraces.filter(t => t.sessionId !== sessionId);
-    this.expandedViewIds.forEach(id => {
+    this.expandedViewIds.forEach((id) => {
       if (id.startsWith(`${sessionId}::`)) {
         this.expandedViewIds.delete(id);
       }
@@ -271,11 +272,11 @@
  */
 export function setUpAsyncBacktrace(ctx: vscode.ExtensionContext, setup: Setup) {
   const provider = new AsyncBacktraceProvider(
-    setup.fx.fuchsiaDir
-      ?? vscode.workspace.workspaceFolders?.[0]?.uri.fsPath
-      ?? process.cwd()
+    setup.fx.fuchsiaDir ??
+    vscode.workspace.workspaceFolders?.[0]?.uri.fsPath ??
+    process.cwd(),
   );
-  const asyncBacktraceUpdateListener = vscode.debug.onDidReceiveDebugSessionCustomEvent(e => {
+  const asyncBacktraceUpdateListener = vscode.debug.onDidReceiveDebugSessionCustomEvent((e) => {
     if (e.session.type !== kSessionType || e.event !== kEventName) {
       return;
     }
@@ -304,12 +305,12 @@
   const expandListener = treeView.onDidExpandElement(
     (e: vscode.TreeViewExpansionEvent<AsyncObject>) => {
       provider.updateTreeItemExpanded(e.element, true);
-    }
+    },
   );
   const collapseListener = treeView.onDidCollapseElement(
     (e: vscode.TreeViewExpansionEvent<AsyncObject>) => {
       provider.updateTreeItemExpanded(e.element, false);
-    }
+    },
   );
 
   const debugSessionTerminateListener = vscode.debug.onDidTerminateDebugSession(
@@ -317,7 +318,7 @@
       if (session.type === kSessionType) {
         provider.reset(session.id);
       }
-    }
+    },
   );
 
   ctx.subscriptions.push(
diff --git a/src/zxdb/console.ts b/src/zxdb/console.ts
index 8f50717..85d3493 100644
--- a/src/zxdb/console.ts
+++ b/src/zxdb/console.ts
@@ -12,7 +12,6 @@
 import { type ChildProcessWithoutNullStreams } from 'child_process';
 import { Fx } from '../fx';
 
-
 const ZXDB_COMMAND_OPT = ['debug', '--new-agent', '--', '--enable-debug-adapter'];
 // Although `ffx debug connect` typically services requests within a second of launch,
 // `fx debug` might start a temporary package server, so use a 30 second timeout.
@@ -57,13 +56,15 @@
   public async lauchZxdb(session: vscode.DebugSession, timeoutOverride?: number) {
     let inputPort = await this.findFreePort();
     // TODO(fxbug.dev/112695): Capture analytics for how frequently we relaunch.
-    return this.connectToZxdb(session, inputPort, /*errorOnBindFailure*/false, timeoutOverride)
+    return this.connectToZxdb(session, inputPort, /* errorOnBindFailure */false, timeoutOverride)
       .then(async (portNumber) => {
-        if (portNumber !== INVALID_SERVER_PORT) { return portNumber; }
+        if (portNumber !== INVALID_SERVER_PORT) {
+          return portNumber;
+        }
 
         // Find a free port, and try connecting again.
         inputPort = await this.findFreePort();
-        return await this.connectToZxdb(session, inputPort, /*errorOnBindFailure*/true,
+        return await this.connectToZxdb(session, inputPort, /* errorOnBindFailure */true,
           timeoutOverride);
       });
   }
@@ -94,11 +95,15 @@
 
       const exitAndCleanUp = () => {
         done = true;
-        if (socket) { socket.destroy(); }
+        if (socket) {
+          socket.destroy();
+        }
       };
 
       const onCloseCallback = (errorMsg: string) => {
-        if (done) { return; }
+        if (done) {
+          return;
+        }
         exitAndCleanUp();
 
         if (!exceptionOnFailure) {
@@ -118,14 +123,18 @@
         logger.debug(`attempting to connect to localhost:${portNumber}`);
 
         socket.on('connect', () => {
-          if (done) { return; }
+          if (done) {
+            return;
+          }
           exitAndCleanUp();
           logger.info('zxdb console has started.');
           resolve(portNumber);
         });
 
         const retryConnect = async () => {
-          if (done) { return; }
+          if (done) {
+            return;
+          }
           socket.destroy();
           await this.sleep(this.retryWaitTimeMs ?? 1000);
           connect();
@@ -142,7 +151,9 @@
       connect();
 
       const timeoutTimer = setTimeout(() => {
-        if (done) { return; }
+        if (done) {
+          return;
+        }
         exitAndCleanUp();
         // End the process that was started from this request
         zxdbProcess?.kill();
diff --git a/src/zxdb/index.ts b/src/zxdb/index.ts
index 1a392a9..dde387a 100644
--- a/src/zxdb/index.ts
+++ b/src/zxdb/index.ts
@@ -59,8 +59,7 @@
       const cfg = config as vscode.DebugConfiguration | undefined;
       let promptText: string;
       if (cfg?.request === 'launch') {
-        promptText =
-          'Launch(zxdb): Enter name of the process that will be launched.' +
+        promptText = 'Launch(zxdb): Enter name of the process that will be launched.' +
           ' Hint: For components, it\'s usually the component name.';
       } else {
         promptText = 'Attach(zxdb): Enter name of the process to debug.' +
@@ -71,7 +70,7 @@
       return vscode.window.showInputBox({
         placeHolder: '(e.g. hello-world-test)',
         value: '',
-        prompt: promptText
+        prompt: promptText,
       });
     }));
 
@@ -81,7 +80,7 @@
         placeHolder: '(e.g. fx test hello-world-test)',
         value: '',
         prompt:
-          'Launch(zxdb): Enter launch command. This will be run in the vscode terminal.'
+          'Launch(zxdb): Enter launch command. This will be run in the vscode terminal.',
       });
     }));
 
@@ -90,7 +89,7 @@
       return vscode.window.showInputBox({
         placeHolder: '(e.g. scenic)',
         value: '',
-        prompt: 'Attach(zxdb): Enter a process or component identifier (name, koid, or URL).'
+        prompt: 'Attach(zxdb): Enter a process or component identifier (name, koid, or URL).',
       });
     }));
 }
@@ -125,7 +124,7 @@
         type: 'zxdb',
         request: 'attach',
         process: process,
-        recursive: true
+        recursive: true,
       });
     }));
 
@@ -154,7 +153,7 @@
   // Final updates to debug configuration can be done here.
   resolveDebugConfigurationWithSubstitutedVariables(
     _folder: WorkspaceFolder | undefined,
-    config: DebugConfiguration
+    config: DebugConfiguration,
   ): ProviderResult<DebugConfiguration> {
     // Return null if launch.json is empty or missing.
     if (!config.type && !config.request && !config.name) {
@@ -233,6 +232,7 @@
       }
     }
   }
+
   dispose() { this.send.dispose(); }
 }
 
@@ -266,12 +266,11 @@
       this.ignoreError = true;
       const disconnectRequest = request as { arguments?: { restart?: boolean } };
       this.restart = !!disconnectRequest?.arguments?.restart;
-    } if (request.command === 'terminate') {
+    } else if (request.command === 'terminate') {
       // Ignore errors reported after this. The connection is closed by the
       // backend and hence debug adapter reports connection loss errors.
       this.ignoreError = true;
-    }
-    else if (request.command === 'runInTerminal') {
+    } else if (request.command === 'runInTerminal') {
       const response = message as DebugProtocol.RunInTerminalResponse;
       if (response.body.shellProcessId) {
         this.launchPID = getChildPID(response.body.shellProcessId);
@@ -344,7 +343,7 @@
 function destroyZxdbLaunch(pid: number | undefined) {
   if (pid) {
     logger.info(`zxdb launch (PID:${pid}) is destroyed.`);
-    process.kill(-pid, 2);  // SIGINT
+    process.kill(-pid, 2); // SIGINT
   }
 }
 
@@ -354,7 +353,7 @@
 function _runCommand(cmd: string, ...args: string[]): Promise<void> {
   return new Promise((resolve, reject) => {
     const process = spawn(cmd, args);
-    process.on('close', code => {
+    process.on('close', (code) => {
       if (code) {
         reject(new Error(`Command "${JSON.stringify([cmd, ...args])}" exited with code ${code}.`));
       } else {
@@ -362,7 +361,7 @@
       }
     });
 
-    process.on('error', err => {
+    process.on('error', (err) => {
       reject(new Error(`Failed to start command ${JSON.stringify([cmd, ...args])}: ${err}`));
     });
   });
diff --git a/syntax/cml.ts b/syntax/cml.ts
index 4f34dae..753a216 100644
--- a/syntax/cml.ts
+++ b/syntax/cml.ts
@@ -175,7 +175,7 @@
   return keyValue(
     args.name,
     [
-      arrayBlock([dictionaryBlock(args.inner)])
+      arrayBlock([dictionaryBlock(args.inner)]),
     ],
   );
 }
@@ -268,7 +268,7 @@
   pattern ??= [patterns.anyString()];
   const keyPattern = key ?? patterns.oneFrom(
     patterns.named(name, 'keyword.control'),
-    patterns.oneString(name, 'keyword.control')
+    patterns.oneString(name, 'keyword.control'),
   );
   return block({
     name: `meta.meta-${name}-block`,
@@ -318,9 +318,9 @@
   pats: Pattern[],
   prefix: string,
   separator: string,
-  suffix: string
+  suffix: string,
 ): NamedPattern {
-  const re = pats.map((p) => p.toString()).join(separator);
+  const re = pats.map(p => p.toString()).join(separator);
   return new NamedPattern(prefix + re + suffix, getPatternNames(pats));
 }
 
@@ -379,7 +379,7 @@
   boolValue: function (type?: string) {
     return patterns.oneFrom(
       patterns.named('\\btrue\\b', type ?? 'constant.language.true'),
-      patterns.named('\\bfalse\\b', type ?? 'constant.language.false')
+      patterns.named('\\bfalse\\b', type ?? 'constant.language.false'),
     );
   },
 
@@ -465,7 +465,7 @@
  * @returns An array of patterns.
  */
 function valueOrArray(
-  pattern: (Pattern | TmPattern)[] = [patterns.anyString()]
+  pattern: (Pattern | TmPattern)[] = [patterns.anyString()],
 ): (Pattern | TmPattern)[] {
   return [...pattern, arrayBlock(pattern)];
 }
@@ -643,8 +643,8 @@
             keyValue('subdir'),
             keyValue('as'),
             keyValue('scope', [arrayBlock(), patterns.anyString()]),
-            //TODO(fxbug.dev/109399): Narrow down the types of valid objects once documentation is
-            //provided in fxbug.dev/96705.
+            // TODO(fxbug.dev/109399): Narrow down the types of valid objects once documentation is
+            // provided in fxbug.dev/96705.
             keyValue('filter', [
               include('meta-valid-array-block'),
               include('meta-valid-dictionary-block'),
@@ -710,8 +710,8 @@
             keyValue('dependency', [patterns.oneStringFrom('strong', 'weak_for_migration', 'weak')]),
             keyValue('rights', [arrayBlock(), patterns.anyString()]),
             keyValue('subdir'),
-            //TODO(fxbug.dev/109399): Narrow down the types of valid objects once documentation is
-            //provided in fxbug.dev/96705.
+            // TODO(fxbug.dev/109399): Narrow down the types of valid objects once documentation is
+            // provided in fxbug.dev/96705.
             keyValue('filter', [
               include('meta-valid-array-block'),
               include('meta-valid-dictionary-block'),
@@ -736,7 +736,7 @@
           patterns.boolValue(),
           include('meta-valid-array-block'),
           include('meta-valid-dictionary-block'),
-        ], false)
+        ], false),
       ],
     },
 
@@ -748,7 +748,7 @@
           patterns.boolValue(),
           include('meta-valid-array-block'),
           include('meta-valid-dictionary-block'),
-        ], true)
+        ], true),
       ],
     },
 
@@ -766,8 +766,8 @@
           patterns.oneFrom(
             patterns.identifier('invalid.illegal'),
             patterns.anyString('invalid.illegal'),
-          )
-        )
+          ),
+        ),
       ],
     },
 
@@ -785,8 +785,8 @@
           patterns.oneFrom(
             patterns.identifier('keyword.control'),
             patterns.anyString('keyword.control'),
-          )
-        )
+          ),
+        ),
       ],
     },
 
@@ -794,7 +794,7 @@
       patterns: [
         dictionaryBlock([
           include('meta-valid-key-value-block'),
-        ], false)
+        ], false),
       ],
     },
 
@@ -802,14 +802,14 @@
       patterns: [
         dictionaryBlock([
           include('meta-valid-key-value-block'),
-        ], true)
+        ], true),
       ],
     },
 
     ///////////////////////////////////////////////////////////////////////////////////////////////
     // Comments
     ///////////////////////////////////////////////////////////////////////////////////////////////
-    comments: {
+    'comments': {
       patterns: [
         match('invalid.illegal.stray-comment-end', '\\*/.*\\n'),
         match('comment.line.documentation', '///.*\\n'),
diff --git a/syntax/fidl.ts b/syntax/fidl.ts
index 20307a5..d4af8d1 100644
--- a/syntax/fidl.ts
+++ b/syntax/fidl.ts
@@ -189,9 +189,9 @@
   pats: Pattern[],
   prefix: string,
   separator: string,
-  suffix: string
+  suffix: string,
 ): NamedPattern {
-  const re = pats.map((p) => p.toString()).join(separator);
+  const re = pats.map(p => p.toString()).join(separator);
   return new NamedPattern(prefix + re + suffix, getPatternNames(pats));
 }
 
@@ -293,11 +293,11 @@
 
 const NUMERIC_LITERAL = patterns.named(
   '-?\\b(?:(?:0(?:x|X)[0-9a-fA-F]*)|(?:0(?:b|B)[01]*)|(?:(?:[0-9]+\\.?[0-9]*)|(?:\\.[0-9]+))(?:(?:e|E)(?:\\+|-)?[0-9]+)?)\\b',
-  'constant.numeric'
+  'constant.numeric',
 );
 const BOOLEAN_LITERAL = patterns.named(
   patterns.oneWordFrom('true', 'false'),
-  'constant.language'
+  'constant.language',
 );
 
 const STRING_LITERAL = patterns.named('"(?:[^\\"]|\\.)*"', 'string.quoted.double');
@@ -305,7 +305,7 @@
 
 const IDENTIFIER = '\\b[a-zA-Z_][0-9a-zA-Z_]*\\b';
 const COMPOUND_IDENTIFIER = new NamedPattern(
-  `${IDENTIFIER}(?:\\.${IDENTIFIER})*`
+  `${IDENTIFIER}(?:\\.${IDENTIFIER})*`,
 );
 
 const CONSTANT = patterns.oneFrom(LITERAL, COMPOUND_IDENTIFIER);
@@ -327,7 +327,7 @@
 
 const PRIMITIVE_TYPE = patterns.named(
   patterns.oneWordFrom(...primitiveTypes),
-  'storage.type.basic'
+  'storage.type.basic',
 );
 const EOL = new NamedPattern('(;)', ['punctuation.terminator']);
 const LIBRARY_NAME = patterns.named(COMPOUND_IDENTIFIER, 'entity.name.type');
@@ -337,7 +337,7 @@
 
 const ATTRIBUTE_TAG = patterns.named(patterns.seq(
   '@',
-  IDENTIFIER
+  IDENTIFIER,
 ), 'entity.other.attribute-name');
 
 const MODIFIERS = patterns.named(patterns.zeroOrMore(
@@ -345,7 +345,7 @@
     patterns.word('strict'),
     patterns.word('flexible'),
     patterns.word('resource'),
-  )
+  ),
 ), 'storage.type.modifier');
 
 const ORDINAL = patterns.seq(NUMERIC_LITERAL, patterns.separator(':'));
@@ -355,7 +355,7 @@
   patterns.keyword('struct'),
   patterns.keyword('table'),
   patterns.keyword('enum'),
-  patterns.keyword('bits')
+  patterns.keyword('bits'),
 );
 
 const SUBTYPE = patterns.seq(patterns.separator(':'), LAYOUT_REFERENCE);
@@ -366,7 +366,7 @@
   patterns.seq(
     patterns.separator(','),
     NUMERIC_CONSTANT,
-  )
+  ),
 )));
 
 // Checks
@@ -375,7 +375,7 @@
   MODIFIERS,
   LAYOUT_KIND,
   patterns.optional(SUBTYPE),
-  '{'
+  '{',
 );
 
 COMPOUND_IDENTIFIER.assert('foo');
@@ -424,7 +424,7 @@
     match('meta.library', patterns.seq(patterns.keyword('using'), LIBRARY_NAME, EOL)),
     match(
       'meta.library',
-      patterns.seq(patterns.keyword('using'), LIBRARY_NAME, patterns.keyword('as'), LOCAL_TYPE, EOL)
+      patterns.seq(patterns.keyword('using'), LIBRARY_NAME, patterns.keyword('as'), LOCAL_TYPE, EOL),
     ),
 
     // Aliases: an aliased type can only be a layout reference, and cannot be re-parameterized
@@ -481,7 +481,7 @@
   ],
   /* eslint-disable @typescript-eslint/naming-convention */
   repository: {
-    comments: {
+    'comments': {
       patterns: [
         match('invalid.illegal.stray-comment-end', '\\*/.*\\n'),
         match('comment.line.documentation', '///.*\\n'),
@@ -509,13 +509,13 @@
         match('meta.attribute.no-args', ATTRIBUTE_TAG),
       ],
     },
-    attributes: {
+    'attributes': {
       patterns: [
         include('attribute-with-args'),
         include('attribute-no-args'),
       ],
     },
-    method: {
+    'method': {
       patterns: [
         block({
           name: 'meta.method',
@@ -593,7 +593,7 @@
           begin: patterns.seq(
             LAYOUT_REFERENCE,
             '<',
-            INLINE_LAYOUT_PREFIX
+            INLINE_LAYOUT_PREFIX,
           ),
           end: patterns.seq(
             // the rest of the layout parameters (i.e. array size)
@@ -612,7 +612,7 @@
           patterns.seq(
             LAYOUT_REFERENCE,
             patterns.optional(TYPE_PARAMETERS),
-          )
+          ),
         ),
       ],
     },
@@ -639,7 +639,7 @@
           patterns.seq(
             ':',
             patterns.named(CONSTANT, 'storage.type.constraint'),
-          )
+          ),
         ),
       ],
     },
@@ -658,7 +658,7 @@
       patterns: [
         match(
           'meta.layout.reserved-member',
-          patterns.seq(ORDINAL, patterns.keyword('reserved'), EOL)
+          patterns.seq(ORDINAL, patterns.keyword('reserved'), EOL),
         ),
       ],
     },
diff --git a/syntax/fuchsia-log.ts b/syntax/fuchsia-log.ts
index 148a5c7..0228b0a 100644
--- a/syntax/fuchsia-log.ts
+++ b/syntax/fuchsia-log.ts
@@ -141,9 +141,9 @@
   pats: Pattern[],
   prefix: string,
   separator: string,
-  suffix: string
+  suffix: string,
 ): NamedPattern {
-  const re = pats.map((p) => p.toString()).join(separator);
+  const re = pats.map(p => p.toString()).join(separator);
   return new NamedPattern(prefix + re + suffix, getPatternNames(pats));
 }
 
@@ -187,7 +187,7 @@
 
 const TAGS = new NamedPattern(
   `^${TIMESTAMP_TAG.toString()}${USER_TAGS.toString()}`,
-  getPatternNames([TIMESTAMP_TAG, USER_TAGS])
+  getPatternNames([TIMESTAMP_TAG, USER_TAGS]),
 );
 
 const logLevels = [