diff --git a/src/compiler/transformers/module/es6.ts b/src/compiler/transformers/module/es6.ts index 9355b476247..d2f4ca4f224 100644 --- a/src/compiler/transformers/module/es6.ts +++ b/src/compiler/transformers/module/es6.ts @@ -34,12 +34,18 @@ namespace ts { return visitImportSpecifier(node); case SyntaxKind.ExportAssignment: return visitExportAssignment(node); + case SyntaxKind.ExportDeclaration: + return visitExportDeclaration(node); + case SyntaxKind.NamedExports: + return visitNamedExports(node); + case SyntaxKind.ExportSpecifier: + return visitExportSpecifier(node); } return node; } - function visitExportAssignment(node: ExportAssignment): ExportDeclaration { + function visitExportAssignment(node: ExportAssignment): ExportAssignment { if (node.isExportEquals) { return undefined; // do not emit export equals for ES6 } @@ -47,6 +53,34 @@ namespace ts { return nodeIsSynthesized(original) || resolver.isValueAliasDeclaration(original) ? node: undefined; } + function visitExportDeclaration(node: ExportDeclaration): ExportDeclaration { + if (!node.exportClause) { + return node; // export * is always emitted + } + if (!resolver.isValueAliasDeclaration(node)) { + return undefined; + } + const newExportClause = visitNode(node.exportClause, visitor, isNamedExports, /*optional*/ true); + if (node.exportClause === newExportClause) { + return node; + } + return newExportClause + ? createExportDeclaration(newExportClause, node.moduleSpecifier) + : undefined; + } + + function visitNamedExports(node: NamedExports): NamedExports { + const newExports = visitNodes(node.elements, visitor, isExportSpecifier); + if (node.elements === newExports) { + return node; + } + return newExports.length ? createNamedExports(newExports) : undefined; + } + + function visitExportSpecifier(node: ExportSpecifier): ExportSpecifier { + return resolver.isValueAliasDeclaration(node) ? node : undefined; + } + function visitImportEqualsDeclaration(node: ImportEqualsDeclaration): ImportEqualsDeclaration { return !isExternalModuleImportEqualsDeclaration(node) || resolver.isReferencedAliasDeclaration(node) ? node : undefined; }