Skip to content

Commit aa18962

Browse files
authored
Fix emit for export { default } from ... when both importHelpers and esModuleInterop are enabled (#57220)
1 parent 193d3cc commit aa18962

7 files changed

Lines changed: 75 additions & 22 deletions

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,
@@ -109,14 +110,16 @@ export interface ExternalModuleInfo {
109110
hasExportStarsToExportValues: boolean; // whether this module contains export*
110111
}
111112

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

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

122125
/** @internal */
@@ -216,6 +219,7 @@ export function collectExternalModuleInfo(context: TransformationContext, source
216219
externalImports.push(node as ExportDeclaration);
217220
if (isNamedExports((node as ExportDeclaration).exportClause!)) {
218221
addExportedNamesForExportDeclaration(node as ExportDeclaration);
222+
hasImportDefault ||= containsDefaultReference((node as ExportDeclaration).exportClause);
219223
}
220224
else {
221225
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)