ESM 用型定義を @tailwindcss/postcss に提供
@tailwindcss/postcss が ESM インポーター向けに正しい型宣言ファイル(dist/index.d.mts)を配布できるよう、package.json の exports マップを条件別に分割しました。これにより TypeScript 6.0 以降や Deno の型チェックで発生していた TS1192 エラーが解消されます。
背景
ESM コンテキストで export = 形式の型宣言が使用されていたことが、TypeScript 6.0 でのハードエラー(TS1192)を招いていました。@tailwindcss/postcss@4.1.16 の package.json では exports.import を宣言しているものの、dist/index.d.ts は CJS スタイルの export = _default となっていたため、ESM インポーターがデフォルトエクスポートを取得できませんでした。この問題は Deno 2.8.3+(TypeScript 6.0)で import tailwindcss from "@tailwindcss/postcss" を実行すると顕在化しました。
このエラーは NodeNext 解決策を使用した tsc では再現しないものの、実際のユーザー環境での型安全性を損ねるため、修正が必要とされました。
技術的な変更
packages/@tailwindcss-postcss/package.json の exports 定義を import と require のそれぞれに対して types フィールドを分離しました。具体的には、従来の単一 "types": "./dist/index.d.ts" を削除し、以下のように条件別に記述します。
{
"exports": {
".": {
"import": {
"types": "./dist/index.d.mts",
"default": "./dist/index.mjs"
},
"require": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
}
}
}
import 条件では dist/index.d.mts(ESM 用型定義)を、require 条件では従来通りの dist/index.d.ts(CJS 用型定義)を指すようにしました。この変更により、ESM インポーターは自動的に .d.mts を取得し、CJS コンシューマは .d.ts を引き続き利用できます。
同様の構成は既に @tailwindcss/vite が採用しており、今回の修正はそのパターンを @tailwindcss/postcss に統一する形となります。
設計判断
PR では exports の types フィールドを import と require それぞれに分割する方針が採られました。これは新たに export default に置き換えるという代替案(index.d.ts の内容変更)と比較して、後方互換性 を最小限に抑える選択です。CJS 利用者は export = 形態の型定義をそのまま使用でき、既存のビルドやランタイム挙動に影響を与えません。
また、package.json の exports マップはモジュール解決時に直接参照されるため、条件別に types を指定することで 型解決ロジックの単純化 と ファイル構造の明示化 が実現します。これにより、将来的に他のサブパッケージ(例: @tailwindcss/node)でも同様のパターンを容易に導入できる設計基盤が整います。
まとめ
本変更は ESM インポーターが正しい型宣言ファイルを取得できるよう exports マップを分割し、TypeScript 6.0 や Deno での型エラーを解消しました。CJS 互換性は保持したまま、型解決の一貫性を高める設計判断が行われ、他パッケージへの展開も容易です。