@@ -2003,7 +2003,7 @@ func isSameScopeDescendentOf(initial *ast.Node, parent *ast.Node, stopAt *ast.No
20032003 return false
20042004}
20052005
2006- // stopAtAnyPropertyDeclaration is used for detecting ES-standard class field use-before-def errors
2006+ // isPropertyImmediatelyReferencedWithinDeclaration is used for detecting ES-standard class field use-before-def errors
20072007func isPropertyImmediatelyReferencedWithinDeclaration(declaration *ast.Node, usage *ast.Node, stopAtAnyPropertyDeclaration bool) bool {
20082008 // always legal if usage is after declaration
20092009 if usage.End() > declaration.End() {
@@ -5539,7 +5539,7 @@ func (c *Checker) checkExternalModuleExports(node *ast.Node) {
55395539 links := c.moduleSymbolLinks.Get(moduleSymbol)
55405540 if !links.exportsChecked {
55415541 exportEqualsSymbol := moduleSymbol.Exports[ast.InternalSymbolNameExportEquals]
5542- if exportEqualsSymbol != nil && c.hasExportedMembers(moduleSymbol) {
5542+ if exportEqualsSymbol != nil && c.hasExportedMembers(moduleSymbol, exportEqualsSymbol.ValueDeclaration.Kind == ast.KindJSExportAssignment ) {
55435543 declaration := core.OrElse(c.getDeclarationOfAliasSymbol(exportEqualsSymbol), exportEqualsSymbol.ValueDeclaration)
55445544 if declaration != nil && !isTopLevelInExternalModuleAugmentation(declaration) {
55455545 c.error(declaration, diagnostics.An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements)
@@ -5575,10 +5575,17 @@ func (c *Checker) checkExternalModuleExports(node *ast.Node) {
55755575 }
55765576}
55775577
5578- func (c *Checker) hasExportedMembers(moduleSymbol *ast.Symbol) bool {
5578+ func (c *Checker) hasExportedMembers(moduleSymbol *ast.Symbol, isCommonJS bool ) bool {
55795579 for id := range moduleSymbol.Exports {
55805580 if id != ast.InternalSymbolNameExportEquals {
5581- return true
5581+ if !isCommonJS {
5582+ return true
5583+ }
5584+ for _, declaration := range moduleSymbol.Exports[id].Declarations {
5585+ if declaration.Kind != ast.KindJSTypeAliasDeclaration {
5586+ return true
5587+ }
5588+ }
55825589 }
55835590 }
55845591 return false
@@ -14440,7 +14447,7 @@ func (c *Checker) canHaveSyntheticDefault(file *ast.Node, moduleSymbol *ast.Symb
1444014447 }
1444114448
1444214449 // JS files have a synthetic default if they do not contain ES2015+ module syntax (export = is not valid in js) _and_ do not have an __esModule marker
14443- return !ast.IsExternalModule( file.AsSourceFile()) && c.resolveExportByName(moduleSymbol, "__esModule", nil /*sourceNode*/, dontResolveAlias) == nil
14450+ return (file.AsSourceFile().ExternalModuleIndicator == nil || file.AsSourceFile().ExternalModuleIndicator == file ) && c.resolveExportByName(moduleSymbol, "__esModule", nil /*sourceNode*/, dontResolveAlias) == nil
1444414451}
1444514452
1444614453func (c *Checker) getEmitSyntaxForModuleSpecifierExpression(usage *ast.Node) core.ResolutionMode {
@@ -15333,13 +15340,27 @@ func (c *Checker) resolveEntityName(name *ast.Node, meaning ast.SymbolFlags, ign
1533315340 if resolveLocation == nil {
1533415341 resolveLocation = name
1533515342 }
15336- symbol = c.getMergedSymbol(c.resolveName(resolveLocation, name.Text(), meaning, message, true /*isUse*/, false /*excludeGlobals*/))
15343+ if meaning == ast.SymbolFlagsNamespace {
15344+ symbol = c.getMergedSymbol(c.resolveName(resolveLocation, name.Text(), meaning, nil, true /*isUse*/, false /*excludeGlobals*/))
15345+ if symbol == nil {
15346+ alias := c.getMergedSymbol(c.resolveName(resolveLocation, name.Text(), ast.SymbolFlagsAlias, nil, true /*isUse*/, false /*excludeGlobals*/))
15347+ if alias != nil && alias.Name == ast.InternalSymbolNameExportEquals {
15348+ // resolve typedefs exported from commonjs, stored on the module symbol
15349+ symbol = alias.Parent
15350+ }
15351+ }
15352+ if symbol == nil && message != nil {
15353+ c.resolveName(resolveLocation, name.Text(), meaning, message, true /*isUse*/, false /*excludeGlobals*/)
15354+ }
15355+ } else {
15356+ symbol = c.getMergedSymbol(c.resolveName(resolveLocation, name.Text(), meaning, message, true /*isUse*/, false /*excludeGlobals*/))
15357+ }
1533715358 case ast.KindQualifiedName:
1533815359 qualified := name.AsQualifiedName()
15339- symbol = c.resolveQualifiedName(name, qualified.Left, qualified.Right, meaning, ignoreErrors, dontResolveAlias, location)
15360+ symbol = c.resolveQualifiedName(name, qualified.Left, qualified.Right, meaning, ignoreErrors, location)
1534015361 case ast.KindPropertyAccessExpression:
1534115362 access := name.AsPropertyAccessExpression()
15342- symbol = c.resolveQualifiedName(name, access.Expression, access.Name(), meaning, ignoreErrors, dontResolveAlias, location)
15363+ symbol = c.resolveQualifiedName(name, access.Expression, access.Name(), meaning, ignoreErrors, location)
1534315364 default:
1534415365 panic("Unknown entity name kind")
1534515366 }
@@ -15357,7 +15378,7 @@ func (c *Checker) resolveEntityName(name *ast.Node, meaning ast.SymbolFlags, ign
1535715378 return symbol
1535815379}
1535915380
15360- func (c *Checker) resolveQualifiedName(name *ast.Node, left *ast.Node, right *ast.Node, meaning ast.SymbolFlags, ignoreErrors bool, dontResolveAlias bool, location *ast.Node) *ast.Symbol {
15381+ func (c *Checker) resolveQualifiedName(name *ast.Node, left *ast.Node, right *ast.Node, meaning ast.SymbolFlags, ignoreErrors bool, location *ast.Node) *ast.Symbol {
1536115382 namespace := c.resolveEntityName(left, ast.SymbolFlagsNamespace, ignoreErrors, false /*dontResolveAlias*/, location)
1536215383 if namespace == nil || ast.NodeIsMissing(right) {
1536315384 return nil
@@ -15713,12 +15734,26 @@ func (c *Checker) getExportsOfModuleWorker(moduleSymbol *ast.Symbol) (exports as
1571315734 }
1571415735 return symbols
1571515736 }
15737+ var originalModule *ast.Symbol
15738+ if moduleSymbol != nil {
15739+ if c.resolveSymbolEx(moduleSymbol.Exports[ast.InternalSymbolNameExportEquals], false /*dontResolveAlias*/) != nil {
15740+ originalModule = moduleSymbol
15741+ }
15742+ }
1571615743 // A module defined by an 'export=' consists of one export that needs to be resolved
1571715744 moduleSymbol = c.resolveExternalModuleSymbol(moduleSymbol, false /*dontResolveAlias*/)
1571815745 exports = visit(moduleSymbol, nil, false)
1571915746 if exports == nil {
1572015747 exports = make(ast.SymbolTable)
1572115748 }
15749+ // A CommonJS module defined by an 'export=' might also export typedefs, stored on the original module
15750+ if originalModule != nil && len(originalModule.Exports) > 1 {
15751+ for _, symbol := range originalModule.Exports {
15752+ if symbol.Flags&ast.SymbolFlagsType != 0 && symbol.Name != ast.InternalSymbolNameExportEquals && exports[symbol.Name] == nil {
15753+ exports[symbol.Name] = symbol
15754+ }
15755+ }
15756+ }
1572215757 for name := range nonTypeOnlyNames.Keys() {
1572315758 delete(typeOnlyExportStarMap, name)
1572415759 }
@@ -23972,6 +24007,13 @@ func (c *Checker) getTypeFromImportTypeNode(node *ast.Node) *Type {
2397224007 symbolFromVariable = c.getPropertyOfTypeEx(c.getTypeOfSymbol(mergedResolvedSymbol), current.Text(), false /*skipObjectFunctionPropertyAugment*/, true /*includeTypeOnlyMembers*/)
2397324008 } else {
2397424009 symbolFromModule = c.getSymbol(c.getExportsOfSymbol(mergedResolvedSymbol), current.Text(), meaning)
24010+ if symbolFromModule == nil {
24011+ // a CommonJS module might have typedefs exported alongside an export=
24012+ immediateModuleSymbol := c.resolveExternalModuleSymbol(innerModuleSymbol, true /*dontResolveAlias*/)
24013+ if immediateModuleSymbol != nil && core.Some(immediateModuleSymbol.Declarations, func(d *ast.Node) bool { return d.Kind == ast.KindJSExportAssignment }) {
24014+ symbolFromModule = c.getSymbol(c.getExportsOfSymbol(immediateModuleSymbol.Parent), current.Text(), meaning)
24015+ }
24016+ }
2397524017 }
2397624018 next := core.OrElse(symbolFromModule, symbolFromVariable)
2397724019 if next == nil {
0 commit comments