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);
MultiReader
はstd/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
コマンドで実行することが出来ます。
またbeforeEach
やafterEach
などのフックを利用することで、事前処理や事後処理などを行うこともできます。 (後述)
他にも、permissions
やsanitizeExit
などの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 fmt
やdeno lint
などと同様に、deno.json(c)
で挙動をカスタマイズできるようにすることが提案されています。
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サーバを構築する方法が解説されています。
詳しくは下記ページを参照ください: