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
が追加
ByteSliceStream
はstd/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
- boolean
とalias
を併用した際の挙動の修正
boolean
型として定義されたフラグに対して、alias
オプションで別名が定義された際の挙動が修正されています。
例えば、以下の例だと、v0.161.0だとparsed.help
はfalse
に設定されますが、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.open
のflags
引数に数値を指定できるようになりました。
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]]
その他には、PreparedQueryにexpandSql
メソッドが実装されており、指定したパラメータで各プレースホルダを置換した状態のSQL文を取得することができます。
https://github.com/dyedgreen/deno-sqlite/releases/tag/v3.6.0
Deno Advent Calendar 2022
Qiitaで2022年のDenoのAdvent Calendarが公開されています。