Skip to content

Commit a8ee22f

Browse files
authored
"fix(services): convert to es6 module generate invalid code with .default" (microsoft#43309)
1 parent b549467 commit a8ee22f

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

src/services/codefixes/convertToEs6Module.ts

+18-8
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,9 @@ namespace ts.codefix {
436436

437437
/**
438438
* Convert `import x = require("x").`
439-
* Also converts uses like `x.y()` to `y()` and uses a named import.
439+
* Also:
440+
* - Convert `x.default()` to `x()` to handle ES6 default export
441+
* - Converts uses like `x.y()` to `y()` and uses a named import.
440442
*/
441443
function convertSingleIdentifierImport(name: Identifier, moduleSpecifier: StringLiteralLike, checker: TypeChecker, identifiers: Identifiers, quotePreference: QuotePreference): ConvertedImports {
442444
const nameSymbol = checker.getSymbolAtLocation(name);
@@ -454,15 +456,23 @@ namespace ts.codefix {
454456

455457
const { parent } = use;
456458
if (isPropertyAccessExpression(parent)) {
457-
const { expression, name: { text: propertyName } } = parent;
458-
Debug.assert(expression === use, "Didn't expect expression === use"); // Else shouldn't have been in `collectIdentifiers`
459-
let idName = namedBindingsNames.get(propertyName);
460-
if (idName === undefined) {
461-
idName = makeUniqueName(propertyName, identifiers);
462-
namedBindingsNames.set(propertyName, idName);
459+
const { name: { text: propertyName } } = parent;
460+
if (propertyName === "default") {
461+
needDefaultImport = true;
462+
463+
const importDefaultName = use.getText();
464+
(useSitesToUnqualify ??= new Map()).set(parent, factory.createIdentifier(importDefaultName));
463465
}
466+
else {
467+
Debug.assert(parent.expression === use, "Didn't expect expression === use"); // Else shouldn't have been in `collectIdentifiers`
468+
let idName = namedBindingsNames.get(propertyName);
469+
if (idName === undefined) {
470+
idName = makeUniqueName(propertyName, identifiers);
471+
namedBindingsNames.set(propertyName, idName);
472+
}
464473

465-
(useSitesToUnqualify ??= new Map()).set(parent, factory.createIdentifier(idName));
474+
(useSitesToUnqualify ??= new Map()).set(parent, factory.createIdentifier(idName));
475+
}
466476
}
467477
else {
468478
needDefaultImport = true;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// @allowJs: true
4+
// @target: esnext
5+
6+
// @Filename: /a.js
7+
////const x = require('x');
8+
////x.default();
9+
////const y = require('y').default;
10+
////y();
11+
12+
verify.codeFix({
13+
description: "Convert to ES6 module",
14+
newFileContent:
15+
`import x from 'x';
16+
x();
17+
import y from 'y';
18+
y();`,
19+
});

0 commit comments

Comments
 (0)