ts-mochaのざっくりとしたしくみ
from ts-mochaを使うとECMAScript moduleに依存したファイルでTypeError ERR_UNKNOWN_FILE_EXTENSION: Unknown file extension ".ts"が出てくる。
ts-mochaのざっくりとしたしくみ
ts-mochaを叩いただけでどうしてtypescriptコードのままテストができるのか?
ts-mochaコマンドのエントリポイントは/bin/ts-mocha(javascriptコード)にあり!
(1) package.jsonをのぞいてみるとbinにこのファイルが設定されていた。
つまり、ts-mochaというコマンドを打つと、/bin/ts-mohcaというコマンドが実行されることになる。
(2) /bin/ts-mochaの上部には、node.jsのShebangがついている。
つまり、このファイルをコマンドとして叩けば、ファイルの内容をnode.jsのコードとして実行してくれるということ。
/bin/ts-mochaの中で呼び出しているコマンドは簡略化して表記すると、
mocha --require /src/index.js ...(ts-mochaに渡した他のパラメタ)
ここでは、/はプロジェクトディレクトリを表している。
--requireとは何か?
--requireオプションの仕様
テストを実行する前に、渡されたファイルをモジュールとしてimport(require)する。
中に書いてあるコードもしっかり実行される。
/src/index.jsではts-nodeを呼び出し、typescriptコードを実行している。
ts-mochaの/src/index.jsとは何か?
--requireを通して環境変数として渡される以下のパラメタをもとに、ts-nodeを実行する
projectへのパス
transpileOnly: コンパイルだけするか否か(?)のフラグ
さらに、以下のコードがその中にあった(抜粋)
code:ts
require('ts-node').register({
project,
transpileOnly,
});
Create a new TypeScript compiler instance and register it onto node.js
register -- ts-node API reference
この文におけるregisterがよくわかってない
おそらくどこかのタイミングで実行されるのだと考えられる...?
ts-nodeのregisterの実装 -- github TypeStrong
このコードによってコンパイルが実行されている。
RegisterOptions.project -- ts-node API reference
RegisterOptions.transpileOnly -- ts-node API reference
ts-node/registerと似た作用を持ってる...?
まとめ
内部でmochaを起動し、そのrequireオプションにts-nodeを実行するスクリプトを結びつけている。
重要なオプション引数以外はそのまま渡している。
メモ書き
--require module -- Node.js CLI Reference
Only CommonJS modules are supported. Use --import to preload an ECMAScript module.