From 6246a039a0d34e5603e0a0545d1e4050ee4c0f37 Mon Sep 17 00:00:00 2001 From: Takashi Tamura Date: Wed, 23 Oct 2024 12:54:28 +0900 Subject: [PATCH] Use instanceOfNodeError --- src/components/server.ts | 6 +++--- src/providers/atsuggestionlib/atsuggestion.ts | 4 ++-- src/providers/completionlib/command.ts | 9 ++++++--- src/providers/completionlib/environment.ts | 11 +++++++---- src/utils/utils.ts | 12 ++++++++++++ test/completion.index.ts | 2 +- test/multiroot-ws.index.ts | 2 +- test/rootfile.index.ts | 2 +- test/unittest.index.ts | 2 +- test/viewer.index.ts | 2 +- viewer/components/extensionconnection.ts | 2 +- 11 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/components/server.ts b/src/components/server.ts index 27555177..2385ab31 100644 --- a/src/components/server.ts +++ b/src/components/server.ts @@ -10,6 +10,7 @@ import { ExternalPromise } from '../utils/externalpromise.js' import type { Logger } from './logger.js' import type { Viewer } from './viewer.js' import { inspectCompact, inspectReadable } from '../utils/inspect.js' +import { instanceOfNodeError } from '../utils/utils.js' class WsServer extends ws.Server { private readonly validOrigin: string @@ -284,9 +285,8 @@ export class Server { this.sendOkResponse(response, content, contentType) } } catch (err: unknown) { - if (err instanceof vscode.FileSystemError || err instanceof Error) { - /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */ - const code = (err as any)?.code as unknown + if (err instanceof vscode.FileSystemError || instanceOfNodeError(err, Error)) { + const code = err.code if (code === 'FileNotFound' || code === 'ENOENT') { response.writeHead(404) } else { diff --git a/src/providers/atsuggestionlib/atsuggestion.ts b/src/providers/atsuggestionlib/atsuggestion.ts index c5fe044a..23852a37 100644 --- a/src/providers/atsuggestionlib/atsuggestion.ts +++ b/src/providers/atsuggestionlib/atsuggestion.ts @@ -78,8 +78,8 @@ export class AtSuggestion implements IProvider { const filteredSuggestions = suggestions.filter(item => item.label === result[0]) if (filteredSuggestions.length > 0) { return filteredSuggestions.map(item => { - /* eslint-disable-next-line @typescript-eslint/no-base-to-string */ - item.range = new vscode.Range(args.position.translate(undefined, -item.label.toString().length), args.position) + const length = typeof item.label === 'string' ? item.label.length : item.label.label.length + item.range = new vscode.Range(args.position.translate(undefined, -length), args.position) return item }) } diff --git a/src/providers/completionlib/command.ts b/src/providers/completionlib/command.ts index db20c189..cc642db4 100644 --- a/src/providers/completionlib/command.ts +++ b/src/providers/completionlib/command.ts @@ -30,9 +30,12 @@ export interface CmdSignature { readonly args: string // {} for mandatory args and [] for optional args } -function isCmdItemEntry(obj: any): obj is CmdItemEntry { - /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */ - return (typeof obj.command === 'string') && (typeof obj.snippet === 'string') +function isCmdItemEntry(obj: CmdItemEntry | undefined) { + if (obj) { + return (typeof obj.command === 'string') && (typeof obj.snippet === 'string') + } else { + return false + } } /** diff --git a/src/providers/completionlib/environment.ts b/src/providers/completionlib/environment.ts index f0b0a5aa..6af5abf0 100644 --- a/src/providers/completionlib/environment.ts +++ b/src/providers/completionlib/environment.ts @@ -21,9 +21,12 @@ export interface EnvItemEntry { readonly detail?: string } -function isEnvItemEntry(obj: any): obj is EnvItemEntry { - /* eslint-disable-next-line @typescript-eslint/no-unsafe-member-access */ - return (typeof obj.name === 'string') +function isEnvItemEntry(obj: EnvItemEntry | undefined) { + if (obj) { + return (typeof obj.name === 'string') + } else { + return false + } } export enum EnvSnippetType { @@ -73,7 +76,7 @@ export class Environment implements IProvider { const content = await lwfs.readFile(filePathUri) const envs: Record = JSON.parse(content) as DataEnvsJsonType Object.keys(envs).forEach(key => { - if (! isEnvItemEntry(envs[key])) { + if (!isEnvItemEntry(envs[key])) { this.extension.logger.info(`Cannot parse intellisense file: ${filePathUri}`) this.extension.logger.info(`Missing field in entry: "${key}": ${inspectCompact(envs[key])}`) delete envs[key] diff --git a/src/utils/utils.ts b/src/utils/utils.ts index eb331192..bc97ca0e 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -25,6 +25,18 @@ export function escapeRegExp(str: string) { return str.replace(/[-[\]/{}()*+?.\\^$|]/g, '\\$&') } +/** + * A typeguarded version of `instanceof Error` for NodeJS. + * @author Joseph JDBar Barron + * @link https://dev.to/jdbar/the-problem-with-handling-node-js-errors-in-typescript-and-the-workaround-m64 + */ +export function instanceOfNodeError Error>( + value: unknown, + errorType: T +): value is InstanceType & NodeJS.ErrnoException { + return value instanceof errorType; +} + /** * Resolve a relative file path to an absolute path using the prefixes `dirs`. * diff --git a/test/completion.index.ts b/test/completion.index.ts index 0cea23cd..1bbb50f9 100644 --- a/test/completion.index.ts +++ b/test/completion.index.ts @@ -27,7 +27,7 @@ export function run(): Promise { }) } catch (e) { console.error(e) - /* eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors */ + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(e) } }) diff --git a/test/multiroot-ws.index.ts b/test/multiroot-ws.index.ts index 36747af0..73d9f56f 100644 --- a/test/multiroot-ws.index.ts +++ b/test/multiroot-ws.index.ts @@ -27,7 +27,7 @@ export function run(): Promise { }) } catch (e) { console.error(e) - /* eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors */ + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(e) } }) diff --git a/test/rootfile.index.ts b/test/rootfile.index.ts index b441e01b..4ecd1ee7 100644 --- a/test/rootfile.index.ts +++ b/test/rootfile.index.ts @@ -27,7 +27,7 @@ export function run(): Promise { }) } catch (e) { console.error(e) - /* eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors */ + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(e) } }) diff --git a/test/unittest.index.ts b/test/unittest.index.ts index d9f0c63d..3330c899 100644 --- a/test/unittest.index.ts +++ b/test/unittest.index.ts @@ -27,7 +27,7 @@ export function run(): Promise { }) } catch (e) { console.error(e) - /* eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors */ + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(e) } }) diff --git a/test/viewer.index.ts b/test/viewer.index.ts index 38bc62d6..933f51fd 100644 --- a/test/viewer.index.ts +++ b/test/viewer.index.ts @@ -27,7 +27,7 @@ export function run(): Promise { }) } catch (e) { console.error(e) - /* eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors */ + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(e) } }) diff --git a/viewer/components/extensionconnection.ts b/viewer/components/extensionconnection.ts index d2f98f92..f1d86406 100644 --- a/viewer/components/extensionconnection.ts +++ b/viewer/components/extensionconnection.ts @@ -100,7 +100,7 @@ class ConnectionPort { const server = `${scheme}://${window.location.hostname}:${window.location.port}` const sock = new WebSocket(server) sock.addEventListener('open', () => this.socketPromise.resolve(sock) ) - /* eslint-disable-next-line @typescript-eslint/no-base-to-string */ + // eslint-disable-next-line @typescript-eslint/no-base-to-string sock.addEventListener('error', (ev) => this.socketPromise.reject(new Error(`Failed to connect to ${server}: ${ev}`)) ) this.startConnectionKeeper() }