diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7c8a0b7337f..eb78885ea5e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -21909,6 +21909,10 @@ namespace ts { } } + if (hasModifier(node.parent.parent, ModifierFlags.Export) && compilerOptions.module !== ModuleKind.ES2015) { + checkESModuleMarker(node.name); + } + const checkLetConstNames = (isLet(node) || isConst(node)); // 1. LexicalDeclaration : LetOrConst BindingList ; @@ -21921,6 +21925,22 @@ namespace ts { return checkLetConstNames && checkGrammarNameInLetOrConstDeclarations(node.name); } + function checkESModuleMarker(name: Identifier | BindingPattern): boolean { + if (name.kind === SyntaxKind.Identifier) { + if (unescapeIdentifier(name.text) === "__esModule") { + return grammarErrorOnNode(name, Diagnostics.Identifier_expected_esModule_is_reserved_as_a_marker_for_transpiled_ES2015_module); + } + } + else { + const elements = (name).elements; + for (const element of elements) { + if (!isOmittedExpression(element)) { + return checkESModuleMarker(element.name); + } + } + } + } + function checkGrammarNameInLetOrConstDeclarations(name: Identifier | BindingPattern): boolean { if (name.kind === SyntaxKind.Identifier) { if ((name).originalKeywordKind === SyntaxKind.LetKeyword) { diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 43a9cce4de6..50a91761e80 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -671,6 +671,10 @@ "category": "Error", "code": 1215 }, + "Identifier expected. '__esModule' is reserved as a marker for transpiled ES2015 module.": { + "category": "Error", + "code": 1216 + }, "Export assignment is not supported when '--module' flag is 'system'.": { "category": "Error", "code": 1218 diff --git a/src/compiler/transformers/module/module.ts b/src/compiler/transformers/module/module.ts index ebd004337f9..7c506be4d58 100644 --- a/src/compiler/transformers/module/module.ts +++ b/src/compiler/transformers/module/module.ts @@ -835,7 +835,7 @@ namespace ts { const parseTreeNode = getParseTreeNode(node); if (parseTreeNode && !shouldAppendEsModuleMarker) { // class declaration get down-level transformed to be variable statement - shouldAppendEsModuleMarker = (parseTreeNode.kind === SyntaxKind.VariableStatement || parseTreeNode.kind === SyntaxKind.ClassDeclaration || parseTreeNode.kind === SyntaxKind.ImportEqualsDeclaration) + shouldAppendEsModuleMarker = (parseTreeNode.kind === SyntaxKind.VariableStatement ||parseTreeNode.kind === SyntaxKind.ClassDeclaration || parseTreeNode.kind === SyntaxKind.ImportEqualsDeclaration) && hasModifier(parseTreeNode, ModifierFlags.Export); } diff --git a/tests/baselines/reference/es5-commonjs3.errors.txt b/tests/baselines/reference/es5-commonjs3.errors.txt new file mode 100644 index 00000000000..51c5d2cd44d --- /dev/null +++ b/tests/baselines/reference/es5-commonjs3.errors.txt @@ -0,0 +1,10 @@ +tests/cases/compiler/es5-commonjs3.ts(3,12): error TS1216: Identifier expected. '__esModule' is reserved as a marker for transpiled ES2015 module. + + +==== tests/cases/compiler/es5-commonjs3.ts (1 errors) ==== + + export default "test"; + export var __esModule = 1; + ~~~~~~~~~~ +!!! error TS1216: Identifier expected. '__esModule' is reserved as a marker for transpiled ES2015 module. + \ No newline at end of file diff --git a/tests/baselines/reference/es5-commonjs3.js b/tests/baselines/reference/es5-commonjs3.js index b2c1c5d6890..5fc9462b955 100644 --- a/tests/baselines/reference/es5-commonjs3.js +++ b/tests/baselines/reference/es5-commonjs3.js @@ -8,3 +8,4 @@ export var __esModule = 1; "use strict"; exports.default = "test"; exports.__esModule = 1; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/tests/baselines/reference/es5-commonjs4.errors.txt b/tests/baselines/reference/es5-commonjs4.errors.txt new file mode 100644 index 00000000000..6a047378bac --- /dev/null +++ b/tests/baselines/reference/es5-commonjs4.errors.txt @@ -0,0 +1,21 @@ +tests/cases/compiler/es5-commonjs4.ts(14,12): error TS1216: Identifier expected. '__esModule' is reserved as a marker for transpiled ES2015 module. + + +==== tests/cases/compiler/es5-commonjs4.ts (1 errors) ==== + + export default class A + { + constructor () + { + + } + + public B() + { + return 42; + } + } + export var __esModule = 1; + ~~~~~~~~~~ +!!! error TS1216: Identifier expected. '__esModule' is reserved as a marker for transpiled ES2015 module. + \ No newline at end of file diff --git a/tests/baselines/reference/es5-commonjs4.js b/tests/baselines/reference/es5-commonjs4.js index b67c771df3c..bf28e064500 100644 --- a/tests/baselines/reference/es5-commonjs4.js +++ b/tests/baselines/reference/es5-commonjs4.js @@ -27,3 +27,4 @@ var A = (function () { }()); exports.default = A; exports.__esModule = 1; +Object.defineProperty(exports, "__esModule", { value: true });