deno v0.33.0の変更点まとめ

# 概要

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

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

# Breaking Changes

## テストランナーがRustでリライトされた

それに伴い、`deno_std/testing/mod.ts`が削除され、`test`及び`runTests`関数が`Deno`オブジェクトに組みこまれています。

そのため、v0.32.0までは、テストは下記のように記述していましたが、

```typescript
import { test, runTests } from "https://deno.land/std@v0.32.0/testing/mod.ts";
import { assertStrictEq } from "https://deno.land/std@v0.32.0/testing/asserts.ts";

test('add', () => {
  assertStrictEq(add(1, 2), 3);
});

runTests();
```

v0.33.0以降では、下記のように変更する必要があります。

```typescript
import { assertStrictEq } from "https://deno.land/std@v0.33.0/testing/asserts.ts";

Deno.test('add', () => {
  assertStrictEq(add(1, 2), 3);
});

Deno.runTests();
```

特定のテストファイルのみを実行したいときは、`runIfMain`関数を使うのではなく、`deno test`コマンドで対象のファイルのみを指定する必要があります。

```sh
$ deno test ./add_test.ts
```

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

# 新規機能等

## (std/http)Trailerレスポンスヘッダのサポート

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

@keroxpさんにより、Trailerレスポンスヘッダのサポートが追加されました。

`req.respond`の`trailers`オプションを指定することで、利用できます。

```typescript
import { serve } from "https://deno.land/std@v0.33.0/http/server.ts";
import { StringReader } from "https://deno.land/std@v0.33.0/io/readers.ts";

const server = serve({ port: 8000 });
for await (const req of server) {
  req.respond({
    body: new StringReader("hello"),
    headers: new Headers({
      "transfer-encoding": "chunked",
      "trailer": "x-hoge,x-piyo"
    }),
    // New
    trailers: () => new Headers({
      "x-hoge": "one",
      "x-piyo": "two"
    })
  });
}
```

## (std/node/fs)`readlink`及び`readlinkSync`が追加

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

Node.jsのfsモジュールのポリフィルに`readlink`及び`readlinkSync`関数が実装されました。

## (std/node)eventsモジュールのポリフィルが追加

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

Node.jsのeventsモジュールのポリフィルが実装されました。

## `deno install`に`--force`フラグが追加

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

それに伴い、インストール済みのコマンドを`deno install`で再インストールする際の挙動が変更されています。

例えば、すでに[dem](https://github.com/syumai/dem)がインストールされている状態で以下のコマンドを実行すると、エラーが発生します。(v0.32.0までは、プロンプトを表示し、ユーザにインストール可否を問うように実装されていました)

```sh
$ deno install dem https://deno.land/x/dem@0.3.1/cmd.ts --allow-read --allow-write -f
```

再インストールする際は、`--force`フラグを指定する必要があります。

```sh
$ deno install --force dem https://deno.land/x/dem@0.3.1/cmd.ts --allow-read --allow-write
```

## コンパイラAPI周りの変更

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

`Deno.compile`及び`Deno.bundle`から返却される配列の第一要素が、オブジェクトから配列に変更されています。

```typescript:mod.ts
(async () => {
  const [diagnostics] = await Deno.compile('./a.ts');
  console.log(JSON.stringify(diagnostics, null, 2));
})();
```

```typescript:a.ts
aaaaaa
add(1, 2);
```

以下は`mod.ts`をdenoのv0.32.0及びv0.33.0それぞれで実行した結果です。

```json:v0.32.0
{
  "items": [
    {
      "message": "Cannot find name 'aaaaaa'.",
      "code": 2304,
      "category": 3,
      "startPosition": 0
    },
    {
      "message": "Cannot find name 'add'.",
      "code": 2304,
      "category": 3,
      "startPosition": 7,
      "endPosition": 10,
      "sourceLine": "add(1, 2);",
      "lineNumber": 1,
      "scriptResourceName": "file:///home/uki00a/work/deno/a.ts",
      "startColumn": 0,
      "endColumn": 3
    }
  ]
}

```

```json:v0.33.0
[
  {
    "message": "Cannot find name 'aaaaaa'.",
    "code": 2304,
    "category": 3,
    "startPosition": 0
  },
  {
    "message": "Cannot find name 'add'.",
    "code": 2304,
    "category": 3,
    "startPosition": 7,
    "endPosition": 10,
    "sourceLine": "add(1, 2);",
    "lineNumber": 1,
    "scriptResourceName": "file:///home/uki00a/work/deno/a.ts",
    "startColumn": 0,
    "endColumn": 3
  }
]
```

## `deno fmt`が標準入力からフォーマット元の内容を受け取れるようになった

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

`deno fmt -`で標準入力からフォーマット元を受け取れます。

フォーマット結果は標準出力へ出力されます。

```typescript:mod.ts
function add(
  a: number
  ,
    b:   number  ):
       number
      {
  return a   +     b  ;
      }
```

```sh
$ cat mod.ts | deno fmt -
function add(
  a: number,
  b: number
): number {
  return a + b;
}
```

## std/signalモジュールが追加された

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

@kt3kさんにより、シグナルハンドリングに関するユーティリティが標準モジュールへ追加されました。

```typescript
import { signal } from "https://deno.land/std@v0.33.0/signal/mod.ts";

// 複数のシグナルのハンドリング
const stream = signal(Deno.Signal.SIGTERM, Deno.Signal.SIGHUP);
for await (const _ of stream) {
  doSomething();  
}
```

## fix(std/path): `globrex`がキャプチャグループを使用しないように修正された。

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

## deno fmtでトップレベルawaitがサポートされた

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

## wasmファイルをimportできるようになった

wasmをimportにより直接読み込むことができない問題が修正されました。

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

## `deno bundle`の改善

bundle時のモジュール形式がamdからsystemへ変更された。

また、抽象クラスがexportされない問題の修正や`import.meta`等のサポートも行われています。

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

## その他の修正

* `deno types | head`を実行するとクラッシュする問題が修正された
  * https://github.com/denoland/deno/pull/3910
* 32bitの境界で揃えられていないデータを返却しようとするとクラッシュする問題が修正された(denoプラグイン)
  * https://github.com/denoland/deno/pull/3935
  * https://github.com/denoland/deno/issues/3925
* `deno install --allow-env`を実行した際に発生するエラーが修正された
  * https://github.com/denoland/deno/pull/3906
* ファイル名に%が含まれているとファイルサーバがクラッシュする問題が修正された(std/http/file_server)
  * https://github.com/denoland/deno/pull/3953
* `WebSocket#send`が排他的にフレームを送信するよう修正された(std/ws)
  * https://github.com/denoland/deno/pull/3885