Skip to content

Commit 9864b4e

Browse files
author
Kanchalai Tanglertsampan
committed
Emit import callExpression for UMD and AMD
1 parent a84645c commit 9864b4e

3 files changed

Lines changed: 85 additions & 3 deletions

File tree

src/compiler/transformers/module/module.ts

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -501,13 +501,73 @@ namespace ts {
501501
}
502502
}
503503

504-
function visitImportCallExpression(node: ImportCallExpression): Expression{
504+
function visitImportCallExpression(node: ImportCallExpression): Expression {
505+
switch (compilerOptions.module) {
506+
case ModuleKind.CommonJS:
507+
return transformImportCallExpressionCommonJS(node);
508+
case ModuleKind.AMD:
509+
return transformImportCallExpressionAMD(node);
510+
case ModuleKind.UMD:
511+
return transformImportCallExpressionUMD(node);
512+
}
513+
Debug.assert(false, "All supported module kind in this transformation step should have been handled");
514+
}
515+
516+
function transformImportCallExpressionUMD(node: ImportCallExpression): Expression {
517+
// (function (factory) {
518+
// ... (regular UMD)
519+
// }
520+
// })(function (require, exports, useSyncRequire) {
521+
// "use strict";
522+
// Object.defineProperty(exports, "__esModule", { value: true });
523+
// require.length === 1 ?
524+
// /*CommonJs Require*/ Promise.resolve().then(() => require('blah'));
525+
// /*Amd Require*/ new Promise(resolve => require(['blah'], resolve));
526+
// });
527+
const require = createIdentifier("require");
528+
return createConditional(
529+
/*condition*/ createBinary(createPropertyAccess(require, /*name*/ "length"), /*operator*/ createToken(SyntaxKind.EqualsEqualsEqualsToken), createNumericLiteral("1")),
530+
/*whenTrue*/ transformImportCallExpressionCommonJS(node),
531+
/*whenFalse*/ transformImportCallExpressionAMD(node)
532+
);
533+
}
534+
535+
function transformImportCallExpressionAMD(node: ImportCallExpression): Expression {
536+
// improt("./blah")
537+
// emit as
538+
// define(["require", "exports", "blah"], function (require, exports) {
539+
// ...
540+
// new Promise(resolve => require(['blah'], resolve));
541+
// });
542+
const resolve = createIdentifier("resolve");
543+
return createNew(
544+
createIdentifier("Promise"),
545+
/*typeArguments*/ undefined,
546+
[
547+
createArrowFunction(
548+
/*modifiers*/undefined,
549+
/*typeParameters*/ undefined,
550+
[createParameter(/*decorator*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, /*name*/ resolve)],
551+
/*type*/ undefined,
552+
createToken(SyntaxKind.EqualsGreaterThanToken),
553+
createCall(createIdentifier("require"), /*typeArguments*/ undefined, [createArrayLiteral([node.specifier]), resolve])
554+
)
555+
]
556+
);
557+
}
558+
559+
function transformImportCallExpressionCommonJS(node: ImportCallExpression): Expression {
560+
// import("./blah")
561+
// emit as
562+
// Promise.resolve().then(() => require("./blah"));
563+
// We have to wrap require in then callback so that require is done in asynchronously
564+
// if we simply do require in resolve callback in Promise constructor. We will execute the loading immediately
505565
return createCall(
506566
createPropertyAccess(
507-
createCall(/*expression*/ createPropertyAccess(createIdentifier("Promise"), "resolve"), /*typeArguments*/ undefined, /*argumentsArray*/ []),
567+
createCall(/*expression*/ createPropertyAccess(createIdentifier("Promise"), "resolve"), /*typeArguments*/ undefined, /*argumentsArray*/[]),
508568
"then"),
509569
/*typeArguments*/ undefined,
510-
[ createArrowFunction(/*modifiers*/ undefined, /*typeParameters*/ undefined, /*parameters*/ undefined, /*type*/ undefined, createToken(SyntaxKind.EqualsGreaterThanToken), createCall(createIdentifier("require"), /*typeArguments*/ undefined, [node.specifier]))]
570+
[createArrowFunction(/*modifiers*/ undefined, /*typeParameters*/ undefined, /*parameters*/ undefined, /*type*/ undefined, createToken(SyntaxKind.EqualsGreaterThanToken), createCall(createIdentifier("require"), /*typeArguments*/ undefined, [node.specifier]))]
511571
);
512572
}
513573

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// @module: amd
2+
// @target: esnext
3+
// @filename: 0.ts
4+
export function foo() { return "foo"; }
5+
6+
// @filename: 1.ts
7+
import("./0");
8+
var p1 = import("./0");
9+
p1.then(zero => {
10+
return zero.foo();
11+
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// @module: umd
2+
// @target: esnext
3+
// @filename: 0.ts
4+
export function foo() { return "foo"; }
5+
6+
// @filename: 1.ts
7+
import("./0");
8+
var p1 = import("./0");
9+
p1.then(zero => {
10+
return zero.foo();
11+
});

0 commit comments

Comments
 (0)