Skip to content

Commit 668bbc6

Browse files
authored
Export anonymous functions in 2 steps, declare as variable and then assign to exports. (#39820)
* Preserve the variable name when exporting an arrow or anonymous function This allows the browser or node to properly name the (arrow) function * Updated tests to reflect previous change * Remove duplicated comment * Transforms variable.initializer using moduleExpressionElementVisitor * PR feedback: rbuckton - Use isArrowFunction and isFunctionExpression * PR feedback: rbuckton - Consider ClassExpresion, they can also be named based on the variable.
1 parent 3328fdb commit 668bbc6

File tree

36 files changed

+111
-42
lines changed

36 files changed

+111
-42
lines changed

src/compiler/transformers/module/module.ts

+31-2
Original file line numberDiff line numberDiff line change
@@ -1195,6 +1195,7 @@ namespace ts {
11951195

11961196
if (hasSyntacticModifier(node, ModifierFlags.Export)) {
11971197
let modifiers: NodeArray<Modifier> | undefined;
1198+
let removeCommentsOnExpressions = false;
11981199

11991200
// If we're exporting these variables, then these just become assignments to 'exports.x'.
12001201
for (const variable of node.declarationList.declarations) {
@@ -1206,7 +1207,31 @@ namespace ts {
12061207
variables = append(variables, variable);
12071208
}
12081209
else if (variable.initializer) {
1209-
expressions = append(expressions, transformInitializedVariable(variable as InitializedVariableDeclaration));
1210+
if (!isBindingPattern(variable.name) && (isArrowFunction(variable.initializer) || isFunctionExpression(variable.initializer) || isClassExpression(variable.initializer))) {
1211+
const expression = factory.createAssignment(
1212+
setTextRange(
1213+
factory.createPropertyAccessExpression(
1214+
factory.createIdentifier("exports"),
1215+
variable.name
1216+
),
1217+
/*location*/ variable.name
1218+
),
1219+
factory.createIdentifier(getTextOfIdentifierOrLiteral(variable.name))
1220+
);
1221+
const updatedVariable = factory.createVariableDeclaration(
1222+
variable.name,
1223+
variable.exclamationToken,
1224+
variable.type,
1225+
visitNode(variable.initializer, moduleExpressionElementVisitor)
1226+
);
1227+
1228+
variables = append(variables, updatedVariable);
1229+
expressions = append(expressions, expression);
1230+
removeCommentsOnExpressions = true;
1231+
}
1232+
else {
1233+
expressions = append(expressions, transformInitializedVariable(variable as InitializedVariableDeclaration));
1234+
}
12101235
}
12111236
}
12121237

@@ -1215,7 +1240,11 @@ namespace ts {
12151240
}
12161241

12171242
if (expressions) {
1218-
statements = append(statements, setOriginalNode(setTextRange(factory.createExpressionStatement(factory.inlineExpressions(expressions)), node), node));
1243+
const statement = setOriginalNode(setTextRange(factory.createExpressionStatement(factory.inlineExpressions(expressions)), node), node);
1244+
if (removeCommentsOnExpressions) {
1245+
removeAllComments(statement);
1246+
}
1247+
statements = append(statements, statement);
12191248
}
12201249
}
12211250
else {

tests/baselines/reference/aliasUsedAsNameValue.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ exports.a = void 0;
3636
///<reference path='aliasUsedAsNameValue_1.ts' />
3737
var mod = require("./aliasUsedAsNameValue_0");
3838
var b = require("./aliasUsedAsNameValue_1");
39-
exports.a = function () {
39+
var a = function () {
4040
//var x = mod.id; // TODO needed hack that mod is loaded
4141
b.b(mod);
4242
};
43+
exports.a = a;

tests/baselines/reference/declarationEmitAliasExportStar.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ __exportStar(require("./thingB"), exports);
3030
"use strict";
3131
exports.__esModule = true;
3232
exports.thing2 = void 0;
33-
exports.thing2 = function (param) { return null; };
33+
var thing2 = function (param) { return null; };
34+
exports.thing2 = thing2;
3435

3536

3637
//// [thingB.d.ts]

tests/baselines/reference/declarationEmitBundleWithAmbientReferences.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@ define("conditional_directive_field", ["require", "exports"], function (require,
2929
"use strict";
3030
exports.__esModule = true;
3131
exports.build = void 0;
32-
exports.build = function () {
32+
var build = function () {
3333
return null;
3434
};
35+
exports.build = build;
3536
});
3637

3738

tests/baselines/reference/declarationEmitComputedNameCausesImportToBePainted.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ var context_1 = require("./context");
2828
exports.context = (_a = {},
2929
_a[context_1.Key] = 'bar',
3030
_a);
31-
exports.withContext = function (_a) {
31+
var withContext = function (_a) {
3232
var _b = context_1.Key, value = _a[_b];
3333
return value;
3434
};
35+
exports.withContext = withContext;
3536

3637

3738
//// [context.d.ts]

tests/baselines/reference/declarationEmitExpandoWithGenericConstraint.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ Point.zero = (): Point => Point(0, 0);
1818
"use strict";
1919
exports.__esModule = true;
2020
exports.Rect = exports.Point = void 0;
21-
exports.Point = function (x, y) { return ({ x: x, y: y }); };
22-
exports.Rect = function (a, b) { return ({ a: a, b: b }); };
21+
var Point = function (x, y) { return ({ x: x, y: y }); };
22+
exports.Point = Point;
23+
var Rect = function (a, b) { return ({ a: a, b: b }); };
24+
exports.Rect = Rect;
2325
exports.Point.zero = function () { return exports.Point(0, 0); };
2426

2527

tests/baselines/reference/declarationEmitExportAliasVisibiilityMarking.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ exports["default"] = (function (suit, rank) { return ({ suit: suit, rank: rank }
2525
"use strict";
2626
exports.__esModule = true;
2727
exports.lazyCard = void 0;
28-
exports.lazyCard = function () { return Promise.resolve().then(function () { return require('./Card'); }).then(function (a) { return a["default"]; }); };
28+
var lazyCard = function () { return Promise.resolve().then(function () { return require('./Card'); }).then(function (a) { return a["default"]; }); };
29+
exports.lazyCard = lazyCard;
2930

3031

3132
//// [Types.d.ts]

tests/baselines/reference/declarationEmitOptionalMethod.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ export const Foo = (opts: {
1111
"use strict";
1212
exports.__esModule = true;
1313
exports.Foo = void 0;
14-
exports.Foo = function (opts) { return ({}); };
14+
var Foo = function (opts) { return ({}); };
15+
exports.Foo = Foo;
1516

1617

1718
//// [declarationEmitOptionalMethod.d.ts]

tests/baselines/reference/declarationEmitRetainsJsdocyComments.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ exports.someMethod = exports.Foo = exports.foo = void 0;
5252
* comment1
5353
* @param p
5454
*/
55-
exports.foo = function (p) {
55+
var foo = function (p) {
5656
return {
5757
/**
5858
* comment2
@@ -66,6 +66,7 @@ exports.foo = function (p) {
6666
bar2: function (s) { }
6767
};
6868
};
69+
exports.foo = foo;
6970
var Foo = /** @class */ (function () {
7071
function Foo() {
7172
}

tests/baselines/reference/declarationEmitTypeAliasWithTypeParameters1.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ export const y = (x: Foo<string>) => 1
77
"use strict";
88
exports.__esModule = true;
99
exports.y = void 0;
10-
exports.y = function (x) { return 1; };
10+
var y = function (x) { return 1; };
11+
exports.y = y;
1112

1213

1314
//// [declarationEmitTypeAliasWithTypeParameters1.d.ts]

tests/baselines/reference/declarationEmitTypeAliasWithTypeParameters2.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ export const y = (x: Baa<number>) => 1
88
"use strict";
99
exports.__esModule = true;
1010
exports.y = void 0;
11-
exports.y = function (x) { return 1; };
11+
var y = function (x) { return 1; };
12+
exports.y = y;
1213

1314

1415
//// [declarationEmitTypeAliasWithTypeParameters2.d.ts]

tests/baselines/reference/declarationEmitWithInvalidPackageJsonTypings.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,11 @@ function useRef(current) {
3333
return { current: current };
3434
}
3535
exports.useRef = useRef;
36-
exports.useCsvParser = function () {
36+
var useCsvParser = function () {
3737
var parserRef = useRef(null);
3838
return parserRef;
3939
};
40+
exports.useCsvParser = useCsvParser;
4041

4142

4243
//// [index.d.ts]

tests/baselines/reference/declarationsForFileShadowingGlobalNoError.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ var __extends = (this && this.__extends) || (function () {
3939
})();
4040
exports.__esModule = true;
4141
exports.mixin = void 0;
42-
exports.mixin = function (Base) {
42+
var mixin = function (Base) {
4343
return /** @class */ (function (_super) {
4444
__extends(class_1, _super);
4545
function class_1() {
@@ -49,6 +49,7 @@ exports.mixin = function (Base) {
4949
return class_1;
5050
}(Base));
5151
};
52+
exports.mixin = mixin;
5253

5354

5455
//// [dom.d.ts]

tests/baselines/reference/declarationsWithRecursiveInternalTypesProduceUniqueTypeParams.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ var __assign = (this && this.__assign) || function () {
5757
};
5858
exports.__esModule = true;
5959
exports.testRecFun = exports.updateIfChanged = void 0;
60-
exports.updateIfChanged = function (t) {
60+
var updateIfChanged = function (t) {
6161
var reduce = function (u, update) {
6262
var set = function (newU) { return Object.is(u, newU) ? t : update(newU); };
6363
return Object.assign(function (key) {
@@ -69,15 +69,17 @@ exports.updateIfChanged = function (t) {
6969
};
7070
return reduce(t, function (t) { return t; });
7171
};
72+
exports.updateIfChanged = updateIfChanged;
7273
// example from https://github.com/microsoft/TypeScript/issues/31605
73-
exports.testRecFun = function (parent) {
74+
var testRecFun = function (parent) {
7475
return {
7576
result: parent,
7677
deeper: function (child) {
7778
return exports.testRecFun(__assign(__assign({}, parent), child));
7879
}
7980
};
8081
};
82+
exports.testRecFun = testRecFun;
8183
var p1 = exports.testRecFun({ one: '1' });
8284
void p1.result.one;
8385
var p2 = p1.deeper({ two: '2' });

tests/baselines/reference/errorsWithInvokablesInUnions01.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ export let ctor: IDirectiveLinkFn<number> | ConstructableA | IDirectivePrePost<n
2323
"use strict";
2424
exports.__esModule = true;
2525
exports.ctor = exports.blah = void 0;
26-
exports.blah = function (x) { };
26+
var blah = function (x) { };
27+
exports.blah = blah;
2728
exports.ctor = /** @class */ (function () {
2829
function class_1() {
2930
}

tests/baselines/reference/esModuleInteropImportTSLibHasImport.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ sayHello(username());
2020
"use strict";
2121
Object.defineProperty(exports, "__esModule", { value: true });
2222
exports.username = void 0;
23-
exports.username = () => 'username';
23+
const username = () => 'username';
24+
exports.username = username;
2425
//// [index.js]
2526
"use strict";
2627
Object.defineProperty(exports, "__esModule", { value: true });

tests/baselines/reference/genericIndexedAccessMethodIntersectionCanBeAccessed.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ export const createService = <T>(
2424
"use strict";
2525
exports.__esModule = true;
2626
exports.createService = void 0;
27-
exports.createService = function (ServiceCtr) {
27+
var createService = function (ServiceCtr) {
2828
Object.keys(ServiceCtr).forEach(function (key) {
2929
var method = (ServiceCtr)[key];
3030
var __$daemonMode = method.__$daemonMode, __$action = method.__$action, id = method.id;
3131
});
3232
};
33+
exports.createService = createService;

tests/baselines/reference/importCallExpressionAsyncES3AMD.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ define(["require", "exports"], function (require, exports) {
139139
return cl2;
140140
}());
141141
exports.cl2 = cl2;
142-
exports.l = function () { return __awaiter(void 0, void 0, void 0, function () {
142+
var l = function () { return __awaiter(void 0, void 0, void 0, function () {
143143
var req;
144144
return __generator(this, function (_a) {
145145
switch (_a.label) {
@@ -151,4 +151,5 @@ define(["require", "exports"], function (require, exports) {
151151
}
152152
});
153153
}); };
154+
exports.l = l;
154155
});

tests/baselines/reference/importCallExpressionAsyncES3CJS.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ var cl2 = /** @class */ (function () {
138138
return cl2;
139139
}());
140140
exports.cl2 = cl2;
141-
exports.l = function () { return __awaiter(void 0, void 0, void 0, function () {
141+
var l = function () { return __awaiter(void 0, void 0, void 0, function () {
142142
var req;
143143
return __generator(this, function (_a) {
144144
switch (_a.label) {
@@ -150,3 +150,4 @@ exports.l = function () { return __awaiter(void 0, void 0, void 0, function () {
150150
}
151151
});
152152
}); };
153+
exports.l = l;

tests/baselines/reference/importCallExpressionAsyncES3UMD.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
148148
return cl2;
149149
}());
150150
exports.cl2 = cl2;
151-
exports.l = function () { return __awaiter(void 0, void 0, void 0, function () {
151+
var l = function () { return __awaiter(void 0, void 0, void 0, function () {
152152
var req;
153153
return __generator(this, function (_a) {
154154
switch (_a.label) {
@@ -160,4 +160,5 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
160160
}
161161
});
162162
}); };
163+
exports.l = l;
163164
});

tests/baselines/reference/importCallExpressionAsyncES5AMD.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ define(["require", "exports"], function (require, exports) {
139139
return cl2;
140140
}());
141141
exports.cl2 = cl2;
142-
exports.l = function () { return __awaiter(void 0, void 0, void 0, function () {
142+
var l = function () { return __awaiter(void 0, void 0, void 0, function () {
143143
var req;
144144
return __generator(this, function (_a) {
145145
switch (_a.label) {
@@ -151,4 +151,5 @@ define(["require", "exports"], function (require, exports) {
151151
}
152152
});
153153
}); };
154+
exports.l = l;
154155
});

tests/baselines/reference/importCallExpressionAsyncES5CJS.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ var cl2 = /** @class */ (function () {
138138
return cl2;
139139
}());
140140
exports.cl2 = cl2;
141-
exports.l = function () { return __awaiter(void 0, void 0, void 0, function () {
141+
var l = function () { return __awaiter(void 0, void 0, void 0, function () {
142142
var req;
143143
return __generator(this, function (_a) {
144144
switch (_a.label) {
@@ -150,3 +150,4 @@ exports.l = function () { return __awaiter(void 0, void 0, void 0, function () {
150150
}
151151
});
152152
}); };
153+
exports.l = l;

tests/baselines/reference/importCallExpressionAsyncES5UMD.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
148148
return cl2;
149149
}());
150150
exports.cl2 = cl2;
151-
exports.l = function () { return __awaiter(void 0, void 0, void 0, function () {
151+
var l = function () { return __awaiter(void 0, void 0, void 0, function () {
152152
var req;
153153
return __generator(this, function (_a) {
154154
switch (_a.label) {
@@ -160,4 +160,5 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
160160
}
161161
});
162162
}); };
163+
exports.l = l;
163164
});

tests/baselines/reference/importCallExpressionAsyncES6AMD.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ define(["require", "exports"], function (require, exports) {
7171
}
7272
}
7373
exports.cl2 = cl2;
74-
exports.l = () => __awaiter(void 0, void 0, void 0, function* () {
74+
const l = () => __awaiter(void 0, void 0, void 0, function* () {
7575
const req = yield new Promise((resolve_5, reject_5) => { require(['./test'], resolve_5, reject_5); }); // FIVE
7676
});
77+
exports.l = l;
7778
});

tests/baselines/reference/importCallExpressionAsyncES6CJS.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class cl2 {
7070
}
7171
}
7272
exports.cl2 = cl2;
73-
exports.l = () => __awaiter(void 0, void 0, void 0, function* () {
73+
const l = () => __awaiter(void 0, void 0, void 0, function* () {
7474
const req = yield Promise.resolve().then(() => require('./test')); // FIVE
7575
});
76+
exports.l = l;

tests/baselines/reference/importCallExpressionAsyncES6UMD.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8080
}
8181
}
8282
exports.cl2 = cl2;
83-
exports.l = () => __awaiter(void 0, void 0, void 0, function* () {
83+
const l = () => __awaiter(void 0, void 0, void 0, function* () {
8484
const req = yield __syncRequire ? Promise.resolve().then(() => require('./test')) : new Promise((resolve_5, reject_5) => { require(['./test'], resolve_5, reject_5); }); // FIVE
8585
});
86+
exports.l = l;
8687
});

tests/baselines/reference/inlineJsxFactoryDeclarationsLocalTypes.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,14 @@ exports.__esModule = true;
9494
exports.tree = exports.MyClass = exports.MySFC = void 0;
9595
/** @jsx predom */
9696
var renderer2_1 = require("./renderer2");
97-
exports.MySFC = function (props) { return renderer2_1.predom("p", null,
97+
var MySFC = function (props) { return renderer2_1.predom("p", null,
9898
props.x,
9999
" + ",
100100
props.y,
101101
" = ",
102102
props.x + props.y,
103103
_this.props.children); };
104+
exports.MySFC = MySFC;
104105
var MyClass = /** @class */ (function () {
105106
function MyClass(props) {
106107
this.props = props;

0 commit comments

Comments
 (0)