Skip to content

Commit d82156d

Browse files
authored
Merge pull request #10 from nathanwhit/raw-imports
feat: pass import attribute type to resolver
2 parents 430327d + 5b8b84d commit d82156d

File tree

4 files changed

+107
-7
lines changed

4 files changed

+107
-7
lines changed

internal/api/server.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,11 +290,12 @@ func (r *resolverWrapper) GetPackageScopeForPath(directory string) *packagejson.
290290
}
291291

292292
// ResolveModuleName implements module.ResolverInterface.
293-
func (r *resolverWrapper) ResolveModuleName(moduleName string, containingFile string, resolutionMode core.ResolutionMode, redirectedReference module.ResolvedProjectReference) (*module.ResolvedModule, []string) {
293+
func (r *resolverWrapper) ResolveModuleName(moduleName string, containingFile string, importAttributeType *string, resolutionMode core.ResolutionMode, redirectedReference module.ResolvedProjectReference) (*module.ResolvedModule, []string) {
294294
if r.server.CallbackEnabled(CallbackResolveModuleName) {
295295
result, err := r.server.call("resolveModuleName", map[string]any{
296296
"moduleName": moduleName,
297297
"containingFile": containingFile,
298+
"importAttributeType": importAttributeType,
298299
"resolutionMode": resolutionMode,
299300
"redirectedReference": redirectedReference,
300301
})
@@ -309,7 +310,7 @@ func (r *resolverWrapper) ResolveModuleName(moduleName string, containingFile st
309310
return &res, nil
310311
}
311312
}
312-
return r.inner.ResolveModuleName(moduleName, containingFile, resolutionMode, redirectedReference)
313+
return r.inner.ResolveModuleName(moduleName, containingFile, importAttributeType, resolutionMode, redirectedReference)
313314
}
314315

315316
// ResolveTypeReferenceDirective implements module.ResolverInterface.

internal/compiler/fileloader.go

Lines changed: 101 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

internal/module/resolver.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ func GetCompilerOptionsWithRedirect(compilerOptions *core.CompilerOptions, redir
143143
}
144144

145145
type ResolverInterface interface {
146-
ResolveModuleName(moduleName string, containingFile string, resolutionMode core.ResolutionMode, redirectedReference ResolvedProjectReference) (*ResolvedModule, []string)
146+
ResolveModuleName(moduleName string, containingFile string, kind *string, resolutionMode core.ResolutionMode, redirectedReference ResolvedProjectReference) (*ResolvedModule, []string)
147147
ResolveTypeReferenceDirective(typeReferenceDirectiveName string, containingFile string, resolutionMode core.ResolutionMode, redirectedReference ResolvedProjectReference) (*ResolvedTypeReferenceDirective, []string)
148148
GetPackageJsonScopeIfApplicable(path string) *packagejson.InfoCacheEntry
149149
GetPackageScopeForPath(directory string) *packagejson.InfoCacheEntry
@@ -232,7 +232,7 @@ func (r *Resolver) ResolveTypeReferenceDirective(
232232
return result, traceBuilder.getTraces()
233233
}
234234

235-
func (r *Resolver) ResolveModuleName(moduleName string, containingFile string, resolutionMode core.ResolutionMode, redirectedReference ResolvedProjectReference) (*ResolvedModule, []string) {
235+
func (r *Resolver) ResolveModuleName(moduleName string, containingFile string, kind *string, resolutionMode core.ResolutionMode, redirectedReference ResolvedProjectReference) (*ResolvedModule, []string) {
236236
traceBuilder := r.newTraceBuilder()
237237
compilerOptions := GetCompilerOptionsWithRedirect(r.compilerOptions, redirectedReference)
238238
if traceBuilder != nil {

internal/project/ata/ata.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,7 +477,7 @@ func (ti *TypingsInstaller) ensureTypingsLocationExists(fs vfs.FS, logger loggin
477477
}
478478

479479
func (ti *TypingsInstaller) typingToFileName(resolver *module.Resolver, packageName string) string {
480-
result, _ := resolver.ResolveModuleName(packageName, tspath.CombinePaths(ti.typingsLocation, "index.d.ts"), core.ModuleKindNone, nil)
480+
result, _ := resolver.ResolveModuleName(packageName, tspath.CombinePaths(ti.typingsLocation, "index.d.ts"), nil, core.ModuleKindNone, nil)
481481
return result.ResolvedFileName
482482
}
483483

0 commit comments

Comments
 (0)