From 4d8a4fdb186071ef32e5cbe9a0c5dcced5e2c2a2 Mon Sep 17 00:00:00 2001 From: Matt Bierner <12821956+mjbvz@users.noreply.github.com> Date: Tue, 19 May 2026 15:38:59 -0700 Subject: [PATCH] Fix a few simple `anys` in extensions --- .../markdown-language-features/src/logging.ts | 4 +- .../src/util/async.ts | 2 +- .../src/util/dispose.ts | 6 +- extensions/media-preview/src/util/dispose.ts | 6 +- .../src/util/dispose.ts | 4 +- .../simple-browser/preview-src/index.ts | 62 +++++++++++++++++-- extensions/simple-browser/src/dispose.ts | 4 +- .../src/utils/dispose.ts | 6 +- .../src/utils/hash.ts | 12 ++-- .../src/utils/platform.ts | 2 +- 10 files changed, 80 insertions(+), 28 deletions(-) diff --git a/extensions/markdown-language-features/src/logging.ts b/extensions/markdown-language-features/src/logging.ts index 30839d8c756..20636643ec1 100644 --- a/extensions/markdown-language-features/src/logging.ts +++ b/extensions/markdown-language-features/src/logging.ts @@ -8,7 +8,7 @@ import { Disposable } from './util/dispose'; export interface ILogger { - trace(title: string, message: string, data?: any): void; + trace(title: string, message: string, data?: unknown): void; } export class VsCodeOutputLogger extends Disposable implements ILogger { @@ -23,7 +23,7 @@ export class VsCodeOutputLogger extends Disposable implements ILogger { super(); } - public trace(title: string, message: string, data?: any): void { + public trace(title: string, message: string, data?: unknown): void { this.#outputChannel.trace(`${title}: ${message}`, ...(data ? [JSON.stringify(data, null, 4)] : [])); } } diff --git a/extensions/markdown-language-features/src/util/async.ts b/extensions/markdown-language-features/src/util/async.ts index 90b2a40ed2c..bd008c8445b 100644 --- a/extensions/markdown-language-features/src/util/async.ts +++ b/extensions/markdown-language-features/src/util/async.ts @@ -10,7 +10,7 @@ export interface ITask { export class Delayer { public defaultDelay: number; - #timeout: any; // Timer + #timeout: ReturnType | null; #cancelTimeout: Promise | null; #onSuccess: ((value: T | PromiseLike | undefined) => void) | null; #task: ITask | null; diff --git a/extensions/markdown-language-features/src/util/dispose.ts b/extensions/markdown-language-features/src/util/dispose.ts index 064302623fd..1517754b4a7 100644 --- a/extensions/markdown-language-features/src/util/dispose.ts +++ b/extensions/markdown-language-features/src/util/dispose.ts @@ -5,8 +5,8 @@ import * as vscode from 'vscode'; -export function disposeAll(disposables: Iterable) { - const errors: any[] = []; +export function disposeAll(disposables: Iterable): void { + const errors: unknown[] = []; for (const disposable of disposables) { try { @@ -32,7 +32,7 @@ export abstract class Disposable { protected _disposables: vscode.Disposable[] = []; - public dispose(): any { + public dispose(): void { if (this.#isDisposed) { return; } diff --git a/extensions/media-preview/src/util/dispose.ts b/extensions/media-preview/src/util/dispose.ts index 548094c28e5..05ca4dcc99d 100644 --- a/extensions/media-preview/src/util/dispose.ts +++ b/extensions/media-preview/src/util/dispose.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode'; -export function disposeAll(disposables: vscode.Disposable[]) { +export function disposeAll(disposables: vscode.Disposable[]): void { while (disposables.length) { const item = disposables.pop(); if (item) { @@ -19,7 +19,7 @@ export abstract class Disposable { protected _disposables: vscode.Disposable[] = []; - public dispose(): any { + public dispose(): void { if (this._isDisposed) { return; } @@ -39,4 +39,4 @@ export abstract class Disposable { protected get isDisposed() { return this._isDisposed; } -} \ No newline at end of file +} diff --git a/extensions/mermaid-markdown-features/src/util/dispose.ts b/extensions/mermaid-markdown-features/src/util/dispose.ts index 175acf7b367..8ddc05211f9 100644 --- a/extensions/mermaid-markdown-features/src/util/dispose.ts +++ b/extensions/mermaid-markdown-features/src/util/dispose.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode'; -export function disposeAll(disposables: vscode.Disposable[]) { +export function disposeAll(disposables: vscode.Disposable[]): void { while (disposables.length) { const item = disposables.pop(); item?.dispose(); @@ -17,7 +17,7 @@ export abstract class Disposable { protected _disposables: vscode.Disposable[] = []; - public dispose(): any { + public dispose(): void { if (this._isDisposed) { return; } diff --git a/extensions/simple-browser/preview-src/index.ts b/extensions/simple-browser/preview-src/index.ts index d2b0b7549e9..cfd90a20f85 100644 --- a/extensions/simple-browser/preview-src/index.ts +++ b/extensions/simple-browser/preview-src/index.ts @@ -5,14 +5,61 @@ import { onceDocumentLoaded } from './events'; +interface SimpleBrowserSettings { + readonly url: string; + readonly focusLockEnabled: boolean; +} + +interface SimpleBrowserState { + readonly url: string; +} + +interface OpenExternalMessage { + readonly type: 'openExternal'; + readonly url: string; +} + +type ExtensionToWebviewMessage = + | { readonly type: 'focus' } + | { readonly type: 'didChangeFocusLockIndicatorEnabled'; readonly focusLockEnabled: boolean }; + +interface VsCodeApi { + setState(state: State): void; + postMessage(message: Message): void; +} + +declare function acquireVsCodeApi(): VsCodeApi; + const vscode = acquireVsCodeApi(); -function getSettings() { +function isSimpleBrowserSettings(value: unknown): value is SimpleBrowserSettings { + return typeof value === 'object' + && value !== null + && 'url' in value + && typeof value.url === 'string' + && 'focusLockEnabled' in value + && typeof value.focusLockEnabled === 'boolean'; +} + +function isExtensionToWebviewMessage(value: unknown): value is ExtensionToWebviewMessage { + return typeof value === 'object' + && value !== null + && 'type' in value + && (value.type === 'focus' + || (value.type === 'didChangeFocusLockIndicatorEnabled' + && 'focusLockEnabled' in value + && typeof value.focusLockEnabled === 'boolean')); +} + +function getSettings(): SimpleBrowserSettings { const element = document.getElementById('simple-browser-settings'); if (element) { const data = element.getAttribute('data-settings'); if (data) { - return JSON.parse(data); + const settings: unknown = JSON.parse(data); + if (isSimpleBrowserSettings(settings)) { + return settings; + } } } @@ -30,7 +77,12 @@ const reloadButton = header.querySelector('.reload-button')!; const openExternalButton = header.querySelector('.open-external-button')!; window.addEventListener('message', e => { - switch (e.data.type) { + const message: unknown = e.data; + if (!isExtensionToWebviewMessage(message)) { + return; + } + + switch (message.type) { case 'focus': { iframe.focus(); @@ -38,7 +90,7 @@ window.addEventListener('message', e => { } case 'didChangeFocusLockIndicatorEnabled': { - toggleFocusLockIndicatorEnabled(e.data.enabled); + toggleFocusLockIndicatorEnabled(message.focusLockEnabled); break; } } @@ -87,7 +139,7 @@ onceDocumentLoaded(() => { navigateTo(settings.url); input.value = settings.url; - toggleFocusLockIndicatorEnabled(settings.focusLockIndicatorEnabled); + toggleFocusLockIndicatorEnabled(settings.focusLockEnabled); function navigateTo(rawUrl: string): void { try { diff --git a/extensions/simple-browser/src/dispose.ts b/extensions/simple-browser/src/dispose.ts index 175acf7b367..8ddc05211f9 100644 --- a/extensions/simple-browser/src/dispose.ts +++ b/extensions/simple-browser/src/dispose.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode'; -export function disposeAll(disposables: vscode.Disposable[]) { +export function disposeAll(disposables: vscode.Disposable[]): void { while (disposables.length) { const item = disposables.pop(); item?.dispose(); @@ -17,7 +17,7 @@ export abstract class Disposable { protected _disposables: vscode.Disposable[] = []; - public dispose(): any { + public dispose(): void { if (this._isDisposed) { return; } diff --git a/extensions/typescript-language-features/src/utils/dispose.ts b/extensions/typescript-language-features/src/utils/dispose.ts index e7687bb6941..1e52da2956a 100644 --- a/extensions/typescript-language-features/src/utils/dispose.ts +++ b/extensions/typescript-language-features/src/utils/dispose.ts @@ -6,8 +6,8 @@ import * as vscode from 'vscode'; -export function disposeAll(disposables: Iterable) { - const errors: any[] = []; +export function disposeAll(disposables: Iterable): void { + const errors: unknown[] = []; for (const disposable of disposables) { try { @@ -33,7 +33,7 @@ export abstract class Disposable { protected _disposables: vscode.Disposable[] = []; - public dispose(): any { + public dispose(): void { if (this._isDisposed) { return; } diff --git a/extensions/typescript-language-features/src/utils/hash.ts b/extensions/typescript-language-features/src/utils/hash.ts index b009808968d..07035b31b46 100644 --- a/extensions/typescript-language-features/src/utils/hash.ts +++ b/extensions/typescript-language-features/src/utils/hash.ts @@ -6,7 +6,7 @@ /** * Return a hash value for an object. */ -export function hash(obj: any, hashVal = 0): number { +export function hash(obj: unknown, hashVal = 0): number { switch (typeof obj) { case 'object': if (obj === null) { @@ -24,7 +24,7 @@ export function hash(obj: any, hashVal = 0): number { case 'undefined': return 937 * 31; default: - return numberHash(obj, 617); + return stringHash(String(obj), 617); } } @@ -44,15 +44,15 @@ function stringHash(s: string, hashVal: number) { return hashVal; } -function arrayHash(arr: any[], initialHashVal: number): number { +function arrayHash(arr: readonly unknown[], initialHashVal: number): number { initialHashVal = numberHash(104579, initialHashVal); - return arr.reduce((hashVal, item) => hash(item, hashVal), initialHashVal); + return arr.reduce((hashVal, item) => hash(item, hashVal), initialHashVal); } -function objectHash(obj: any, initialHashVal: number): number { +function objectHash(obj: object, initialHashVal: number): number { initialHashVal = numberHash(181387, initialHashVal); return Object.keys(obj).sort().reduce((hashVal, key) => { hashVal = stringHash(key, hashVal); - return hash(obj[key], hashVal); + return hash(Reflect.get(obj, key), hashVal); }, initialHashVal); } diff --git a/extensions/typescript-language-features/src/utils/platform.ts b/extensions/typescript-language-features/src/utils/platform.ts index bb4e7cdbfd9..ee30a3f2900 100644 --- a/extensions/typescript-language-features/src/utils/platform.ts +++ b/extensions/typescript-language-features/src/utils/platform.ts @@ -14,5 +14,5 @@ export function isWebAndHasSharedArrayBuffers(): boolean { } export function supportsReadableByteStreams(): boolean { - return isWeb() && 'ReadableByteStreamController' in globalThis; + return isWeb() && typeof ReadableByteStreamController !== 'undefined'; }