deno v0.37.0の変更点まとめ

# 概要

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

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

# 破壊的変更

## `FileInfo.len`が`FileInfo.size`にリネームされた

`Deno.stat`等を使用している場合は影響があります。

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

## `Deno.run`の`args`オプションが`cmd`にリネームされました

```typescript
const process = Deno.run({
  cmd: ["echo", "Hello"], // v0.36.0までは`args`だった. v0.37.0以降は`cmd`で指定する
  stdout: "piped"
});
const decoder = new TextDecoder();
console.log(decoder.decode(await Deno.readAll(process.stdout!)));
process.close();
```

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

# 新機能等

## `console.log`等が`Symbol.toStringTag`及び`Symbol`型のプロパティに対応した

```typescript:v0.37.0
console.log({ a: "hello", [Symbol.toStringTag]: "world", [Symbol("hoge")]:"piyo" });
// world { a: "hello", Symbol(Symbol.toStringTag): "world", Symbol(hoge): "piyo" }
// v0.36.0までは、Symbol(Symbol.toStringTag)やSymbol(hoge)が表示されていなかった
```

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

## (std/node/fs) `chmod`, `chown`及び`close`が実装された

Node.jsのfsモジュールのポリフィルに以下の関数が実装されました。

- `chmod`
- `chown`
- `close`

```typescript:fs.chown
import * as fs from "https://deno.land/std@v0.37.0/node/fs.ts"

fs.chmod("hello.txt", 0o644, err => {
  if (err) {
    console.error(err);
  }
});
```

```typescript:fs.chown
const uid = ...;
const gid = ...;
fs.chown("hello.txt", uid, gid, err => {
  if (err) {
    console.error(err);
  }
});
```

```typescript:fs.close
const file = await Deno.open("hello.txt");
fs.close(file.rid, err => {
  if (err) {
    console.error(err);
  }
});
```

- https://github.com/denoland/deno/pull/4358
  - `chmod`の実装
- https://github.com/denoland/deno/pull/4377
  - `chown`と`close`の実装

## (std/node) querystringモジュールが実装された

Node.jsのポリフィルにquerystringモジュールが追加されました

```typescript
import * as qs from "https://deno.land/std@v0.37.0/node/querystring.ts"

console.log(qs.parse("a=1&b=test")); // { a: "1", b: "test" }
```

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

## `std/permissions`モジュールの追加

標準モジュールにパーミッションを扱うヘルパーが追加されました。

#### `grant`

```typescript
import { grant } from "https://deno.land/std@v0.37.0/permissions/mod.ts"

if (await grant({ name: "run" })) {
  console.log("OK!");
} else {
  console.log("NG...");
}
```

上記を実行すると、

- `--allow-run`パーミッションを与えていた場合、`true`に解決される`Promise`を返却する
- `--allow-run`パーミッションが与えられていない場合、プロンプトを表示しパーミッションの付与を促されます。許可した場合は
- `true`に解決される`Promise`、拒否した場合は`false`に解決される`Promise`を返却します

#### `grantOrThrow`

```typescript
import { grantOrThrow } from "https://deno.land/std@v0.37.0/permissions/mod.ts"

try {
  await grantOrThrow({ name: "net" });
  console.log("OK");
} catch (err) {
  console.error(err);
}
```

基本的には`grant`と同様ですが、権限を付与しなかった場合は、rejectされた`Promise`を返却するという点が異なります。

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

## `std/types`モジュールの追加

現時点では、下記モジュールの型定義ファイルが提供されています。

- `react`
- `react-dom`

```typescript
// @deno-types="https://deno.land/std@v0.37.0/types/react.d.ts"
import React from "https://cdn.pika.dev/_/react/v16";

console.log(React.createElement);
```

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

## 特定のテストケースをスキップできるようになった

`Deno.test`関数に`ignore`オプションが追加され、特定のケースをスキップできるようになりました。

以下のように`ignore`オプションに`true`が指定されたテストはスキップされます。

```typescript
Deno.test({
  ignore: true,
  name: "should work properly",
  fn() {
    console.log("skipped");
  }
});
```

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

## `Deno.test`がリソースリークを検知するようになった

`Deno.test`で定義したテストケースの実行完了後、denoがリソースリークのチェックを行うようになりました。

下記のように、リソースの開放を行っていないテストコードがあると、それを検知して、denoがテストを失敗させます。

```typescript
Deno.test("This should fail", async () => {
  await Deno.open("hello.txt");
});
```

無効化したいときは、`disableOpSanitizer`及び`disableResourceSanitizer`オプションに`true`を設定する必要があります。

```typescript
Deno.test({
  name: "This should fail",
  fn: async () => {
    await Deno.open("hello.txt");
  },
  disableOpSanitizer: true,
  disableResourceSanitizer: true
});
```

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

## テストランナーがtsx/jsx形式のテストファイルをサポート

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

## `Deno.open`/`Deno.close`に`mode`オプションが追加された

```typescript
const file = await Deno.open("hello.txt", {
  write: true,
  createNew: true,
  mode: 0o644 // New
});
```

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

## `fetch`の`body`オプションに`FormData`を渡せるようになった

```typescript
const formData = new FormData();
formData.append("hoge", "piyo");
await fetch("http://localhost:8000", {
  method: "POST",
  body: formData
});
```

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

## `deno upgrade`コマンドが実装された

`deno upgrade`でdenoのアップグレードができるようになりました。

`--dry-run`オプションを指定すると、実際にアップグレードすることなく、動作の確認を行うことができます。

```sh
$ deno upgrade --dry-run
```

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

## `Object.prototype.__proto__`が削除された

prototoypeを悪用した攻撃を防ぐために実施されたようです。

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

# その他の変更点

## (`std/http`)`server.close`を呼んだ際に、開いているTCPコネクションが切断されるようになった

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

## Windows環境では、`Deno.chmod`が例外を投げるように変更された

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

## `std/testing/runner.ts`が削除された

`deno test`コマンドでテストは実行できるため、削除されました。