@@ -2448,10 +2448,11 @@ namespace ts {
2448
2448
}
2449
2449
2450
2450
function getTargetOfImportEqualsDeclaration(node: ImportEqualsDeclaration | VariableDeclaration, dontResolveAlias: boolean): Symbol | undefined {
2451
- if (isVariableDeclaration(node) && node.initializer && isPropertyAccessExpression(node.initializer)) {
2452
- const name = (getLeftmostAccessExpression(node.initializer.expression) as CallExpression).arguments[0] as StringLiteral;
2453
- return isIdentifier(node.initializer.name)
2454
- ? resolveSymbol(getPropertyOfType(resolveExternalModuleTypeByLiteral(name), node.initializer.name.escapedText))
2451
+ const commonJSPropertyAccess = getCommonJSPropertyAccess(node);
2452
+ if (commonJSPropertyAccess) {
2453
+ const name = (getLeftmostAccessExpression(commonJSPropertyAccess.expression) as CallExpression).arguments[0] as StringLiteral;
2454
+ return isIdentifier(commonJSPropertyAccess.name)
2455
+ ? resolveSymbol(getPropertyOfType(resolveExternalModuleTypeByLiteral(name), commonJSPropertyAccess.name.escapedText))
2455
2456
: undefined;
2456
2457
}
2457
2458
if (isVariableDeclaration(node) || node.moduleReference.kind === SyntaxKind.ExternalModuleReference) {
@@ -2646,12 +2647,8 @@ namespace ts {
2646
2647
return result;
2647
2648
}
2648
2649
2649
- function getExportOfModule(symbol: Symbol, specifier: ImportOrExportSpecifier | BindingElement , dontResolveAlias: boolean): Symbol | undefined {
2650
+ function getExportOfModule(symbol: Symbol, name: Identifier, specifier: Declaration , dontResolveAlias: boolean): Symbol | undefined {
2650
2651
if (symbol.flags & SymbolFlags.Module) {
2651
- const name = specifier.propertyName ?? specifier.name;
2652
- if (!isIdentifier(name)) {
2653
- return undefined;
2654
- }
2655
2652
const exportSymbol = getExportsOfSymbol(symbol).get(name.escapedText);
2656
2653
const resolved = resolveSymbol(exportSymbol, dontResolveAlias);
2657
2654
markSymbolOfAliasDeclarationIfTypeOnly(specifier, exportSymbol, resolved, /*overwriteEmpty*/ false);
@@ -2668,10 +2665,10 @@ namespace ts {
2668
2665
}
2669
2666
}
2670
2667
2671
- function getExternalModuleMember(node: ImportDeclaration | ExportDeclaration | VariableDeclaration, specifier: ImportOrExportSpecifier | BindingElement, dontResolveAlias = false): Symbol | undefined {
2668
+ function getExternalModuleMember(node: ImportDeclaration | ExportDeclaration | VariableDeclaration, specifier: ImportOrExportSpecifier | BindingElement | PropertyAccessExpression , dontResolveAlias = false): Symbol | undefined {
2672
2669
const moduleSpecifier = getExternalModuleRequireArgument(node) || (node as ImportDeclaration | ExportDeclaration).moduleSpecifier!;
2673
2670
const moduleSymbol = resolveExternalModuleName(node, moduleSpecifier)!; // TODO: GH#18217
2674
- const name = specifier.propertyName || specifier.name;
2671
+ const name = !isPropertyAccessExpression(specifier) && specifier.propertyName || specifier.name;
2675
2672
if (!isIdentifier(name)) {
2676
2673
return undefined;
2677
2674
}
@@ -2691,10 +2688,10 @@ namespace ts {
2691
2688
else {
2692
2689
symbolFromVariable = getPropertyOfVariable(targetSymbol, name.escapedText);
2693
2690
}
2694
-
2695
2691
// if symbolFromVariable is export - get its final target
2696
2692
symbolFromVariable = resolveSymbol(symbolFromVariable, dontResolveAlias);
2697
- let symbolFromModule = getExportOfModule(targetSymbol, specifier, dontResolveAlias);
2693
+
2694
+ let symbolFromModule = getExportOfModule(targetSymbol, name, specifier, dontResolveAlias);
2698
2695
if (symbolFromModule === undefined && name.escapedText === InternalSymbolName.Default) {
2699
2696
const file = find(moduleSymbol.declarations, isSourceFile);
2700
2697
if (canHaveSyntheticDefault(file, moduleSymbol, dontResolveAlias)) {
@@ -2782,11 +2779,23 @@ namespace ts {
2782
2779
}
2783
2780
2784
2781
function getTargetOfImportSpecifier(node: ImportSpecifier | BindingElement, dontResolveAlias: boolean): Symbol | undefined {
2785
- const resolved = getExternalModuleMember(isBindingElement(node) ? getRootDeclaration(node) as VariableDeclaration : node.parent.parent.parent, node, dontResolveAlias);
2782
+ const root = isBindingElement(node) ? getRootDeclaration(node) as VariableDeclaration : node.parent.parent.parent;
2783
+ const commonJSPropertyAccess = getCommonJSPropertyAccess(root);
2784
+ const resolved = getExternalModuleMember(root, commonJSPropertyAccess || node, dontResolveAlias);
2785
+ const name = node.propertyName || node.name;
2786
+ if (commonJSPropertyAccess && resolved && isIdentifier(name)) {
2787
+ return getPropertyOfType(getTypeOfSymbol(resolved), name.escapedText);
2788
+ }
2786
2789
markSymbolOfAliasDeclarationIfTypeOnly(node, /*immediateTarget*/ undefined, resolved, /*overwriteEmpty*/ false);
2787
2790
return resolved;
2788
2791
}
2789
2792
2793
+ function getCommonJSPropertyAccess(node: Node) {
2794
+ if (isVariableDeclaration(node) && node.initializer && isPropertyAccessExpression(node.initializer)) {
2795
+ return node.initializer;
2796
+ }
2797
+ }
2798
+
2790
2799
function getTargetOfNamespaceExportDeclaration(node: NamespaceExportDeclaration, dontResolveAlias: boolean): Symbol {
2791
2800
const resolved = resolveExternalModuleSymbol(node.parent.symbol, dontResolveAlias);
2792
2801
markSymbolOfAliasDeclarationIfTypeOnly(node, /*immediateTarget*/ undefined, resolved, /*overwriteEmpty*/ false);
@@ -2940,7 +2949,7 @@ namespace ts {
2940
2949
finalTarget: Symbol | undefined,
2941
2950
overwriteEmpty: boolean,
2942
2951
): boolean {
2943
- if (!aliasDeclaration) return false;
2952
+ if (!aliasDeclaration || isPropertyAccessExpression(aliasDeclaration) ) return false;
2944
2953
2945
2954
// If the declaration itself is type-only, mark it and return.
2946
2955
// No need to check what it resolves to.
0 commit comments