Skip to content

Commit 0bdd2af

Browse files
committed
Fix --importHelpers for export { default } when esModuleInterop is enabled
1 parent 25a4f9e commit 0bdd2af

7 files changed

+75
-22
lines changed

src/compiler/transformers/utilities.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ import {
6868
map,
6969
MethodDeclaration,
7070
ModifierFlags,
71+
NamedExportBindings,
7172
NamedImportBindings,
7273
NamespaceExport,
7374
Node,
@@ -108,14 +109,16 @@ export interface ExternalModuleInfo {
108109
hasExportStarsToExportValues: boolean; // whether this module contains export*
109110
}
110111

111-
function containsDefaultReference(node: NamedImportBindings | undefined) {
112+
function containsDefaultReference(node: NamedImportBindings | NamedExportBindings | undefined) {
112113
if (!node) return false;
113-
if (!isNamedImports(node)) return false;
114+
if (!isNamedImports(node) && !isNamedExports(node)) return false;
114115
return some(node.elements, isNamedDefaultReference);
115116
}
116117

117-
function isNamedDefaultReference(e: ImportSpecifier): boolean {
118-
return e.propertyName !== undefined && e.propertyName.escapedText === InternalSymbolName.Default;
118+
function isNamedDefaultReference(e: ImportSpecifier | ExportSpecifier): boolean {
119+
return e.propertyName !== undefined ?
120+
e.propertyName.escapedText === InternalSymbolName.Default :
121+
e.name.escapedText === InternalSymbolName.Default;
119122
}
120123

121124
/** @internal */
@@ -214,6 +217,7 @@ export function collectExternalModuleInfo(context: TransformationContext, source
214217
externalImports.push(node as ExportDeclaration);
215218
if (isNamedExports((node as ExportDeclaration).exportClause!)) {
216219
addExportedNamesForExportDeclaration(node as ExportDeclaration);
220+
hasImportDefault ||= containsDefaultReference((node as ExportDeclaration).exportClause);
217221
}
218222
else {
219223
const name = ((node as ExportDeclaration).exportClause as NamespaceExport).name;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//// [tests/cases/compiler/importHelpersNoEmitHelpersExportDefault.ts] ////
2+
3+
//// [main.ts]
4+
// https://github.com/microsoft/TypeScript/issues/40328
5+
export { default as A } from "./other";
6+
7+
//// [main2.ts]
8+
export { default } from "./other";
9+
10+
//// [other.ts]
11+
export default {};
12+
13+
//// [tslib.d.ts]
14+
declare module "tslib" {
15+
function __importDefault(m: any): void;
16+
}
17+
18+
//// [other.js]
19+
"use strict";
20+
Object.defineProperty(exports, "__esModule", { value: true });
21+
exports.default = {};
22+
//// [main.js]
23+
"use strict";
24+
Object.defineProperty(exports, "__esModule", { value: true });
25+
exports.A = void 0;
26+
var tslib_1 = require("tslib");
27+
// https://github.com/microsoft/TypeScript/issues/40328
28+
var other_1 = require("./other");
29+
Object.defineProperty(exports, "A", { enumerable: true, get: function () { return tslib_1.__importDefault(other_1).default; } });
30+
//// [main2.js]
31+
"use strict";
32+
Object.defineProperty(exports, "__esModule", { value: true });
33+
exports.default = void 0;
34+
var tslib_1 = require("tslib");
35+
var other_1 = require("./other");
36+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(other_1).default; } });

tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=node16).js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,14 @@ declare module "tslib" {
2929

3030
//// [index.js]
3131
"use strict";
32-
var __importDefault = (this && this.__importDefault) || function (mod) {
33-
return (mod && mod.__esModule) ? mod : { "default": mod };
34-
};
3532
Object.defineProperty(exports, "__esModule", { value: true });
3633
exports.baz = exports.foo = exports.default = void 0;
34+
var tslib_1 = require("tslib");
3735
// cjs format file
3836
var fs_1 = require("fs");
39-
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(fs_1).default; } });
37+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_1).default; } });
4038
var fs_2 = require("fs");
41-
Object.defineProperty(exports, "foo", { enumerable: true, get: function () { return __importDefault(fs_2).default; } });
39+
Object.defineProperty(exports, "foo", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_2).default; } });
4240
var fs_3 = require("fs");
4341
Object.defineProperty(exports, "baz", { enumerable: true, get: function () { return fs_3.bar; } });
4442
//// [index.js]

tests/baselines/reference/nodeModulesAllowJsImportHelpersCollisions3(module=nodenext).js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,14 @@ declare module "tslib" {
2929

3030
//// [index.js]
3131
"use strict";
32-
var __importDefault = (this && this.__importDefault) || function (mod) {
33-
return (mod && mod.__esModule) ? mod : { "default": mod };
34-
};
3532
Object.defineProperty(exports, "__esModule", { value: true });
3633
exports.baz = exports.foo = exports.default = void 0;
34+
var tslib_1 = require("tslib");
3735
// cjs format file
3836
var fs_1 = require("fs");
39-
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(fs_1).default; } });
37+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_1).default; } });
4038
var fs_2 = require("fs");
41-
Object.defineProperty(exports, "foo", { enumerable: true, get: function () { return __importDefault(fs_2).default; } });
39+
Object.defineProperty(exports, "foo", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_2).default; } });
4240
var fs_3 = require("fs");
4341
Object.defineProperty(exports, "baz", { enumerable: true, get: function () { return fs_3.bar; } });
4442
//// [index.js]

tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=node16).js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,12 @@ declare module "tslib" {
2525

2626
//// [index.js]
2727
"use strict";
28-
var __importDefault = (this && this.__importDefault) || function (mod) {
29-
return (mod && mod.__esModule) ? mod : { "default": mod };
30-
};
3128
Object.defineProperty(exports, "__esModule", { value: true });
3229
exports.default = void 0;
30+
var tslib_1 = require("tslib");
3331
// cjs format file
3432
var fs_1 = require("fs");
35-
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(fs_1).default; } });
33+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_1).default; } });
3634
//// [index.js]
3735
// esm format file
3836
export { default } from "fs";

tests/baselines/reference/nodeModulesImportHelpersCollisions3(module=nodenext).js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,12 @@ declare module "tslib" {
2525

2626
//// [index.js]
2727
"use strict";
28-
var __importDefault = (this && this.__importDefault) || function (mod) {
29-
return (mod && mod.__esModule) ? mod : { "default": mod };
30-
};
3128
Object.defineProperty(exports, "__esModule", { value: true });
3229
exports.default = void 0;
30+
var tslib_1 = require("tslib");
3331
// cjs format file
3432
var fs_1 = require("fs");
35-
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(fs_1).default; } });
33+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return tslib_1.__importDefault(fs_1).default; } });
3634
//// [index.js]
3735
// esm format file
3836
export { default } from "fs";
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// @target: es5
2+
// @module: commonjs
3+
// @importHelpers: true
4+
// @noEmitHelpers: true
5+
// @esModuleInterop: true
6+
// @noTypesAndSymbols: true
7+
8+
// @filename: main.ts
9+
// https://github.com/microsoft/TypeScript/issues/40328
10+
export { default as A } from "./other";
11+
12+
// @filename: main2.ts
13+
export { default } from "./other";
14+
15+
// @filename: other.ts
16+
export default {};
17+
18+
// @filename: tslib.d.ts
19+
declare module "tslib" {
20+
function __importDefault(m: any): void;
21+
}

0 commit comments

Comments
 (0)