@@ -46,6 +46,7 @@ namespace ts {
46
46
let currentSourceFile : SourceFile ; // The current file.
47
47
let currentModuleInfo : ExternalModuleInfo ; // The ExternalModuleInfo for the current file.
48
48
let noSubstitution : boolean [ ] ; // Set of nodes for which substitution rules should be ignored.
49
+ let needUMDDynamicImportHelper : boolean ;
49
50
50
51
return transformSourceFile ;
51
52
@@ -66,9 +67,9 @@ namespace ts {
66
67
// Perform the transformation.
67
68
const transformModule = getTransformModuleDelegate ( moduleKind ) ;
68
69
const updated = transformModule ( node ) ;
69
-
70
70
currentSourceFile = undefined ;
71
71
currentModuleInfo = undefined ;
72
+ needUMDDynamicImportHelper = false ;
72
73
return aggregateTransformFlags ( updated ) ;
73
74
}
74
75
@@ -107,6 +108,7 @@ namespace ts {
107
108
// we need to inform the emitter to add the __export helper.
108
109
addEmitHelper ( updated , exportStarHelper ) ;
109
110
}
111
+ addEmitHelpers ( updated , context . readEmitHelpers ( ) ) ;
110
112
return updated ;
111
113
}
112
114
@@ -411,6 +413,9 @@ namespace ts {
411
413
// we need to inform the emitter to add the __export helper.
412
414
addEmitHelper ( body , exportStarHelper ) ;
413
415
}
416
+ if ( needUMDDynamicImportHelper ) {
417
+ addEmitHelper ( body , dynamicImportUMDHelper ) ;
418
+ }
414
419
415
420
return body ;
416
421
}
@@ -526,13 +531,16 @@ namespace ts {
526
531
// })(function (require, exports, useSyncRequire) {
527
532
// "use strict";
528
533
// 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*/
532
540
// });
533
- const require = createIdentifier ( "require" ) ;
541
+ needUMDDynamicImportHelper = true ;
534
542
return createConditional (
535
- /*condition*/ createBinary ( createPropertyAccess ( require , /*name*/ "length" ) , /*operator*/ createToken ( SyntaxKind . EqualsEqualsEqualsToken ) , createNumericLiteral ( "1" ) ) ,
543
+ /*condition*/ createIdentifier ( "__syncRequire" ) ,
536
544
/*whenTrue*/ transformImportCallExpressionCommonJS ( node ) ,
537
545
/*whenFalse*/ transformImportCallExpressionAMD ( node )
538
546
) ;
@@ -543,43 +551,52 @@ namespace ts {
543
551
// emit as
544
552
// define(["require", "exports", "blah"], function (require, exports) {
545
553
// ...
546
- // new Promise(resolve => require(['blah' ], resolve));
554
+ // new Promise(function (_a, _b) { require([x ], _a, _b); }); /*Amd Require*/
547
555
// });
548
- const resolve = createIdentifier ( "resolve" ) ;
556
+ const resolve = createIdentifier ( "_a" ) ;
557
+ const reject = createIdentifier ( "_b" ) ;
549
558
return createNew (
550
559
createIdentifier ( "Promise" ) ,
551
560
/*typeArguments*/ undefined ,
552
- [ createArrowFunction (
553
- /*modifiers*/ undefined ,
561
+ [ createFunctionExpression (
562
+ /*modifiers*/ undefined ,
563
+ /*asteriskToken*/ undefined ,
564
+ /*name*/ undefined ,
554
565
/*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 ) ] ,
556
568
/*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
+ ) ] ) ;
560
576
}
561
577
562
578
function transformImportCallExpressionCommonJS ( node : ImportCall ) : Expression {
563
579
// import("./blah")
564
580
// emit as
581
+ // var __resolved = new Promise(function (resolve) { resolve(); });
582
+ // ....
583
+ // __resolved.then(function () { return require(x); }) /*CommonJs Require*/
584
+
565
585
// Promise.resolve().then(() => require("./blah"));
566
586
// We have to wrap require in then callback so that require is done in asynchronously
567
587
// if we simply do require in resolve callback in Promise constructor. We will execute the loading immediately
588
+ context . requestEmitHelper ( dynamicImportCreateResolvedHelper ) ;
568
589
return createCall (
569
- createPropertyAccess (
570
- createCall (
571
- createPropertyAccess ( createIdentifier ( "Promise" ) , "resolve" ) ,
572
- /*typeArguments*/ undefined ,
573
- /*argumentsArray*/ [ ]
574
- ) , "then" ) ,
590
+ createPropertyAccess ( createIdentifier ( "__resolved" ) , "then" ) ,
575
591
/*typeArguments*/ undefined ,
576
- [ createArrowFunction (
592
+ [ createFunctionExpression (
577
593
/*modifiers*/ undefined ,
594
+ /*asteriskToken*/ undefined ,
595
+ /*name*/ undefined ,
578
596
/*typeParameters*/ undefined ,
579
597
/*parameters*/ undefined ,
580
598
/*type*/ undefined ,
581
- createToken ( SyntaxKind . EqualsGreaterThanToken ) ,
582
- createCall ( createIdentifier ( "require" ) , /*typeArguments*/ undefined , node . arguments )
599
+ createBlock ( [ createReturn ( createCall ( createIdentifier ( "require" ) , /*typeArguments*/ undefined , node . arguments ) ) ] )
583
600
) ] ) ;
584
601
}
585
602
@@ -1586,4 +1603,20 @@ namespace ts {
1586
1603
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
1587
1604
}`
1588
1605
} ;
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
+ } ;
1589
1622
}
0 commit comments