@@ -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
0 commit comments