From 02a67205276e122da07e51810df9d031ded80ce1 Mon Sep 17 00:00:00 2001 From: Luca Casonato Date: Fri, 29 May 2020 12:45:20 +0200 Subject: [PATCH] Improved typechecking error for unstable props (#5503) --- cli/js/diagnostics_util.ts | 80 +++++++++++++++++++++++++++++++-- cli/tests/unstable_disabled.out | 2 +- 2 files changed, 78 insertions(+), 4 deletions(-) diff --git a/cli/js/diagnostics_util.ts b/cli/js/diagnostics_util.ts index 17e73e377d..7b66d72a39 100644 --- a/cli/js/diagnostics_util.ts +++ b/cli/js/diagnostics_util.ts @@ -10,6 +10,79 @@ import { DiagnosticItem, } from "./diagnostics.ts"; +const unstableDenoGlobalProperties = [ + "umask", + "linkSync", + "link", + "symlinkSync", + "symlink", + "DirKind", + "dir", + "loadavg", + "osRelease", + "openPlugin", + "DiagnosticCategory", + "DiagnosticMessageChain", + "DiagnosticItem", + "Diagnostic", + "formatDiagnostics", + "CompilerOptions", + "TranspileOnlyResult", + "transpileOnly", + "compile", + "bundle", + "Location", + "applySourceMap", + "LinuxSignal", + "MacOSSignal", + "Signal", + "SignalStream", + "signal", + "signals", + "setRaw", + "utimeSync", + "utime", + "ShutdownMode", + "shutdown", + "DatagramConn", + "UnixListenOptions", + "listen", + "listenDatagram", + "UnixConnectOptions", + "connect", + "StartTlsOptions", + "startTls", + "kill", + "PermissionName", + "PermissionState", + "RunPermissionDescriptor", + "ReadPermissionDescriptor", + "WritePermissionDescriptor", + "NetPermissionDescriptor", + "EnvPermissionDescriptor", + "PluginPermissionDescriptor", + "HrtimePermissionDescriptor", + "PermissionDescriptor", + "Permissions", + "PermissionStatus", + "hostname", +]; + +function transformMessageText(messageText: string, code: number): string { + if (code === 2339) { + const property = messageText + .replace(/^Property '/, "") + .replace(/' does not exist on type 'typeof Deno'\.$/, ""); + if ( + messageText.endsWith("on type 'typeof Deno'.") && + unstableDenoGlobalProperties.includes(property) + ) { + return `${messageText} 'Deno.${property}' is an unstable API. Did you forget to run with the '--unstable' flag?`; + } + } + return messageText; +} + interface SourceInformation { sourceLine: string; lineNumber: number; @@ -78,7 +151,8 @@ function fromDiagnosticMessageChain( return undefined; } - return messageChain.map(({ messageText: message, code, category, next }) => { + return messageChain.map(({ messageText, code, category, next }) => { + const message = transformMessageText(messageText, code); return { message, code, @@ -110,9 +184,9 @@ function parseDiagnostic( let message: string; let messageChain: DiagnosticMessageChain | undefined; if (typeof messageText === "string") { - message = messageText; + message = transformMessageText(messageText, code); } else { - message = messageText.messageText; + message = transformMessageText(messageText.messageText, messageText.code); messageChain = fromDiagnosticMessageChain([messageText])![0]; } diff --git a/cli/tests/unstable_disabled.out b/cli/tests/unstable_disabled.out index 695ca122ce..e951c5d0ab 100644 --- a/cli/tests/unstable_disabled.out +++ b/cli/tests/unstable_disabled.out @@ -1,5 +1,5 @@ [WILDCARD] -error: TS2339 [ERROR]: Property 'loadavg' does not exist on type 'typeof Deno'. +error: TS2339 [ERROR]: Property 'loadavg' does not exist on type 'typeof Deno'. 'Deno.loadavg' is an unstable API. Did you forget to run with the '--unstable' flag? console.log(Deno.loadavg); ~~~~~~~ at [WILDCARD]/cli/tests/unstable.ts:1:18