2021/04/18〜2022/04/24の最新情報

Deno v1.21 Deno v1.21がリリースされました。 個別に記事を書いたので、詳しくはそちらを参照いただければと思います。 Deno v1.21 deno_std v0.136.0 deno_std v0.136.0がリリースされました。 testing/snapshot スナップショットテストを行うためのモジュールが追加されました。 このモジュールではassertSnapshotという関数が公開されており、__snapshots__ディレクトリに保存されたスナップショットと第2引数で指定された値を比較し、マッチしなかった場合、エラーが発生します。 スナップショットを読み込む必要があるため、利用には--allow-readパーミッションが必要になります。 import { assertSnapshot } from "https://deno.land/std@0.136.0/testing/snapshot.ts" Deno.test("doSomething", async (t) => { const result = doSomething(); await assertSnapshot(t, result); }); スナップショットを更新したいときは、テストを実行する際に--updateを指定する必要があります。 この場合、スナップショットを書き込むために、追加で--allow-writeが必要になります。 # スナップショットは__snapshots__に書き込まれます $ deno test --allow-read --allow-write tests/some_test.js -- --update testing/bdd itに渡すテスト関数がTestContextを受け取るように修正されています。 import { describe, it } from "https://deno.land/std@0.136.0/testing/bdd.ts" describe("sum", () => { it("should return sum of numbers", (t) => { assertEquals(sum(1, 2, 3), 6, t....

April 24, 2022

Deno v1.21

Deno v1.21がリリースされました。 この記事では新機能や修正点などについて解説します。 deno checkコマンドの導入 新しいコマンドとしてdeno checkコマンドが追加されました。 挙動としては基本的にdeno cacheコマンドと同等で、与えられたモジュールの型チェック及びリモートモジュールのダウンロードを行います。 $ deno check mod.ts deno cacheコマンドとの違い deno cacheコマンドとの大きな違いとして、deno checkコマンドはデフォルトではリモートモジュールの型チェックを行いません。 deno checkコマンドでリモートモジュールの型チェックも行いたい場合は--remoteオプションを指定する必要があります。 deno runコマンドでの型チェックについて deno checkコマンドの追加による影響として、将来的にdeno runコマンドではデフォルトで型チェックが行われなくなる予定です。(Deno v1.21時点でもDENO_FUTURE_CHECK=1環境変数を設定することで、この挙動を有効化できます) 型チェックを行いたいときは、今回追加されたdeno checkコマンドまたはdeno run --checkで明示的に行う必要が出てきます。 新しいサブプロセスAPI (unstable) DenoにはDeno.run()というサブプロセスを生成するためのAPIがありますが、今回、新しく3種類のAPIが追加されました: Deno.spawn() (高レベル) Deno.spawnChild() (低レベル) Deno.spawnSync() (Deno.spawnの同期版) これらのAPIの利用にはDeno.run()と同様に--allow-runパーミッションが必要です。 また、これらのAPIの追加により、Deno.run()は非推奨化される予定のようです。 Deno.spawn() これは高レベルAPIという位置づけです。 指定したコマンドを実行し、そのコマンドの実行結果(status)や標準出力(stdout)及び標準エラー出力(stderr)への出力内容を返却してくれます。 const { stdout, status } = await Deno.spawn("echo", { args: ["foo"], }); console.assert("foo\n" === new TextDecoder().decode(stdout)); console.assert(status.success); コマンドの出力結果のみが必要で、細かな制御はいらない場合に便利かと思います。 Deno.spawnChild() こちらは低レベルAPIという位置づけです。 Deno.Reader/Deno.WriterではなくReadableStream/WritableStreamをベースに実装されています。 const child = Deno....

April 24, 2022

2021/04/11〜2022/04/17の最新情報

Deno v1.20.6 Deno v1.20.6がリリースされました。 deno fmtコマンドの内部実装で使用されているdprint関連のプラグインがアップデートされています。 その影響により、deno fmtコマンドのパフォーマンス向上やバグの修正が行われています。 (オブジェクトリテラルと3項演算子を併用した際に、フォーマット結果に一貫性がなくなる問題が修正されているようです) https://github.com/denoland/deno/releases/tag/v1.20.6 deno_std v0.135.0 deno_std v0.135.0がリリースされました。 このリリースでは破壊的変更が実施されています。 io/readers: MultiReaderのシグネチャの変更 (破壊的変更) MultiReaderのコンストラクタの引数が可変長引数ではなくDeno.Readerの配列を受け取るように変更されています。 変更前: const readers: Array<Deno.Reader> = [...]; new MultiReader(...readers); 変更後: const readers: Array<Deno.Reader> = [...]; new MultiReader(readers); MultiReaderはstd/archive/tar.tsモジュールの内部で使われており、大量のファイルを持つtarファイルを作ろうとすると、maximum call stack exceededエラーが発生してしまう問題があったようです。 mime/multipartの非推奨化 (破壊的変更) mime/multipartモジュールが非推奨化されました。 今後はFormDataの使用が推奨されます。 testing/benchの非推奨化 (破壊的変更) testing/benchモジュールが非推奨化されました。 今後はDeno.benchの使用が推奨されます。 testing/bddの追加 testing/bddモジュールが追加されました。 JestやMochaライクなAPIを使用してテストコードを記述することができます。 import { assertEquals } from "https://deno.land/std@0.135.0/testing/asserts.ts"; import { describe, it } from "https://deno.land/std@0.135.0/testing/bdd.ts"; describe("sum", () => { it("should return sum of numbers", () => { assertEquals(sum(1, 2, 5), 8) }); it("should return 0 when no arguments are given", () => { assertEquals(sum(), 0); }); }); 定義したテストコードはdeno testコマンドで実行することが出来ます。...

April 17, 2022

2021/04/04〜2022/04/10の最新情報

Deno v1.20.5 Deno v1.20.5がリリースされました。 deno lspの新機能 deno lspでTesting APIがサポートされています (https://code.visualstudio.com/api/extension-guides/testing) vscodeでTesting: Focus on Test Explorer Viewコマンドを実行すると、テストファイルに含まれるテストケースの一覧を表示できます。 Deno.Listenerにrefとunrefメソッドが追加 (unstable) unref()が呼ばれたListenerはプロセスの終了をブロックしなくなります (タイマにDeno.unrefTimerを呼んだときと同様の挙動をします) 後述するdeno_std/node/netでのServer.ref()の実装で利用されています。 バグ修正 SubtleCrypto.exportKey()でextractable: falseに設定されたキーをエクスポートできてしまう問題が修正されました (https://github.com/denoland/deno/issues/14215) --compatを指定してdeno installを実行した際に、--compatフラグが維持されない問題が修正されました。 https://github.com/denoland/deno/releases/tag/v1.20.5 deno_std v0.134.0 deno_std v0.134.0がリリースされました。 encoding/csvやnodeモジュールへの機能の追加が行われています。 encoding/csv CSVStreamが追加されました。 import { CSVStream } from "https://deno.land/std@0.134.0/encoding/csv/stream.ts"; const file = await Deno.open("path/to/data.csv"); const stream = file.readable .pipeThrough(new TextDecoderStream()) .pipeThrough(new CSVStream()); for await (const record of stream) { console.log(record); } node child_process: ChildProcess....

April 10, 2022

2021/03/28〜2022/04/03の最新情報

Supabase Functions SupabaseでSupabase FunctionsというFaaSが利用できるようになりました。 Supabase FunctionsはDeno Deployをベースにしており、TypeScriptなどを利用してコードを記述できるようです。 Supabase Functions on Deno Deploy Edge Functions are now available in Supabase Deno v1.20.4 Deno v1.20.4がリリースされました。 変更点: 外部モジュールのimport時にリダイレクトが発生すると、deno compileで生成したバイナリがうまく動作しなくなる問題が修正されました。 Deno v1.20.3で非推奨化されたfetch()のシグネチャが修正されました。 変更前: function fetch( input: URL, init?: RequestInit, ): Promise<Response>; 変更後: function fetch( input: URL | Request | string, init?: RequestInit, ): Promise<Response>; deno lspでdeno.jsoncなどの拡張子が.jsoncのファイルがウォッチされない問題が修正されました。 deno taskコマンドでのPATHEXT環境変数の取り扱いが改善されました。 https://github....

April 3, 2022

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

Deno v1.20.2 permissionsオプションへの破壊的変更について Deno v1.20で行われる予定であったpermissionsオプションへの破壊的変更が正式に反映されました。 詳細については下記を参照ください。 Deno v1.20 deno taskコマンドの改善 deno taskコマンドの内部で使われているdeno_task_shellがアップデートされています。 これにより、cp -Rや|&のサポートなどが行われています。 deno_task_shell v0.2.0 deno lspでenablePathsオプションがサポート deno lspでenablePathsオプションがサポートされました。 ワークスペース内の特定のフォルダでのみdeno lspを有効化したいが、それ以外のフォルダでは組み込みのJavaScript/TypeScriptランゲージサーバを使いたいようなときに設定することが想定されているようです。 https://github.com/denoland/vscode_deno/releases/tag/3.11.0 その他の変更 --unstableなしでdeno benchを実行した際のエラーメッセージが改善 deno upgradeコマンドでDENO_CERT環境変数による証明書の指定がサポート HTTPサーバのパフォーマンスチューニング など https://github.com/denoland/deno/releases/tag/v1.20.2 Deno v1.20.3 Deno v1.20.2に続けて、v1.20.3もリリースされています。 セキュリティに関する修正が含まれるので早めのアップデートが推奨されています。 変更点: Denoはfetchの第一引数としてURLの指定をサポートしていますが、この形式での呼び出しが非推奨化されました。 (v2で削除される予定のようです) FFI関連の各API(Deno.UnsafeFnPointer#callなど)でちゃんと--unstableオプションが与えられているかチェックされるよう変更されました。 Deno.RunOptionsのcmdプロパティがreadonlyに変更されました。 https://github.com/denoland/deno/releases/tag/v1.20.3 deno_std v0.131.0 deno_std v0.131.0がリリースされました。 collections BinaryHeapが追加されました。 import { BinaryHeap } from "https://deno.land/std@0.132.0/collections/binary_heap.ts"; const heap = new BinaryHeap<number>(); heap....

March 27, 2022

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

Deno v1.20 Deno v1.20がリリースされました。 詳しくは下記の記事を参照ください: Deno v1.20 deno_std v0.130.0 deno_std v0.130.0がリリースされました。 std/testing/assertsモジュールでassertInstanceOfが実装されました。 import { assertInstanceOf } from "https://deno.land/std@0.130.0/testing/asserts.ts"; assertInstanceOf(new Date(), Date); // OK assertInstanceOf(/abc/, RegExp); // OK assertInstanceOf("baz", Number); // NG その他にもstd/nodeでのfs.writevSyncの実装などが行われています。 https://github.com/denoland/deno_std/commit/dbccc64488bbcc2bc540b833488b9bb97c11e1cb IndexedDBサポートについて Deno本体にIndexedDBを追加するPRが作成されています。 feat(ext/webstorage): IndexedDB (#14035) 内部的にはlocalStorageなどと同様にSQLiteを使用して実装されているようです。 近い将来にリリースされる可能性があるかもしれません。 https://github.com/denoland/deno/pull/14035 deno-sqlite v3.3.0 deno-sqlite v3.3.0がリリースされました。 DBクラスにexecuteメソッドが追加されています。 これを使うと、複数のSQLステートメントをまとめて実行することができます。 import { DB } from "https://deno.land/x/sqlite@v3.3.0/mod.ts"; const db = new DB(":memory:"); db.execute(` CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT ); INSERT INTO users (name) VALUES ('foo'), ('bar'); `); for (const [id, name] of db....

March 20, 2022

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