@@ -42,6 +42,7 @@ interface Scope {
4242export interface EmitResolver {
4343 isValueAliasDeclaration ( node : ts . Node ) : boolean ;
4444 isReferencedAliasDeclaration ( node : ts . Node , checkChildren ?: boolean ) : boolean ;
45+ isTopLevelValueImportEqualsWithEntityName ( node : ts . ImportEqualsDeclaration ) : boolean ;
4546 moduleExportsSomeValue ( moduleReferenceExpression : ts . Expression ) : boolean ;
4647}
4748
@@ -462,21 +463,38 @@ export class LuaTransformer {
462463
463464 public transformImportEqualsDeclaration ( declaration : ts . ImportEqualsDeclaration ) : StatementVisitResult {
464465 const name = this . transformIdentifier ( declaration . name ) ;
465- const expression = ts . isExternalModuleReference ( declaration . moduleReference )
466- ? this . transformExternalModuleReference ( declaration . moduleReference )
467- : this . transformEntityName ( declaration . moduleReference ) ;
466+ let expression : tstl . Expression ;
467+ if ( ts . isExternalModuleReference ( declaration . moduleReference ) ) {
468+ if ( ! this . resolver . isReferencedAliasDeclaration ( declaration ) ) {
469+ return undefined ;
470+ }
471+
472+ expression = this . transformExternalModuleReference ( declaration . moduleReference ) ;
473+ } else {
474+ if ( this . currentSourceFile === undefined ) {
475+ throw TSTLErrors . MissingSourceFile ( ) ;
476+ }
477+
478+ const shouldEmit =
479+ this . resolver . isReferencedAliasDeclaration ( declaration ) ||
480+ ( ! ts . isExternalModule ( this . currentSourceFile ) &&
481+ this . resolver . isTopLevelValueImportEqualsWithEntityName ( declaration ) ) ;
482+
483+ if ( ! shouldEmit ) {
484+ return undefined ;
485+ }
486+
487+ expression = this . transformEntityName ( declaration . moduleReference ) ;
488+ }
468489
469490 return this . createHoistableVariableDeclarationStatement ( name , expression , declaration ) ;
470491 }
471492
472493 public transformExternalModuleReference (
473494 externalModuleReference : ts . ExternalModuleReference
474495 ) : ExpressionVisitResult {
475- return tstl . createCallExpression (
476- tstl . createIdentifier ( "require" ) ,
477- [ this . transformExpression ( externalModuleReference . expression ) ] ,
478- externalModuleReference
479- ) ;
496+ // TODO: Should `externalModuleReference` be original node?
497+ return this . createModuleRequire ( externalModuleReference . expression as ts . StringLiteral ) ;
480498 }
481499
482500 private transformEntityName ( entityName : ts . EntityName ) : ExpressionVisitResult {
0 commit comments