◆ webpack のソースを見てみたら Parser.js で acorn 使ってた
◆ @babel/parser (元 babylon) じゃなかった
◆ ecmaVersion が 11 で extend なしなので新構文は使えない
◆ 外部から追加できそうな作りでもなかった

この記事の続き
やっぱり気になったので Webpack のソースも見てみました

使われてたのは acorn

additional loader がどうこうっていうエラーメッセージは ModuleParseError で作られてます
https://github.com/webpack/webpack/blob/v4.37.0/lib/ModuleParseError.js#L26

使ってる場所を探すと NormalModule の handleParseError で使われてます
https://github.com/webpack/webpack/blob/v4.37.0/lib/NormalModule.js#L456

これが実行されるのは
https://github.com/webpack/webpack/blob/v4.37.0/lib/NormalModule.js#L474
の this.parser.parse でエラーがあったとき
parser はコンストラクタで渡されてるのでインスタンス作成箇所を探すと
https://github.com/webpack/webpack/blob/v4.37.0/lib/NormalModuleFactory.js#L150

ここまでは良かったのですが これが実行されるのは this.hooks.afterResolve.callAsync に渡したコールバック関数の内側です
afterResolve は AsyncSeriesWaterfallHook のインスタンスで webpack だけど別リポジトリのライブラリで定義されてます
別ライブラリだし名前的にも 複雑なデータの渡し方というか処理の呼び出し方を管理する系でそこで設定が決まるわけではなさそうです
hook っていうくらいだし イベントリスナみたいな感じで なにかのイベントが起きたときに登録しておいた処理をやる系なんだとは思います
callAsync は data も渡してるくらいだからたぶん登録ではなく呼び出しです
ここからが大変で こういうのってどこで呼び出されるか探すのが難しいです
単純な関数呼び出しならともかく独自の仕組みを作ってるとそれを理解しないと どの処理で呼び出されるのかがわかりません

ただ data を result に変換する処理よりも data 自体に入ってそうな気がするのでさらに上を見てみました
すると resolver のコールバックの中で さらにその上は this.hooks.factory.tap のコールバックになってました……
こういう作りのって初めてコード読んですぐにどうなってるのかわからないから嫌いです

完全に追うのは諦めて NormalModuleFactory を使ってるところを検索すると意外といっぱいありました
その中でパーサを設定してそうなところを探すとたぶんこれ
https://github.com/webpack/webpack/blob/v4.37.0/lib/JavascriptModulesPlugin.js#L21
Parser のインスタンスを作って返してます
auto, dynamic, esm の種類がありますがどれも Parser のインスタンスで設定違いです
探してみると Parser って名前のファイル これと JsonParser しかないですしほぼ間違いないでしょう

Parser を見てみると使われてたのは acorn
https://github.com/webpack/webpack/blob/v4.37.0/lib/Parser.js#L9

てっきり babel のパーサだと思ってたので予想外でした
とは言っても @babel/parser は acorn ベースらしいので似たようなものになりそうです
ちなみに 知らないうちに babylon から @babel/parser に名前変わってました

拡張はやっぱり無理そう

使い方を見てみると extend はしないで ecmaVersion は 11 でした
オプションは parse メソッドみたところ sourceType の変更程度で ecmaVersion は固定になりそうです
extend もしていないので使える機能は ecmaVersion 11 にあるものだけみたいです

acorn でプラグイン追加するならこういう追加機能のパッケージを使って extend が必要です
https://github.com/acornjs/acorn-bigint
const な acornParser を呼び出してますし そもそもその変数は公開されてないので外部から機能追加はできなそうです

ちょっと前のバージョンをみてみると dynamic-import が extend されてました
acorn のバージョンを上げたら標準で対応したのではずしたみたいですね
https://github.com/webpack/webpack/commit/b56c3ecf1c5dee350b80b72193892740dc25e61d

頻繁に acorn の更新をしてるなら近いうちに対応するかなとも思いましたが 考えてみたら ecmaVersion 指定がありました
stage 4 になってどのバージョンで仕様書に載るか確定するまでは使えなそうです

ソースを変えれば

どうしてもやりたいというなら Parser.js を書き換えて 前の dynamic-import していたときのような感じで BigInt とかを自分で追加することは可能です
hook とか tab とかよくわからない部分は触れなくても良さそうですし やろうとすれば簡単にできるとは思います
ただ ツールのソースを変更してまでやりたいわけでもないですし 今回は諦めることにしました