quote from esbuild only drop type definition and transform enum jsx etc...
input -> lexer -> parser -> compiler -> output
// SourceCode Scanner> Tokens Parser> AST Emitter> JavaScript
// NewLexer -> newParser -> Parse -> parseFile -> maybeParseFile -> scanAllDependencies -> ScanBundle -> Compile -> buildImpl -> Build
parseの処理でtsを落としてASTに変換してそれをcompileImplに渡してASTをjsに変換する、CompileでcompileImplをラップして外部公開
parseFileでの結果は parseArgsの args.results
に入る、scannerに入れられてresultの値を各種scannerに実装されているメソッドで加工している、
scannerに渡されたparseResultは各種scanの過程を経て ScanBundle
で呼ばれてcompileの処理に渡される
playgroundで特定の文字列を受け取ってcompileした結果を返すapiとして提供するのであれば、stringで引数を取ってそれを lexer, parser, compiler
の順に渡すようにすれば問題ない。
esbuildのようにcliなどでファイル単位で渡したものを全てcompileしてファイル依存解消してminifyして返すようにするためには設計考える必要あり。
input Lexer> Tokens Parser> AST Compiler> Javascript
渡されたTypescriptコードを型を落としたTokenに変換する
内部で lexer.skipTypescript
を読んで型を落とす
渡されたTokenをASTに変換する
渡されたASTをJavascriptコードに変換する
オプションはつけないあくまでAPIに文字列として渡されたTypescriptコードを変換することだけする
parser.Parse
の内部で newLexer
を読んでいるので parser.Parse
にstringでtypescriptコードを渡す
const x: number = 1;
function square(x: number): number {
return x ** 2;
}
go run main.go const x:number=1;