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>): voidDeno.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.UnsafePointerとDeno.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)のサポート
- インクリメンタルサーチやパッケージに関する詳細なドキュメントなどを提供することを目的として、新しいレジストリ補完プロトコルのサポートが実装されました
- プロトコルの詳細については下記を参照
- https://deno.land/manual@v1.17.0/language_server/imports
- deno.land/xでは、このv1.17のリリース後まもなくこのプロトコルが実装されるようです
- インクリメンタルサーチやパッケージに関する詳細なドキュメントなどを提供することを目的として、新しいレジストリ補完プロトコルのサポートが実装されました
AbortControllerに関する変更点
下記APIでAbortController#abortのreasonパラメータがサポートされました。
Deno.readFile()/Deno.readTextFile()/Deno.writeFile()/Deno.writeTextFile()- Web streams API
WebSocketStreamfetch
また、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.locationがundefinedに設定されるよう修正されました- v1.16.4までは
--locationの省略時にglobalThis.locationを参照すると、TypeErrorが発生しました。
- v1.16.4までは
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オプションが削除されています。
今後は代わりにhostnameやportオプションの方を指定する必要があります。
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の変更点
findLastとfindLastIndexが削除されました。
DenoではすでにArray.prototype.findLastなどが利用できるためです。
std/signalの変更点
onSignal関数が削除されました。
今後はDeno.addSignalListenerの使用が推奨されます。
std/nodeの変更点
Node.js互換モード(--compat)の互換性向上に向けて、様々な機能が実装されています。
child_process:child_process.forkが実装されました。http: 下記APIが実装されました。request()AgentOutgoingMessage
fs: 下記APIが実装されましたaccess()accessSync()
url: 下記APIが実装されました。parse()resolveObject()
util: 下記APIが実装されました。isDeepStrictEqualdeprecate
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に使い勝手を近づけることを目的として、新しくPageとElementクラスが導入されています。
それに伴い、Clientオブジェクトが保持していたメソッドなどがPageやElementに移動しています。
マイグレーションガイドが公開されているため、詳しくはそちらも参照ください。
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公式によって開発されているようです。