11import * as path from "path" ;
22import { Device , FilesPayload } from "nativescript-preview-sdk" ;
3- import { APP_RESOURCES_FOLDER_NAME , APP_FOLDER_NAME , TrackActionNames } from "../../../constants" ;
3+ import { APP_RESOURCES_FOLDER_NAME , APP_FOLDER_NAME , TrackActionNames , FILES_CHANGE_EVENT_NAME } from "../../../constants" ;
44import { PreviewAppLiveSyncEvents } from "./preview-app-constants" ;
55import { HmrConstants } from "../../../common/constants" ;
66import { stringify } from "../../../common/helpers" ;
77import { EventEmitter } from "events" ;
88import { performanceLog } from "../../../common/decorators" ;
9+ import { WorkflowDataService } from "../../workflow/workflow-data-service" ;
10+ import { PlatformWatcherService } from "../../platform/platform-watcher-service" ;
911
1012export class PreviewAppLiveSyncService extends EventEmitter implements IPreviewAppLiveSyncService {
1113
1214 private deviceInitializationPromise : IDictionary < Promise < FilesPayload > > = { } ;
15+ private promise = Promise . resolve ( ) ;
1316
1417 constructor (
1518 private $analyticsService : IAnalyticsService ,
1619 private $errors : IErrors ,
17- private $hooksService : IHooksService ,
20+ private $hmrStatusService : IHmrStatusService ,
1821 private $logger : ILogger ,
1922 private $platformsData : IPlatformsData ,
23+ private $platformWatcherService : PlatformWatcherService ,
2024 private $projectDataService : IProjectDataService ,
2125 private $previewSdkService : IPreviewSdkService ,
2226 private $previewAppFilesService : IPreviewAppFilesService ,
2327 private $previewAppPluginsService : IPreviewAppPluginsService ,
2428 private $previewDevicesService : IPreviewDevicesService ,
25- private $hmrStatusService : IHmrStatusService ) {
26- super ( ) ;
27- }
29+ private $workflowDataService : WorkflowDataService
30+ ) { super ( ) ; }
2831
2932 @performanceLog ( )
3033 public async initialize ( data : IPreviewAppLiveSyncData ) : Promise < void > {
@@ -46,7 +49,15 @@ export class PreviewAppLiveSyncService extends EventEmitter implements IPreviewA
4649 } ) ;
4750 }
4851
49- this . deviceInitializationPromise [ device . id ] = this . getInitialFilesForDevice ( data , device ) ;
52+ this . deviceInitializationPromise [ device . id ] = this . getInitialFilesForPlatformSafe ( data , device . platform ) ;
53+
54+ this . $platformWatcherService . on ( FILES_CHANGE_EVENT_NAME , async ( filesChangeData : IFilesChangeEventData ) => {
55+ await this . onWebpackCompilationComplete ( data , filesChangeData . hmrData , filesChangeData . files , device . platform ) ;
56+ } ) ;
57+
58+ const { nativePlatformData, projectData, preparePlatformData } = this . $workflowDataService . createWorkflowData ( device . platform . toLowerCase ( ) , data . projectDir , data ) ;
59+ await this . $platformWatcherService . startWatchers ( nativePlatformData , projectData , preparePlatformData ) ;
60+
5061 try {
5162 const payloads = await this . deviceInitializationPromise [ device . id ] ;
5263 return payloads ;
@@ -89,38 +100,6 @@ export class PreviewAppLiveSyncService extends EventEmitter implements IPreviewA
89100 this . $previewDevicesService . updateConnectedDevices ( [ ] ) ;
90101 }
91102
92- private async getInitialFilesForDevice ( data : IPreviewAppLiveSyncData , device : Device ) : Promise < FilesPayload > {
93- const hookArgs = this . getHookArgs ( data , device ) ;
94- await this . $hooksService . executeBeforeHooks ( "preview-sync" , { hookArgs } ) ;
95- await this . $previewAppPluginsService . comparePluginsOnDevice ( data , device ) ;
96- const payloads = await this . getInitialFilesForPlatformSafe ( data , device . platform ) ;
97- return payloads ;
98- }
99-
100- private getHookArgs ( data : IPreviewAppLiveSyncData , device : Device ) {
101- const filesToSyncMap : IDictionary < string [ ] > = { } ;
102- const hmrData : IDictionary < IPlatformHmrData > = { } ;
103- const promise = Promise . resolve ( ) ;
104- const result = {
105- projectData : this . $projectDataService . getProjectData ( data . projectDir ) ,
106- hmrData,
107- config : {
108- env : data . env ,
109- platform : device . platform ,
110- appFilesUpdaterOptions : {
111- bundle : data . bundle ,
112- useHotModuleReload : data . useHotModuleReload ,
113- release : false
114- } ,
115- } ,
116- externals : this . $previewAppPluginsService . getExternalPlugins ( device ) ,
117- filesToSyncMap,
118- startSyncFilesTimeout : async ( platform : string ) => await this . onWebpackCompilationComplete ( data , hmrData , filesToSyncMap , promise , platform )
119- } ;
120-
121- return result ;
122- }
123-
124103 private async getInitialFilesForPlatformSafe ( data : IPreviewAppLiveSyncData , platform : string ) : Promise < FilesPayload > {
125104 this . $logger . info ( `Start sending initial files for platform ${ platform } .` ) ;
126105
@@ -153,21 +132,20 @@ export class PreviewAppLiveSyncService extends EventEmitter implements IPreviewA
153132 }
154133
155134 @performanceLog ( )
156- private async onWebpackCompilationComplete ( data : IPreviewAppLiveSyncData , hmrData : IDictionary < IPlatformHmrData > , filesToSyncMap : IDictionary < string [ ] > , promise : Promise < void > , platform : string ) {
157- await promise
135+ private async onWebpackCompilationComplete ( data : IPreviewAppLiveSyncData , hmrData : IPlatformHmrData , files : string [ ] , platform : string ) {
136+ await this . promise
158137 . then ( async ( ) => {
159- const currentHmrData = _ . cloneDeep ( hmrData ) ;
160- const platformHmrData = currentHmrData [ platform ] || < any > { } ;
138+ const platformHmrData = _ . cloneDeep ( hmrData ) ;
161139 const projectData = this . $projectDataService . getProjectData ( data . projectDir ) ;
162140 const platformData = this . $platformsData . getPlatformData ( platform , projectData ) ;
163- const clonedFiles = _ . cloneDeep ( filesToSyncMap [ platform ] ) ;
141+ const clonedFiles = _ . cloneDeep ( files ) ;
164142 const filesToSync = _ . map ( clonedFiles , fileToSync => {
165143 const result = path . join ( platformData . appDestinationDirectoryPath , APP_FOLDER_NAME , path . relative ( projectData . getAppDirectoryPath ( ) , fileToSync ) ) ;
166144 return result ;
167145 } ) ;
168146
169- promise = this . syncFilesForPlatformSafe ( data , { filesToSync } , platform ) ;
170- await promise ;
147+ this . promise = this . syncFilesForPlatformSafe ( data , { filesToSync } , platform ) ;
148+ await this . promise ;
171149
172150 if ( data . useHotModuleReload && platformHmrData . hash ) {
173151 const devices = this . $previewDevicesService . getDevicesForPlatform ( platform ) ;
@@ -183,7 +161,6 @@ export class PreviewAppLiveSyncService extends EventEmitter implements IPreviewA
183161 } ) ) ;
184162 }
185163 } ) ;
186- filesToSyncMap [ platform ] = [ ] ;
187164 }
188165
189166 private showWarningsForNativeFiles ( files : string [ ] ) : void {
0 commit comments