deno v0.35.0の変更点まとめ

# 概要

https://github.com/denoland/deno/releases/tag/v0.35.0

denoのv0.35.0がリリースされたため、変更点をまとめます。

# 主要な変更点(新機能等)

## `Deno.fsEvents()`が実装された

denoでファイルの変更等を監視できるようになりました。

```typescript
const iter = Deno.fsEvents("./testdata");

const encoder = new TextEncoder();
Deno.writeFileSync("./testdata/hello.txt", encoder.encode("hello"));

for await (const event of iter) {
  console.log(event); // { kind: "create", paths: [ "/home/uki00a/work/deno/sample/./testdata/hello.txt" ] }
  break;
}
```

https://github.com/denoland/deno/pull/3452

## UDPがサポートされた

`Deno.listen`に`transport: "udp"`を指定することで、UDP通信ができます。

```typescript
const encoder = new TextEncoder();
const decoder = new TextDecoder();
const server = Deno.listen({ transport: "udp", hostname: "127.0.0.1", port: 50000 });
const client = Deno.listen({ transport: "udp", hostname: "127.0.0.1", port: 50001 });
try {
  await client.send(encoder.encode('hello'), server.addr);
  const [received, remote] = await server.receive();
  console.log(decoder.decode(received)); // hello
  console.log(remote); // { hostname: "127.0.0.1", port: 50001, transport: "udp" }
} finally {
  client.close();
  server.close();
}
```

https://github.com/denoland/deno/pull/3946

## `Deno.setRaw()`が実装された

`Deno.setRaw`で端末のrawモードの有効・無効を切り替えられるようになりました。

```typescript
Deno.setRaw(Deno.stdin.rid, true); // rawモードを有効化
const buf = new Uint8Array(1);
await Deno.stdin.read(buf);
console.log(new TextDecoder().decode(buf));
Deno.setRaw(Deno.stdin.rid, false); // rawモードを無効化
```

また、`Deno.isTTY`が削除され、`Deno.isatty`関数が追加されています。

```typescript
Deno.isatty(Deno.stdin.rid); // true
```

https://github.com/denoland/deno/pull/3958

## `Deno.formatDiagnostics`が実装された

`Deno.compile`や`Deno.bundle`とセットで使用します。
コンパイルエラーに関するメッセージを整形し、画面に表示することができます。

```typescript
const [diagnostics] = await Deno.compile("mod.ts", {
  "mod.ts": "document.getElementById('hoge');"
});
console.log(Deno.formatDiagnostics(diagnostics!));
// error TS2584: Cannot find name 'document'. Do you need to change your target library? Try changing the `lib` compiler option to include 'dom'.
```

https://github.com/denoland/deno/pull/4032

## `deno eval -T`でTypeScriptコードの評価ができるようになった

```sh
$ deno eval -T "const obj = { a: 123 }; obj.b = 'hello';"
error TS2339: Property 'b' does not exist on type '{ a: number; }'.

$ deno eval -T "const obj = { a: 1 }; obj.a = 2; console.log(obj);"
{ a: 2 }
```

https://github.com/denoland/deno/pull/4141

## Compiler APIでtypesオプションがサポートされた

```typescript:hoge.d.ts
declare namespace Hoge {
  const hoge: string;
}
```

```typescript
const [diagnostics] = await Deno.compile("mod.ts", {
  "mod.ts": "console.log(Hoge.hoge);"
}, { types: ["./hoge.d.ts"] });
```

https://github.com/denoland/deno/pull/4155

## (std/node)`os.platform`が実装された

```typescript
import * as os from "https://deno.land/std@v0.35.0/node/os.ts";

console.log(os.platform());
```

https://github.com/denoland/deno/pull/4064

## TypeScriptが3.8にアップデートされた

https://github.com/denoland/deno/pull/4100

## `window.self`が追加された

```typescript
window.self === window; // `true`
window.self === globalThis; // `true`
```

https://github.com/denoland/deno/pull/4131

## `Deno.errors`名前空間の追加

`Deno.ErrorKind`が削除され、代わりに`Deno.errors`名前空間が追加されました。

`instanceof`を使用して、どのようなエラーが発生したか調べられるようになりました。

```typescript
try {
  Deno.readFileSync('./dummy.txt')
} catch (err) {
  console.error(err instanceof Deno.errors.NotFound);
}
```

https://github.com/denoland/deno/issues/4067

# その他の変更点

- `deno fmt -`でフォーマットエラーが発生した際に、終了コードとして0が返却される問題が修正された
  - https://github.com/denoland/deno/pull/4163
  - https://github.com/denoland/deno/issues/4157
- Worker内で`WebAssembly`オブジェクトを参照すると、コンパイルエラーが発生する問題が修正された
  - https://github.com/denoland/deno/pull/4084
  - https://github.com/denoland/deno/issues/4077
- (std/examples)簡易的なchatアプリケーションの実装例が追加された
  - https://github.com/denoland/deno/pull/4022
  - @keroxpさんによる対応です。以下のコマンドを実行すると、8080番ポートでチャットアプリケーションが起動します。

```sh
$ deno run --allow-net https://deno.land/std@v0.35.0/examples/chat/server.ts
```

- `fetch`でサポートされていないプロトコル(`file:///`等)に対してリクエストを送信するとパニックする問題が修正された
  - パニックするのではなく、例外を投げるように修正されています。
  - https://github.com/denoland/deno/pull/4085
- (std/http)同一TCPコネクション上で後続のリクエストを読み込む前に、未読のボディ及びトレイラを消費するよう修正された
  - @keroxpさんによる対応です。
  - https://github.com/denoland/deno/pull/3990
- (std/ws)まれに`Sec-Websocket-Key`ヘッダに`undefined`が含まれていまう問題が修正された
  - @suguru03 さんによる対応です。
  - https://github.com/denoland/deno/pull/4063
- `ws.close`の引数を省略できるようになりました。
  - @keroxpさんによる対応です。
  - 省略した際は`1000`(Normal Closure)がデフォルト値として利用されます。
      - https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes
  - https://github.com/denoland/deno/pull/4172
- `Deno.makeTemp*`を実行する際に、`--allow-write`フラグ及び`dir`オプションに相対パスを渡すと、パーミッションエラーが発生する問題が修正された
  - https://github.com/denoland/deno/pull/4104
  - https://github.com/denoland/deno/issues/4103