Deno v1.17.0

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

--no-check=remoteのサポート

リモートモジュール(http:またはhttps:で始まるモジュール)の型チェックのみが無効化されます。

$ deno run --no-check=remote mod.ts

Import assertionsのサポート

Import assertionsが実装されました。

現在はJSON modulesのみがサポートされています。

import modules from "./modules.json" assert { type: "json" };

Object.keys(modules);

Deno.testのシグネチャの向上

Deno v1.16.4までは下記の形式のみがサポートされていました。

  • Deno.test(name: string, fn: (t: Deno.TestContext) => void | Promise<void>): void
  • Deno.test(t: Deno.TestDefinition): void

v1.17で以下のオーバーロードが追加され、使い勝手が向上しました。

// オプションを第2引数、テスト関数を第3引数で指定
Deno.test("foo", { permissions: { read: false } }, () => {
  Deno.cwd();
});

// オプションを第1引数、テスト関数を第2引数で指定
Deno.test({
  name: "bar",
  ignore: Deno.build.os === "windows",
}, async () => {
  //
});

Deno.testのサブステップAPIについて

サブステップAPIを使用した際のレポート出力が改善されています。

Deno.test("nested test case", async (t) => {
  const success = await t.step("step 1", async (t) => {
    const success = await t.step("step 1-1", () => {
      throw new Error("Failed!");
    });
    if (!success) throw new Error("Failed!");

    await t.step("step 1-2", () => {});
  });

  if (success) throw new Error("Failed!");
});

サブステップAPIは次のv1.18のリリースで安定化することが予定されています。

--watchオプションの向上

deno run--watchに外部ファイルのリストを指定できるようになりました。

例えば、下記のように指定した場合、main.ts及びそこから依存されるモジュールに加えて、modules.jsonの変更も監視されるようになります。

$ deno run --watch=modules.json main.ts

また、ウォッチ対象のファイル変更時にスクリーンがクリアされるようになりました。

FFI

Deno.dlopen"buffer"タイプが"pointer"タイプにリネームされました。

合わせて、Deno.UnsafePointerDeno.UnsafePointerViewが実装されています。

これらの型を利用することで、ダイナミックリンクライブラリとの間でポインタを受け渡すことができます

const p = Deno.UnsafePointer.of(new TextEncoder().encode("Hello"));
new TextDecoder().decode(new Deno.UnsafePointerView(p).getArrayBuffer(5)); // => "Hello"

Deno.refTimer及びDeno.unrefTimerが実装

setTimeoutなどのAPIでタイマーを起動すると、そのタイマーが停止するまでプロセスの終了がブロックされます。

Deno.unrefTimerを使用することで、この挙動を変更することができるようになりました。

具体的には、下記コードを実行すると、タイマーがイベントループをブロックしなくなるため、プロセスが即座に終了します。

const timerID = setTimeout(() => {
  console.log("Hello");
}, 3000);
Deno.unrefTimer(timerID);

Deno.refTimerはこの逆で、unrefされたタイマーをデフォルトの挙動に戻します。

Deno.connectTls()及びDeno.startTls()でのALPNサポート

元々、ALPNはDeno.listenTls()でのみサポートされていました。

今回のリリースでDeno.connectTls()Deno.startTls()にもALPNのサポート(alpnProtocolsオプション)が追加されました。

また、この変更に合わせて、Deno.TlsConn#handshakeの戻り値にalpnProtocolプロパティが追加されています。

背景としては、後述するEdgeDBドライバをDenoで実装する上でALPNサポートが必要になるためサポートされたようです。


REPLの変更点

deno replで起動できるREPLの機能が強化されています。

  • import節でのタブ補完がサポート
  • Node.js互換モードのサポート
    $ deno repl --compat --unstable
    

deno lspの変更点

  • textDocument/typeDefinitionが実装されました
  • workspace/symbolが実装されました
  • 新しいレジストリ補完プロトコル(v2)のサポート
    • インクリメンタルサーチやパッケージに関する詳細なドキュメントなどを提供することを目的として、新しいレジストリ補完プロトコルのサポートが実装されました
    • deno.land/xでは、このv1.17のリリース後まもなくこのプロトコルが実装されるようです

AbortControllerに関する変更点

下記APIでAbortController#abortreasonパラメータがサポートされました。

  • Deno.readFile() / Deno.readTextFile() / Deno.writeFile() / Deno.writeTextFile()
  • Web streams API
  • WebSocketStream
  • fetch

また、AbortSignal#throwIfAbortedが実装されました。

const abortController = new AbortController();
abortController.abort(new Error("foo"));
try {
  abortController.signal.throwIfAborted();
} catch (e) {
  console.error(e);
}

Web Crypto APIに関する変更点

  • SubtleCrypto#importKeyで下記フォーマットがサポートされました
    • RSAキーをSPKIとJWKの形式でimportできるようになりました
    • AESキーをJWK形式でimportできるようになりました
    • ECキーをPKCS#8とSPKI, JWK形式でimportできるようになりました
  • SubtleCrypto#exportKey
    • RSA及びAESキーをJWK形式でexportできるようになりました
  • SubtleCrypto#unwrapKeyが実装されました

WebAssembly.instantiateStreamingの変更点

Deno v1.16でローカルファイルのfetchがサポートされました。

今回のリリースでは、このローカルファイルのfetchを利用したWebAssemblyモジュールのインスタンス化がサポートされています。

const { module } = await WebAssembly.instantiateStreaming(await fetch("file:///path/to/file.wasm"));

その他の変更点

  • 内部のTypeScriptがv4.5へアップグレードされました。
  • UDPメッセージをブロードキャストできるようになりました。
  • --locationオプションの省略時にglobalThis.locationundefinedに設定されるよう修正されました
    • v1.16.4までは--locationの省略時にglobalThis.locationを参照すると、TypeErrorが発生しました。

deno_std v0.118.0

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

std/httpの変更点

TypeScriptによるHTTPサーバの実装であるhttp/server_legacyモジュールが削除されました。

これはDeno本体でDeno.serveHttpが実装されたのと、それをベースにしたhttp/serverモジュールが存在するためです。

また、http/serverモジュールで提供されているserve関数などからaddrオプションが削除されています。

今後は代わりにhostnameportオプションの方を指定する必要があります。

import { serve } from "https://deno.land/std@0.118.0/http/server.ts";

serve((req) => new Response("Hello"), { hostname: "0.0.0.0", port: 3000 });

std/wsの変更点

WebSocketサーバを提供していたwsモジュールが削除されました。

これはDeno本体で実装されているDeno.upgradeWebSocketが安定化されたためです。

testing/assertsの変更点

assertThrowsAsyncが削除されました。

今後はassertRejectsの方を使用する必要があります。

std/collectionsの変更点

findLastfindLastIndexが削除されました。

DenoではすでにArray.prototype.findLastなどが利用できるためです。

std/signalの変更点

onSignal関数が削除されました。

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

std/nodeの変更点

Node.js互換モード(--compat)の互換性向上に向けて、様々な機能が実装されています。

  • child_process: child_process.forkが実装されました。
  • http: 下記APIが実装されました。
    • request()
    • Agent
    • OutgoingMessage
  • fs: 下記APIが実装されました
    • access()
    • accessSync()
  • url: 下記APIが実装されました。
    • parse()
    • resolveObject()
  • util: 下記APIが実装されました。
    • isDeepStrictEqual
    • deprecate
  • inspector及びzlibモジュールのモック実装が追加されました。

std/encoding/tomlの変更点

stringfy()のバグ修正や機能追加が行われています。

  • 値に=を含むプロパティが適切にフォーマットされない問題が修正されました。
  • keyAlignmentオプションがサポートされ、キーの整列がサポートされました。
import { stringify } from "https://deno.land/std@0.118.0/encoding/toml.ts";

const toml = stringify({
  a: "1",
  ab: "20",
  abc: "300",
}, { keyAlignment: true });
// a   = "1"
// ab  = "20"
// abc = "300"

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

DenoがTC39にジョイン

DenoがTC39にジョインしたようです。

直近では、以下などに注力していく予定とのこと。

  • モジュールグラフ中での非JSアセットの管理
  • よりよりリソース管理のサポート
  • (非同期) イテレーションのためのより充実した関数

https://deno.com/blog/deno-joins-tc39

DenoのJupyter notebookサポートについて

以下のPRでJupyter notebookサポートの追加が行われています。

今のところ、Deno本体にdeno jupyterコマンドを追加することで、ファーストクラスサポートを提供することを目指しているようです。


Sinco v3.0.0

DenoのブラウザオートメーションライブラリであるSincoのv3.0.0がリリースされました。

よりブラウザのAPIに使い勝手を近づけることを目的として、新しくPageElementクラスが導入されています。

それに伴い、Clientオブジェクトが保持していたメソッドなどがPageElementに移動しています。

マイグレーションガイドが公開されているため、詳しくはそちらも参照ください。


https://github.com/drashland/sinco/releases/tag/v3.0.0

deno-sqlite v3.2.0

deno-sqlite v3.2.0がリリースされました。

新機能としてDB#transactionが実装されています。

db.transaction(() => {
  db.query("INSERT INTO users (name) VALUES (?)", ["foo"]);  
  throw new Error(); // 例外を投げるとロールバックします
});

SAVEPOINTを使用して実装されており、transaction()の呼び出しはネストすることも可能です。


https://github.com/dyedgreen/deno-sqlite/releases/tag/v3.2.0

deno_mongo v0.29.0

deno_mongo v0.29.0がリリースされました。

内部で使用しているBSONライブラリがjs-bsonからdeno_bsonに変更されています。

それによりパフォーマンス向上や軽量化などが達成されているようです。


https://github.com/denodrivers/deno_mongo/releases/tag/v0.29.0

edgedb-deno

DenoのEdgeDBドライバ

EdgeDB公式によって開発されているようです。


https://github.com/edgedb/edgedb-deno