Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 35e2289

Browse filesBrowse 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
Copy full SHA for 35e2289

1 file changed

+56-23Lines changed: 56 additions & 23 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎src/compiler/transformers/module/module.ts‎

Copy file name to clipboardExpand all lines: src/compiler/transformers/module/module.ts
+56-23Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.