@@ -542,8 +542,12 @@ func (p *fileLoader) resolveImportsAndModuleAugmentations(t *parseTask) {
542542 continue
543543 }
544544
545+ var kind * string = nil
546+ if ast .IsStringLiteralLike (entry ) {
547+ kind = getModuleLiteralImportKind (entry )
548+ }
545549 mode := getModeForUsageLocation (file .FileName (), meta , entry , optionsForFile )
546- resolvedModule , trace := p .resolver .ResolveModuleName (moduleName , fileName , mode , redirect )
550+ resolvedModule , trace := p .resolver .ResolveModuleName (moduleName , fileName , kind , mode , redirect )
547551 resolutionsInFile [module.ModeAwareCacheKey {Name : moduleName , Mode : mode }] = resolvedModule
548552 resolutionsTrace = append (resolutionsTrace , trace ... )
549553
@@ -625,7 +629,7 @@ func (p *fileLoader) pathForLibFile(name string) *LibFile {
625629 if p .opts .Config .CompilerOptions ().LibReplacement .IsTrue () && name != "lib.d.ts" {
626630 libraryName := getLibraryNameFromLibFileName (name )
627631 resolveFrom := getInferredLibraryNameResolveFrom (p .opts .Config .CompilerOptions (), p .opts .Host .GetCurrentDirectory (), name )
628- resolution , trace := p .resolver .ResolveModuleName (libraryName , resolveFrom , core .ModuleKindCommonJS , nil )
632+ resolution , trace := p .resolver .ResolveModuleName (libraryName , resolveFrom , nil , core .ModuleKindCommonJS , nil )
629633 if resolution .IsResolved () {
630634 path = resolution .ResolvedFileName
631635 replaced = true
@@ -750,3 +754,98 @@ func getEmitSyntaxForUsageLocationWorker(fileName string, meta ast.SourceFileMet
750754 }
751755 return core .ModuleKindNone
752756}
757+
758+ // start added for deno
759+ func isStrOrIdentWithText (node * ast.Node , text string ) bool {
760+ if ast .IsStringLiteral (node ) {
761+ return node .Text () == text
762+ } else if ast .IsIdentifier (node ) {
763+ return node .AsIdentifier ().Text == text
764+ } else {
765+ return false
766+ }
767+ }
768+
769+ func getRawImportAttributeValue (node * ast.ImportAttribute ) * string {
770+ if ! isStrOrIdentWithText (node .Name (), "type" ) {
771+ return nil
772+ }
773+ return getRawTypeValue (node .Value )
774+ }
775+
776+ func getRawTypeValue (node * ast.Node ) * string {
777+ if ast .IsStringLiteral (node ) {
778+ text := node .Text ()
779+ if len (text ) > 0 {
780+ return & text
781+ }
782+ }
783+ return nil
784+ }
785+
786+ func getModuleLiteralImportKind (node * ast.StringLiteralLike ) * string {
787+ parent := node .Parent
788+ if parent == nil {
789+ return nil
790+ }
791+
792+ if ast .IsImportDeclaration (parent ) || ast .IsExportDeclaration (parent ) {
793+ var elements []* ast.Node
794+ if ast .IsImportDeclaration (parent ) {
795+ elements = parent .AsImportDeclaration ().Attributes .AsImportAttributes ().Attributes .Nodes
796+ } else {
797+ elements = parent .AsExportDeclaration ().Attributes .AsImportAttributes ().Attributes .Nodes
798+ }
799+ if elements == nil {
800+ return nil
801+ }
802+ for _ , element := range elements {
803+ value := getRawImportAttributeValue (element .AsImportAttribute ())
804+ if value != nil {
805+ return value
806+ }
807+ }
808+ return nil
809+ } else if ast .IsCallExpression (parent ) {
810+ arguments := parent .Arguments ()
811+ if parent .Expression ().Kind != ast .KindImportKeyword ||
812+ len (arguments ) <= 1 ||
813+ ! ast .IsStringLiteral (arguments [0 ]) ||
814+ ! ast .IsObjectLiteralExpression (arguments [1 ]) {
815+ return nil
816+ }
817+
818+ obj := arguments [1 ].AsObjectLiteralExpression ()
819+ withExpr := find (obj .Properties .Nodes , func (p * ast.Node ) bool {
820+ return ast .IsPropertyAssignment (p ) && isStrOrIdentWithText (p .Name (), "with" )
821+ })
822+ if withExpr == nil {
823+ return nil
824+ }
825+ withInitializer := (* withExpr ).Initializer ()
826+ if ! ast .IsObjectLiteralExpression (withInitializer ) {
827+ return nil
828+ }
829+ typeProp := find (withInitializer .Properties (), func (p * ast.Node ) bool {
830+ return ast .IsPropertyAssignment (p ) && isStrOrIdentWithText (p .Name (), "type" )
831+ })
832+ if typeProp == nil {
833+ return nil
834+ }
835+ typeInitializer := (* typeProp ).Initializer ()
836+ return getRawTypeValue (typeInitializer )
837+ } else {
838+ return nil
839+ }
840+ }
841+
842+ func find [T any ](list []T , predicate func (T ) bool ) * T {
843+ for _ , item := range list {
844+ if predicate (item ) {
845+ return & item
846+ }
847+ }
848+ return nil
849+ }
850+
851+ // end added for deno
0 commit comments