Skip to content

Commit

Permalink
Hoist initial assignment to exported names in cjs to they are not blo…
Browse files Browse the repository at this point in the history
…cked by bindings made by __exportStar
  • Loading branch information
weswigham committed Feb 28, 2020
1 parent f1457c1 commit 44bbf14
Show file tree
Hide file tree
Showing 1,699 changed files with 8,132 additions and 4,998 deletions.
8 changes: 7 additions & 1 deletion src/compiler/transformers/module/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,9 @@ namespace ts {
if (shouldEmitUnderscoreUnderscoreESModule()) {
append(statements, createUnderscoreUnderscoreESModule());
}
if (length(currentModuleInfo.exportedNames)) {
append(statements, createExpressionStatement(reduceLeft(currentModuleInfo.exportedNames, (prev, nextId) => createAssignment(createPropertyAccess(createIdentifier("exports"), nextId), prev), createVoidZero() as Expression)));
}

append(statements, visitNode(currentModuleInfo.externalHelpersImportDeclaration, sourceElementVisitor, isStatement));
addRange(statements, visitNodes(node.statements, sourceElementVisitor, isStatement, statementOffset));
Expand Down Expand Up @@ -414,6 +417,9 @@ namespace ts {
if (shouldEmitUnderscoreUnderscoreESModule()) {
append(statements, createUnderscoreUnderscoreESModule());
}
if (length(currentModuleInfo.exportedNames)) {
append(statements, createExpressionStatement(reduceLeft(currentModuleInfo.exportedNames, (prev, nextId) => createAssignment(createPropertyAccess(createIdentifier("exports"), nextId), prev), createVoidZero() as Expression)));
}

// Visit each statement of the module body.
append(statements, visitNode(currentModuleInfo.externalHelpersImportDeclaration, sourceElementVisitor, isStatement));
Expand Down Expand Up @@ -1188,7 +1194,7 @@ namespace ts {

variables = append(variables, variable);
}
else {
else if (variable.initializer) {
expressions = append(expressions, transformInitializedVariable(variable));
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/testRunner/unittests/tsserver/compileOnSave.ts
Original file line number Diff line number Diff line change
Expand Up @@ -714,7 +714,7 @@ namespace ts.projectSystem {

const expectedEmittedFileName = "/a/b/f1.js";
assert.isTrue(host.fileExists(expectedEmittedFileName));
assert.equal(host.readFile(expectedEmittedFileName), `"use strict";\r\nexports.__esModule = true;\r\nfunction Foo() { return 10; }\r\nexports.Foo = Foo;\r\n`);
assert.equal(host.readFile(expectedEmittedFileName), `"use strict";\r\nexports.__esModule = true;\r\nexports.Foo = void 0;\r\nfunction Foo() { return 10; }\r\nexports.Foo = Foo;\r\n`);
});

it("shoud not emit js files in external projects", () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ exports.fn3 = fn3;`;
expectedFiles: [{
path: `${usageLocation}/usage.js`,
content: `"use strict";
exports.__esModule = true;
exports.__esModule = true;${appendJsText === changeJs ? "\nexports.fn3 = void 0;" : ""}
var fns_1 = require("../decls/fns");
fns_1.fn1();
fns_1.fn2();
Expand Down Expand Up @@ -286,6 +286,7 @@ ${appendJs}`
path: `${dependecyLocation}/fns.js`,
content: `"use strict";
exports.__esModule = true;
${appendJsText === changeJs ? "exports.fn3 = " : ""}exports.fn2 = exports.fn1 = void 0;
function fn1() { }
exports.fn1 = fn1;
function fn2() { }
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/APISample_compile.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ compile(process.argv.slice(2), {
* Please log a "breaking change" issue for any API breaking change affecting this issue
*/
exports.__esModule = true;
exports.compile = void 0;
var ts = require("typescript");
function compile(fileNames, options) {
var program = ts.createProgram(fileNames, options);
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/APISample_linter.js
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ fileNames.forEach(fileName => {
* Please log a "breaking change" issue for any API breaking change affecting this issue
*/
exports.__esModule = true;
exports.delint = void 0;
var ts = require("typescript");
function delint(sourceFile) {
delintNode(sourceFile);
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/APISample_parseConfig.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ export function createProgram(rootFiles: string[], compilerOptionsJson: string):
* Please log a "breaking change" issue for any API breaking change affecting this issue
*/
exports.__esModule = true;
exports.createProgram = void 0;
var ts = require("typescript");
function printError(error) {
if (!error) {
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/ExportAssignment7.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export = B;

//// [ExportAssignment7.js]
"use strict";
exports.C = void 0;
var C = /** @class */ (function () {
function C() {
}
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/ExportAssignment8.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export class C {

//// [ExportAssignment8.js]
"use strict";
exports.C = void 0;
var C = /** @class */ (function () {
function C() {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export module A {
//// [part1.js]
"use strict";
exports.__esModule = true;
exports.A = void 0;
var A;
(function (A) {
var Utils;
Expand All @@ -46,6 +47,7 @@ var A;
//// [part2.js]
"use strict";
exports.__esModule = true;
exports.A = void 0;
var A;
(function (A) {
// collision with 'Origin' var in other part of merged module
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/aliasAssignments.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ y = moduleA; // should be error
//// [aliasAssignments_moduleA.js]
"use strict";
exports.__esModule = true;
exports.someClass = void 0;
var someClass = /** @class */ (function () {
function someClass() {
}
Expand Down
2 changes: 2 additions & 0 deletions tests/baselines/reference/aliasUsageInAccessorsOfClass.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class C2 {
//// [aliasUsage1_backbone.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Model = void 0;
var Model = /** @class */ (function () {
function Model() {
}
Expand All @@ -52,6 +53,7 @@ var __extends = (this && this.__extends) || (function () {
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.VisualizationModel = void 0;
var Backbone = require("./aliasUsage1_backbone");
var VisualizationModel = /** @class */ (function (_super) {
__extends(VisualizationModel, _super);
Expand Down
2 changes: 2 additions & 0 deletions tests/baselines/reference/aliasUsageInArray.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ var xs2: typeof moduleA[] = [moduleA];
//// [aliasUsageInArray_backbone.js]
"use strict";
exports.__esModule = true;
exports.Model = void 0;
var Model = /** @class */ (function () {
function Model() {
}
Expand All @@ -46,6 +47,7 @@ var __extends = (this && this.__extends) || (function () {
};
})();
exports.__esModule = true;
exports.VisualizationModel = void 0;
var Backbone = require("./aliasUsageInArray_backbone");
var VisualizationModel = /** @class */ (function (_super) {
__extends(VisualizationModel, _super);
Expand Down
2 changes: 2 additions & 0 deletions tests/baselines/reference/aliasUsageInFunctionExpression.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ f = (x) => moduleA;
//// [aliasUsageInFunctionExpression_backbone.js]
"use strict";
exports.__esModule = true;
exports.Model = void 0;
var Model = /** @class */ (function () {
function Model() {
}
Expand All @@ -45,6 +46,7 @@ var __extends = (this && this.__extends) || (function () {
};
})();
exports.__esModule = true;
exports.VisualizationModel = void 0;
var Backbone = require("./aliasUsageInFunctionExpression_backbone");
var VisualizationModel = /** @class */ (function (_super) {
__extends(VisualizationModel, _super);
Expand Down
2 changes: 2 additions & 0 deletions tests/baselines/reference/aliasUsageInGenericFunction.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ var r2 = foo({ a: <IHasVisualizationModel>null });
//// [aliasUsageInGenericFunction_backbone.js]
"use strict";
exports.__esModule = true;
exports.Model = void 0;
var Model = /** @class */ (function () {
function Model() {
}
Expand All @@ -49,6 +50,7 @@ var __extends = (this && this.__extends) || (function () {
};
})();
exports.__esModule = true;
exports.VisualizationModel = void 0;
var Backbone = require("./aliasUsageInGenericFunction_backbone");
var VisualizationModel = /** @class */ (function (_super) {
__extends(VisualizationModel, _super);
Expand Down
2 changes: 2 additions & 0 deletions tests/baselines/reference/aliasUsageInIndexerOfClass.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class N2 {
//// [aliasUsageInIndexerOfClass_backbone.js]
"use strict";
exports.__esModule = true;
exports.Model = void 0;
var Model = /** @class */ (function () {
function Model() {
}
Expand All @@ -51,6 +52,7 @@ var __extends = (this && this.__extends) || (function () {
};
})();
exports.__esModule = true;
exports.VisualizationModel = void 0;
var Backbone = require("./aliasUsageInIndexerOfClass_backbone");
var VisualizationModel = /** @class */ (function (_super) {
__extends(VisualizationModel, _super);
Expand Down
2 changes: 2 additions & 0 deletions tests/baselines/reference/aliasUsageInObjectLiteral.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ var c: { y: { z: IHasVisualizationModel } } = { y: { z: moduleA } };
//// [aliasUsageInObjectLiteral_backbone.js]
"use strict";
exports.__esModule = true;
exports.Model = void 0;
var Model = /** @class */ (function () {
function Model() {
}
Expand All @@ -46,6 +47,7 @@ var __extends = (this && this.__extends) || (function () {
};
})();
exports.__esModule = true;
exports.VisualizationModel = void 0;
var Backbone = require("./aliasUsageInObjectLiteral_backbone");
var VisualizationModel = /** @class */ (function (_super) {
__extends(VisualizationModel, _super);
Expand Down
2 changes: 2 additions & 0 deletions tests/baselines/reference/aliasUsageInOrExpression.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ var f: { x: IHasVisualizationModel } = <{ x: IHasVisualizationModel }>null ? { x
//// [aliasUsageInOrExpression_backbone.js]
"use strict";
exports.__esModule = true;
exports.Model = void 0;
var Model = /** @class */ (function () {
function Model() {
}
Expand All @@ -49,6 +50,7 @@ var __extends = (this && this.__extends) || (function () {
};
})();
exports.__esModule = true;
exports.VisualizationModel = void 0;
var Backbone = require("./aliasUsageInOrExpression_backbone");
var VisualizationModel = /** @class */ (function (_super) {
__extends(VisualizationModel, _super);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class D extends C<IHasVisualizationModel> {
//// [aliasUsageInTypeArgumentOfExtendsClause_backbone.js]
"use strict";
exports.__esModule = true;
exports.Model = void 0;
var Model = /** @class */ (function () {
function Model() {
}
Expand All @@ -49,6 +50,7 @@ var __extends = (this && this.__extends) || (function () {
};
})();
exports.__esModule = true;
exports.VisualizationModel = void 0;
var Backbone = require("./aliasUsageInTypeArgumentOfExtendsClause_backbone");
var VisualizationModel = /** @class */ (function (_super) {
__extends(VisualizationModel, _super);
Expand Down
2 changes: 2 additions & 0 deletions tests/baselines/reference/aliasUsageInVarAssignment.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ var m: typeof moduleA = i;
//// [aliasUsageInVarAssignment_backbone.js]
"use strict";
exports.__esModule = true;
exports.Model = void 0;
var Model = /** @class */ (function () {
function Model() {
}
Expand All @@ -45,6 +46,7 @@ var __extends = (this && this.__extends) || (function () {
};
})();
exports.__esModule = true;
exports.VisualizationModel = void 0;
var Backbone = require("./aliasUsageInVarAssignment_backbone");
var VisualizationModel = /** @class */ (function (_super) {
__extends(VisualizationModel, _super);
Expand Down
2 changes: 2 additions & 0 deletions tests/baselines/reference/aliasUsedAsNameValue.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@ exports.id = void 0;
//// [aliasUsedAsNameValue_1.js]
"use strict";
exports.__esModule = true;
exports.b = void 0;
function b(a) { return null; }
exports.b = b;
//// [aliasUsedAsNameValue_2.js]
"use strict";
exports.__esModule = true;
exports.a = void 0;
///<reference path='aliasUsedAsNameValue_0.ts' />
///<reference path='aliasUsedAsNameValue_1.ts' />
var mod = require("./aliasUsedAsNameValue_0");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,13 @@ const y: originalZZZ = x;
//// [b.js]
"use strict";
exports.__esModule = true;
exports.zzz = void 0;
exports.zzz = 123;
exports["default"] = exports.zzz;
//// [a.js]
"use strict";
exports.__esModule = true;
exports["default"] = void 0;
var b_1 = require("./b");
exports["default"] = b_1["default"];
var x = { x: "" };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,12 @@ export var a = vextend({
//// [func.js]
"use strict";
exports.__esModule = true;
exports.vextend = void 0;
exports.vextend = extend;
//// [app.js]
"use strict";
exports.__esModule = true;
exports.a = void 0;
var func_1 = require("./func");
// hover on vextend
exports.a = func_1.vextend({
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports1.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ export class Foo {
//// [a.js]
"use strict";
exports.__esModule = true;
exports.x = void 0;
var b_1 = require("./b");
exports.x = new b_1["default"].Foo();
1 change: 1 addition & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports4.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@ export var x = new Foo();
//// [a.js]
"use strict";
exports.__esModule = true;
exports.x = void 0;
var b_1 = require("./b");
exports.x = new b_1["default"]();
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ exports.__esModule = true;
//// [file2.js]
"use strict";
exports.__esModule = true;
exports.A = void 0;
var file1_1 = require("./file1");
exports.A = file1_1.styled();

Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/alwaysStrictModule4.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ export const a = 1
//// [alwaysStrictModule4.js]
"use strict";
exports.__esModule = true;
exports.a = void 0;
// Module commonjs
exports.a = 1;
1 change: 1 addition & 0 deletions tests/baselines/reference/alwaysStrictModule6.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ export const a = 1;
//// [alwaysStrictModule6.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.a = void 0;
// Targeting ES5
exports.a = 1;
1 change: 1 addition & 0 deletions tests/baselines/reference/ambient.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ declare namespace ns {
//// [a.js]
"use strict";
exports.__esModule = true;
exports.A = void 0;
var A = /** @class */ (function () {
function A() {
}
Expand Down
2 changes: 2 additions & 0 deletions tests/baselines/reference/amdDeclarationEmitNoExtraDeclare.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ var __extends = (this && this.__extends) || (function () {
define("Configurable", ["require", "exports"], function (require, exports) {
"use strict";
exports.__esModule = true;
exports.Configurable = void 0;
function Configurable(base) {
return /** @class */ (function (_super) {
__extends(class_1, _super);
Expand All @@ -56,6 +57,7 @@ define("Configurable", ["require", "exports"], function (require, exports) {
define("Class", ["require", "exports", "Configurable"], function (require, exports, Configurable_1) {
"use strict";
exports.__esModule = true;
exports.ActualClass = exports.HiddenClass = void 0;
var HiddenClass = /** @class */ (function () {
function HiddenClass() {
}
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/amdImportAsPrimaryExpression.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ if(foo.E1.A === 0){
define(["require", "exports"], function (require, exports) {
"use strict";
exports.__esModule = true;
exports.E1 = void 0;
var E1;
(function (E1) {
E1[E1["A"] = 0] = "A";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ var e: number = <foo.E1>0;
define(["require", "exports"], function (require, exports) {
"use strict";
exports.__esModule = true;
exports.E1 = exports.C1 = void 0;
var C1 = /** @class */ (function () {
function C1() {
this.m1 = 42;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export class Bar {}
define("mynamespace::SomeModuleA", ["require", "exports"], function (require, exports) {
"use strict";
exports.__esModule = true;
exports.Foo = void 0;
/// <amd-module name="mynamespace::SomeModuleA" />
var Foo = /** @class */ (function () {
function Foo() {
Expand All @@ -22,6 +23,7 @@ define("mynamespace::SomeModuleA", ["require", "exports"], function (require, ex
define("mynamespace::SomeModuleB", ["require", "exports"], function (require, exports) {
"use strict";
exports.__esModule = true;
exports.Bar = void 0;
/// <amd-module name="mynamespace::SomeModuleB" />
var Bar = /** @class */ (function () {
function Bar() {
Expand Down
Loading

0 comments on commit 44bbf14

Please sign in to comment.