diff --git a/eslint.config.js b/eslint.config.js index d9456a0f903..8a1819cc4aa 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -177,6 +177,93 @@ export default tseslint.config( ] } }, + // vscode TS: strict no explicit `any` + { + files: [ + 'src/vs/base/common/extpath.ts', + 'src/vs/base/common/glob.ts', + 'src/vs/base/common/path.ts', + 'src/vs/base/common/stream.ts', + 'src/vs/base/node/pfs.ts', + 'src/vs/base/parts/contextmenu/**', + // 'src/vs/base/parts/ipc/**', + // 'src/vs/base/parts/sandbox/**', + 'src/vs/base/parts/storage/**', + 'src/vs/platform/auxiliaryWindow/**', + // 'src/vs/platform/backup/**', + // 'src/vs/platform/editor/**', + // 'src/vs/platform/environment/**', + // 'src/vs/platform/files/**', + // 'src/vs/platform/ipc/**', + // 'src/vs/platform/launch/**', + // 'src/vs/platform/lifecycle/**', + // 'src/vs/platform/menubar/**', + // 'src/vs/platform/native/**', + // 'src/vs/platform/sharedProcess/**', + // 'src/vs/platform/state/**', + // 'src/vs/platform/storage/**', + // 'src/vs/platform/utilityProcess/**', + // 'src/vs/platform/window/**', + // 'src/vs/platform/windows/**', + // 'src/vs/platform/workspace/**', + // 'src/vs/platform/workspaces/**', + 'src/bootstrap-cli.ts', + 'src/bootstrap-esm.ts', + 'src/bootstrap-fork.ts', + 'src/bootstrap-import.ts', + 'src/bootstrap-meta.ts', + 'src/bootstrap-node.ts', + 'src/bootstrap-server.ts', + 'src/cli.ts', + 'src/main.ts', + 'src/server-cli.ts', + 'src/server-main.ts', + 'src/vs/code/**', + 'src/vs/workbench/services/activity/**', + 'src/vs/workbench/services/auxiliaryWindow/**', + 'src/vs/workbench/services/chat/**', + 'src/vs/workbench/services/contextmenu/**', + 'src/vs/workbench/services/dialogs/**', + 'src/vs/workbench/services/editor/**', + // 'src/vs/workbench/services/environment/**', + 'src/vs/workbench/services/files/**', + 'src/vs/workbench/services/filesConfiguration/**', + 'src/vs/workbench/services/history/**', + 'src/vs/workbench/services/host/**', + 'src/vs/workbench/services/label/**', + 'src/vs/workbench/services/layout/**', + 'src/vs/workbench/services/lifecycle/**', + 'src/vs/workbench/services/notification/**', + 'src/vs/workbench/services/path/**', + 'src/vs/workbench/services/progress/**', + // 'src/vs/workbench/services/storage/**', + // 'src/vs/workbench/services/textfile/**', + // 'src/vs/workbench/services/textmodelResolver/**', + // 'src/vs/workbench/services/untitled/**', + // 'src/vs/workbench/services/utilityProcess/**', + // 'src/vs/workbench/services/views/**', + // 'src/vs/workbench/services/workingCopy/**', + // 'src/vs/workbench/services/workspaces/**', + // 'src/vs/workbench/common/**', + // 'src/vs/workbench/browser/**', + // 'src/vs/workbench/electron-browser/**', + // 'src/vs/workbench/contrib/files/**', + ], + languageOptions: { + parser: tseslint.parser, + }, + plugins: { + '@typescript-eslint': tseslint.plugin, + }, + rules: { + '@typescript-eslint/no-explicit-any': [ + 'warn', + { + 'ignoreRestArgs': false + } + ] + } + }, // Tests { files: [ diff --git a/src/bootstrap-import.ts b/src/bootstrap-import.ts index 9d222a003eb..3bd5c73a0af 100644 --- a/src/bootstrap-import.ts +++ b/src/bootstrap-import.ts @@ -47,7 +47,7 @@ export async function initialize(injectPath: string): Promise { console.log(`[bootstrap-import] Initialized node_modules redirector for: ${injectPath}`); } -export async function resolve(specifier: string | number, context: any, nextResolve: (arg0: any, arg1: any) => any) { +export async function resolve(specifier: string | number, context: unknown, nextResolve: (arg0: unknown, arg1: unknown) => unknown) { const newSpecifier = _specifierToUrl[specifier]; if (newSpecifier !== undefined) { diff --git a/src/bootstrap-node.ts b/src/bootstrap-node.ts index 30e1bd41c90..8cb580e738b 100644 --- a/src/bootstrap-node.ts +++ b/src/bootstrap-node.ts @@ -83,7 +83,7 @@ export function removeGlobalNodeJsModuleLookupPaths(): void { const originalResolveLookupPaths = Module._resolveLookupPaths; - Module._resolveLookupPaths = function (moduleName: string, parent: any): string[] { + Module._resolveLookupPaths = function (moduleName: string, parent: unknown): string[] { const paths = originalResolveLookupPaths(moduleName, parent); if (Array.isArray(paths)) { let commonSuffixLength = 0; diff --git a/src/main.ts b/src/main.ts index 7afc29087ed..e2bbdcd87df 100644 --- a/src/main.ts +++ b/src/main.ts @@ -582,8 +582,7 @@ function registerListeners(): void { * the app-ready event. We listen very early for open-file and remember this upon startup as path to open. */ const macOpenFiles: string[] = []; - // eslint-disable-next-line local/code-no-any-casts - (globalThis as any)['macOpenFiles'] = macOpenFiles; + (globalThis as { macOpenFiles?: string[] }).macOpenFiles = macOpenFiles; app.on('open-file', function (event, path) { macOpenFiles.push(path); }); @@ -603,8 +602,7 @@ function registerListeners(): void { app.on('open-url', onOpenUrl); }); - // eslint-disable-next-line local/code-no-any-casts - (globalThis as any)['getOpenUrls'] = function () { + (globalThis as { getOpenUrls?: () => string[] }).getOpenUrls = function () { app.removeListener('open-url', onOpenUrl); return openUrls; diff --git a/src/server-main.ts b/src/server-main.ts index b0d8f65e2c4..6c192ab8997 100644 --- a/src/server-main.ts +++ b/src/server-main.ts @@ -20,8 +20,7 @@ import { INLSConfiguration } from './vs/nls.js'; import { IServerAPI } from './vs/server/node/remoteExtensionHostAgentServer.js'; perf.mark('code/server/start'); -// eslint-disable-next-line local/code-no-any-casts -(globalThis as any).vscodeServerStartTime = performance.now(); +(globalThis as { vscodeServerStartTime?: number }).vscodeServerStartTime = performance.now(); // Do a quick parse to determine if a server or the cli needs to be started const parsedArgs = minimist(process.argv.slice(2), { @@ -139,8 +138,7 @@ if (shouldSpawnCli) { console.log(output); perf.mark('code/server/started'); - // eslint-disable-next-line local/code-no-any-casts - (globalThis as any).vscodeServerListenTime = performance.now(); + (globalThis as { vscodeServerListenTime?: number }).vscodeServerListenTime = performance.now(); await getRemoteExtensionHostAgentServer(); }); @@ -153,7 +151,7 @@ if (shouldSpawnCli) { }); } -function sanitizeStringArg(val: any): string | undefined { +function sanitizeStringArg(val: unknown): string | undefined { if (Array.isArray(val)) { // if an argument is passed multiple times, minimist creates an array val = val.pop(); // take the last item } diff --git a/src/vs/base/common/stream.ts b/src/vs/base/common/stream.ts index 990c8f1c6bc..ebc0ef5d23b 100644 --- a/src/vs/base/common/stream.ts +++ b/src/vs/base/common/stream.ts @@ -331,14 +331,14 @@ class WriteableStreamImpl implements WriteableStream { on(event: 'data', callback: (data: T) => void): void; on(event: 'error', callback: (err: Error) => void): void; on(event: 'end', callback: () => void): void; - on(event: 'data' | 'error' | 'end', callback: (arg0?: any) => void): void { + on(event: 'data' | 'error' | 'end', callback: ((data: T) => void) | ((err: Error) => void) | (() => void)): void { if (this.state.destroyed) { return; } switch (event) { case 'data': - this.listeners.data.push(callback); + this.listeners.data.push(callback as (data: T) => void); // switch into flowing mode as soon as the first 'data' // listener is added and we are not yet in flowing mode @@ -347,7 +347,7 @@ class WriteableStreamImpl implements WriteableStream { break; case 'end': - this.listeners.end.push(callback); + this.listeners.end.push(callback as () => void); // emit 'end' event directly if we are flowing // and the end has already been reached @@ -360,7 +360,7 @@ class WriteableStreamImpl implements WriteableStream { break; case 'error': - this.listeners.error.push(callback); + this.listeners.error.push(callback as (err: Error) => void); // emit buffered 'error' events unless done already // now that we know that we have at least one listener diff --git a/src/vs/base/parts/contextmenu/electron-browser/contextmenu.ts b/src/vs/base/parts/contextmenu/electron-browser/contextmenu.ts index 3eab2e24b9d..7b1971d0aa7 100644 --- a/src/vs/base/parts/contextmenu/electron-browser/contextmenu.ts +++ b/src/vs/base/parts/contextmenu/electron-browser/contextmenu.ts @@ -13,13 +13,16 @@ export function popup(items: IContextMenuItem[], options?: IPopupOptions, onHide const contextMenuId = contextMenuIdPool++; const onClickChannel = `vscode:onContextMenu${contextMenuId}`; - const onClickChannelHandler = (event: unknown, itemId: number, context: IContextMenuEvent) => { + const onClickChannelHandler = (_event: unknown, ...args: unknown[]) => { + const itemId = args[0] as number; + const context = args[1] as IContextMenuEvent; const item = processedItems[itemId]; item.click?.(context); }; ipcRenderer.once(onClickChannel, onClickChannelHandler); - ipcRenderer.once(CONTEXT_MENU_CLOSE_CHANNEL, (event: unknown, closedContextMenuId: number) => { + ipcRenderer.once(CONTEXT_MENU_CLOSE_CHANNEL, (_event: unknown, ...args: unknown[]) => { + const closedContextMenuId = args[0] as number; if (closedContextMenuId !== contextMenuId) { return; } diff --git a/src/vs/base/parts/sandbox/electron-browser/electronTypes.ts b/src/vs/base/parts/sandbox/electron-browser/electronTypes.ts index cbf98ff13c5..fee511ba913 100644 --- a/src/vs/base/parts/sandbox/electron-browser/electronTypes.ts +++ b/src/vs/base/parts/sandbox/electron-browser/electronTypes.ts @@ -66,17 +66,17 @@ export interface IpcRenderer { * returned by `invoke` will reject. However, the `Error` object in the renderer * process will not be the same as the one thrown in the main process. */ - invoke(channel: string, ...args: any[]): Promise; + invoke(channel: string, ...args: unknown[]): Promise; /** * Listens to `channel`, when a new message arrives `listener` would be called with * `listener(event, args...)`. */ - on(channel: string, listener: (event: IpcRendererEvent, ...args: any[]) => void): this; + on(channel: string, listener: (event: IpcRendererEvent, ...args: unknown[]) => void): this; /** * Adds a one time `listener` function for the event. This `listener` is invoked * only the next time a message is sent to `channel`, after which it is removed. */ - once(channel: string, listener: (event: IpcRendererEvent, ...args: any[]) => void): this; + once(channel: string, listener: (event: IpcRendererEvent, ...args: unknown[]) => void): this; // Note: API with `Transferable` intentionally commented out because you // cannot transfer these when `contextIsolation: true`. // /** @@ -92,12 +92,12 @@ export interface IpcRenderer { // * For more information on using `MessagePort` and `MessageChannel`, see the MDN // * documentation. // */ - // postMessage(channel: string, message: any, transfer?: MessagePort[]): void; + // postMessage(channel: string, message: unknown, transfer?: MessagePort[]): void; /** * Removes the specified `listener` from the listener array for the specified * `channel`. */ - removeListener(channel: string, listener: (event: IpcRendererEvent, ...args: any[]) => void): this; + removeListener(channel: string, listener: (event: IpcRendererEvent, ...args: unknown[]) => void): this; /** * Send an asynchronous message to the main process via `channel`, along with * arguments. Arguments will be serialized with the Structured Clone Algorithm, @@ -122,7 +122,7 @@ export interface IpcRenderer { * If you want to receive a single response from the main process, like the result * of a method call, consider using `ipcRenderer.invoke`. */ - send(channel: string, ...args: any[]): void; + send(channel: string, ...args: unknown[]): void; } export interface WebFrame { diff --git a/src/vs/base/parts/sandbox/electron-browser/globals.ts b/src/vs/base/parts/sandbox/electron-browser/globals.ts index 9d831ac8afe..bd43ae40457 100644 --- a/src/vs/base/parts/sandbox/electron-browser/globals.ts +++ b/src/vs/base/parts/sandbox/electron-browser/globals.ts @@ -115,8 +115,18 @@ export interface ISandboxContext { resolveConfiguration(): Promise; } -// eslint-disable-next-line local/code-no-any-casts -const vscodeGlobal = (globalThis as any).vscode; +interface ISandboxGlobal { + vscode: { + readonly ipcRenderer: IpcRenderer; + readonly ipcMessagePort: IpcMessagePort; + readonly webFrame: WebFrame; + readonly process: ISandboxNodeProcess; + readonly context: ISandboxContext; + readonly webUtils: WebUtils; + }; +} + +const vscodeGlobal = (globalThis as unknown as ISandboxGlobal).vscode; export const ipcRenderer: IpcRenderer = vscodeGlobal.ipcRenderer; export const ipcMessagePort: IpcMessagePort = vscodeGlobal.ipcMessagePort; export const webFrame: WebFrame = vscodeGlobal.webFrame; diff --git a/src/vs/base/parts/sandbox/electron-browser/preload-aux.ts b/src/vs/base/parts/sandbox/electron-browser/preload-aux.ts index 83b7e91fc6f..c8e238ed112 100644 --- a/src/vs/base/parts/sandbox/electron-browser/preload-aux.ts +++ b/src/vs/base/parts/sandbox/electron-browser/preload-aux.ts @@ -23,13 +23,13 @@ */ ipcRenderer: { - send(channel: string, ...args: any[]): void { + send(channel: string, ...args: unknown[]): void { if (validateIPC(channel)) { ipcRenderer.send(channel, ...args); } }, - invoke(channel: string, ...args: any[]): Promise { + invoke(channel: string, ...args: unknown[]): Promise { validateIPC(channel); return ipcRenderer.invoke(channel, ...args); diff --git a/src/vs/base/parts/sandbox/electron-browser/preload.ts b/src/vs/base/parts/sandbox/electron-browser/preload.ts index c023c5622ed..74b908e7523 100644 --- a/src/vs/base/parts/sandbox/electron-browser/preload.ts +++ b/src/vs/base/parts/sandbox/electron-browser/preload.ts @@ -109,19 +109,19 @@ ipcRenderer: { - send(channel: string, ...args: any[]): void { + send(channel: string, ...args: unknown[]): void { if (validateIPC(channel)) { ipcRenderer.send(channel, ...args); } }, - invoke(channel: string, ...args: any[]): Promise { + invoke(channel: string, ...args: unknown[]): Promise { validateIPC(channel); return ipcRenderer.invoke(channel, ...args); }, - on(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => void) { + on(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: unknown[]) => void) { validateIPC(channel); ipcRenderer.on(channel, listener); @@ -129,7 +129,7 @@ return this; }, - once(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => void) { + once(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: unknown[]) => void) { validateIPC(channel); ipcRenderer.once(channel, listener); @@ -137,7 +137,7 @@ return this; }, - removeListener(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => void) { + removeListener(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: unknown[]) => void) { validateIPC(channel); ipcRenderer.removeListener(channel, listener); @@ -215,7 +215,7 @@ return process.getProcessMemoryInfo(); }, - on(type: string, callback: (...args: any[]) => void): void { + on(type: string, callback: (...args: unknown[]) => void): void { process.on(type, callback); } }, @@ -246,17 +246,10 @@ } }; - // Use `contextBridge` APIs to expose globals to VSCode - // only if context isolation is enabled, otherwise just - // add to the DOM global. - if (process.contextIsolated) { - try { - contextBridge.exposeInMainWorld('vscode', globals); - } catch (error) { - console.error(error); - } - } else { - // eslint-disable-next-line local/code-no-any-casts - (window as any).vscode = globals; + try { + // Use `contextBridge` APIs to expose globals to VSCode + contextBridge.exposeInMainWorld('vscode', globals); + } catch (error) { + console.error(error); } }()); diff --git a/src/vs/base/parts/storage/node/storage.ts b/src/vs/base/parts/storage/node/storage.ts index 162179cf35b..3822560cbff 100644 --- a/src/vs/base/parts/storage/node/storage.ts +++ b/src/vs/base/parts/storage/node/storage.ts @@ -245,8 +245,7 @@ export class SQLiteStorageDatabase implements IStorageDatabase { const connection = await this.whenConnected; const row = await this.get(connection, full ? 'PRAGMA integrity_check' : 'PRAGMA quick_check'); - // eslint-disable-next-line local/code-no-any-casts - const integrity = full ? (row as any)['integrity_check'] : (row as any)['quick_check']; + const integrity = full ? (row as { integrity_check: string }).integrity_check : (row as { quick_check: string }).quick_check; if (connection.isErroneous) { return `${integrity} (last error: ${connection.lastError})`; diff --git a/src/vs/base/parts/storage/test/node/storage.integrationTest.ts b/src/vs/base/parts/storage/test/node/storage.integrationTest.ts index 994417ddc00..4db56c00c77 100644 --- a/src/vs/base/parts/storage/test/node/storage.integrationTest.ts +++ b/src/vs/base/parts/storage/test/node/storage.integrationTest.ts @@ -446,7 +446,7 @@ flakySuite('SQLite Storage Library', function () { const corruptDBPath = join(testdir, 'broken.db'); await Promises.writeFile(corruptDBPath, 'This is a broken DB'); - let expectedError: any; + let expectedError: Error | string | undefined = undefined; await testDBBasics(corruptDBPath, error => { expectedError = error; }); diff --git a/src/vs/code/electron-browser/workbench/workbench.ts b/src/vs/code/electron-browser/workbench/workbench.ts index c1bad461c93..b0fdcaeba29 100644 --- a/src/vs/code/electron-browser/workbench/workbench.ts +++ b/src/vs/code/electron-browser/workbench/workbench.ts @@ -17,8 +17,7 @@ type IMainWindowSandboxGlobals = import('../../../base/parts/sandbox/electron-browser/globals.js').IMainWindowSandboxGlobals; type IDesktopMain = import('../../../workbench/electron-browser/desktop.main.js').IDesktopMain; - // eslint-disable-next-line local/code-no-any-casts - const preloadGlobals: IMainWindowSandboxGlobals = (window as any).vscode; // defined by preload.ts + const preloadGlobals = (window as unknown as { vscode: IMainWindowSandboxGlobals }).vscode; // defined by preload.ts const safeProcess = preloadGlobals.process; //#region Splash Screen Helpers @@ -127,8 +126,7 @@ titleDiv.style.left = '0'; titleDiv.style.top = '0'; titleDiv.style.backgroundColor = `${colorInfo.titleBarBackground}`; - // eslint-disable-next-line local/code-no-any-casts - (titleDiv.style as any)['-webkit-app-region'] = 'drag'; + (titleDiv.style as CSSStyleDeclaration & { '-webkit-app-region': string })['-webkit-app-region'] = 'drag'; splash.appendChild(titleDiv); if (colorInfo.titleBarBorder) { diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 271d4625d53..43aba014586 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -545,8 +545,7 @@ export class CodeApplication extends Disposable { // See: https://github.com/microsoft/vscode/issues/35361#issuecomment-399794085 try { if (isMacintosh && this.configurationService.getValue('window.nativeTabs') === true && !systemPreferences.getUserDefault('NSUseImprovedLayoutPass', 'boolean')) { - // eslint-disable-next-line local/code-no-any-casts - systemPreferences.setUserDefault('NSUseImprovedLayoutPass', 'boolean', true as any); + systemPreferences.setUserDefault('NSUseImprovedLayoutPass', 'boolean', true); } } catch (error) { this.logService.error(error); @@ -691,8 +690,7 @@ export class CodeApplication extends Disposable { } // macOS: open-url events that were received before the app is ready - // eslint-disable-next-line local/code-no-any-casts - const protocolUrlsFromEvent = ((global).getOpenUrls() || []) as string[]; + const protocolUrlsFromEvent = ((global as { getOpenUrls?: () => string[] }).getOpenUrls?.() || []); if (protocolUrlsFromEvent.length > 0) { this.logService.trace(`app#resolveInitialProtocolUrls() protocol urls from macOS 'open-url' event:`, protocolUrlsFromEvent); } @@ -1299,8 +1297,7 @@ export class CodeApplication extends Disposable { } } - // eslint-disable-next-line local/code-no-any-casts - const macOpenFiles: string[] = (global).macOpenFiles; + const macOpenFiles: string[] = (global as { macOpenFiles?: string[] }).macOpenFiles ?? []; const hasCliArgs = args._.length; const hasFolderURIs = !!args['folder-uri']; const hasFileURIs = !!args['file-uri']; diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts index b31099ef0fb..b7c4fb99f8f 100644 --- a/src/vs/code/node/cli.ts +++ b/src/vs/code/node/cli.ts @@ -40,7 +40,7 @@ function shouldSpawnCliProcess(argv: NativeParsedArgs): boolean { || !!argv['telemetry']; } -export async function main(argv: string[]): Promise { +export async function main(argv: string[]): Promise { let args: NativeParsedArgs; try { @@ -567,7 +567,7 @@ export async function main(argv: string[]): Promise { child = spawn('open', spawnArgs, { ...options, env: {} }); } - return Promise.all(processCallbacks.map(callback => callback(child))); + await Promise.all(processCallbacks.map(callback => callback(child))); } } diff --git a/src/vs/workbench/contrib/chat/browser/chatSetup.ts b/src/vs/workbench/contrib/chat/browser/chatSetup.ts index 4325d481e24..0f4287c529c 100644 --- a/src/vs/workbench/contrib/chat/browser/chatSetup.ts +++ b/src/vs/workbench/contrib/chat/browser/chatSetup.ts @@ -609,7 +609,7 @@ class SetupTool extends Disposable implements IToolImpl { return result; } - async prepareToolInvocation?(parameters: any, token: CancellationToken): Promise { + async prepareToolInvocation?(parameters: unknown, token: CancellationToken): Promise { return undefined; } } diff --git a/src/vs/workbench/contrib/chat/electron-browser/chat.contribution.ts b/src/vs/workbench/contrib/chat/electron-browser/chat.contribution.ts index a4b5e6e84d0..3ecc2fc8bf5 100644 --- a/src/vs/workbench/contrib/chat/electron-browser/chat.contribution.ts +++ b/src/vs/workbench/contrib/chat/electron-browser/chat.contribution.ts @@ -69,10 +69,11 @@ class ChatCommandLineHandler extends Disposable { } private registerListeners() { - ipcRenderer.on('vscode:handleChatRequest', (_, args: typeof this.environmentService.args.chat) => { - this.logService.trace('vscode:handleChatRequest', args); + ipcRenderer.on('vscode:handleChatRequest', (_, ...args: unknown[]) => { + const chatArgs = args[0] as typeof this.environmentService.args.chat; + this.logService.trace('vscode:handleChatRequest', chatArgs); - this.prompt(args); + this.prompt(chatArgs); }); } diff --git a/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts b/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts index 95ecd96f3fd..2feba38fb4f 100644 --- a/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts +++ b/src/vs/workbench/contrib/remote/electron-browser/remote.contribution.ts @@ -42,7 +42,8 @@ class RemoteAgentDiagnosticListener implements IWorkbenchContribution { @IRemoteAgentService remoteAgentService: IRemoteAgentService, @ILabelService labelService: ILabelService ) { - ipcRenderer.on('vscode:getDiagnosticInfo', (event: unknown, request: { replyChannel: string; args: IDiagnosticInfoOptions }): void => { + ipcRenderer.on('vscode:getDiagnosticInfo', (event: unknown, ...args: unknown[]): void => { + const request = args[0] as { replyChannel: string; args: IDiagnosticInfoOptions }; const connection = remoteAgentService.getConnection(); if (connection) { const hostName = labelService.getHostLabel(Schemas.vscodeRemote, connection.remoteAuthority); diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeContribution.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeContribution.ts index a076cf8cfd9..54e3588037a 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeContribution.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeContribution.ts @@ -26,7 +26,7 @@ export class TerminalNativeContribution extends Disposable implements IWorkbench ) { super(); - ipcRenderer.on('vscode:openFiles', (_: unknown, request: INativeOpenFileRequest) => { this._onOpenFileRequest(request); }); + ipcRenderer.on('vscode:openFiles', (_: unknown, ...args: unknown[]) => { this._onOpenFileRequest(args[0] as INativeOpenFileRequest); }); this._register(nativeHostService.onDidResumeOS(() => this._onOsResume())); this._terminalService.setNativeDelegate({ diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 11035d0404d..b8b3b650c5e 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -155,7 +155,8 @@ export class NativeWindow extends BaseWindow { } // Support `runAction` event - ipcRenderer.on('vscode:runAction', async (event: unknown, request: INativeRunActionInWindowRequest) => { + ipcRenderer.on('vscode:runAction', async (event: unknown, ...argsRaw: unknown[]) => { + const request = argsRaw[0] as INativeRunActionInWindowRequest; const args: unknown[] = request.args || []; // If we run an action from the touchbar, we fill in the currently active resource @@ -182,7 +183,8 @@ export class NativeWindow extends BaseWindow { }); // Support runKeybinding event - ipcRenderer.on('vscode:runKeybinding', (event: unknown, request: INativeRunKeybindingInWindowRequest) => { + ipcRenderer.on('vscode:runKeybinding', (event: unknown, ...argsRaw: unknown[]) => { + const request = argsRaw[0] as INativeRunKeybindingInWindowRequest; const activeElement = getActiveElement(); if (activeElement) { this.keybindingService.dispatchByUserSettingsLabel(request.userSettingsLabel, activeElement); @@ -190,7 +192,7 @@ export class NativeWindow extends BaseWindow { }); // Shared Process crash reported from main - ipcRenderer.on('vscode:reportSharedProcessCrash', (event: unknown, error: string) => { + ipcRenderer.on('vscode:reportSharedProcessCrash', (event: unknown, ...argsRaw: unknown[]) => { this.notificationService.prompt( Severity.Error, localize('sharedProcessCrash', "A shared background process terminated unexpectedly. Please restart the application to recover."), @@ -205,16 +207,17 @@ export class NativeWindow extends BaseWindow { }); // Support openFiles event for existing and new files - ipcRenderer.on('vscode:openFiles', (event: unknown, request: IOpenFileRequest) => { this.onOpenFiles(request); }); + ipcRenderer.on('vscode:openFiles', (event: unknown, ...argsRaw: unknown[]) => { this.onOpenFiles(argsRaw[0] as IOpenFileRequest); }); // Support addRemoveFolders event for workspace management - ipcRenderer.on('vscode:addRemoveFolders', (event: unknown, request: IAddRemoveFoldersRequest) => this.onAddRemoveFoldersRequest(request)); + ipcRenderer.on('vscode:addRemoveFolders', (event: unknown, ...argsRaw: unknown[]) => this.onAddRemoveFoldersRequest(argsRaw[0] as IAddRemoveFoldersRequest)); // Message support - ipcRenderer.on('vscode:showInfoMessage', (event: unknown, message: string) => this.notificationService.info(message)); + ipcRenderer.on('vscode:showInfoMessage', (event: unknown, ...argsRaw: unknown[]) => this.notificationService.info(argsRaw[0] as string)); // Shell Environment Issue Notifications - ipcRenderer.on('vscode:showResolveShellEnvError', (event: unknown, message: string) => { + ipcRenderer.on('vscode:showResolveShellEnvError', (event: unknown, ...argsRaw: unknown[]) => { + const message = argsRaw[0] as string; this.notificationService.prompt( Severity.Error, message, @@ -233,7 +236,8 @@ export class NativeWindow extends BaseWindow { ); }); - ipcRenderer.on('vscode:showCredentialsError', (event: unknown, message: string) => { + ipcRenderer.on('vscode:showCredentialsError', (event: unknown, ...argsRaw: unknown[]) => { + const message = argsRaw[0] as string; this.notificationService.prompt( Severity.Error, localize('keychainWriteError', "Writing login information to the keychain failed with error '{0}'.", message), @@ -263,7 +267,7 @@ export class NativeWindow extends BaseWindow { ); }); - ipcRenderer.on('vscode:showArgvParseWarning', (event: unknown, message: string) => { + ipcRenderer.on('vscode:showArgvParseWarning', () => { this.notificationService.prompt( Severity.Warning, localize("showArgvParseWarning", "The runtime arguments file 'argv.json' contains errors. Please correct them and restart."), @@ -282,7 +286,8 @@ export class NativeWindow extends BaseWindow { ipcRenderer.on('vscode:leaveFullScreen', () => setFullscreen(false, mainWindow)); // Proxy Login Dialog - ipcRenderer.on('vscode:openProxyAuthenticationDialog', async (event: unknown, payload: { authInfo: AuthInfo; username?: string; password?: string; replyChannel: string }) => { + ipcRenderer.on('vscode:openProxyAuthenticationDialog', async (event: unknown, ...argsRaw: unknown[]) => { + const payload = argsRaw[0] as { authInfo: AuthInfo; username?: string; password?: string; replyChannel: string }; const rememberCredentialsKey = 'window.rememberProxyCredentials'; const rememberCredentials = this.storageService.getBoolean(rememberCredentialsKey, StorageScope.APPLICATION); const result = await this.dialogService.input({ @@ -324,12 +329,14 @@ export class NativeWindow extends BaseWindow { }); // Accessibility support changed event - ipcRenderer.on('vscode:accessibilitySupportChanged', (event: unknown, accessibilitySupportEnabled: boolean) => { + ipcRenderer.on('vscode:accessibilitySupportChanged', (event: unknown, ...argsRaw: unknown[]) => { + const accessibilitySupportEnabled = argsRaw[0] as boolean; this.accessibilityService.setAccessibilitySupport(accessibilitySupportEnabled ? AccessibilitySupport.Enabled : AccessibilitySupport.Disabled); }); // Allow to update security settings around allowed UNC Host - ipcRenderer.on('vscode:configureAllowedUNCHost', async (event: unknown, host: string) => { + ipcRenderer.on('vscode:configureAllowedUNCHost', async (event: unknown, ...argsRaw: unknown[]) => { + const host = argsRaw[0] as string; if (!isWindows) { return; // only supported on Windows } @@ -354,7 +361,8 @@ export class NativeWindow extends BaseWindow { }); // Allow to update security settings around protocol handlers - ipcRenderer.on('vscode:disablePromptForProtocolHandling', (event: unknown, kind: 'local' | 'remote') => { + ipcRenderer.on('vscode:disablePromptForProtocolHandling', (event: unknown, ...argsRaw: unknown[]) => { + const kind = argsRaw[0] as 'local' | 'remote'; const setting = kind === 'local' ? 'security.promptForLocalFileProtocolHandling' : 'security.promptForRemoteFileProtocolHandling'; this.configurationService.updateValue(setting, false); }); diff --git a/src/vs/workbench/services/activity/common/activity.ts b/src/vs/workbench/services/activity/common/activity.ts index 4b114f37b40..a920fbc5b7d 100644 --- a/src/vs/workbench/services/activity/common/activity.ts +++ b/src/vs/workbench/services/activity/common/activity.ts @@ -70,16 +70,16 @@ export interface IBadgeStyles { readonly badgeBorder: Color | undefined; } -class BaseBadge implements IBadge { +class BaseBadge implements IBadge { constructor( - protected readonly descriptorFn: (arg: any) => string, + protected readonly descriptorFn: (arg: T) => string, private readonly stylesFn: ((theme: IColorTheme) => IBadgeStyles | undefined) | undefined, ) { } getDescription(): string { - return this.descriptorFn(null); + return this.descriptorFn(null as T); } getColors(theme: IColorTheme): IBadgeStyles | undefined { @@ -87,7 +87,7 @@ class BaseBadge implements IBadge { } } -export class NumberBadge extends BaseBadge { +export class NumberBadge extends BaseBadge { constructor(readonly number: number, descriptorFn: (num: number) => string) { super(descriptorFn, undefined); @@ -100,7 +100,7 @@ export class NumberBadge extends BaseBadge { } } -export class IconBadge extends BaseBadge { +export class IconBadge extends BaseBadge { constructor( readonly icon: ThemeIcon, descriptorFn: () => string, @@ -110,7 +110,7 @@ export class IconBadge extends BaseBadge { } } -export class ProgressBadge extends BaseBadge { +export class ProgressBadge extends BaseBadge { constructor(descriptorFn: () => string) { super(descriptorFn, undefined); } diff --git a/src/vs/workbench/services/auxiliaryWindow/electron-browser/auxiliaryWindowService.ts b/src/vs/workbench/services/auxiliaryWindow/electron-browser/auxiliaryWindowService.ts index 31d0c4ef27c..ae2faa7b571 100644 --- a/src/vs/workbench/services/auxiliaryWindow/electron-browser/auxiliaryWindowService.ts +++ b/src/vs/workbench/services/auxiliaryWindow/electron-browser/auxiliaryWindowService.ts @@ -24,6 +24,7 @@ import { getZoomLevel, isFullscreen, setFullscreen } from '../../../../base/brow import { getActiveWindow } from '../../../../base/browser/dom.js'; import { IWorkbenchEnvironmentService } from '../../environment/common/environmentService.js'; import { isMacintosh } from '../../../../base/common/platform.js'; +import { assert } from '../../../../base/common/assert.js'; import { IContextMenuService } from '../../../../platform/contextview/browser/contextView.js'; type NativeCodeWindow = CodeWindow & { @@ -156,6 +157,7 @@ export class NativeAuxiliaryWindowService extends BrowserAuxiliaryWindowService mark('code/auxiliaryWindow/willResolveWindowId'); const windowId = await auxiliaryWindow.vscode.ipcRenderer.invoke('vscode:registerAuxiliaryWindow', this.nativeHostService.windowId); mark('code/auxiliaryWindow/didResolveWindowId'); + assert(typeof windowId === 'number'); return windowId; } diff --git a/src/vs/workbench/services/editor/common/customEditorLabelService.ts b/src/vs/workbench/services/editor/common/customEditorLabelService.ts index 68eda9a9d67..bf7692f7589 100644 --- a/src/vs/workbench/services/editor/common/customEditorLabelService.ts +++ b/src/vs/workbench/services/editor/common/customEditorLabelService.ts @@ -159,10 +159,10 @@ export class CustomEditorLabelService extends Disposable implements ICustomEdito private readonly _filenameCaptureExpression = /(?^\.*[^.]*)/; private applyTemplate(template: string, resource: URI, relevantPath: string): string { let parsedPath: undefined | ParsedPath; - return template.replace(this._parsedTemplateExpression, (match: string, variable: string, ...args: any[]) => { + return template.replace(this._parsedTemplateExpression, (match: string, variable: string, ...args: unknown[]) => { parsedPath = parsedPath ?? parsePath(resource.path); // named group matches - const { dirnameN = '0', extnameN = '0' }: { dirnameN?: string; extnameN?: string } = args.pop(); + const { dirnameN = '0', extnameN = '0' } = args.pop() as { dirnameN?: string; extnameN?: string }; if (variable === 'filename') { const { filename } = this._filenameCaptureExpression.exec(parsedPath.base)?.groups ?? {}; diff --git a/src/vs/workbench/services/editor/test/browser/customEditorLabelService.test.ts b/src/vs/workbench/services/editor/test/browser/customEditorLabelService.test.ts index 96182d0967b..5c2789a8740 100644 --- a/src/vs/workbench/services/editor/test/browser/customEditorLabelService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/customEditorLabelService.test.ts @@ -33,7 +33,7 @@ suite('Custom Editor Label Service', () => { return [customLabelService, configService, instantiationService.createInstance(TestServiceAccessor)]; } - async function updatePattern(configService: TestConfigurationService, value: any): Promise { + async function updatePattern(configService: TestConfigurationService, value: unknown): Promise { await configService.setUserConfiguration(CustomEditorLabelService.SETTING_ID_PATTERNS, value); configService.onDidChangeConfigurationEmitter.fire({ affectsConfiguration: (key: string) => key === CustomEditorLabelService.SETTING_ID_PATTERNS, diff --git a/src/vs/workbench/services/host/browser/browserHostService.ts b/src/vs/workbench/services/host/browser/browserHostService.ts index 4277634e32e..dddecccdc52 100644 --- a/src/vs/workbench/services/host/browser/browserHostService.ts +++ b/src/vs/workbench/services/host/browser/browserHostService.ts @@ -538,16 +538,25 @@ export class BrowserHostService extends Disposable implements IHostService { } // Safari and Edge 14 are all using webkit prefix - // eslint-disable-next-line local/code-no-any-casts - if ((targetWindow.document).webkitIsFullScreen !== undefined) { + + interface WebkitDocument extends Document { + webkitFullscreenElement: Element | null; + webkitExitFullscreen(): Promise; + webkitIsFullScreen: boolean; + } + + interface WebkitHTMLElement extends HTMLElement { + webkitRequestFullscreen(): Promise; + } + + const webkitDocument = targetWindow.document as WebkitDocument; + const webkitElement = target as WebkitHTMLElement; + if (webkitDocument.webkitIsFullScreen !== undefined) { try { - // eslint-disable-next-line local/code-no-any-casts - if (!(targetWindow.document).webkitIsFullScreen) { - // eslint-disable-next-line local/code-no-any-casts - (target).webkitRequestFullscreen(); // it's async, but doesn't return a real promise. + if (!webkitDocument.webkitIsFullScreen) { + webkitElement.webkitRequestFullscreen(); // it's async, but doesn't return a real promise } else { - // eslint-disable-next-line local/code-no-any-casts - (targetWindow.document).webkitExitFullscreen(); // it's async, but doesn't return a real promise. + webkitDocument.webkitExitFullscreen(); // it's async, but doesn't return a real promise } } catch { this.logService.warn('toggleFullScreen(): requestFullscreen/exitFullscreen failed'); diff --git a/src/vs/workbench/services/label/test/browser/label.test.ts b/src/vs/workbench/services/label/test/browser/label.test.ts index f736e1bd069..bcf14160d8f 100644 --- a/src/vs/workbench/services/label/test/browser/label.test.ts +++ b/src/vs/workbench/services/label/test/browser/label.test.ts @@ -222,8 +222,7 @@ suite('URI Label', () => { } assert.deepStrictEqual(m, { formatters: expected }); - // eslint-disable-next-line local/code-no-any-casts - delete (m as any).formatters; + delete (m as { formatters: unknown }).formatters; }); }); diff --git a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts b/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts index 762840ba2f2..2495e02372f 100644 --- a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts @@ -34,7 +34,8 @@ export class NativeLifecycleService extends AbstractLifecycleService { const windowId = this.nativeHostService.windowId; // Main side indicates that window is about to unload, check for vetos - ipcRenderer.on('vscode:onBeforeUnload', async (event: unknown, reply: { okChannel: string; cancelChannel: string; reason: ShutdownReason }) => { + ipcRenderer.on('vscode:onBeforeUnload', async (event: unknown, ...args: unknown[]) => { + const reply = args[0] as { okChannel: string; cancelChannel: string; reason: ShutdownReason }; this.logService.trace(`[lifecycle] onBeforeUnload (reason: ${reply.reason})`); // trigger onBeforeShutdown events and veto collecting @@ -60,7 +61,8 @@ export class NativeLifecycleService extends AbstractLifecycleService { }); // Main side indicates that we will indeed shutdown - ipcRenderer.on('vscode:onWillUnload', async (event: unknown, reply: { replyChannel: string; reason: ShutdownReason }) => { + ipcRenderer.on('vscode:onWillUnload', async (event: unknown, ...args: unknown[]) => { + const reply = args[0] as { replyChannel: string; reason: ShutdownReason }; this.logService.trace(`[lifecycle] onWillUnload (reason: ${reply.reason})`); // trigger onWillShutdown events and joining diff --git a/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts b/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts index 1214694e56d..0c1a9f91495 100644 --- a/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts +++ b/src/vs/workbench/services/progress/test/browser/progressIndicator.test.ts @@ -7,32 +7,33 @@ import assert from 'assert'; import { DisposableStore } from '../../../../../base/common/lifecycle.js'; import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js'; import { AbstractProgressScope, ScopedProgressIndicator } from '../../browser/progressIndicator.js'; +import { ProgressBar } from '../../../../../base/browser/ui/progressbar/progressbar.js'; -class TestProgressBar { +class TestProgressBar extends ProgressBar { fTotal: number = 0; fWorked: number = 0; fInfinite: boolean = false; fDone: boolean = false; - infinite() { + override infinite() { this.fDone = null!; this.fInfinite = true; return this; } - total(total: number) { + override total(total: number) { this.fDone = null!; this.fTotal = total; return this; } - hasTotal() { + override hasTotal() { return !!this.fTotal; } - worked(worked: number) { + override worked(worked: number) { this.fDone = null!; if (this.fWorked) { @@ -44,7 +45,7 @@ class TestProgressBar { return this; } - done() { + override done() { this.fDone = true; this.fInfinite = null!; @@ -54,13 +55,13 @@ class TestProgressBar { return this; } - stop() { + override stop() { return this.done(); } - show(): void { } + override show(): void { } - hide(): void { } + override hide(): void { } } suite('Progress Indicator', () => { @@ -72,14 +73,13 @@ suite('Progress Indicator', () => { }); test('ScopedProgressIndicator', async () => { - const testProgressBar = new TestProgressBar(); + const testProgressBar = disposables.add(new TestProgressBar(document.createElement('div'))); const progressScope = disposables.add(new class extends AbstractProgressScope { constructor() { super('test.scopeId', true); } testOnScopeOpened(scopeId: string) { super.onScopeOpened(scopeId); } testOnScopeClosed(scopeId: string): void { super.onScopeClosed(scopeId); } }()); - // eslint-disable-next-line local/code-no-any-casts - const testObject = disposables.add(new ScopedProgressIndicator((testProgressBar), progressScope)); + const testObject = disposables.add(new ScopedProgressIndicator(testProgressBar, progressScope)); // Active: Show (Infinite) let fn = testObject.show(true);