@@ -4,6 +4,8 @@ import { cache, performanceLog } from "../common/decorators";
4
4
import { EventEmitter } from "events" ;
5
5
6
6
export class RunController extends EventEmitter implements IRunController {
7
+ private prepareReadyEventHandler : any = null ;
8
+
7
9
constructor (
8
10
protected $analyticsService : IAnalyticsService ,
9
11
private $buildController : IBuildController ,
@@ -23,6 +25,7 @@ export class RunController extends EventEmitter implements IRunController {
23
25
private $prepareController : IPrepareController ,
24
26
private $prepareDataService : IPrepareDataService ,
25
27
private $prepareNativePlatformService : IPrepareNativePlatformService ,
28
+ private $projectChangesService : IProjectChangesService ,
26
29
protected $projectDataService : IProjectDataService
27
30
) {
28
31
super ( ) ;
@@ -45,9 +48,21 @@ export class RunController extends EventEmitter implements IRunController {
45
48
this . $hmrStatusService . attachToHmrStatusEvent ( ) ;
46
49
}
47
50
48
- this . $prepareController . on ( PREPARE_READY_EVENT_NAME , async data => {
49
- await this . syncChangedDataOnDevices ( data , projectData , liveSyncInfo , deviceDescriptors ) ;
50
- } ) ;
51
+ if ( ! this . prepareReadyEventHandler ) {
52
+ this . prepareReadyEventHandler = async ( data : IFilesChangeEventData ) => {
53
+ if ( data . hasNativeChanges ) {
54
+ const platformData = this . $platformsDataService . getPlatformData ( data . platform , projectData ) ;
55
+ const prepareData = this . $prepareDataService . getPrepareData ( liveSyncInfo . projectDir , data . platform , { ...liveSyncInfo , watch : ! liveSyncInfo . skipWatcher } ) ;
56
+ const changesInfo = await this . $projectChangesService . checkForChanges ( platformData , projectData , prepareData ) ;
57
+ if ( changesInfo . hasChanges ) {
58
+ await this . syncChangedDataOnDevices ( data , projectData , liveSyncInfo ) ;
59
+ }
60
+ } else {
61
+ await this . syncChangedDataOnDevices ( data , projectData , liveSyncInfo ) ;
62
+ }
63
+ } ;
64
+ this . $prepareController . on ( PREPARE_READY_EVENT_NAME , this . prepareReadyEventHandler . bind ( this ) ) ;
65
+ }
51
66
52
67
await this . syncInitialDataOnDevices ( projectData , liveSyncInfo , deviceDescriptorsForInitialSync ) ;
53
68
@@ -58,6 +73,7 @@ export class RunController extends EventEmitter implements IRunController {
58
73
const { projectDir, deviceIdentifiers, stopOptions } = data ;
59
74
const liveSyncProcessInfo = this . $liveSyncProcessDataService . getPersistedData ( projectDir ) ;
60
75
if ( liveSyncProcessInfo && ! liveSyncProcessInfo . isStopped ) {
76
+
61
77
// In case we are coming from error during livesync, the current action is the one that erred (but we are still executing it),
62
78
// so we cannot await it as this will cause infinite loop.
63
79
const shouldAwaitPendingOperation = ! stopOptions || stopOptions . shouldAwaitAllActions ;
@@ -94,6 +110,11 @@ export class RunController extends EventEmitter implements IRunController {
94
110
95
111
liveSyncProcessInfo . deviceDescriptors = [ ] ;
96
112
113
+ if ( this . prepareReadyEventHandler ) {
114
+ this . removeListener ( PREPARE_READY_EVENT_NAME , this . prepareReadyEventHandler ) ;
115
+ this . prepareReadyEventHandler = null ;
116
+ }
117
+
97
118
const projectData = this . $projectDataService . getProjectData ( projectDir ) ;
98
119
await this . $hooksService . executeAfterHooks ( 'watch' , {
99
120
hookArgs : {
@@ -313,10 +334,11 @@ export class RunController extends EventEmitter implements IRunController {
313
334
await this . addActionToChain ( projectData . projectDir , ( ) => this . $devicesService . execute ( deviceAction , ( device : Mobile . IDevice ) => _ . some ( deviceDescriptors , deviceDescriptor => deviceDescriptor . identifier === device . deviceInfo . identifier ) ) ) ;
314
335
}
315
336
316
- private async syncChangedDataOnDevices ( data : IFilesChangeEventData , projectData : IProjectData , liveSyncInfo : ILiveSyncInfo , deviceDescriptors : ILiveSyncDeviceDescriptor [ ] ) : Promise < void > {
337
+ private async syncChangedDataOnDevices ( data : IFilesChangeEventData , projectData : IProjectData , liveSyncInfo : ILiveSyncInfo ) : Promise < void > {
317
338
const rebuiltInformation : IDictionary < { packageFilePath : string , platform : string , isEmulator : boolean } > = { } ;
318
339
319
340
const deviceAction = async ( device : Mobile . IDevice ) => {
341
+ const deviceDescriptors = this . $liveSyncProcessDataService . getDeviceDescriptors ( projectData . projectDir ) ;
320
342
const deviceDescriptor = _ . find ( deviceDescriptors , dd => dd . identifier === device . deviceInfo . identifier ) ;
321
343
const platformData = this . $platformsDataService . getPlatformData ( data . platform , projectData ) ;
322
344
const prepareData = this . $prepareDataService . getPrepareData ( liveSyncInfo . projectDir , device . deviceInfo . platform ,
0 commit comments