deno v0.41.0の変更点まとめ

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

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

# 破壊的変更

## `Deno.readdir`の返却値が変更された

- 新しく`DirEntry`型が追加されました。
  - この型は`FileInfo`型を実装しています。
  - また、`FileInfo`型の`isFile`/`isDirectory`/`isSymlink`がメソッドからプロパティに変更されています。
- `Deno.readdir`の戻り値の型が`Promise<FileInfo[]>`から`AsyncIterable<DirEntry>`に変更されました。

```typescript
for await (const entry of Deno.readdir("./dir")) {
  console.log(entry.isFile);
}
```

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

## `Deno.mkdir`/`mkdirSync`の非推奨のオーバーロードが削除

以下のような3引数を受け取る形式がサポートから外されました。

v0.29.0から非推奨という扱いでしたが、v1.0.0のリリースに先立ち、削除されました。

```typescript
export function mkdir(
  path: string,
  recursive?: boolean,
  mode?: number
): Promise<void>;
```

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

## Fetch APIのWeb標準との互換性を向上

- `Response.redirect`がスタティックメソッドに変更されました。
  - v0.40.0まではインスタンスメソッドとして定義されていました。
- `Response.body`が`AsyncIterable`ではなくなりました。

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

## `std/testing/format.ts`の削除

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

## `std/types`が`https://deno.land/x/types`に移動した

- 今まで`std/types`で管理されていたreactとreact-domモジュールの型定義ファイルが、[deno_types](https://github.com/Soremwar/deno_types)リポジトリへ移動しました。

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

# 新規機能

## (`deno doc`) ビルトインAPIに関するドキュメントを出力できるようになりました。

- 例) 引数を指定せずに`deno doc`を実行すると、すべてのビルトインAPIのドキュメントが出力されます。

```sh
$ deno doc
```

- 例) 特定のAPIのドキュメントを出力したいときは、`--builtin`に続けて、そのAPIを指定します。

```sh
# Deno.readdirのドキュメントを表示する
$ deno doc --builtin Deno.readdir

# Deno.openのドキュメントを表示する
$ deno doc --builtin Deno.open
```

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

## `std/log`に関する変更

- `FileHandler`を作成する際に、モードを指定できるようになりました。

```typescript
const fileHandler = new log.handlers.FileHandler("DEBUG", {
  filename: "./log.txt",
  mode: "a" // 省略可能(デフォルトは"a")
});
```

- `FileHandler`が同期的にログを書き込むように変更されました。
- `RotatingFileHandler`が追加されました。
  - 基本的には`FileHandler`と同様の挙動をしますが、ログファイルのローテーションに対応しています。

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

## (`std/node/util`) `isPrimitive`関数が実装された

```typescript
import { isPrimitive } from "https://deno.land/std@v0.41.0/node/util.ts";

console.log(isPrimitive(1)); // true
console.log(isPrimitive("Hello world!")); // true
console.log(isPrimitive({ a: 1 })); // false
console.log(isPrimitive([1, 2, 3])); // false
```

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

## (`std/node/fs`) `copyFile`/`copyFileSync`関数が実装された

- 利用する際は、`--allow-read`及び`--allow-write`フラグを指定する必要があります。

```typescript
import { copyFile } from "https://deno.land/std@v0.41.0/node/fs.ts";

const src = "./src.txt";
const dest = "./dest.txt";
copyFile(src, dest, err => {
  if (err) {
    console.error(err);
  }
});
```

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

## (`std/signal`) `onSignal`関数が追加された

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

const handle = onSignal(Deno.Signal.SIGTERM, () => {
  console.log("on SIGTERM");
  handle.dispose();
});
```

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

## (`std/testing`) エラーメッセージが改善された

```typescript
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
assertEquals(1, 2);
```

以下は、v0.40.0とv0.41.0、それぞれの出力内容です。

```sh:v0.40.0
    [Diff] Left / Right


-   1
+   2
```

```sh:v0.41.0
    [Diff] Actual / Expected


-   1
+   2
```

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

## `std/http/cookie`モジュールの変更

- 空のクッキー名を渡した際は、`Set-Cookie`が設定されないように修正されました

```typescript
import { setCookie } from "https://deno.land/std@v0.41.0/http/cookie.ts";

const headers = new Headers();
setCookie({ headers }, { name: "", value: "hoge" });
console.log(headers.get("Set-Cookie")); // => null
```

- `SameSite=None`を指定できるようになりました。(v0.40.0までは、コンパイルエラーが発生していました)

```typescript
import { setCookie } from "https://deno.land/std@v0.41.0/http/cookie.ts";

const headers = new Headers();
setCookie({ headers }, {
  name: "a",
  value: "hoge",
  sameSite: "None"
});
console.log(headers.get("Set-Cookie")); // => 'a=hoge; SameSite=None'
```

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

## (`std/multipart`) `MultipartReader#readForm`の戻り値が変更された

```typescript
import { MultipartReader } from "https://deno.land/std@v0.41.0/mime/multipart.ts";
...
const mr = new MultipartReader(reader, boundary);
const form = await mr.readForm();
console.log(form.file("file"));
await form.removeAll();
```

- [v0.40.0](https://doc.deno.land/https/deno.land/std@v0.40.0/mime/multipart.ts#MultipartReader)
- [v0.41.0](https://doc.deno.land/https/deno.land/std@v0.41.0/mime/multipart.ts#MultipartReader)

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

## (`std/uuid`) UUID v1がサポートされた

```typescript
import { generate } from "https://deno.land/std@v0.41.0/uuid/v1.ts";
console.log(generate());
```

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

## `deno install`を実行する際に指定したログレベル(`--log-level`)が、インストールされたスクリプトに引き継がれるようになった

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

## Worker APIがよりWeb標準に近づいた

- `Worker#terminate()`及び`self.close()`が実装された([#4684](https://github.com/denoland/deno/pull/4684))
- `MessageEvent`及び`ErrorEvent`が実装され、それに伴い、`Worker.onmessage`と`Worker.onerror`のシグネチャが変更された([#4391](https://github.com/denoland/deno/pull/4391))

## `AbortController`/`AbortSignal`が実装された

- ただし、Fetch APIとは、まだ完全に統合されているわけではないようです。

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