Skip to content

Commit 0451cc3

Browse files
authored
Merge pull request #10874 from Microsoft/fix10855
Support export default for target=ES5/module=ES6.
2 parents 439fe79 + 3f266fb commit 0451cc3

File tree

7 files changed

+34
-4
lines changed

7 files changed

+34
-4
lines changed

src/compiler/transformers/es6.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,7 @@ namespace ts {
541541
*
542542
* @param node A ClassDeclaration node.
543543
*/
544-
function visitClassDeclaration(node: ClassDeclaration): Statement {
544+
function visitClassDeclaration(node: ClassDeclaration): VisitResult<Statement> {
545545
// [source]
546546
// class C { }
547547
//
@@ -552,8 +552,17 @@ namespace ts {
552552
// return C;
553553
// }());
554554

555+
const modifierFlags = getModifierFlags(node);
556+
const isExported = modifierFlags & ModifierFlags.Export;
557+
const isDefault = modifierFlags & ModifierFlags.Default;
558+
559+
// Add an `export` modifier to the statement if needed (for `--target es5 --module es6`)
560+
const modifiers = isExported && !isDefault
561+
? filter(node.modifiers, isExportModifier)
562+
: undefined;
563+
555564
const statement = createVariableStatement(
556-
/*modifiers*/ undefined,
565+
modifiers,
557566
createVariableDeclarationList([
558567
createVariableDeclaration(
559568
getDeclarationName(node, /*allowComments*/ true),
@@ -566,9 +575,26 @@ namespace ts {
566575

567576
setOriginalNode(statement, node);
568577
startOnNewLine(statement);
578+
579+
// Add an `export default` statement for default exports (for `--target es5 --module es6`)
580+
if (isExported && isDefault) {
581+
const statements: Statement[] = [statement];
582+
statements.push(createExportAssignment(
583+
/*decorators*/ undefined,
584+
/*modifiers*/ undefined,
585+
/*isExportEquals*/ false,
586+
getDeclarationName(node, /*allowComments*/ false)
587+
));
588+
return statements;
589+
}
590+
569591
return statement;
570592
}
571593

594+
function isExportModifier(node: Modifier) {
595+
return node.kind === SyntaxKind.ExportKeyword;
596+
}
597+
572598
/**
573599
* Visits a ClassExpression and transforms it into an expression.
574600
*

tests/baselines/reference/es5andes6module.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@ var A = (function () {
2323
};
2424
return A;
2525
}());
26+
export default A;

tests/baselines/reference/es6modulekindWithES5Target.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
2727
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
2828
return c > 3 && r && Object.defineProperty(target, key, r), r;
2929
};
30-
var C = (function () {
30+
export var C = (function () {
3131
function C() {
3232
this.p = 1;
3333
}

tests/baselines/reference/es6modulekindWithES5Target2.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,5 @@ var C = (function () {
1515
C.prototype.method = function () { };
1616
return C;
1717
}());
18+
export default C;
1819
C.s = 0;

tests/baselines/reference/externModule.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ n=XDate.UTC(1964,2,1);
4343
declare;
4444
module;
4545
{
46-
var XDate = (function () {
46+
export var XDate = (function () {
4747
function XDate() {
4848
}
4949
return XDate;

tests/baselines/reference/moduleElementsInWrongContext.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
}
4545
return C;
4646
}());
47+
export default C;
4748
function bee() { }
4849
import I2 = require("foo");
4950
import * as Foo from "ambient";

tests/baselines/reference/moduleElementsInWrongContext2.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ function blah() {
4444
}
4545
return C;
4646
}());
47+
export default C;
4748
function bee() { }
4849
import I2 = require("foo");
4950
import * as Foo from "ambient";

0 commit comments

Comments
 (0)