-
-
Notifications
You must be signed in to change notification settings - Fork 197
/
Copy pathrun.ts
148 lines (119 loc) · 5.29 KB
/
run.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import { ERROR_NO_VALID_SUBCOMMAND_FORMAT } from "../common/constants";
import { ANDROID_RELEASE_BUILD_ERROR_MESSAGE } from "../constants";
import { cache } from "../common/decorators";
import { BundleBase } from "./base-bundler";
export class RunCommandBase extends BundleBase implements ICommand {
public platform: string;
constructor(protected $platformService: IPlatformService,
protected $projectData: IProjectData,
protected $options: IOptions,
protected $devicePlatformsConstants: Mobile.IDevicePlatformsConstants,
protected $errors: IErrors,
protected $devicesService: Mobile.IDevicesService,
protected $platformsData: IPlatformsData,
private $hostInfo: IHostInfo,
private $liveSyncCommandHelper: ILiveSyncCommandHelper
) {
super($projectData, $errors, $options);
}
public allowedParameters: ICommandParameter[] = [];
public async execute(args: string[]): Promise<void> {
return this.executeCore(args);
}
public async canExecute(args: string[]): Promise<boolean> {
if (args.length) {
this.$errors.fail(ERROR_NO_VALID_SUBCOMMAND_FORMAT, "run");
}
this.$projectData.initializeProjectData();
this.platform = args[0] || this.platform;
if (!this.platform && !this.$hostInfo.isDarwin) {
this.platform = this.$devicePlatformsConstants.Android;
}
const availablePlatforms = this.$liveSyncCommandHelper.getPlatformsForOperation(this.platform);
for (const platform of availablePlatforms) {
const platformData = this.$platformsData.getPlatformData(platform, this.$projectData);
const platformProjectService = platformData.platformProjectService;
await platformProjectService.validate(this.$projectData);
}
super.validateBundling();
return true;
}
public async executeCore(args: string[]): Promise<void> {
await this.$devicesService.initialize({
deviceId: this.$options.device,
platform: this.platform,
emulator: this.$options.emulator,
skipDeviceDetectionInterval: true,
skipInferPlatform: !this.platform
});
await this.$devicesService.detectCurrentlyAttachedDevices({ shouldReturnImmediateResult: false, platform: this.platform });
let devices = this.$devicesService.getDeviceInstances();
devices = devices.filter(d => !this.platform || d.deviceInfo.platform.toLowerCase() === this.platform.toLowerCase());
await this.$liveSyncCommandHelper.executeLiveSyncOperation(devices, this.platform);
}
}
$injector.registerCommand("run|*all", RunCommandBase);
export class RunIosCommand implements ICommand {
@cache()
private get runCommand(): RunCommandBase {
const runCommand = this.$injector.resolve<RunCommandBase>(RunCommandBase);
runCommand.platform = this.platform;
return runCommand;
}
public allowedParameters: ICommandParameter[] = [];
public get platform(): string {
return this.$devicePlatformsConstants.iOS;
}
constructor(protected $platformsData: IPlatformsData,
protected $devicePlatformsConstants: Mobile.IDevicePlatformsConstants,
protected $errors: IErrors,
private $injector: IInjector,
private $platformService: IPlatformService,
private $projectData: IProjectData,
private $options: IOptions) {
}
public async execute(args: string[]): Promise<void> {
if (!this.$platformService.isPlatformSupportedForOS(this.$devicePlatformsConstants.iOS, this.$projectData)) {
this.$errors.fail(`Applications for platform ${this.$devicePlatformsConstants.iOS} can not be built on this OS`);
}
return this.runCommand.executeCore(args);
}
public async canExecute(args: string[]): Promise<boolean> {
return await this.runCommand.canExecute(args) && await this.$platformService.validateOptions(this.$options.provision, this.$options.teamId, this.$projectData, this.$platformsData.availablePlatforms.iOS);
}
}
$injector.registerCommand("run|ios", RunIosCommand);
export class RunAndroidCommand implements ICommand {
@cache()
private get runCommand(): RunCommandBase {
const runCommand = this.$injector.resolve<RunCommandBase>(RunCommandBase);
runCommand.platform = this.platform;
return runCommand;
}
public allowedParameters: ICommandParameter[] = [];
public get platform(): string {
return this.$devicePlatformsConstants.Android;
}
constructor(protected $platformsData: IPlatformsData,
protected $devicePlatformsConstants: Mobile.IDevicePlatformsConstants,
protected $errors: IErrors,
private $injector: IInjector,
private $platformService: IPlatformService,
private $projectData: IProjectData,
private $options: IOptions) {
}
public async execute(args: string[]): Promise<void> {
return this.runCommand.executeCore(args);
}
public async canExecute(args: string[]): Promise<boolean> {
await this.runCommand.canExecute(args);
if (!this.$platformService.isPlatformSupportedForOS(this.$devicePlatformsConstants.Android, this.$projectData)) {
this.$errors.fail(`Applications for platform ${this.$devicePlatformsConstants.Android} can not be built on this OS`);
}
if (this.$options.release && (!this.$options.keyStorePath || !this.$options.keyStorePassword || !this.$options.keyStoreAlias || !this.$options.keyStoreAliasPassword)) {
this.$errors.fail(ANDROID_RELEASE_BUILD_ERROR_MESSAGE);
}
return this.$platformService.validateOptions(this.$options.provision, this.$options.teamId, this.$projectData, this.$platformsData.availablePlatforms.Android);
}
}
$injector.registerCommand("run|android", RunAndroidCommand);