deno v0.39.0の変更点まとめ

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

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

# 破壊的変更

## `std/strings`が削除された

- `std/strings/mod.ts`で公開されていた`encode`/`decode`関数は、`std/encoding/utf8.ts`に移動しています。

```typescript
import { encode, decode } from "https://deno.land/std@v0.39.0/encoding/utf8.ts";

const data = encode("Hello, world!");
console.log(decode(data)); // Hello, world!
```

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

## `std/media_types`が削除された

元々存在していたmedia_typesモジュールは、[oakserver](https://github.com/oakserver/media_types)のorganizationに移動しました。

https://deno.land/x/media_types/mod.ts からimportできます。

```typescript
import { contentType } from "https://deno.land/x/media_types@v1.0.0/mod.ts";

console.log(contentType("mod.js")); // application/javascript; charset=utf-8
```

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

# 新機能等

## `std/path`モジュールに`common`関数が追加された

- 引数として与えたパスの中から共通部分を返してくれます。

```typescript
import { common } from "https://deno.land/std@v0.39.0/path/mod.ts";

console.log(common([
  "./hoge/piyo/fuga",  
  "./hoge/piyo",
  "./hoge/fuga/piyo"
])); // ./hoge/
```

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

## `--inspect-brk`オプションがサポートされた

```typescript:sample.ts
debugger;
console.log("Hello");
```

```sh
$ deno run --inspect-brk ./sample.ts
```

1. 上記の実行後、Chromeから`chrome://inspect`のページを開きます。
2. 「Remote Target」の欄から「inspect」をクリックして、Chrome DevToolsを開きます。
3. この時点では、Denoの内部スクリプトの1行目で処理が中断しています。「Resume script execution」を実行すると、処理が続行され、上記`sample.ts`の`debugger`ラインで処理が中断します。

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

## `deno bundle`がダイナミックimportに対応した

```typescript:sample.ts
const { greet } = await import("./mod.ts");
greet();
```

```typescript:mod.ts
export function greet(): void {
  console.log("hello");
}
```

```sh
$ deno bundle ./sample.ts ./bundle.ts
$ deno run ./bundle.ts
hello
```

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

## `deno test`に`--filter`オプションが追加された

- `--filter`オプションを指定すると、指定した値を名前に含むテストのみが実行されます。

```typescript:test.ts
Deno.test("sample 1", () => {});
Deno.test("[sample] 2", () => {});
Deno.test("should fail", () => {
  throw new Error();
});
```

```sh
$ deno test --filter sample
running 2 tests
test sample 1 ... ok (7ms)
test [sample] 2 ... ok (1ms)

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out (9ms)
```

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

## `console.log`の出力が改善された

- `Promise`の出力

```typescript
console.log(Promise.resolve(100));
```

**v0.38.0**

```sh
Promise {}
```

**v0.39.0**

```sh
Promise { 100 }
```

- `Iterable`
  - 出力される要素数が100に限定されました
  - 行の長さに応じて改行が行われるようになりました

```typescript
console.log([..."@".repeat(500)]);
```

```sh
[
  "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@",
  "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@",
  "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@",
  "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@",
  "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@",
  "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@",
  "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@",
  "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@", "@",
  "@", "@", "@", "@",
  ... 400 more items
]
```

https://github.com/denoland/deno/pull/4524
https://github.com/denoland/deno/pull/4472

# その他変更点

## (`std/http/cookie`) `setCookie`を複数回呼ぶと、Cookieが上書きされる問題が修正された

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

const res: Response = {
  headers: new Headers()
};

setCookie(res, { name: "a", value: "hoge" });
setCookie(res, { name: "b", value: "piyo", secure: true });

console.log(res.headers.get("set-cookie");
// v0.39.0: `a=hoge, b=piyo; Secure`
// v0.38.0: `b=piyo; Secure`
```

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

## `deno repl`と`deno eval`が`--inspect`フラグに対応した

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

## `deno doc`の改善

* 出力に色がつくようになった
* `declare`がサポートされた
* 基底クラスの名前が表示されるようになった
* 明示的に実装している`interface`名が表示されるようになった

等、色々と改善が行われています。

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

## (`std/http/file_server`) ファイルの拡張子を元に、`Content-Type`が設定されるようになった

これによってHTMLファイル等を返却する際に、ブラウザで内容を適切に表示できるようになりました。

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

## テストコード中で`clearInterval`/`clearTimeout`を使用してタイマーを解除したにも関わらず、リソースリークエラーが発生する問題が修正された

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

## `Blob.slice`の`contentType`パラメータに不正な値を渡すと例外が発生する問題が修正された

ブラウザとDenoで`Blob.slice`の`contentType`パラメータに不正な値を渡した際の挙動が異なる問題がありました。

- ブラウザ: `Blob.type`に空文字列が設定される
- Deno: 例外が発生する

v0.39.0にて、ブラウザと同様の挙動を行うように修正されました。

https://developer.mozilla.org/ja/docs/Web/API/Blob/slice

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

## `Worker.poll`がprivateになった

非標準の`poll`メソッドがpublicとして公開されていたため、privateメソッドに変更されました。

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