Deno v1.20

Deno v1.20がリリースされました。 この記事では新しく追加された機能などについて紹介します。 (破壊的変更) Deno.testのpermissionsオプションの挙動が変更 ⚠️ この変更はv1.20.1時点ではまだ反映されていません! 現在、正式な修正用のPRが作成されており、おそらくv1.20.2で反映されるはずです https://github.com/denoland/deno/pull/14024 Deno.testやWorkerなどのAPIはpermissionsオプションにより実行時のパーミッションをカスタマイズできます: Deno.test({ name: "permissions_test", permissions: { read: true }, fn: async () => { const content = await Deno.readTextFile("./data.txt"); await Deno.writeTextFile("./data.txt", processContent(content)); }, }); 上記のテストコードはDeno.readTextFileとDeno.writeTextFileを実行しており、正しく実行するためには--allow-readと--allow-writeの両方の権限が必要です。 このテストケースでは、下記宣言により--allow-readを明示的に指定しています。 permissions: { read: true }, ここではwrite: trueが指定されていないため、このテストケースは権限エラーにより失敗するというのが直感的な挙動なのではないかと思います。 しかし、Deno v1.19時点では上記のテストコードは成功してしまいます。 permissions: { read: true }, 実は、Deno v1.19において、この指定は下記宣言と同義になります: // `read`以外はすべてCLIオプションで指定された権限(--allow-writeなど)が継承される permissions: { read: true, env: "inherit", ffi: "inherit", hrtime: "inherit", net: "inherit", run: "inherit", write: "inherit", }, この挙動は直感的ではないということで、Deno v1....

March 20, 2022

2021/03/07〜2022/03/13の最新情報

Deno v1.19.3 Deno v1.19.3がリリースされました。 deno test --docでtypescriptやjavascriptタイプのコードブロックをチェックできるようになりました。 ```ts let str: string = 0; ``` だけでなく ```typescript let str: string = 0; ``` のようにコードブロックを記述した際もテストが行われるようになります。 また、パフォーマンスチューニングも実施されており、atobとbtoaのパフォーマンスが最大で20倍まで高速化されています。 その他には古いバージョンのglibcを搭載するプラットフォームのサポートが行われています。 https://github.com/denoland/deno/releases/tag/v1.19.3 deno_std v0.129.0 deno_std v0.129.0がリリースされました。 streams deno_stdのWeb streams APIへの移行の一環として、streams/bufferモジュールが追加されました。 現時点では、以下のクラスが提供されています: Buffer (std/io/bufferのBufferクラスのstreams APIバージョン) LimitedTransformStream (std/io/readersのLimitedReaderのstreams APIバージョン) LimitedBytesTransformStream (std/io/readersのLimitedReaderのstreams APIバージョン) また、streams/delimiterモジュールにTextDelimiterStreamが追加されています。 testing/asserts assertStrictEquals()のシグネチャがAssertion Functionsを使用した形式に変更されています。 具体的には下記コードが動くようになります: const a = { name: "foo" }; const b = a as unknown; assertStrictEquals(b, a); b....

March 13, 2022

2021/02/28〜2022/03/06の最新情報

Deno v1.19.2 Deno v1.19.2がリリースされました。 リモートスクリプトでのdeno.json(c)の自動読み込みが無効化 Deno v1.18でdeno.json(c)の自動読み込みがサポートされました。 このリリースでは、リモートスクリプト実行時のdeno.json(c)の自動探索が無効化されています。 リモートスクリプトを実行する際に、ローカルのdeno.json(c)が読まれてしまうことによる不整合を防止することが目的のようです。 Proposal: disable auto-discovery of config file for deno run deno testの実行時はデフォルトで--no-promptが有効化 Deno v1.19で--promptがデフォルトで有効化されました。 しかし、deno testの実行時は--promptオプションの必要性が薄いため、このリリースで無効化されています。 その他の変更点 deno replでnullが適切に表示されない問題が修正されました。 非TTY環境でconsoleを使用した際の色付けが無効化されない問題が修正されました。 https://github.com/denoland/deno/releases/tag/v1.19.2 deno_std v0.128.0 deno_std v0.128.0がリリースされました。 新機能 streamsモジュールにTextLineStreamが追加されています。 import { TextLineStream } from "https://deno.land/std@0.128.0/streams/delimiter.ts"; const file = await Deno.open("./path/to/file.txt"); const readable = file.readable .pipeThrough(new TextDecoderStream()) .pipeThrough(new TextLineStream()); for await (const line of readable) { console....

March 6, 2022

2021/02/21〜2022/02/27の最新情報

Deno v1.19.1 Deno v1.19.1がリリースされました。 新機能としてDeno.dlopenでstatic変数の参照がサポートされています。 Deno.ForeignStatic その他にも、deno compileで--import-mapオプションがうまく動かなくなっていた問題が修正されています。 https://github.com/denoland/deno/releases/tag/v1.19.1 deno_std v0.127.0 deno_std v0.127.0がリリースされました。 dotenvの追加 deno-dotenvモジュールがdeno_stdにマージされました。 マイグレーション手順も公開されているので、もしdeno-dotenvを利用されていた場合は参考にするとよさそうです。 async/abortableの追加 Promiseをキャンセルできるようにするためのユーティリティが追加されています。 import { abortable } from "https://deno.land/std@0.127.0/async/abortable.ts"; import { delay } from "https://deno.land/std@0.127.0/async/delay.ts"; const controller = new AbortController(); const promise = delay(5000); setTimeout(() => controller.abort(), 2000); await abortable(promise, controller.signal); // => AbortError node fs: fs.realpath.nativeが追加されました。 tls: tls.createServerの基本的なサポートが追加されました。 その他 http/file_server: serveDir関数が追加されました。 testing/aserts: assertAlmostEqualsが追加されました。 https://github.com/denoland/deno_std/releases/tag/0.127.0 deno.json(c)でのImport Mapサポートについて deno....

February 27, 2022

2021/02/14〜2022/02/20の最新情報

Deno v1.19 Deno v1.19がリリースされました。 --promptオプションの挙動がデフォルト化 例えば、以下のようなファイルがあったとします。 const content = await Deno.readTextFile("README.md"); このファイルを権限なしで実行しようとすると、下記のように権限を付与するか尋ねられるようになります。 $ deno run main.ts ⚠️ ️Deno requests read access to "README.md". Run again with --allow-read to bypass this prompt. Allow? [y/n (y = yes allow, n = no deny)] Deno v1.18以前の挙動に戻したいときは--no-promptを指定する必要があります。 deno vendorコマンドの追加 サードパーティモジュールもバージョン管理に含めたいなどの要求を解決すべく導入されたコマンドです。 具体的な使い方としては、下記のようにエントリポイントを指定します。 $ deno vendor mod.ts これにより、vendorディレクトリにmod.tsから依存されているサードパーティモジュールが保存されます。 また、vendorディレクトリに次のような内容でimport_map.jsonが作成されます。 { "imports": { "https://deno.land/": "./deno.land/", "https://unpkg.com/": "./unpkg.com/" }, "scopes": { "....

February 20, 2022

2021/02/07〜2022/02/13の最新情報

--promptオプションの挙動をデフォルト化するPRがマージされました Denoで--promptオプションをデフォルトで有効化するPRがマージされました。 feat: prompt by default (#13650) 次のDeno v1.19でリリースされる可能性がありそうです。 また、この変更に合わせて、--no-promptオプションが追加されています。 このオプションを指定することで、今まで通り、 許可されていないAPIを実行しようとすると、即時にエラーが発生します。 ファイルシステムやネットワーク関連APIでのStreams APIのサポートについて Denoのファイルシステム(Deno.File)やネットワーク(Deno.Conn)関連のAPIでStreams APIをサポートすることが検討されています。 Make FS and net APIs work well with WHATWG streams (#13614) まだドラフトの段階ですが、すでにPRも作成されています。 feat(runtime): web streams in fs & net APIs (#13615) 背景: 現在、Denoのファイルシステムやネットワーク関連のAPIはGoのスタイルに従っています(Deno.Reader/Deno.Writer) しかし、これらのAPIはfetch()やStreams APIと互換性がありません (一応、この差異を吸収するためにdeno_std/streamsが提供されていたりします) この問題を解消するため、Deno.FileやDeno.Connなどにreadableプロパティ(ReadableStream<Uint8Array>型)やwritableプロパティ(WritableStream<Uint8Array>型)を追加することが検討されています。 N-APIの実装について DenoでN-APIの実装が開始されています。 Implement NAPI (#13633) まだドラフトの段階でありリリース時期も未定ですが、進捗は上記のPRから確認できるので、気になる方はSubscribeするとよいかもしれません。 Deno.umask()の削除について Deno.umask()を削除するPRが作成されています。 chore: remove Deno.umask (#13639) 背景としては、競合状態によるバグが存在するためのようです。 詳しくは以下のissueを参照ください。 Proposal: Remove (unstable) Deno....

February 13, 2022

2021/01/31〜2022/02/06の最新情報

Deno v1.18.2 Deno v1.18.2がリリースされました。 Deno.getUid() Deno.getUid()が実装されました。 これを使うと、現在のユーザのIDを取得できます。(Windowsだとnullが返されます) const uid = Deno.getUid(); console.log(uid); 利用するには--allow-envと--unstableが必要です。 その他バグ修正 HOME環境変数に相対パスが設定されていると、プロセスがクラッシュする問題が修正されました。 拡張子なしでimportしようとした際に、メディアタイプを元に拡張子を推論されるようになりました。 クエリパラメータつきでローカルファイルをimportするとプロセスがクラッシュする問題が修正されました。 SubtleCrypto.decryptでAES-GCMによる復号を行う際に、タグ長が128ビットでないとプロセスがパニックする問題が修正されました deno lsp: リダイレクトが発生すると、X-Deno-Warningヘッダの内容が表示されなくなる問題が修正されました https://github.com/denoland/deno/releases/tag/v1.18.2 deno_std v0.125.0 deno_std v0.125.0がリリースされました。 std/nodeへの機能追加などを中心に行われています。 全般 std/fs/copyやstd/node、std/osなどの--unstableが必要なモジュールを--unstableなしで使用した際に、型エラーではなく実行時エラーが発生するように修正されました。 node punycodeパッケージが実装されました url.resolve()が実装されました child_process.spawn()などでAbortSignalがサポートされました fs.createWriteStream()が実装されました fs.copyFile()で4引数の形式がサポートされました https://github.com/denoland/deno_std/commit/3b43d075ea6977e10bb1d9bd58fbeacc721a114e deno_stdへのdotenvモジュールの追加について dotenvモジュールをdeno_stdへ追加するPRが作成されています。 https://github.com/denoland/deno_std/pull/1877 経緯については下記のissueで議論されていますが、好意的な反応が多く、次のリリースなどで追加される可能性がありそうです。 https://github.com/denoland/deno/issues/13396 https://github.com/denoland/deno_std/pull/1877 Deno.Conn#setNoDelayとDeno.Conn#setKeepAliveの実装について Deno.ConnにsetNoDelayとsetKeepAliveを実装するPRがマージされました。(denoland/deno#13103) 今のところ、下記のように使用することが想定されています。 Deno.Conn#setNoDelay(true)を呼ぶとNagleアルゴリズムが無効化されます (TCP_NODELAYが設定される) Deno.Conn#setKeepAlive(true)を呼ぶとTCPキープアライブが有効化されます (SO_KEEPALIVEが設定される) この機能は次のDeno v1.19でリリースされる可能性がありそうです。 https://github.com/denoland/deno/pull/13103 Deno.run()でのIPCサポートについて Deno.run()でIPCをサポートするPRが作成されています。(denoland/deno#13566) 今のところ、下記のような方法での使用が想定されているようです。 Deno....

February 6, 2022

2021/01/24〜2022/01/30の最新情報

Deno v1.18.1 Deno v1.18.1がリリースされました。 Deno.networkInterfaces() Deno.networkInterfaces()が実装されました。 利用可能なネットワークインターフェースの一覧を取得できます。 const interfaces = Deno.networkInterfaces(); 利用するには--allow-envと--unstableが必要です。 deno lsp deno lspでDENO_CERTとDENO_TLS_CA_STOREの環境変数がサポートされました。 これらの環境変数については、下記を参照ください。 https://deno.land/manual@v1.18.1/getting_started/setup_your_environment#environment-variables https://github.com/denoland/deno/releases/tag/v1.18.1 deno_std v0.123.0 deno_std v0.123.0がリリースされました。 std/node 新しく下記APIが実装されています: os.networkInterfaces() process.uptime() child_process.execFile() std/testing assertObjectMatchでArrayBufferを含むオブジェクトが適切に比較されない問題が修正されました。 https://github.com/denoland/deno_std/releases/tag/0.123.0 deno_std/archive/tarの現代化について deno_stdにはtarファイルを取り扱うためにarchive/tarが提供されています。 このarchive/tarはDeno.Readerをベースに実装されています。 現在、archive/tarをStreams APIで書き直すことが検討されています。 この一環として、archive/streams.tsを追加するPRが作成されています。 https://github.com/denoland/deno_std/pull/1855 archive/streams.tsではTarEncoderStreamとTarDecoderStreamを提供し、StreamsベースのAPIを介してtarファイルの操作を行うことができます。 まだマージされていないものの、次のリリースなどで追加される可能性がありそうです。 https://github.com/denoland/deno_std/issues/1658 https://github.com/denoland/deno_std/pull/1855 Deno in 2021 Denoの公式ブログポストとしてDeno in 2021という記事が公開されました。 この記事では、2021年中にDenoに起きたできごとや変更内容などについて解説されています。 また、Deno v2へのロードマップの公開などもまもなく実施予定とのことです。 https://deno.com/blog/deno-in-2021 I’m porting tsc to Go SWCの作者であるkdy1氏により、I’m porting tsc to Goという記事が公開されました。...

January 30, 2022

2021/01/17〜2022/01/23の最新情報

Deno v1.18.0 Deno v1.18.0がリリースされました。 設定ファイルの自動読み込みがサポート 今までは、設定ファイルを読み込むためには--configの指定が必要でした。 $ deno run --config ./deno.json ./main.ts 今後は、--configが指定されなかった場合、deno.jsonまたはdeno.jsoncという名前の設定ファイルを自動で読み込まれるようになります。 Deno.testのsub-steps APIが安定化 Deno.testでテストケースのグループ化を行うためのsub-steps APIが安定化されました。 今後は--unstableを指定しなくても利用できます。 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!...

January 23, 2022

2021/01/10〜2022/01/16の最新情報

Deno v1.17.3 Deno v1.17.3がリリースされました。 このリリースでは、バグ修正を中心に実施されています。 変更点: deno installで--allow-allを付与した際に、パーミッションが分解されてスクリプトが作成されないように修正されました。 具体的には、今まではdeno installで--allow-allを指定すると、下記のようなスクリプトが作成されていました。 #!/bin/sh # generated by deno install exec deno run --allow-read --allow-write --allow-net --allow-env --allow-run --allow-ffi --allow-hrtime --quiet --unstable 'http://localhost:3000/bin.ts' "$@" この形式でスクリプトが作成されてしまうと、将来的に新しい--allow-*オプションが導入された際などにスクリプトが意図した通りに動作しなくなってしまうため、この修正が実施されました。 deno bundleやdeno compileの--outputオプションにディレクトリを指定できるようになりました。 ディレクトリを指定した際は、バイナリ名は自動で推論されるようです。 deno coverageコマンドで型チェックが行われなくなりました。 あるモジュールが複数のファイルからimportされていた場合などに、適切にカバレッジが収集されなくなる問題が修正されました。 WorkerでDeno.memoryUsage()が使えない問題が修正されました。 lib.deno_core.d.tsのエラーが修正されました。 https://github.com/denoland/deno/releases/tag/v1.17.3 deno_std v0.121.0 deno_std v0.121.0がリリースされました。 変更点: crypto: MD4がサポートされました。 http/file_server: --quietオプションによりログ出力を無効化できるようになりました。 node: zlibパッケージが実装されました。 node/fs: fs.write()とfs.writeSync()が実装されました。 node/http: ClientRequest#abortが実装されました。また、'response'イベントが発火されるように修正されました。 node/url: url....

January 16, 2022