ソースマップコメントの `=` をエスケープしてVitestの誤検知を修正

tailwindlabs/tailwindcss

内部ソースマップのコメント生成において =\x3d にエスケープすることで、Vitestがソースマップのパスを誤ってパースし発生していた警告を解消しました。

背景

テスト実行中に、VitestがViteのSSRモジュールロード処理でソースマップファイルを正しく解決できないという警告が発生していました。警告の内容は、${i} というリテラル文字列をファイルパスとして解釈しようとした結果、ENOENT: no such file or directory, open '.../${i}' というエラーが発生するというものです。

原因は、ソースマップのインラインコメントに含まれる = 記号にありました。sourceMappingURL=... という形式の文字列を Vite のソースマップパーサーが走査する際、= を区切り文字として解釈し、その後ろに続くURLの内容を誤ってパス変数(${i})として展開しようとしていたと考えられます。PRでは、この警告が Vitest のハングにも関係していた可能性も示唆されています。

技術的な変更

変更は packages/@tailwindcss-node/src/source-maps.tscomment 関数1行のみで、= を Unicode エスケープ \x3d に置き換えることで対処しています。

変更前:

function comment(url: string) {
  return `/*# sourceMappingURL=${url} */\n`
}

変更後:

function comment(url: string) {
  return `/*# sourceMappingURL\x3d${url} */\n`
}

\x3d は ASCII コード 0x3D、すなわち = と等価であるため、生成されるCSSコメントの内容は変わりません。JavaScriptのテンプレートリテラル内でのみエスケープされた表現になるだけで、出力文字列としては従来通り /*# sourceMappingURL=app.css.map */ が得られます。

あわせて packages/@tailwindcss-node/src/source-maps.test.ts が新規追加され、comment('app.css.map') の戻り値が /*# sourceMappingURL=app.css.map */\n であることを明示的に検証するテストが導入されています。

import { expect, it } from 'vitest'
import { toSourceMap } from './source-maps'

it('should emit source maps', () => {
  let map = toSourceMap('{"version":3,"sources":[],"names":[],"mappings":""}')

  expect(map.comment('app.css.map')).toBe('/*# sourceMappingURL=app.css.map */\n')
})

設計判断

ソースコード上の表現を変更し、出力は維持するというアプローチが採用されました。

Viteのパーサーが = を誤検知するという問題に対し、パーサー側を修正するのではなく、生成側で回避する方針を取っています。\x3d はJavaScriptエンジンがパースする時点で = に展開されるため、出力されるCSSの仕様適合性は損なわれません。この修正は1文字の変更で済み、Tailwind CSSが生成するソースマップのフォーマット自体には一切影響しません。

まとめ

この変更は、テンプレートリテラル内の特定文字がツールチェーンのパーサーに誤解釈されるという、ツール間の相互作用に起因する問題をピンポイントに解消しています。出力を変えずにソースコードの表現のみを変える手法は、他のソースジェネレーターが同様の問題に直面した際の参考となるアプローチです。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
ce970219

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

記事全体の構成は「総論→各論→結論」の3部構成に正しく従っています。リード文、背景、技術的な変更、設計判断、まとめの各要素がすべて含まれており、理想的な構成です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きのシンタックスハイライト(```言語:ファイルパス)が正しく使用されています。記事本文中にGitHubリンク記法は含まれていませんが、使用されている構文はすべてガイドラインに準拠しています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

ソースマップ、Vitest、Vite SSRといった専門用語が適切に使用されており、専門知識を持つエンジニアという対象読者に適合した技術レベルと表現になっています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクション、各パラグラフともに構成が非常に優れています。各段落はトピックセンテンスで始まり、1段落1トピックの原則が守られています。段落の長さも適切で、可読性が高いです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内のコードブロックは、提供されたDiff情報を正確に反映しています。変更点(`=`から`\x3d`へ)と追加されたテストコードの両方が、元のDiffと完全に一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「ソースマップ」「Unicodeエスケープ」「テンプレートリテラル」などの技術用語が、文脈に応じて正確かつ適切に使用されています。

説明の技術的正確性 ⚠ WARNING

技術的主張の正確性と論理性

全体として技術的に正確ですが、「技術的な変更」セクションにおける `\x3d` の説明がやや不正確です。「テンプレートリテラル内でのみエスケープされた表現になる」という表現は、エスケープシーケンスのスコープを誤解させる可能性があります。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(Vitestの警告内容、ハングの可能性、修正方法など)は、PRのDescriptionやDiff情報によって裏付けられており、ハルシネーションは見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

記事内で引用されているファイルパス(`packages/@tailwindcss-node/src/source-maps.ts`など)はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトルは、PRのタイトル「Fix internal source map warnings」をより具体的にしたものであり、PRの内容を正確かつ分かりやすく要約しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

PR情報に含まれない外部知識(バージョンのサポート状況、リリース日程など)の記述はなく、提供された情報源に忠実です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「警告が発生していました」といった時間表現は、PRが修正しようとしている問題の状況を正しく反映しており、時間的な歪曲はありません。