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>): void
Deno.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
WebSocketStream
fetch
また、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()
Agent
OutgoingMessage
fs
: 下記APIが実装されましたaccess()
accessSync()
url
: 下記APIが実装されました。parse()
resolveObject()
util
: 下記APIが実装されました。isDeepStrictEqual
deprecate
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公式によって開発されているようです。