Deno v1.20.6

Deno v1.20.6がリリースされました。

deno fmtコマンドの内部実装で使用されているdprint関連のプラグインがアップデートされています。

その影響により、deno fmtコマンドのパフォーマンス向上やバグの修正が行われています。 (オブジェクトリテラルと3項演算子を併用した際に、フォーマット結果に一貫性がなくなる問題が修正されているようです)


https://github.com/denoland/deno/releases/tag/v1.20.6

deno_std v0.135.0

deno_std v0.135.0がリリースされました。

このリリースでは破壊的変更が実施されています。

io/readers: MultiReaderのシグネチャの変更 (破壊的変更)

MultiReaderのコンストラクタの引数が可変長引数ではなくDeno.Readerの配列を受け取るように変更されています。

変更前:

const readers: Array<Deno.Reader> = [...];
new MultiReader(...readers);

変更後:

const readers: Array<Deno.Reader> = [...];
new MultiReader(readers);

MultiReaderstd/archive/tar.tsモジュールの内部で使われており、大量のファイルを持つtarファイルを作ろうとすると、maximum call stack exceededエラーが発生してしまう問題があったようです。

mime/multipartの非推奨化 (破壊的変更)

mime/multipartモジュールが非推奨化されました。

今後はFormDataの使用が推奨されます。

testing/benchの非推奨化 (破壊的変更)

testing/benchモジュールが非推奨化されました。

今後はDeno.benchの使用が推奨されます。

testing/bddの追加

testing/bddモジュールが追加されました。

JestやMochaライクなAPIを使用してテストコードを記述することができます。

import { assertEquals } from "https://deno.land/std@0.135.0/testing/asserts.ts";
import { describe, it } from "https://deno.land/std@0.135.0/testing/bdd.ts";

describe("sum", () => {
  it("should return sum of numbers", () => {
    assertEquals(sum(1, 2, 5), 8)
  });

  it("should return 0 when no arguments are given", () => {
    assertEquals(sum(), 0);
  });
});

定義したテストコードはdeno testコマンドで実行することが出来ます。

またbeforeEachafterEachなどのフックを利用することで、事前処理や事後処理などを行うこともできます。 (後述)

他にも、permissionssanitizeExitなどのDeno.testがサポートしているオプションを指定することもできます。

describe("doSomething", { permissions: { read: false } }, () => {
  it("should work", async () => {
    // ...
  });
});

testing/timeの追加

testing/timeモジュールが追加されました。

このモジュールで提供されているFakeTimeを利用することで、下記APIがフェイク実装に置換されます。

  • Date
  • setTimeout
  • clearTimeout
  • setInterval
  • clearInterval

使用例:

import { assertEquals } from "https://deno.land/std@0.135.0/testing/asserts.ts";
import { afterEach, beforeEach, describe, it } from "https://deno.land/std@0.135.0/testing/bdd.ts"
import { assertSpyCalls, spy } from "https://deno.land/std@0.135.0/testing/mock.ts";
import { FakeTime } from "https://deno.land/std@0.135.0/testing/time.ts";

describe("FakeTime", () => {
  let fakeTime;
  beforeEach(() => {
    // FakeTimeをインスタンス化すると、DateやsetIntervalなどのAPIがフェイク実装に置換されます
    fakeTime = new FakeTime("2022-04-01T00:00:00.000Z");
  });

  afterEach(() => {
    // restoreを呼ぶと、FakeTimeによって置換されたDateなどのAPIが元の実装に復元されます
    fakeTime.restore();
  });

  it("replaces Date with fake implementation", () => {
    // FakeTimeのコンストラクタに渡した日付が返されます
    assertEquals("2022-04-01T00:00:00.000Z", new Date().toISOString());
  });

  it("replaces setInterval with fake implementation", () => {
    const cb = spy();
    const intervalID = setInterval(cb, 2000);
    fakeTime.tick(7000); // tick()メソッドによって、タイマを進めることが出来ます
    try {
      assertSpyCalls(cb, 3);
    } finally {
      clearInterval(intervalID);
    }
  });
});

nodeの変更点

node/streamで`Duplex.fromWebが実装されました。


https://github.com/denoland/deno_std/releases/tag/0.135.0

deno checkコマンドを実装するPRがマージ

Deno本体にdeno checkコマンドを追加するPRがマージされました。

feat: Add “deno check” subcommand for type checking (#14072)

次のDeno v1.21でリリースされる可能性が高そうです。

deno checkコマンドの詳細についてはこちらも参照ください。

deno testの挙動をdeno.json(c)でカスタマイズできるようにする提案

deno testコマンドでもdeno fmtdeno lintなどと同様に、deno.json(c)で挙動をカスタマイズできるようにすることが提案されています。

Consider adding config for deno test to deno.jsonc (#14263)

Denoの開発メンバからも好意的な反応が多く、将来的に実装される可能性があるかもしれません。


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

npm_bridge

DenoのコアコントリビュータであるDavid Sherret氏によって、Denoからnpmパッケージを利用するためのブリッジモジュールが公開されています。

PoCの段階のようなので本格的に利用できるようになるかはまだわかりませんが、もしかしたらDeno本体の実装などに影響を与えることもあるかもしれません。


https://github.com/dsherret/npm_bridge

GraphQL YogaのDenoサポートについて

GraphQL Yogaの公式ドキュメントで、@graphql-yoga/commonパッケージを使ってDenoでGraphQLサーバを構築する方法が解説されています。

詳しくは下記ページを参照ください:


https://twitter.com/TheGuildDev/status/1512414707612803073