@@ -554,6 +554,7 @@ type Program interface {
554554 GetImpliedNodeFormatForEmit(sourceFile ast.HasFileName) core.ModuleKind
555555 GetResolvedModule(currentSourceFile ast.HasFileName, moduleReference string, mode core.ResolutionMode) *module.ResolvedModule
556556 GetResolvedModules() map[tspath.Path]module.ModeAwareCache[*module.ResolvedModule]
557+ GetPackagesMap() map[string]bool
557558 GetSourceFileMetaData(path tspath.Path) ast.SourceFileMetaData
558559 GetJSXRuntimeImportSpecifier(path tspath.Path) (moduleReference string, specifier *ast.Node)
559560 GetImportHelpersImportSpecifier(path tspath.Path) *ast.Node
@@ -1462,8 +1463,16 @@ func (c *Checker) getModuleSymbol(sourceFile *ast.Node) *ast.Symbol {
14621463 if cached, ok := c.moduleSymbols[sourceFile]; ok {
14631464 return cached
14641465 }
1465- result := c.newSymbol(ast.SymbolFlagsModuleExports|ast.SymbolFlagsFunctionScopedVariable, ast.InternalSymbolNameModuleExports)
1466+ result := c.newSymbol(ast.SymbolFlagsModuleExports|ast.SymbolFlagsFunctionScopedVariable, "module")
1467+ result.Declarations = []*ast.Node{sourceFile}
14661468 result.ValueDeclaration = sourceFile
1469+ exportsSymbol := c.newSymbol(ast.SymbolFlagsModuleExports|ast.SymbolFlagsProperty, "exports")
1470+ exportsSymbol.Declarations = result.Declarations
1471+ exportsSymbol.ValueDeclaration = result.ValueDeclaration
1472+ exportsSymbol.Parent = result
1473+ members := make(ast.SymbolTable, 1)
1474+ members["exports"] = exportsSymbol
1475+ c.valueSymbolLinks.Get(result).resolvedType = c.newAnonymousType(result, members, nil, nil, nil)
14671476 c.moduleSymbols[sourceFile] = result
14681477 return result
14691478}
@@ -15011,39 +15020,29 @@ func (c *Checker) errorOnImplicitAnyModule(isError bool, errorNode *ast.Node, mo
1501115020}
1501215021
1501315022func (c *Checker) createModuleNotFoundChain(resolvedModule *module.ResolvedModule, errorNode *ast.Node, moduleReference string, mode core.ResolutionMode, packageName string) *ast.Diagnostic {
15014- if resolvedModule.AlternateResult != "" {
15015- if strings.Contains(resolvedModule.AlternateResult, "/node_modules/@types/") {
15016- packageName = "@types/" + module.MangleScopedPackageName(packageName)
15017- }
15018- return NewDiagnosticForNode(errorNode, diagnostics.There_are_types_at_0_but_this_result_could_not_be_resolved_when_respecting_package_json_exports_The_1_library_may_need_to_update_its_package_json_or_typings, resolvedModule.AlternateResult, packageName)
15019- }
15020- if c.typesPackageExists(packageName) {
15021- return NewDiagnosticForNode(errorNode, diagnostics.If_the_0_package_actually_exposes_this_module_consider_sending_a_pull_request_to_amend_https_Colon_Slash_Slashgithub_com_SlashDefinitelyTyped_SlashDefinitelyTyped_Slashtree_Slashmaster_Slashtypes_Slash_1, packageName, module.MangleScopedPackageName(packageName))
15022- }
15023- if c.packageBundlesTypes(packageName) {
15024- return NewDiagnosticForNode(errorNode, diagnostics.If_the_0_package_actually_exposes_this_module_try_adding_a_new_declaration_d_ts_file_containing_declare_module_1, packageName, moduleReference)
15025- }
15026- return NewDiagnosticForNode(errorNode, diagnostics.Try_npm_i_save_dev_types_Slash_1_if_it_exists_or_add_a_new_declaration_d_ts_file_containing_declare_module_0, moduleReference, module.MangleScopedPackageName(packageName))
15023+ // Store the original packageName for repopulateInfo before any modifications
15024+ storedPackageName := packageName
15025+ if storedPackageName == moduleReference {
15026+ storedPackageName = ""
15027+ }
15028+
15029+ details := CreateModuleNotFoundChain(c.program, ast.GetSourceFileOfNode(errorNode), moduleReference, mode, packageName)
15030+ result := NewDiagnosticForNode(errorNode, details.Message, details.Args...)
15031+ result.SetRepopulateInfo(&ast.RepopulateDiagnosticInfo{
15032+ Kind: ast.RepopulateModuleNotFound,
15033+ ModuleReference: moduleReference,
15034+ Mode: mode,
15035+ PackageName: storedPackageName,
15036+ })
15037+ return result
1502715038}
1502815039
1502915040func (c *Checker) createModeMismatchDetails(sourceFile *ast.SourceFile, errorNode *ast.Node) *ast.Diagnostic {
15030- ext := tspath.TryGetExtensionFromPath(sourceFile.FileName())
15031- targetExt := core.IfElse(ext == tspath.ExtensionTs, tspath.ExtensionMts, core.IfElse(ext == tspath.ExtensionJs, tspath.ExtensionMjs, ""))
15032- meta := c.program.GetSourceFileMetaData(sourceFile.Path())
15033- packageJsonType := meta.PackageJsonType
15034- packageJsonDirectory := meta.PackageJsonDirectory
15035- var result *ast.Diagnostic
15036- if packageJsonDirectory != "" && packageJsonType == "" {
15037- if targetExt != "" {
15038- result = NewDiagnosticForNode(errorNode, diagnostics.To_convert_this_file_to_an_ECMAScript_module_change_its_file_extension_to_0_or_add_the_field_type_Colon_module_to_1, targetExt, tspath.CombinePaths(packageJsonDirectory, "package.json"))
15039- } else {
15040- result = NewDiagnosticForNode(errorNode, diagnostics.To_convert_this_file_to_an_ECMAScript_module_add_the_field_type_Colon_module_to_0, tspath.CombinePaths(packageJsonDirectory, "package.json"))
15041- }
15042- } else if targetExt != "" {
15043- result = NewDiagnosticForNode(errorNode, diagnostics.To_convert_this_file_to_an_ECMAScript_module_change_its_file_extension_to_0_or_create_a_local_package_json_file_with_type_Colon_module, targetExt)
15044- } else {
15045- result = NewDiagnosticForNode(errorNode, diagnostics.To_convert_this_file_to_an_ECMAScript_module_create_a_local_package_json_file_with_type_Colon_module)
15046- }
15041+ details := CreateModeMismatchDetails(c.program, sourceFile)
15042+ result := NewDiagnosticForNode(errorNode, details.Message, details.Args...)
15043+ result.SetRepopulateInfo(&ast.RepopulateDiagnosticInfo{
15044+ Kind: ast.RepopulateModeMismatch,
15045+ })
1504715046 return result
1504815047}
1504915048
@@ -16081,12 +16080,6 @@ func (c *Checker) getTypeOfVariableOrParameterOrPropertyWorker(symbol *ast.Symbo
1608116080 if symbol == c.requireSymbol {
1608216081 return c.anyType
1608316082 }
16084- if symbol.Flags&ast.SymbolFlagsModuleExports != 0 && symbol.ValueDeclaration != nil {
16085- fileSymbol := c.resolveExternalModuleSymbol(symbol.ValueDeclaration.Symbol(), false /*dontResolveAlias*/)
16086- members := make(ast.SymbolTable, 1)
16087- members["exports"] = fileSymbol
16088- return c.newAnonymousType(symbol, members, nil, nil, nil)
16089- }
1609016083 debug.Assert(symbol.ValueDeclaration != nil)
1609116084 declaration := symbol.ValueDeclaration
1609216085 if ast.IsSourceFile(declaration) && ast.IsJsonSourceFile(declaration.AsSourceFile()) {
@@ -16100,6 +16093,9 @@ func (c *Checker) getTypeOfVariableOrParameterOrPropertyWorker(symbol *ast.Symbo
1610016093 if !c.pushTypeResolution(symbol, TypeSystemPropertyNameType) {
1610116094 return c.reportCircularityError(symbol)
1610216095 }
16096+ if symbol.Flags&ast.SymbolFlagsModuleExports != 0 {
16097+ return c.getTypeOfSymbol(c.resolveExternalModuleSymbol(symbol.ValueDeclaration.Symbol(), false /*dontResolveAlias*/))
16098+ }
1610316099 var result *Type
1610416100 switch declaration.Kind {
1610516101 case ast.KindParameter, ast.KindPropertyDeclaration, ast.KindPropertySignature, ast.KindVariableDeclaration,
@@ -30890,9 +30886,6 @@ func (c *Checker) getSymbolOfNameOrPropertyAccessExpression(name *ast.Node) *ast
3089030886 }
3089130887 meaning := core.IfElse(isJSDoc, ast.SymbolFlagsValue|ast.SymbolFlagsType|ast.SymbolFlagsNamespace, ast.SymbolFlagsValue)
3089230888 result := c.resolveEntityName(name, meaning, true /*ignoreErrors*/, true /*dontResolveAlias*/, nil /*location*/)
30893- if result != nil && result.Flags&ast.SymbolFlagsModuleExports != 0 {
30894- result = result.ValueDeclaration.Symbol() // Symbol of the module source file
30895- }
3089630889 if result == nil && isJSDoc {
3089730890 if container := ast.FindAncestor(name, ast.IsClassOrInterfaceLike); container != nil {
3089830891 symbol := c.getSymbolOfDeclaration(container)
0 commit comments