本文へ移動
技術を、自社の仕事に。
判断と実行を助けるメディア

記事を検索

TypeScript 7.1ベータのcontentMappers .astroの型検査と外部コード

目次 · 7項目

AstroやVue、Svelteで作ったサイトでは、型検査を tsc だけで済ませられませんでした。.astro や .vue のファイルはTypeScriptのコンパイラが読めないため、astro check のような専用の道具を別に動かす必要があります。TypeScript 7(Goで書き直された版)に上げると、この専用の道具が動かなくなる、という問題も出ています。npmに公開されているAstro(7.4.7と、11月10日時点の最新の7.4.10)の astro check のソースは、TypeScriptのメジャー版が7以上だと「TypeScript 7.0には対応していない。TypeScript 6を入れること」というエラーで止まるよう書かれています。

TypeScript 7.1のベータには、この穴を埋める「content mapper(コンテンツマッパー)」という仕組みが入りました。ただし、使うにはコンパイル中に外部のコードを実行する許可が必要です。本記事では、TypeScriptの公式ブログの告知、TypeScriptのリポジトリ(microsoft/TypeScript)の原文、npmに公開されたパッケージの中身から、仕組みと、使い始める前に決めておくことを整理します。

TypeScript 7.1ベータの位置づけ

npmの typescript パッケージでは、2026年11月11日時点で次のタグが付いています。

  • latest(通常の npm i typescript で入る版): 7.0.2(2026年7月8日公開)
  • beta: 7.1.0-beta(2026年10月20日公開)
  • next: 7.1.0-dev.20261110.1(毎日の開発版)

7.1はまだベータで、ベータより新しいRC(リリース候補)や正式版はnpmに出ていません。公式ブログの告知「Announcing TypeScript 7.1 Beta」(2026年10月20日)は、RCを「about a month from now(約1か月後)」、正式版をその少し後としています。7.1.0-betaのパッケージの exports には、./sync・./async・./ast などのAPIの入口が並んでいます。TypeScript 7.0への移行の全体像は、TypeScript 7.0の移行ガイドで扱いました。

contentMappersの書き方

content mapperは、TypeScriptが読めない形式のファイルを、型検査できる形に変換して渡す外部のプログラムです。公式ブログは、拡張子ごとに登録し、ファイルの仮の表現と元のファイルへの対応づけを返す「新しいプラグインの差し込み口」と説明しています。同じ告知によると、Astro・CSS Modules・Ember・MDX・Svelte・Vue向けに、試作または実装が進んでいます。tsconfig.json の最上位に contentMappers を書きます。7.1.0-betaに同梱されたスキーマでは、配列の各要素が package(パッケージ名、必須)、extensions(扱う拡張子、必須)、options(任意)の3つの項目を持ちます。

Astroのチームは、.astro 用の @astrojs/ts-content-mapper を公開しています(npmの最新は0.2.0、2026年9月22日公開)。READMEに書かれた設定は次のとおりです。

{
  "compilerOptions": {},
  "contentMappers": [
    {
      "package": "@astrojs/ts-content-mapper",
      "extensions": [".astro"]
    }
  ]
}

実行は次のコマンドです。

tsc --noEmit --runExternalCode

スキーマの説明文には「Execution must be enabled separately with --runExternalCode.(実行はこのフラグで別に有効にする必要がある)」とあります。公式ブログも、content mapperは事実上どんなプログラムでも実行できるため、このフラグで明示させる、と説明しています。tsconfig.json に書いただけでは、マッパーは動きません。フラグなしで実行した場合のために、「Content mappers require the '--runExternalCode' command line flag to be enabled.」というエラーの文言が用意されており、7.1.0-betaの実行ファイルにもこの文言が含まれています。

なぜ「外部コードの実行」の許可が要るのか

TypeScriptのリポジトリには、信頼できない入力に対して tsc が何を保証するかをまとめた文書があります。そこでは、悪意のある .ts や tsconfig.json を tsc にかけても入力のコードが実行されることはない、これが tsc の中心となるセキュリティ上の性質だ、と書かれています。そのうえで、例外として次の一文があります。

content mapperを有効にすると、第三者のコードの実行が可能になる。どのcontent mapperが使われるかを確かめ、それを実行してよいと判断した場合にだけ --runExternalCode を渡すこと。

同じ文書には、tsc はcontent mapperを通じた場合を除いて、HTTPの通信もしないし子プロセスも起動しない、ともあります。言い換えると、フラグを付けた瞬間から、型検査のコマンドが「node_modules に入っているパッケージのプログラムを起動するコマンド」に変わります。@astrojs/ts-content-mapper の package.json にも、変換を受け持つ処理として node dist/server.js を起動する設定が書かれています。

contentMappersを有効にしたときのtscの動きの図。tsconfig.jsonにcontentMappersを書いただけでは動かず、runExternalCodeフラグを付けると、node_modulesのマッパーが別のプロセスとして起動して.astroファイルを変換する。フラグを付けない通常のtscは、入力のコードを実行せず、通信も子プロセスの起動もしない

エディタでは既定で有効になっている

コマンドラインでは明示の許可が必要な一方、TypeScript 7のVS Code拡張(リポジトリの packages/vscode-typescript)では扱いが異なります。

  • 設定 js/ts.contentMappers.enabled の既定値は true(試験的な設定という印が付いている)
  • この設定の値が、言語サーバーへの runExternalCode としてそのまま渡される
  • 拡張の package.json では、信頼していないワークスペース(untrusted workspaces)には対応しない、と宣言されている

公式ブログも、VS Codeなどのエディタでは content mapper が「just works(そのまま動く)」とし、ワークスペースの信頼と content mapper の許可の両方が要ること、js/ts.contentMappers.enabled で無効にできることを書いています。リポジトリのセキュリティ方針の文書には、node_modules から来るものも含め、content mapper は「プロジェクトのコード」の一部で、そのワークスペースを信頼すれば実行される、とあります。

2026年10月19日のコミット(#64837)では、言語サーバーがcontent mapperを読み込む場所を、ワークスペースのフォルダーの中にある node_modules だけに限る変更が入りました。ただし、ベータの元になったコミット(release-7.1ブランチの3e92363、10月19日20時38分 UTC)とGitHub上で比べると、この変更はその約2時間後にmainへ入っており、ベータには含まれていません。また、11月3日には、相対パスで指定したマッパーを、そのマッパーを宣言した設定ファイルの場所から解決する修正(#65105)が入っており、これはベータより後の開発版の変更です。11月9〜10日にも、content mapperで変換したファイルへのジャンプや、モジュール形式の扱いの修正(#65009・#65417・#65432)がmainに入りました。仕組みの細部はまだ動いています。

CIやチームで使い始める前に決めること

ここからは、上の原文をもとにした編集部の提案です。編集部では --runExternalCode を付けた実行は行っていません。

フラグを付けるのは、依存関係を固定したリポジトリだけにする。 型検査のたびに node_modules のプログラムが起動するので、package-lock.json を必ずコミットし、CIでは npm ci で入れます。マッパーのパッケージと、その依存(@astrojs/ts-content-mapper なら @astrojs/astro2tsx など)の更新は、通常の依存更新と同じようにレビューします。

外部からのプルリクエストを検査するジョブでは慎重に扱う。 協力会社や外部の人のプルリクエストが package.json を書き換えた場合、そのブランチで --runExternalCode を実行すると、書き換えた依存のコードが動きます。シークレットを渡さないジョブで実行する、package.json が変わったプルリクエストは人が確認してから動かす、などの分け方を決めておきます。

エディタの既定を、チームで把握しておく。 VS Code拡張の既定は有効です。ワークスペースを「信頼する」を押した時点で、そのリポジトリの node_modules のマッパーが動く前提で扱います。取引先から受け取ったリポジトリを開くときは、信頼の確認を安易に通さないようにします。

ベータの間は、本番のビルドの判定に使わない。 7.1は正式版ではなく、上で見たとおり、マッパーの解決の仕方も変わり続けています。当面は、今の型検査(TypeScript 6と astro check など)を残したまま、別のジョブで7.1ベータの結果を比べる、という並行の運用が無難です。型検査の道具を置き換えるときの比べ方は、Bunのbun checkとtscを並べて試した記事も参考になります。Astroの最近の修正は、Astro 7.4.5の環境変数の不具合の記事で扱いました。

確認した範囲

2026年11月9日に、npmの typescript(7.1.0-betaの公開日・タグ・同梱のスキーマ・実行ファイル内の文言)と @astrojs/ts-content-mapper 0.2.0のパッケージ(README・package.json)、microsoft/TypeScriptリポジトリ(f797316、2026年11月6日時点)のセキュリティ方針の文書・オプション定義・VS Code拡張の設定と、関連するコミットを確認しました(資料調査)。公開前の2026年11月11日に、TypeScriptの公式ブログの7.1ベータの告知、npmのタグ(ベータより新しい版がないこと)、7.1.0-betaのスキーマ、mainのセキュリティ方針の文書とVS Code拡張の設定、ベータの元になったコミットと#64837の関係を確かめ直しました。Astroの astro check の挙動は、npmのastro 7.4.7と7.4.10のソースで確認したもので、実行はしていません。--runExternalCode を付けた型検査は、ドラフトを書いた環境の権限設定で外部パッケージのコードの実行を見送ったため、行っていません。

Astroで作ったサイトの保守や、TypeScriptの版の上げ方は、HP制作・リニューアル相談からご相談ください。サイトの構成やCIの作りによって進め方が変わるため、個別にご案内します。

参考資料

この記事を共有XFacebook
鈴木 翔

技術の可能性に魅了され、学生時代からプログラミングとデジタルアートの分野に深い関心を持つ

この記事のテーマを、自社の次の一歩へ

Webサイトで、実現したいことから。

使う人の目的、必要な機能、更新の体制を整理し、制作・改善で最初に取り組むことを考えます。

  • サイトの目的
  • 機能と使いやすさ
  • 公開後の運用
Web制作・改善を相談する

構想段階からご相談いただけます。この記事の情報を相談フォームに引き継ぎます。

最新記事をメールで受け取る・Web制作ガイドを読む
無料ダウンロード

Web制作 費用・発注・集客 完全ガイド【2026年版】

費用相場・制作会社の選び方・集客戦略をPDFにまとめました。

The PDF and newsletter emails are currently in Japanese.

メルマガにも登録されます。いつでも解除可能です。