Skip to content

Commit bc1058e

Browse files
authored
Merge pull request microsoft#13871 from Microsoft/master-fix13709
[Fix 13709] - Emit __esmodule
2 parents de40000 + 1243e11 commit bc1058e

File tree

1,643 files changed

+3302
-1444
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,643 files changed

+3302
-1444
lines changed

src/compiler/checker.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/// <reference path="moduleNameResolver.ts"/>
1+
/// <reference path="moduleNameResolver.ts"/>
22
/// <reference path="binder.ts"/>
33

44
/* @internal */
@@ -22084,6 +22084,11 @@ namespace ts {
2208422084
}
2208522085
}
2208622086

22087+
if (compilerOptions.module !== ModuleKind.ES2015 && compilerOptions.module !== ModuleKind.System && !compilerOptions.noEmit &&
22088+
!isInAmbientContext(node.parent.parent) && hasModifier(node.parent.parent, ModifierFlags.Export)) {
22089+
checkESModuleMarker(node.name);
22090+
}
22091+
2208722092
const checkLetConstNames = (isLet(node) || isConst(node));
2208822093

2208922094
// 1. LexicalDeclaration : LetOrConst BindingList ;
@@ -22096,6 +22101,22 @@ namespace ts {
2209622101
return checkLetConstNames && checkGrammarNameInLetOrConstDeclarations(node.name);
2209722102
}
2209822103

22104+
function checkESModuleMarker(name: Identifier | BindingPattern): boolean {
22105+
if (name.kind === SyntaxKind.Identifier) {
22106+
if (unescapeIdentifier(name.text) === "__esModule") {
22107+
return grammarErrorOnNode(name, Diagnostics.Identifier_expected_esModule_is_reserved_as_an_exported_marker_when_transforming_ECMAScript_modules);
22108+
}
22109+
}
22110+
else {
22111+
const elements = (<BindingPattern>name).elements;
22112+
for (const element of elements) {
22113+
if (!isOmittedExpression(element)) {
22114+
return checkESModuleMarker(element.name);
22115+
}
22116+
}
22117+
}
22118+
}
22119+
2209922120
function checkGrammarNameInLetOrConstDeclarations(name: Identifier | BindingPattern): boolean {
2210022121
if (name.kind === SyntaxKind.Identifier) {
2210122122
if ((<Identifier>name).originalKeywordKind === SyntaxKind.LetKeyword) {

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,10 @@
671671
"category": "Error",
672672
"code": 1215
673673
},
674+
"Identifier expected. '__esModule' is reserved as an exported marker when transforming ECMAScript modules.": {
675+
"category": "Error",
676+
"code": 1216
677+
},
674678
"Export assignment is not supported when '--module' flag is 'system'.": {
675679
"category": "Error",
676680
"code": 1218

src/compiler/transformers/module/module.ts

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ namespace ts {
8383

8484
const statements: Statement[] = [];
8585
const statementOffset = addPrologueDirectives(statements, node.statements, /*ensureUseStrict*/ !compilerOptions.noImplicitUseStrict, sourceElementVisitor);
86+
87+
if (!currentModuleInfo.exportEquals) {
88+
append(statements, createUnderscoreUnderscoreESModule());
89+
}
90+
8691
append(statements, visitNode(currentModuleInfo.externalHelpersImportDeclaration, sourceElementVisitor, isStatement, /*optional*/ true));
8792
addRange(statements, visitNodes(node.statements, sourceElementVisitor, isStatement, statementOffset));
8893
addRange(statements, endLexicalEnvironment());
@@ -92,7 +97,6 @@ namespace ts {
9297
if (currentModuleInfo.hasExportStarsToExportValues) {
9398
addEmitHelper(updated, exportStarHelper);
9499
}
95-
96100
return updated;
97101
}
98102

@@ -371,6 +375,10 @@ namespace ts {
371375
const statements: Statement[] = [];
372376
const statementOffset = addPrologueDirectives(statements, node.statements, /*ensureUseStrict*/ !compilerOptions.noImplicitUseStrict, sourceElementVisitor);
373377

378+
if (!currentModuleInfo.exportEquals) {
379+
append(statements, createUnderscoreUnderscoreESModule());
380+
}
381+
374382
// Visit each statement of the module body.
375383
append(statements, visitNode(currentModuleInfo.externalHelpersImportDeclaration, sourceElementVisitor, isStatement, /*optional*/ true));
376384
addRange(statements, visitNodes(node.statements, sourceElementVisitor, isStatement, statementOffset));
@@ -665,6 +673,7 @@ namespace ts {
665673
}
666674

667675
const generatedName = getGeneratedNameForNode(node);
676+
668677
if (node.exportClause) {
669678
const statements: Statement[] = [];
670679
// export { x, y } from "mod";
@@ -838,6 +847,7 @@ namespace ts {
838847
let statements: Statement[];
839848
let variables: VariableDeclaration[];
840849
let expressions: Expression[];
850+
841851
if (hasModifier(node, ModifierFlags.Export)) {
842852
let modifiers: NodeArray<Modifier>;
843853

@@ -1127,43 +1137,39 @@ namespace ts {
11271137
* @param allowComments Whether to allow comments on the export.
11281138
*/
11291139
function appendExportStatement(statements: Statement[] | undefined, exportName: Identifier, expression: Expression, location?: TextRange, allowComments?: boolean): Statement[] | undefined {
1130-
if (exportName.text === "default") {
1131-
const sourceFile = getOriginalNode(currentSourceFile, isSourceFile);
1132-
if (sourceFile && !sourceFile.symbol.exports.get("___esModule")) {
1133-
if (languageVersion === ScriptTarget.ES3) {
1134-
statements = append(statements,
1135-
createStatement(
1136-
createExportExpression(
1137-
createIdentifier("__esModule"),
1138-
createTrue()
1139-
)
1140-
)
1141-
);
1142-
}
1143-
else {
1144-
statements = append(statements,
1145-
createStatement(
1146-
createCall(
1147-
createPropertyAccess(createIdentifier("Object"), "defineProperty"),
1148-
/*typeArguments*/ undefined,
1149-
[
1150-
createIdentifier("exports"),
1151-
createLiteral("__esModule"),
1152-
createObjectLiteral([
1153-
createPropertyAssignment("value", createTrue())
1154-
])
1155-
]
1156-
)
1157-
)
1158-
);
1159-
}
1160-
}
1161-
}
1162-
11631140
statements = append(statements, createExportStatement(exportName, expression, location, allowComments));
11641141
return statements;
11651142
}
11661143

1144+
function createUnderscoreUnderscoreESModule() {
1145+
let statement: Statement;
1146+
if (languageVersion === ScriptTarget.ES3) {
1147+
statement = createStatement(
1148+
createExportExpression(
1149+
createIdentifier("__esModule"),
1150+
createLiteral(true)
1151+
)
1152+
)
1153+
}
1154+
else {
1155+
statement = createStatement(
1156+
createCall(
1157+
createPropertyAccess(createIdentifier("Object"), "defineProperty"),
1158+
/*typeArguments*/ undefined,
1159+
[
1160+
createIdentifier("exports"),
1161+
createLiteral("__esModule"),
1162+
createObjectLiteral([
1163+
createPropertyAssignment("value", createLiteral(true))
1164+
])
1165+
]
1166+
)
1167+
);
1168+
}
1169+
setEmitFlags(statement, EmitFlags.CustomPrologue);
1170+
return statement;
1171+
}
1172+
11671173
/**
11681174
* Creates a call to the current file's export function to export a value.
11691175
*

src/harness/unittests/compileOnSave.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ namespace ts.projectSystem {
520520

521521
const expectedEmittedFileName = "/a/b/f1.js";
522522
assert.isTrue(host.fileExists(expectedEmittedFileName));
523-
assert.equal(host.readFile(expectedEmittedFileName), `"use strict";\r\nfunction Foo() { return 10; }\r\nexports.Foo = Foo;\r\n`);
523+
assert.equal(host.readFile(expectedEmittedFileName), `"use strict";\r\nexports.__esModule = true;\r\nfunction Foo() { return 10; }\r\nexports.Foo = Foo;\r\n`);
524524
});
525525

526526
it("shoud not emit js files in external projects", () => {

tests/baselines/reference/APISample_compile.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ compile(process.argv.slice(2), {
4141
* Please log a "breaking change" issue for any API breaking change affecting this issue
4242
*/
4343
"use strict";
44+
exports.__esModule = true;
4445
var ts = require("typescript");
4546
function compile(fileNames, options) {
4647
var program = ts.createProgram(fileNames, options);

tests/baselines/reference/APISample_linter.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ fileNames.forEach(fileName => {
7171
* Please log a "breaking change" issue for any API breaking change affecting this issue
7272
*/
7373
"use strict";
74+
exports.__esModule = true;
7475
var ts = require("typescript");
7576
function delint(sourceFile) {
7677
delintNode(sourceFile);

tests/baselines/reference/APISample_parseConfig.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export function createProgram(rootFiles: string[], compilerOptionsJson: string):
4343
* Please log a "breaking change" issue for any API breaking change affecting this issue
4444
*/
4545
"use strict";
46+
exports.__esModule = true;
4647
var ts = require("typescript");
4748
function printError(error) {
4849
if (!error) {

tests/baselines/reference/APISample_transform.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ console.log(JSON.stringify(result));
2323
* Please log a "breaking change" issue for any API breaking change affecting this issue
2424
*/
2525
"use strict";
26+
exports.__esModule = true;
2627
var ts = require("typescript");
2728
var source = "let x: string = 'string'";
2829
var result = ts.transpile(source, { module: ts.ModuleKind.CommonJS });

tests/baselines/reference/APISample_watcher.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ watch(currentDirectoryFiles, { module: ts.ModuleKind.CommonJS });
116116
* Please log a "breaking change" issue for any API breaking change affecting this issue
117117
*/
118118
"use strict";
119+
exports.__esModule = true;
119120
var ts = require("typescript");
120121
function watch(rootFileNames, options) {
121122
var files = {};

tests/baselines/reference/TwoInternalModulesThatMergeEachWithExportedLocalVarsOfTheSameName.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export module A {
3131

3232
//// [part1.js]
3333
"use strict";
34+
exports.__esModule = true;
3435
var A;
3536
(function (A) {
3637
var Utils;
@@ -44,6 +45,7 @@ var A;
4445
})(A = exports.A || (exports.A = {}));
4546
//// [part2.js]
4647
"use strict";
48+
exports.__esModule = true;
4749
var A;
4850
(function (A) {
4951
// collision with 'Origin' var in other part of merged module

tests/baselines/reference/aliasAssignments.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ y = moduleA; // should be error
1515

1616
//// [aliasAssignments_moduleA.js]
1717
"use strict";
18+
exports.__esModule = true;
1819
var someClass = (function () {
1920
function someClass() {
2021
}
@@ -23,6 +24,7 @@ var someClass = (function () {
2324
exports.someClass = someClass;
2425
//// [aliasAssignments_1.js]
2526
"use strict";
27+
exports.__esModule = true;
2628
var moduleA = require("./aliasAssignments_moduleA");
2729
var x = moduleA;
2830
x = 1; // Should be error

tests/baselines/reference/aliasOnMergedModuleInterface.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ var x: foo.A = foo.bar("hello"); // foo.A should be ok but foo.bar should be err
2424
//// [aliasOnMergedModuleInterface_0.js]
2525
//// [aliasOnMergedModuleInterface_1.js]
2626
"use strict";
27+
exports.__esModule = true;
2728
var z;
2829
z.bar("hello"); // This should be ok
2930
var x = foo.bar("hello"); // foo.A should be ok but foo.bar should be error

tests/baselines/reference/aliasUsageInAccessorsOfClass.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class C2 {
2929

3030
//// [aliasUsage1_backbone.js]
3131
"use strict";
32+
Object.defineProperty(exports, "__esModule", { value: true });
3233
var Model = (function () {
3334
function Model() {
3435
}
@@ -47,6 +48,7 @@ var __extends = (this && this.__extends) || (function () {
4748
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
4849
};
4950
})();
51+
Object.defineProperty(exports, "__esModule", { value: true });
5052
var Backbone = require("./aliasUsage1_backbone");
5153
var VisualizationModel = (function (_super) {
5254
__extends(VisualizationModel, _super);
@@ -58,6 +60,7 @@ var VisualizationModel = (function (_super) {
5860
exports.VisualizationModel = VisualizationModel;
5961
//// [aliasUsage1_main.js]
6062
"use strict";
63+
Object.defineProperty(exports, "__esModule", { value: true });
6164
var moduleA = require("./aliasUsage1_moduleA");
6265
var C2 = (function () {
6366
function C2() {

tests/baselines/reference/aliasUsageInArray.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ var xs2: typeof moduleA[] = [moduleA];
2323

2424
//// [aliasUsageInArray_backbone.js]
2525
"use strict";
26+
exports.__esModule = true;
2627
var Model = (function () {
2728
function Model() {
2829
}
@@ -41,6 +42,7 @@ var __extends = (this && this.__extends) || (function () {
4142
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
4243
};
4344
})();
45+
exports.__esModule = true;
4446
var Backbone = require("./aliasUsageInArray_backbone");
4547
var VisualizationModel = (function (_super) {
4648
__extends(VisualizationModel, _super);
@@ -52,6 +54,7 @@ var VisualizationModel = (function (_super) {
5254
exports.VisualizationModel = VisualizationModel;
5355
//// [aliasUsageInArray_main.js]
5456
"use strict";
57+
exports.__esModule = true;
5558
var moduleA = require("./aliasUsageInArray_moduleA");
5659
var xs = [moduleA];
5760
var xs2 = [moduleA];

tests/baselines/reference/aliasUsageInFunctionExpression.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ f = (x) => moduleA;
2222

2323
//// [aliasUsageInFunctionExpression_backbone.js]
2424
"use strict";
25+
exports.__esModule = true;
2526
var Model = (function () {
2627
function Model() {
2728
}
@@ -40,6 +41,7 @@ var __extends = (this && this.__extends) || (function () {
4041
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
4142
};
4243
})();
44+
exports.__esModule = true;
4345
var Backbone = require("./aliasUsageInFunctionExpression_backbone");
4446
var VisualizationModel = (function (_super) {
4547
__extends(VisualizationModel, _super);
@@ -51,6 +53,7 @@ var VisualizationModel = (function (_super) {
5153
exports.VisualizationModel = VisualizationModel;
5254
//// [aliasUsageInFunctionExpression_main.js]
5355
"use strict";
56+
exports.__esModule = true;
5457
var moduleA = require("./aliasUsageInFunctionExpression_moduleA");
5558
var f = function (x) { return x; };
5659
f = function (x) { return moduleA; };

tests/baselines/reference/aliasUsageInGenericFunction.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ var r2 = foo({ a: <IHasVisualizationModel>null });
2626

2727
//// [aliasUsageInGenericFunction_backbone.js]
2828
"use strict";
29+
exports.__esModule = true;
2930
var Model = (function () {
3031
function Model() {
3132
}
@@ -44,6 +45,7 @@ var __extends = (this && this.__extends) || (function () {
4445
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
4546
};
4647
})();
48+
exports.__esModule = true;
4749
var Backbone = require("./aliasUsageInGenericFunction_backbone");
4850
var VisualizationModel = (function (_super) {
4951
__extends(VisualizationModel, _super);
@@ -55,6 +57,7 @@ var VisualizationModel = (function (_super) {
5557
exports.VisualizationModel = VisualizationModel;
5658
//// [aliasUsageInGenericFunction_main.js]
5759
"use strict";
60+
exports.__esModule = true;
5861
var moduleA = require("./aliasUsageInGenericFunction_moduleA");
5962
function foo(x) {
6063
return x;

tests/baselines/reference/aliasUsageInIndexerOfClass.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class N2 {
2828

2929
//// [aliasUsageInIndexerOfClass_backbone.js]
3030
"use strict";
31+
exports.__esModule = true;
3132
var Model = (function () {
3233
function Model() {
3334
}
@@ -46,6 +47,7 @@ var __extends = (this && this.__extends) || (function () {
4647
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
4748
};
4849
})();
50+
exports.__esModule = true;
4951
var Backbone = require("./aliasUsageInIndexerOfClass_backbone");
5052
var VisualizationModel = (function (_super) {
5153
__extends(VisualizationModel, _super);
@@ -57,6 +59,7 @@ var VisualizationModel = (function (_super) {
5759
exports.VisualizationModel = VisualizationModel;
5860
//// [aliasUsageInIndexerOfClass_main.js]
5961
"use strict";
62+
exports.__esModule = true;
6063
var moduleA = require("./aliasUsageInIndexerOfClass_moduleA");
6164
var N = (function () {
6265
function N() {

0 commit comments

Comments
 (0)