1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-22 07:14:47 -05:00

feat(cli): enable useUnknownInCatchVariables by default (#12547)

Closes #11826

**BREAKING CHANGE** this behaviour was disable when introduced in Deno 1.14/TypeScript 4.4. It will highlight code that unsafely handles variables that are caught, and will cause type errors in unsafe code.
This commit is contained in:
Kitson Kelly 2021-10-28 08:43:40 +11:00 committed by GitHub
parent be68b82eb4
commit a065604155
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 56 additions and 17 deletions

View file

@ -160,8 +160,6 @@ pub(crate) fn get_ts_config(
"target": "esnext",
"tsBuildInfoFile": "deno:///.tsbuildinfo",
"useDefineForClassFields": true,
// TODO(@kitsonk) remove for Deno 2.0
"useUnknownInCatchVariables": false,
}));
if tsc_emit {
ts_config.merge(&json!({
@ -213,8 +211,6 @@ pub(crate) fn get_ts_config(
"target": "esnext",
"tsBuildInfoFile": "deno:///.tsbuildinfo",
"useDefineForClassFields": true,
// TODO(@kitsonk) remove for Deno 2.0
"useUnknownInCatchVariables": false,
}));
if tsc_emit {
ts_config.merge(&json!({

View file

@ -629,8 +629,6 @@ impl Inner {
"strict": true,
"target": "esnext",
"useDefineForClassFields": true,
// TODO(@kitsonk) remove for Deno 1.15
"useUnknownInCatchVariables": false,
}));
let config = &self.config;
let workspace_settings = config.get_workspace_settings();

View file

@ -1367,6 +1367,13 @@ itest!(error_import_map_unable_to_load {
exit_code: 1,
});
// This test ensure that useUnknownInCatchVariables is enabled by default.
itest!(use_unknown_in_catch_variables {
args: "run useUnknownInCatchVariables.ts",
output: "useUnknownInCatchVariables.ts.out",
exit_code: 1,
});
// Test that setting `self` in the main thread to some other value doesn't break
// the world.
itest!(replace_self {

View file

@ -4,5 +4,7 @@ console.log(location);
try {
location.hostname = "bar";
} catch (error) {
console.log(error.toString());
if (error instanceof Error) {
console.log(error.toString());
}
}

View file

@ -1,5 +1,7 @@
try {
await import("./delayed_error.ts");
} catch (error) {
console.log(`Caught: ${error.stack}`);
if (error instanceof Error) {
console.log(`Caught: ${error.stack}`);
}
}

View file

@ -1,11 +1,15 @@
try {
await import("./error_001.ts");
} catch (error) {
console.log(`Caught: ${error.stack}`);
if (error instanceof Error) {
console.log(`Caught: ${error.stack}`);
}
}
try {
await import("./error_001.ts");
} catch (error) {
console.log(`Caught: ${error.stack}`);
if (error instanceof Error) {
console.log(`Caught: ${error.stack}`);
}
}

View file

@ -5,6 +5,8 @@ function foo(): never {
try {
foo();
} catch (error) {
console.log(error.stack);
if (error instanceof Error) {
console.log(error.stack);
}
throw error;
}

View file

@ -7,6 +7,8 @@ class A {
try {
new A();
} catch (error) {
console.log(error.stack);
if (error instanceof Error) {
console.log(error.stack);
}
throw error;
}

View file

@ -7,6 +7,8 @@ class A {
try {
new A().m();
} catch (error) {
console.log(error.stack);
if (error instanceof Error) {
console.log(error.stack);
}
throw error;
}

View file

@ -7,6 +7,8 @@ const p = (async () => {
try {
await p;
} catch (error) {
console.log(error.stack);
if (error instanceof Error) {
console.log(error.stack);
}
throw error;
}

View file

@ -9,6 +9,8 @@ const p = Promise.all([
try {
await p;
} catch (error) {
console.log(error.stack);
if (error instanceof Error) {
console.log(error.stack);
}
throw error;
}

View file

@ -38,5 +38,9 @@ console.log(JSON.stringify(txt));
try {
await Deno.resolveDns("not-found-example.com", "A", nameServer);
} catch (e) {
console.log(`Error ${e.name} thrown for not-found-example.com`);
console.log(
`Error ${
e instanceof Error ? e.name : "[non-error]"
} thrown for not-found-example.com`,
);
}

View file

@ -0,0 +1,5 @@
try {
throw new Error();
} catch (e) {
console.log(e.message);
}

View file

@ -0,0 +1,5 @@
[WILDCARD]
error: TS2571 [ERROR]: Object is of type 'unknown'.
console.log(e.message);
^
at file://[WILDCARD]/useUnknownInCatchVariables.ts:4:15

View file

@ -12,7 +12,9 @@ unitTest(async function sendAsyncStackTrace() {
await Deno.read(rid, buf);
unreachable();
} catch (error) {
const s = error.stack.toString();
assert(error instanceof Error);
const s = error.stack?.toString();
assert(s);
console.log(s);
assertStringIncludes(s, "opcall_test.ts");
assertStringIncludes(s, "read");

View file

@ -98,6 +98,7 @@ unitTest(function textDecoderErrorEncoding() {
new TextDecoder("Foo");
} catch (e) {
didThrow = true;
assert(e instanceof Error);
assertEquals(e.message, "The encoding label provided ('Foo') is invalid.");
}
assert(didThrow);

View file

@ -1,5 +1,6 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
import {
assert,
assertEquals,
assertRejects,
assertThrows,
@ -251,6 +252,7 @@ unitTest(
try {
await Deno.writeFile(filename, data, { signal: ac.signal });
} catch (e) {
assert(e instanceof Error);
assertEquals(e.name, "AbortError");
}
const stat = Deno.statSync(filename);
@ -269,6 +271,7 @@ unitTest(
try {
await Deno.writeFile(filename, data, { signal: ac.signal });
} catch (e) {
assert(e instanceof Error);
assertEquals(e.name, "AbortError");
}
const stat = Deno.statSync(filename);