Deno v1.25.0

Deno v1.25.0がリリースされました。

以下の記事に変更点をまとめたため、詳しくはそちらを参照いただければと思います。

deno_std v0.153.0

deno_std v0.153.0がリリースされました。

std/encoding/csv: parse()が同期的に動作するように (破壊的変更)

parse()の引数からBufReaderが削除されています

これに伴い、parse()の戻り値がstring[][] | Record<string, unknown>[]に変更されています。

import { parse } from "https://deno.land/std@0.153.0/encoding/csv.ts";

const records = parse(`id,name
1,foo
2,bar`);
console.log(records);
// Output: [ [ "id", "name" ], [ "1", "foo" ], [ "2", "bar" ] ]

std/http/cookie_mapモジュールが追加

MapライクなAPIをベースにCookieを管理するためのユーティリティモジュールが追加されました。

CookieMapはリクエスト及びレスポンスに関するCookieの管理に利用することができます。

import { CookieMap, mergeHeaders } from "https://deno.land/std@0.153.0/http/cookie_map.ts";

const req = new Request("http://localhost:3000", {
  headers: { cookie: "foo=bar; hoge=piyo;" },
});
const cookies = new CookieMap(req);
cookies.get("hoge"); // => "piyo"
cookies.set("bar", "baz");
cookies.delete("foo");

const headers = mergeHeaders(cookies, new Headers({ "content-type": "application/json" }));
console.log(headers);
// Output:
//   Headers {
//     "content-type": "application/json",
//     "set-cookie": "foo=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GM
//   T; httponly"
//   }

SecureCookieMapは、基本的にはCookieMapと同様の用途で使用できますが、以下の点が異なります。

  • 各APIが非同期に動作する
  • Cookieの署名と検証を行ってくれる (Cookieの改ざんを防止するため)

以下はSecureCookieMapの使用例です。

import { KeyStack } from "https://deno.land/std@0.153.0/crypto/keystack.ts";
import { SecureCookieMap, mergeHeaders } from "https://deno.land/std@0.153.0/http/cookie_map.ts";

const keys = new KeyStack(["secret"]);
const digest = await keys.sign("hoge=piyo");

const req = new Request("http://localhost:3000", {
  headers: { cookie: `bar=baz; hoge=piyo; hoge.sig=${digest}` },
});
const cookies = new SecureCookieMap(req, { keys });
await cookies.get("hoge"); // => "piyo"
await cookies.get("bar"); // => undefined
await cookies.set("foo", "bar");

const headers = mergeHeaders(cookies, new Headers({ "content-type": "application/json" }));
console.log(headers);
// Output:
// Headers {
//   "content-type": "application/json",
//   "set-cookie": "foo.sig=6N0gFVndcVFLbSrP0HdUs2TqhGHThgq3tyJpHSuP0J
// s; path=/; httponly"
// }

std/http/cookie: getSetCookies()が追加

新しいAPIとしてgetSetCookies()が追加されています。

Set-Cookieヘッダの内容を解析するために利用できます。

import { getSetCookies } from "https://deno.land/std@0.153.0/http/cookie.ts";

const headers = new Headers({
  "set-cookie": "foo=bar; path=/; Secure; HttpOnly",
});
const cookies = getSetCookies(headers);
console.log(cookies);
// Output:
// [ { name: "foo", value: "bar", path: "/", secure: true, httpOnly: true } ]

std/http/server: serveTls()keycertオプションがサポート

serveTls()では秘密鍵と証明書を指定するために、keyFilecertFileオプションがサポートされていますが、これらはDeno 2.0で削除予定の非推奨化されたAPIに依存しています。

そのため、新しいオプションとしてkeycertオプションが追加されました。

これらの使い方は、Deno.listenTlsにおける同名オプションと同様です。

std/crypto/keystackモジュールの追加

前述したstd/http/cookie_mapにおけるSecureCookieMapを実装する目的で、std/cryptokeystackモジュールが追加されました。

std/testing/asserts

新しいAPIとして、assertNotInstanceOfが追加されています。

assertNotInstanceOf("foo", Request); // => OK
assertNotInstanceOf(new Date(), Date); // => NG

その他には、assertEqualsgetterを持つオブジェクトを比較した際の差分の表示が改善されています。

std/async/delay: persistentオプションのサポート

falseを指定すると、Deno.unrefTimerによってプロセスの終了がブロックされなくなります。

await delay(5000, { persistent: false });

std/node

httpパッケージがFlashを使って再実装されています。

また、eventパッケージからlistenerCount()setMaxListeners()exportされました。

その他には、util/typesにおけるTypedArrayのチェックがより厳密に行われるように改善されています。


https://github.com/denoland/deno_std/releases/tag/0.153.0

Ultra v2のalphaバージョンが公開

ReactベースのWebフレームワークであるUltraのv2.0.0-alpha.0が公開されました。

v1ではwouterreact-helmetなどの使用が前提になっていましたが、v2では様々なエコシステムをより柔軟に利用できるようにすることが想定されているようです。

例えば、公式では以下のパッケージなどの使用例が公開されています。

その他には、サーバがHonoをベースに再実装されているようで、それを元にしたAPI routesの仕組みが導入される予定のようです。


esm.sh v92

esm.sh v92がリリースされました。

react/preact/vue向けにstableチャネルが追加されています。

https://esm.sh/stable/react@18.2.0/deno/react.js

https://github.com/ije/esm.sh/releases/tag/v92