@@ -66,6 +66,10 @@ namespace ts {
66
66
* Already seen affected files
67
67
*/
68
68
seenEmittedFiles : Map < true > | undefined ;
69
+ /**
70
+ * true if program has been emitted
71
+ */
72
+ programEmitComplete ?: true ;
69
73
}
70
74
71
75
function hasSameKeys < T , U > ( map1 : ReadonlyMap < T > | undefined , map2 : ReadonlyMap < U > | undefined ) : boolean {
@@ -352,6 +356,7 @@ namespace ts {
352
356
function doneWithAffectedFile ( state : BuilderProgramState , affected : SourceFile | Program , isPendingEmit ?: boolean ) {
353
357
if ( affected === state . program ) {
354
358
state . changedFilesSet . clear ( ) ;
359
+ state . programEmitComplete = true ;
355
360
}
356
361
else {
357
362
state . seenAffectedFiles ! . set ( ( affected as SourceFile ) . path , true ) ;
@@ -487,12 +492,22 @@ namespace ts {
487
492
let affected = getNextAffectedFile ( state , cancellationToken , computeHash ) ;
488
493
let isPendingEmitFile = false ;
489
494
if ( ! affected ) {
490
- affected = getNextAffectedFilePendingEmit ( state ) ;
491
- // Done
492
- if ( ! affected ) {
493
- return undefined ;
495
+ if ( ! state . compilerOptions . out && ! state . compilerOptions . outFile ) {
496
+ affected = getNextAffectedFilePendingEmit ( state ) ;
497
+ if ( ! affected ) {
498
+ return undefined ;
499
+ }
500
+ isPendingEmitFile = true ;
501
+ }
502
+ else {
503
+ const program = Debug . assertDefined ( state . program ) ;
504
+ // Check if program uses any prepend project references, if thats the case we cant track of the js files of those, so emit even though there are no changes
505
+ if ( state . programEmitComplete || ! some ( program . getProjectReferences ( ) , ref => ! ! ref . prepend ) ) {
506
+ state . programEmitComplete = true ;
507
+ return undefined ;
508
+ }
509
+ affected = program ;
494
510
}
495
- isPendingEmitFile = true ;
496
511
}
497
512
498
513
// Mark seen emitted files if there are pending files to be emitted
0 commit comments