Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit a8ee22f

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

2 files changed

+37-8Lines changed: 37 additions & 8 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎src/services/codefixes/convertToEs6Module.ts‎

Copy file name to clipboardExpand all lines: src/services/codefixes/convertToEs6Module.ts
+18-8Lines changed: 18 additions & 8 deletions
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;
Collapse file
+19Lines changed: 19 additions & 0 deletions
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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.