diff --git a/src/compiler/transformers/es6.ts b/src/compiler/transformers/es6.ts index 5f336da546..9cb759027e 100644 --- a/src/compiler/transformers/es6.ts +++ b/src/compiler/transformers/es6.ts @@ -541,7 +541,7 @@ namespace ts { * * @param node A ClassDeclaration node. */ - function visitClassDeclaration(node: ClassDeclaration): Statement { + function visitClassDeclaration(node: ClassDeclaration): VisitResult { // [source] // class C { } // @@ -552,8 +552,17 @@ namespace ts { // return C; // }()); + const modifierFlags = getModifierFlags(node); + const isExported = modifierFlags & ModifierFlags.Export; + const isDefault = modifierFlags & ModifierFlags.Default; + + // Add an `export` modifier to the statement if needed (for `--target es5 --module es6`) + const modifiers = isExported && !isDefault + ? filter(node.modifiers, isExportModifier) + : undefined; + const statement = createVariableStatement( - /*modifiers*/ undefined, + modifiers, createVariableDeclarationList([ createVariableDeclaration( getDeclarationName(node, /*allowComments*/ true), @@ -566,9 +575,26 @@ namespace ts { setOriginalNode(statement, node); startOnNewLine(statement); + + // Add an `export default` statement for default exports (for `--target es5 --module es6`) + if (isExported && isDefault) { + const statements: Statement[] = [statement]; + statements.push(createExportAssignment( + /*decorators*/ undefined, + /*modifiers*/ undefined, + /*isExportEquals*/ false, + getDeclarationName(node, /*allowComments*/ false) + )); + return statements; + } + return statement; } + function isExportModifier(node: Modifier) { + return node.kind === SyntaxKind.ExportKeyword; + } + /** * Visits a ClassExpression and transforms it into an expression. * diff --git a/tests/baselines/reference/es5andes6module.js b/tests/baselines/reference/es5andes6module.js index 148464a212..ae8c0ad87e 100644 --- a/tests/baselines/reference/es5andes6module.js +++ b/tests/baselines/reference/es5andes6module.js @@ -23,3 +23,4 @@ var A = (function () { }; return A; }()); +export default A; diff --git a/tests/baselines/reference/es6modulekindWithES5Target.js b/tests/baselines/reference/es6modulekindWithES5Target.js index 560e401b31..10d9cd2e36 100644 --- a/tests/baselines/reference/es6modulekindWithES5Target.js +++ b/tests/baselines/reference/es6modulekindWithES5Target.js @@ -27,7 +27,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key, 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; return c > 3 && r && Object.defineProperty(target, key, r), r; }; -var C = (function () { +export var C = (function () { function C() { this.p = 1; } diff --git a/tests/baselines/reference/es6modulekindWithES5Target2.js b/tests/baselines/reference/es6modulekindWithES5Target2.js index 7025ac0510..101ead5cb5 100644 --- a/tests/baselines/reference/es6modulekindWithES5Target2.js +++ b/tests/baselines/reference/es6modulekindWithES5Target2.js @@ -15,4 +15,5 @@ var C = (function () { C.prototype.method = function () { }; return C; }()); +export default C; C.s = 0; diff --git a/tests/baselines/reference/externModule.js b/tests/baselines/reference/externModule.js index a7f58e4f30..ff83d07ef9 100644 --- a/tests/baselines/reference/externModule.js +++ b/tests/baselines/reference/externModule.js @@ -43,7 +43,7 @@ n=XDate.UTC(1964,2,1); declare; module; { - var XDate = (function () { + export var XDate = (function () { function XDate() { } return XDate; diff --git a/tests/baselines/reference/moduleElementsInWrongContext.js b/tests/baselines/reference/moduleElementsInWrongContext.js index 7cd2af405e..cd440bd601 100644 --- a/tests/baselines/reference/moduleElementsInWrongContext.js +++ b/tests/baselines/reference/moduleElementsInWrongContext.js @@ -44,6 +44,7 @@ } return C; }()); + export default C; function bee() { } import I2 = require("foo"); import * as Foo from "ambient"; diff --git a/tests/baselines/reference/moduleElementsInWrongContext2.js b/tests/baselines/reference/moduleElementsInWrongContext2.js index 55dd133ec9..cc4aca0dec 100644 --- a/tests/baselines/reference/moduleElementsInWrongContext2.js +++ b/tests/baselines/reference/moduleElementsInWrongContext2.js @@ -44,6 +44,7 @@ function blah() { } return C; }()); + export default C; function bee() { } import I2 = require("foo"); import * as Foo from "ambient";