-
-
Notifications
You must be signed in to change notification settings - Fork 197
/
Copy pathpreview-app-files-service.ts
89 lines (74 loc) · 3.28 KB
/
preview-app-files-service.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import * as path from "path";
import { APP_FOLDER_NAME, TNS_MODULES_FOLDER_NAME, APP_RESOURCES_FOLDER_NAME } from "../../../constants";
import { PreviewSdkEventNames } from "./preview-app-constants";
import { FilePayload, FilesPayload } from "nativescript-preview-sdk";
const isTextOrBinary = require('istextorbinary');
export class PreviewAppFilesService implements IPreviewAppFilesService {
private excludedFileExtensions = [".ts", ".sass", ".scss", ".less"];
private excludedFiles = [".DS_Store"];
constructor(
private $fs: IFileSystem,
private $logger: ILogger,
private $platformsData: IPlatformsData,
private $projectDataService: IProjectDataService,
private $projectFilesManager: IProjectFilesManager
) { }
public getInitialFilesPayload(data: IPreviewAppLiveSyncData, platform: string, deviceId?: string): FilesPayload {
const rootFilesDir = this.getRootFilesDir(data, platform);
const filesToSync = this.$projectFilesManager.getProjectFiles(rootFilesDir);
const payloads = this.getFilesPayload(data, { filesToSync }, platform, deviceId);
return payloads;
}
public getFilesPayload(data: IPreviewAppLiveSyncData, filesData: IPreviewAppFilesData, platform: string, deviceId?: string): FilesPayload {
const { filesToSync, filesToRemove } = filesData;
const filesToTransfer = filesToSync
.filter(file => file.indexOf(TNS_MODULES_FOLDER_NAME) === -1)
.filter(file => file.indexOf(APP_RESOURCES_FOLDER_NAME) === -1)
.filter(file => !_.includes(this.excludedFiles, path.basename(file)))
.filter(file => !_.includes(this.excludedFileExtensions, path.extname(file)));
this.$logger.trace(`Sending ${filesToTransfer.join("\n")}.`);
const rootFilesDir = this.getRootFilesDir(data, platform);
const payloadsToSync = _.map(filesToTransfer, file => this.createFilePayload(file, rootFilesDir, PreviewSdkEventNames.CHANGE_EVENT_NAME));
const payloadsToRemove = _.map(filesToRemove, file => this.createFilePayload(file, rootFilesDir, PreviewSdkEventNames.UNLINK_EVENT_NAME));
const payloads = payloadsToSync.concat(payloadsToRemove);
return {
files: payloads,
platform: platform,
hmrMode: data.useHotModuleReload ? 1 : 0,
deviceId
};
}
private createFilePayload(file: string, rootFilesDir: string, event: string): FilePayload {
let fileContents = "";
let binary = false;
if (event === PreviewSdkEventNames.CHANGE_EVENT_NAME) {
binary = isTextOrBinary.isBinarySync(file);
if (binary) {
const bitmap = <string>this.$fs.readFile(file);
const base64 = Buffer.from(bitmap).toString('base64');
fileContents = base64;
} else {
fileContents = this.$fs.readText(file);
}
}
const filePayload = {
event,
file: path.relative(rootFilesDir, file),
binary,
fileContents
};
return filePayload;
}
private getRootFilesDir(data: IPreviewAppLiveSyncData, platform: string): string {
const projectData = this.$projectDataService.getProjectData(data.projectDir);
const platformData = this.$platformsData.getPlatformData(platform, projectData);
let rootFilesDir = null;
if (data.bundle) {
rootFilesDir = path.join(platformData.appDestinationDirectoryPath, APP_FOLDER_NAME);
} else {
rootFilesDir = projectData.getAppDirectoryPath();
}
return rootFilesDir;
}
}
$injector.register("previewAppFilesService", PreviewAppFilesService);