Skip to content

Commit 35e2289

Browse files
author
Kanchalai Tanglertsampan
committed
Address PR:
don't use Promise.resolve, capture reject in AMD require callback, create helper for UMD don't use arrow function
1 parent 742d515 commit 35e2289

File tree

1 file changed

+56
-23
lines changed

1 file changed

+56
-23
lines changed

src/compiler/transformers/module/module.ts

Lines changed: 56 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ namespace ts {
4646
let currentSourceFile: SourceFile; // The current file.
4747
let currentModuleInfo: ExternalModuleInfo; // The ExternalModuleInfo for the current file.
4848
let noSubstitution: boolean[]; // Set of nodes for which substitution rules should be ignored.
49+
let needUMDDynamicImportHelper: boolean;
4950

5051
return transformSourceFile;
5152

@@ -66,9 +67,9 @@ namespace ts {
6667
// Perform the transformation.
6768
const transformModule = getTransformModuleDelegate(moduleKind);
6869
const updated = transformModule(node);
69-
7070
currentSourceFile = undefined;
7171
currentModuleInfo = undefined;
72+
needUMDDynamicImportHelper = false;
7273
return aggregateTransformFlags(updated);
7374
}
7475

@@ -107,6 +108,7 @@ namespace ts {
107108
// we need to inform the emitter to add the __export helper.
108109
addEmitHelper(updated, exportStarHelper);
109110
}
111+
addEmitHelpers(updated, context.readEmitHelpers());
110112
return updated;
111113
}
112114

@@ -411,6 +413,9 @@ namespace ts {
411413
// we need to inform the emitter to add the __export helper.
412414
addEmitHelper(body, exportStarHelper);
413415
}
416+
if (needUMDDynamicImportHelper) {
417+
addEmitHelper(body, dynamicImportUMDHelper);
418+
}
414419

415420
return body;
416421
}
@@ -526,13 +531,16 @@ namespace ts {
526531
// })(function (require, exports, useSyncRequire) {
527532
// "use strict";
528533
// Object.defineProperty(exports, "__esModule", { value: true });
529-
// require.length === 1 ?
530-
// /*CommonJs Require*/ Promise.resolve().then(() => require('blah'));
531-
// /*Amd Require*/ new Promise(resolve => require(['blah'], resolve));
534+
// var __syncRequire = typeof module === "object" && typeof module.exports === "object";
535+
// var __resolved = new Promise(function (resolve) { resolve(); });
536+
// .....
537+
// __syncRequire
538+
// ? __resolved.then(function () { return require(x); }) /*CommonJs Require*/
539+
// : new Promise(function (_a, _b) { require([x], _a, _b); }); /*Amd Require*/
532540
// });
533-
const require = createIdentifier("require");
541+
needUMDDynamicImportHelper = true;
534542
return createConditional(
535-
/*condition*/ createBinary(createPropertyAccess(require, /*name*/ "length"), /*operator*/ createToken(SyntaxKind.EqualsEqualsEqualsToken), createNumericLiteral("1")),
543+
/*condition*/ createIdentifier("__syncRequire"),
536544
/*whenTrue*/ transformImportCallExpressionCommonJS(node),
537545
/*whenFalse*/ transformImportCallExpressionAMD(node)
538546
);
@@ -543,43 +551,52 @@ namespace ts {
543551
// emit as
544552
// define(["require", "exports", "blah"], function (require, exports) {
545553
// ...
546-
// new Promise(resolve => require(['blah'], resolve));
554+
// new Promise(function (_a, _b) { require([x], _a, _b); }); /*Amd Require*/
547555
// });
548-
const resolve = createIdentifier("resolve");
556+
const resolve = createIdentifier("_a");
557+
const reject = createIdentifier("_b");
549558
return createNew(
550559
createIdentifier("Promise"),
551560
/*typeArguments*/ undefined,
552-
[createArrowFunction(
553-
/*modifiers*/undefined,
561+
[createFunctionExpression(
562+
/*modifiers*/ undefined,
563+
/*asteriskToken*/ undefined,
564+
/*name*/ undefined,
554565
/*typeParameters*/ undefined,
555-
[createParameter(/*decorator*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, /*name*/ resolve)],
566+
[createParameter(/*decorator*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, /*name*/ resolve),
567+
createParameter(/*decorator*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, /*name*/ reject)],
556568
/*type*/ undefined,
557-
createToken(SyntaxKind.EqualsGreaterThanToken),
558-
createCall(createIdentifier("require"), /*typeArguments*/ undefined, [createArrayLiteral(node.arguments), resolve]))
559-
]);
569+
createBlock([createStatement(
570+
createCall(
571+
createIdentifier("require"),
572+
/*typeArguments*/ undefined,
573+
[createArrayLiteral(node.arguments), resolve, reject]
574+
))])
575+
)]);
560576
}
561577

562578
function transformImportCallExpressionCommonJS(node: ImportCall): Expression {
563579
// import("./blah")
564580
// emit as
581+
// var __resolved = new Promise(function (resolve) { resolve(); });
582+
// ....
583+
// __resolved.then(function () { return require(x); }) /*CommonJs Require*/
584+
565585
// Promise.resolve().then(() => require("./blah"));
566586
// We have to wrap require in then callback so that require is done in asynchronously
567587
// if we simply do require in resolve callback in Promise constructor. We will execute the loading immediately
588+
context.requestEmitHelper(dynamicImportCreateResolvedHelper);
568589
return createCall(
569-
createPropertyAccess(
570-
createCall(
571-
createPropertyAccess(createIdentifier("Promise"), "resolve"),
572-
/*typeArguments*/ undefined,
573-
/*argumentsArray*/[]
574-
), "then"),
590+
createPropertyAccess(createIdentifier("__resolved"), "then"),
575591
/*typeArguments*/ undefined,
576-
[createArrowFunction(
592+
[createFunctionExpression(
577593
/*modifiers*/ undefined,
594+
/*asteriskToken*/ undefined,
595+
/*name*/ undefined,
578596
/*typeParameters*/ undefined,
579597
/*parameters*/ undefined,
580598
/*type*/ undefined,
581-
createToken(SyntaxKind.EqualsGreaterThanToken),
582-
createCall(createIdentifier("require"), /*typeArguments*/ undefined, node.arguments)
599+
createBlock([createReturn(createCall(createIdentifier("require"), /*typeArguments*/ undefined, node.arguments))])
583600
)]);
584601
}
585602

@@ -1586,4 +1603,20 @@ namespace ts {
15861603
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
15871604
}`
15881605
};
1606+
1607+
// emit helper for dynamic import
1608+
const dynamicImportUMDHelper: EmitHelper = {
1609+
name: "typescript:dynamicimport-sync-require",
1610+
scoped: true,
1611+
text: `
1612+
var __syncRequire = typeof module === "object" && typeof module.exports === "object";
1613+
var __resolved = new Promise(function (resolve) { resolve(); });`
1614+
};
1615+
1616+
const dynamicImportCreateResolvedHelper: EmitHelper = {
1617+
name: "typescript:dynamicimport-create-resolved",
1618+
scoped: false,
1619+
priority: 1,
1620+
text: `var __resolved = new Promise(function (resolve) { resolve(); });`
1621+
};
15891622
}

0 commit comments

Comments
 (0)