Deno v1.31.3

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

CLI/APIに関する改善

  • deno infodeno docコマンドで--no-lock/--lockオプションがサポートされました。(挙動はdeno runコマンドなどと同様です)
  • deno.jsonなどでcompilerOptions.typesエントリが定義されていると、型エラーが起きる問題が修正されています。
  • REPLでglobalThis.Denoやその配下で定義されたプロパティを削除しようとすると、プロセスがパニックする問題が修正されています。
  • Deno.makeTempFile(Sync)でファイルがすでに存在した際にリトライが行われるように挙動が改善されています。
  • Deno.serveHttp()でレスポンスエラーが発生した際に、nextRequestから返されるRequestsignalがabortedに設定されるように修正されました。

Node.js互換性に関する改善

  • package.jsonが存在する または --node-modules-dirオプションが指定されたが、実行されたスクリプトではnpmパッケージがimportされていない場合に、node_modulesが作成されないように挙動が改善されました。
  • node_modulesのセットアップ中にプログレスバーが表示されるように挙動が改善されました。(#18136)
  • node:crypto: createCipheriv()が実装されました。 (aes-128-cbcのみサポート)
  • node:fs: writeFile()encoding: "ascii"オプションがサポートされました。

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

deno_std v0.180.0

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

std/encoding関連モジュールのディレクトリ構造の見直し (破壊的変更)

std/encodingで提供されていたcsv/front_matter/json/jsonc/toml/yamlモジュールが、トップレベルのモジュールとして独立しました。

今後は、例えば、csvモジュールを利用したい場合はstd/csv/mod.tsyamlモジュールを利用したい場合はstd/yaml/mod.tsから読み込む必要があります。

ディレクトリの移動に合わせて、以下の変更も実施されています。

  • csvモジュールの細分化
    • 以下のファイルが追加されており、必要なAPIのみを個別に読み込めるようになりました。
      • csv/stringify.ts
      • csv/parse.ts
      • csv/stream.ts
  • jsonモジュールの細分化
    • 以下のファイルが追加されており、必要なAPIのみを個別に読み込めるようになりました。
      • json/json_parse_stream.ts
      • json/json_stringify_stream.ts
      • json/concatenated_json_parse_stream.ts
  • tomlモジュールの細分化
    • 以下のファイルが追加されており、必要なAPIのみを個別に読み込めるようになりました。
      • toml/parse.ts
      • toml/stringify.ts

std/http/server_sent_event.tsが追加

新規モジュールとしてstd/http/server_sent_event.tsが追加されました。

元々、Oakで提供されていたServer-Sent Eventsのユーティリティdeno_stdにポートされたようです。


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

キーバリューストア(Deno.openDatabase)の追加について

⚠️この対応が正式にリリースされるかどうかはまだ不明なため、あくまで参考程度に留めていただけるとよさそうです🙇

Deno本体にSQLiteベースのキーバリューストアを追加するPRが作成されています。

feat(ext/kv): key-value store #18232

具体的には、Deno.openDatabase()というAPIから返却されるDeno.Databaseオブジェクト経由でデータベースを操作できるようにする想定のようです。

// 永続化先のファイルのパス (省略した場合は、`localStorage`などと同様の規則に基づいて保存先が決定されるようです)
const path = ":memory:";
const db = await Deno.openDatabase(path);
await db.set(["key"], "value");
const result = await db.get(["key"]);
assert(result.key.length === 1);
assert(result.key[0] === "key");
assert(result.value === "value");
assert(result.versionstamp != null);

await db.delete(["key"]);

Deno.Databaseset()get()などの第1引数には配列が渡されていますが、これがキーにあたるようです。

このキーはDeno.KvKeyという型で定義されています。 さらに、Deno.KvKeyDeno.KvKeyPartという型の配列として定義されています。

キーと値の組み合わせを永続化する際は、Deno.KvKeyを以下の規則によってエンコードした値がデータベースのキーとして使用されるようです。

  1. 一定の規則に従って要素(Deno.KvKeyPart)をソートします。
  • 複数のデータ型が混在している際は、Uint8Array, string, number, bigint, booleanの順に並び替えられます。
  • 同一のデータ型の要素が複数含まれる際は、それらを辞書順に並び替えます。
  1. 各要素をバイト列にエンコードした上で連結します。

これ以外にも、データベースに対してアトミックに操作を行うためのatomic()メソッドなどが提供されています

ここで紹介したもの以外にもいくつか機能が存在するため、より詳細については、このPRの以下のファイルなどを参照いただければと思います。

  • cli/tests/unit/kv_test.ts
  • cli/tsc/dts/lib.deno.unstable.d.ts

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