package moduletransforms import ( "github.com/microsoft/typescript-go/internal/ast" "github.com/microsoft/typescript-go/internal/binder" "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/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 { tx := &ImpliedModuleTransformer{opts: opts, resolver: opts.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() }