Deno v1.16.0

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

React 17 JSX Transformのサポート

React 17で導入された新しいJSX Transformのサポートが追加されました。

.jsxまたは.tsxファイル中で@jsxImportSourceを使うことで有効化されます。

/** @jsxImportSource https://esm.sh/preact@10.5.15 */

export function Hello(props) {
  return (
    <div>Hello, {props.name}</div>
  )
}

また、--configオプションで指定する設定ファイルで有効化することも可能です。

{
  "compilerOptions": {
    "jsx": "react-jsx",
    "jsxImportSource": "https://esm.sh/react@17.0.2"
  }
}

※Denoの特性上、"jsx": "react-jsx"を指定した際は、jsxImportSourceの指定も必要です。

Deno API

新しいシグナルAPI

Deno.addSignalListenerDeno.removeSignalListenerが実装されました (unstable)

const signalListener = () => {
  // ...
};
Deno.addSignalListener("SIGTERM", signalListener);
Deno.removeSignalListener("SIGTERM", signalListener);

この変更に合わせて、既存のDeno.signalは削除されています。

Deno.TlsConn型の導入

Deno.TlsConnという新しいデータ型が導入されました。

これに合わせて、Deno.connectTlsなどのAPIがDeno.Connの代わりにDeno.TlsConnを返却するように修正されています。

このオブジェクトにはhandshakeメソッドが定義されており、明示的にハンドシェイクを行うことができます。

Deno.testのテストケースごとのパーミッション指定が安定化

Deno v1.10で実装されたテストケースごとにパーミッションを指定できる機能が安定化され、--unstableフラグなしでも利用できるようになりました。

Deno.test({
  name: "This should fail",
  permissions: {
    net: false,
  },
  fn: async () => {
    const _ = await fetch("https://example.com");
  },
});

Deno.startTlsが安定化

Deno.startTlsが安定化され--unstableフラグなしでも利用できるようになりました。

シンボリックリンク関連のAPI

Deno.symlinkなどのAPIが--allow-writeに加えて--allow-readパーミッションを要求するように変更されました。

Node.js互換モードの機能向上

https:blob:インポートがサポートされました。 (.mjsファイル中やpackage.json"type": "module"が指定された際に有効化されます)

また、Import mapsとの統合もサポートされています。

Web API

localStorage--locationの指定が不要になりました

localStorage--locationオプションを指定せずに利用できるようになりました。

また、--locationが指定された際の挙動も若干変更されています。

  • v1.15までと異なり、--location https://deno.land/x/a.ts--location https://deno.land/x/b.tsは同一のオリジンとして扱われます。
  • --locationが未指定 かつ --configが指定された場合、--configで指定された設定ファイルの絶対パスがオリジンとして使用されます。
  • --location--configも指定されなかった場合、メインモジュールの絶対パスがオリジンとして使用されます。

fetchでローカルファイルのダウンロードがサポート

利用するには--allow-readパーミッションが必要です。

const res = await fetch("file:///home/uki00a/.vimrc");
console.log(await res.text());

AbortSignal.reasonのサポート

詳細についてはこちらを参照ください。

const controller = new AbortController();
controller.abort(new Error("Hello"));
console.log(controller.signal.reason);

Streams API

変更点:

エラー関連

  • Errorオブジェクトのcauseプロパティの値がconsole.logなどで出力されるようになりました。
  • OSエラーやdynamic importのエラーにcodeプロパティが定義されるようになりました。

V8のアップデート

V8が9.7にアップデートされました 。

Web AssemblyのReference Typesのサポートや、ArrayTypedArrayへのfindLast及びfindLastIndexの実装などが追加されています。

バグ修正など

  • TypeScriptの型エラーが発生した際にトランスパイル結果がキャッシュされる問題が修正されました。
  • deno fmt --watchまたはdeno lint --watchに引数が与えられなかった際に、うまく動かない問題が修正されました
  • --no-checkinlineSourcesコンパイラオプションが機能するようになりました。
  • Deno.upgradeWebSocketUpgradeヘッダに複数の値の指定が許可されるようになりました。
  • fetchでPOSTやPUTリクエストを送信する際に、ボディがなくてもContent-Length: 0ヘッダが設定されるようになりました。
  • deno lsptextDocument/signatureHelpから返却されるドキュメントの形式がplain textからMarkdown形式に変更されました。
  • deno lspx-typescript-typesヘッダがうまく機能しない問題が修正されました
  • importScriptsfetchと同じHTTPクライアントを使用するように修正されました

Deno v1.16.1

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

変更点:

  • v1.16.0で追加されたAbortSignal.reasonの型定義が追加されました。
  • ネイティブHTTPサーバで非アスキー文字を含むUint8Arrayのレスポンスの返却に失敗する問題が修正されました。
  • SubtleCrypto.deriveBitsでHKDFキーのビット列を得る際に、渡されたキー長が大きすぎるとプロセスがパニックする問題が修正されました。

https://github.com/denoland/deno/releases/tag/v1.16.1

deno_std v0.114.0

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

collections

  • Deno v1.16でのArray.prototype.findLastなどの導入に合わせて、findLastfindLastIndexが非推奨化されました。
  • deepMergeにプロトタイプ汚染攻撃への対策が入れられました。
  • findSingleで述語関数の指定が必須になりました。

http/server

serveListener関数が追加されました。使用法はv0.113.0までのserve関数と同様です。

import { serveListener } from "https://deno.land/std@0.114.0/http/server.ts";

const listener = Deno.listen({ port: 8000 });
await serveListener(listener, (request) => {
  return new Response("Hello", { status: 200 });
});

これに合わせてserveの使用法が変更されています。こちらはDeno.Listenerを渡す必要がありません。

import { serve } from "https://deno.land/std@0.114.0/http/server.ts";

await serve((request) => {
  return new Response("Hello", { status: 200 });
}, { addr: ":8000" });

これらの変更に合わせて、下記関数が非推奨化されました。

  • listenAndServe (今後はserveの使用が推奨されます)
  • listenAndServeTls (今後はserveTlsの使用が推奨されます)

Denoでサーバーを建てる方法 2021年11月版の記事でserveなどについて解説されています。

node

DenoのNode.js互換モードの強化に向けて、様々な機能の追加や変更が実施されています。

また、Deno Deployとの互換性の向上なども実施されています。

変更点:

  • readlineパッケージが追加されました (下記関数がサポート)
    • clearLine
    • clearScreenDown
    • cursorTo
    • moveCursor
  • vmパッケージが追加されました (現在は最低限の実装のみ)
  • process
    • process.onでシグナルをリスニングできるようになりました。
    • process.execArgvが追加されました (現在は、常に空の配列が設定されます)
    • process.archがNode.jsに一致するよう修正されました
  • fsパッケージでwatchFileが実装されました
  • http
    • Server
      • EventEmitterを継承し、'close''connection'イベントを発火するようになりました。
      • closeメソッドやaddressメソッドが実装されました
    • ServerResponse
      • statusCodestatusMessageプロパティが定義されました。
      • removeHeadergetHeaderNameshasHeaderが実装されました
      • setHeaderthisを返却するようになりました。
  • child_processパッケージでstdioを介してバイナリデータの読み書きができるように修正されました。
  • querystring
    • unescapeBuffer()が実装されました。
    • parse()stringify()のNode.jsとの互換性が向上しました。
  • moduleパッケージで適切なメンバがexportされるよう修正されました
  • osパッケージでcpus()が実装されました

signal

Deno v1.16で実装されたシグナルAPIの変更に合わせて、内部実装が変更されています。

http/file_server

ファイル配信時にReadableStreamを使用してストリーミングが行われるように修正されました。


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

deno-postgres v0.14.0

deno-postgres v0.14.0がリリースされました。

Deno v1.16でのDeno.startTlsの安定化に合わせ、deno-postgresも--unstableなしで利用できるようになっています

また、Client#queryObjectcamelcaseオプションが追加され、データベースから返却されたスネークケース形式のカラム名をキャメルケース形式に変換できるようになりました。

const { rows } = await client.queryObject({
  text: `SELECT * FROM users`,
  camelcase: true,
});

その他の変更として、日付型の値が適切に解析されるように修正が行われています。


https://github.com/denodrivers/postgres/releases/tag/v0.14.0