2025-10-15 10:12:44 +03:00

59 lines
1.8 KiB
Go

package moduletransforms
import (
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/ast"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/binder"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/core"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/transformers"
)
type ImpliedModuleTransformer struct {
transformers.Transformer
opts *transformers.TransformOptions
resolver binder.ReferenceResolver
getEmitModuleFormatOfFile func(file ast.HasFileName) core.ModuleKind
cjsTransformer *transformers.Transformer
esmTransformer *transformers.Transformer
}
func NewImpliedModuleTransformer(opts *transformers.TransformOptions) *transformers.Transformer {
compilerOptions := opts.CompilerOptions
resolver := opts.Resolver
if resolver == nil {
resolver = binder.NewReferenceResolver(compilerOptions, binder.ReferenceResolverHooks{})
}
tx := &ImpliedModuleTransformer{opts: opts, resolver: resolver, getEmitModuleFormatOfFile: opts.GetEmitModuleFormatOfFile}
return tx.NewTransformer(tx.visit, opts.Context)
}
func (tx *ImpliedModuleTransformer) visit(node *ast.Node) *ast.Node {
switch node.Kind {
case ast.KindSourceFile:
node = tx.visitSourceFile(node.AsSourceFile())
}
return node
}
func (tx *ImpliedModuleTransformer) visitSourceFile(node *ast.SourceFile) *ast.Node {
if node.IsDeclarationFile {
return node.AsNode()
}
format := tx.getEmitModuleFormatOfFile(node)
var transformer *transformers.Transformer
if format >= core.ModuleKindES2015 {
if tx.esmTransformer == nil {
tx.esmTransformer = NewESModuleTransformer(tx.opts)
}
transformer = tx.esmTransformer
} else {
if tx.cjsTransformer == nil {
tx.cjsTransformer = NewCommonJSModuleTransformer(tx.opts)
}
transformer = tx.cjsTransformer
}
return transformer.TransformSourceFile(node).AsNode()
}