Deno v1.27.1

ロックファイルに関する機能の追加や改善などが実施されています。

ロックファイルの自動探索

ロックファイルの自動探索が実装されました。

これは、deno.json(c)と同じディレクトリにdeno.lockというファイルがあれば、それを元に自動でインテグリティチェックを実行する機能です。

現状、この機能は--unstableを指定したときのみ有効化されます。(Deno v1.28にて安定化予定のようです)

また、この自動探索を無効化する目的で、--no-lockというオプションも追加されています。

これらの変更に合わせて、--lockオプションの引数がオプショナルに変更されました。(未指定の場合は、デフォルトでdeno.lockが読み込まれます)

また、--lock-writeオプションを指定する際の--lockオプションの指定も不要になっています。

ロックファイルによるインテグリティチェックの挙動が変更

ロックファイルの自動探索機能の実装に合わせて、インテグリティチェックに関する挙動が変更されています。

具体的には、ロックファイルに列挙されていないパッケージが見つかったときに、インテグリティチェックが失敗しないように挙動が変更されています。

もしこのようなパッケージがあった際は、ロックファイルへ自動でハッシュが書き込まれ、次回以降からそのパッケージに対するインテグリティチェックが実施されます。

その他の変更点

  • deno infoコマンドでnpm:がサポートされました。
  • Deno.osRelease()--unstableなしだと利用できなかった問題が解消されています。(このAPIは元々、Deno v1.27.0で安定化される予定でした)
  • Change Array by copyに関する型定義ファイルが追加されました。
  • Promise.prototype.thenが上書きされても、DenoのコアAPIが影響を受けないように実装が変更されました。
  • WindowsでDeno.hostname()が空文字列を返すことがある問題が修正されています。

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

deno_std v0.162.0

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

std/encoding/front_matter - YAML以外のフォーマットのサポート

std/encoding/front_matter/any.tsを使うと、YAML/TOML/JSONのいずれかのフォーマットで記述されたFront Matterブロックを読み込むことができます。

import { extract } from "https://deno.land/std@0.162.0/encoding/front_matter/any.ts";

// YAMLでの記述例)
let { attrs, body } = extract<{ title: string, date: Date }>(`---
title: foobar
date: 2022-06-12
---

Hello`);
assert(attrs.title === "foobar");
assert(attrs.date instanceof Date);
assert(body === "Hello");

// TOMLでの記述例)
({ attrs, body } = extract<{ title: string, date: Date }>(`---toml
title='foobar'
date=2022-06-12
---

Hello`));
assert(attrs.title === "foobar");
assert(attrs.date instanceof Date);
assert(body === "Hello");

ただし、このany.tsを使用すると、YAMLパーサーだけでなくTOMLパーサーも読み込まれてしまいます。

それに対する回避策として、各フォーマット向けの専用ファイルが提供されているため、必要に応じてこれらを使用するとよさそうです。

この変更に合わせて、既存のstd/encoding/front_matter.tsは非推奨化されました。

std/streams/buffer - ByteSliceStreamが追加

ByteSliceStreamstd/io/files.tsにおけるreadRangeと同様の機能を提供します。

import { ByteSliceStream } from "https://deno.land/std@0.162.0/streams/buffer.ts";
import { assertEquals } from "https://deno.land/std@0.162.0/testing/asserts.ts";

const readable = new ReadableStream<Uint8Array>({
  start(controller) {
    controller.enqueue(new Uint8Array([0, 1]));
    controller.enqueue(new Uint8Array([2, 3]));
    controller.enqueue(new Uint8Array([4, 5]));
    controller.close();
  },
}).pipeThrough(new ByteSliceStream(1, 6));

const chunks = [];
for await (const x of readable) {
  chunks.push(x);
}

assertEquals(chunks, [
  new Uint8Array([1]),
  new Uint8Array([2, 3]),
  new Uint8Array([4, 5]),
]);

std/dotenv - 変数定義に空文字列が含まれていた際の挙動の修正

.envファイルに、以下のように空文字列が設定された変数が存在すると、TypeErrorが発生する問題が解消されています。

FOO=""

std/flags - booleanaliasを併用した際の挙動の修正

boolean型として定義されたフラグに対して、aliasオプションで別名が定義された際の挙動が修正されています。

例えば、以下の例だと、v0.161.0だとparsed.helpfalseに設定されますが、v0.162.0ではtrueに設定されます。

const parsed = parse([], {  
  boolean: ["h"],
  alias: { h: "help" },
});
assert(!parsed.h);
assert(!parsed.help); // v0.162.0ではOK, v0.161.0だと失敗

std/node/fs - fs.openの互換性の向上

fs.openflags引数に数値を指定できるようになりました。


https://github.com/denoland/deno_std/pull/2835

deno benchコマンドの安定化について

deno benchコマンドとDeno.bench()を安定化するPRが作成されています。

feat: Stabilize Deno.bench() and ‘deno bench’ subcommand (#16485)

今のところ、v1.28での安定化が検討されているようです。

deno-sqlite v3.6.0

deno-sqlite v3.6.0がリリースされています。

DB.createFunctionが実装されています。

これを利用すると、JavaScriptで定義された関数をSQLから利用することができます。

import { DB } from "https://deno.land/x/sqlite@v3.6.0/mod.ts";

const db = new DB();
db.createFunction((x: number) => 2 * x, { name: "double", deterministic: true });
db.query(`SELECT double(123)`); // => [[246]]

その他には、PreparedQueryexpandSqlメソッドが実装されており、指定したパラメータで各プレースホルダを置換した状態のSQL文を取得することができます。


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

Deno Advent Calendar 2022

Qiitaで2022年のDenoのAdvent Calendarが公開されています。