Deno v1.18.0

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

設定ファイルの自動読み込みがサポート

今までは、設定ファイルを読み込むためには--configの指定が必要でした。

$ deno run --config ./deno.json ./main.ts

今後は、--configが指定されなかった場合、deno.jsonまたはdeno.jsoncという名前の設定ファイルを自動で読み込まれるようになります。

Deno.testのsub-steps APIが安定化

Deno.testでテストケースのグループ化を行うためのsub-steps APIが安定化されました。

今後は--unstableを指定しなくても利用できます。

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!");
});

Web Cryptography APIの実装が完了

このリリースでは、下記の変更が実施されています。

  • SubtleCrypto.encrypt()及びSubtleCrypto.decrypt()でAES-GCM及びAES-CTRがサポート
  • SubtleCrypto.wrapKey()及びSubtleCrypto.unwrapKey()でAES-KWがサポート
  • SubtleCrypto.importKey()でECDSA及びECDHキーとP-384曲線の組み合わせがサポート
  • SubtleCrypto.exportKey()でECDSA及びECDHキーのjwkやpkcs8, 及びspki形式でのエクスポートがサポート
  • SubtleCrypto.wrapKey()SubtleCrypto.unwrapKey()でjwk形式がサポート

今回のリリースでWeb Cryptography APIの実装が完了したようです。

Deno.dlopen(FFI)への機能追加

まず、外部関数の型がシンボル定義を元に自動で推論されるようになりました。

const dylib = Deno.dlopen("./add.so", {
  add: {
    parameters: ["i32", "i32"],
    result: "i32",
  } as const,
});
const result = dylib.symbols.add("1", 2); // NG! (型エラー)

シンボルへの別名の設定もサポートされています。

const dylib = Deno.dlopen("./add.so", {
  plus: {
    name: "add",
    parameters: ["i32", "i32"],
    result: "i32",
  } as const,
});
dylib.symbols.plus(1, 2)

また、Deno.UnsafeFnPointerが実装され、関数ポインタを取り扱えるようになりました。

Node.js互換モードの変更

deno repl --compatでNode.jsの組み込みモジュール( events, assertなど)がグローバルにあらかじめ読み込まれるようになりました。

また、deno testコマンドでもNode.js互換モード(--compat)がサポートされました。

WebSocket関連の変更

WebSocketStreamでハンドシェイク時に送信されるHTTPヘッダを指定できるようになりました (Denoの独自拡張です)

const wss = new WebSocketStream("wss://localhost:4000/ws", {
  headers: { "X-FOO": "foo" },
});

また、WebSocketサーバ(Deno.upgradeWebSocket)でping/pongメッセージのハンドリングがサポートされました。

サーバがクライアントへpingメッセージを送信する間隔はidleTimeoutオプションで制御できます (デフォルトは120秒)

Uncaught Error発生時のログ出力の強化

Uncaught Errorが発生した際に、Error.causeの内容が表示されるようになりました。

deno lspの改善

import節のホバーでモジュールの情報などが表示されるようになりました

deno-lsp-hover-info-v1.18

その他の修正

  • Denoランタイムの起動が33%、Deno内部のtscの起動が10%高速化されました (v8スナップショットの圧縮にzlibではなくlz4zstdが使用されるようになりました)
  • deno bundleによるバンドル後のソースに// deno-fmt-ignore-file// deno-lint-ignore-fileコメントが出力されるようになりました
  • deno install--promptオプションがサポートされました。
  • 実行途中のread()が存在する状態でReadableStreamDefaultReaderまたはReadableStreamBYOBReaderreleaseLock()を呼ぶと、read()がrejectするように変更されました (今までは、同じ状況でreleaseLock()を呼ぶと、TypeErrorが発生しました)
  • window変数をdeleteで削除すると、プロセスがパニックする問題が修正されました
  • globalThisを削除すると、console.logなどがクラッシュする問題が修正されました
  • Intl.ListFormatの型定義が追加されました
  • Deno.errors.NotSupportedの型定義が追加されました

deno_std v0.122.0

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

csv

parse()の戻り値の型が改善されています。

また、破壊的変更として、ParseOptions.parseParseOptions.columns[].parseオプションが削除されています。

node

Timeoutクラスが実装されました。

log

FileHandlerの内部バッファが満杯になった際に、バッファの内容が強制的にフラッシュされるように修正が行われました。


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

テストステップメタデータの実装について (#13399)

テストステップメタデータの実装が検討されています。

まず、現状のsub-steps APIの問題点として、--filterオプションによるフィルタリングが困難であるという問題があります。

この問題を緩和するために、stepMetadataオプションをDeno.testに追加することが検討されています。

Deno.test({
  name: "group",
  async fn(t) {
    await t.step("step 1", () => {
      await t.step("sub step 1", () => {});
    });
    await t.step("step 2", () => {});
  },
  stepMetadata: [
    { name: "step 1", steps: [{ name: "sub step 1" }] },
    { name: "step 2" },
  ],
});

このようにしてメタデータを定義しておくことで、ネストされたテストケースのフィルタリングが可能になります。

$ deno test --filter "sub step 1”

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

Velociraptor v1.4.0

Velociraptor v1.4.0がリリースされました。

Import mapファイルを指定するためのimapオプションがimportmapにリネームされています。

scripts:
  dev:
    cmd: deno run --unstable dev.ts
    importmap: import_map.json

imapオプションは非推奨化されており、今後はimportmapオプションの使用が推奨されます。

その他の変更点として、deno.json(c)での設定のサポートが追加されています。

以下のように、deno.json(c)ファイルのvelociraptorキーでスクリプトの定義が行えます。

{
  "velociraptor": {
    "scripts": {
      "check": [
        "deno lint",
        "deno fmt --check"
      ]
    }
  }
}

https://github.com/jurassiscripts/velociraptor/releases/tag/1.4.0

Astrodon

TauriとFFI(Deno.dlopen)をベースにしたデスクトップアプリケーションフレームワーク


https://github.com/astrodon/astrodon