@@ -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