microsoft/vscode-react-native

Public

mirrored from https://github.com/microsoft/vscode-react-nativeAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
1.0.1

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/extension/commandPaletteHandler.ts

420lines · modeblame

bef522ffMeena Kunnathur Balakrishnan10 years ago1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license. See LICENSE file in the project root for details.
3
6e179583digeff10 years ago4import * as vscode from "vscode";
0a68f8dbArtem Egorov8 years ago5import * as XDL from "./exponent/xdlInterface";
df4bce40digeff10 years ago6import {SettingsHelper} from "./settingsHelper";
0a68f8dbArtem Egorov8 years ago7import {OutputChannelLogger} from "./log/OutputChannelLogger";
db6fd42aRuslan Bikkinin7 years ago8import {TargetType, GeneralMobilePlatform} from "./generalMobilePlatform";
0a68f8dbArtem Egorov8 years ago9import {AndroidPlatform} from "./android/androidPlatform";
10import {IOSPlatform} from "./ios/iOSPlatform";
6e1bcd36RedMickey6 years ago11import {ProjectVersionHelper} from "../common/projectVersionHelper";
e3706a1cRedMickey6 years ago12import {ReactNativeProjectHelper} from "../common/reactNativeProjectHelper";
aeaf46bcMeena Kunnathur Balakrishnan10 years ago13import {TargetPlatformHelper} from "../common/targetPlatformHelper";
d976d077Meena Kunnathur Balakrishnan10 years ago14import {TelemetryHelper} from "../common/telemetryHelper";
6e1bcd36RedMickey6 years ago15import {ProjectsStorage} from "./projectsStorage";
259c018fYuri Skorokhodov5 years ago16import {IAndroidRunOptions, IIOSRunOptions, PlatformType} from "./launchArgs";
d8b69cd3Yuri Skorokhodov7 years ago17import {ExponentPlatform} from "./exponent/exponentPlatform";
6277aa08Yuri Skorokhodov7 years ago18import {spawn, ChildProcess} from "child_process";
19import {HostPlatform} from "../common/hostPlatform";
af1474acRedMickey6 years ago20import {CommandExecutor} from "../common/commandExecutor";
d7d405aeYuri Skorokhodov7 years ago21import * as nls from "vscode-nls";
af1474acRedMickey6 years ago22import {ErrorHelper} from "../common/error/errorHelper";
23import {InternalErrorCode} from "../common/error/internalErrorCode";
6e1bcd36RedMickey6 years ago24import {AppLauncher} from "./appLauncher";
68a5b8d5JiglioNero5 years ago25import { AndroidEmulatorManager } from "./android/androidEmulatorManager";
26import { AdbHelper } from "./android/adb";
2d8af448Yuri Skorokhodov6 years ago27nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })();
d7d405aeYuri Skorokhodov7 years ago28const localize = nls.loadMessageBundle();
4b37483dmax-mironov8 years ago29
e1c05e69dlebu10 years ago30export class CommandPaletteHandler {
a740b79aYuri Skorokhodov7 years ago31public static elementInspector: ChildProcess | null;
2e432a9eArtem Egorov8 years ago32private static logger: OutputChannelLogger = OutputChannelLogger.getMainChannel();
6a465861max-mironov8 years ago33
0904a0d7Meena Kunnathur Balakrishnan10 years ago34/**
35* Starts the React Native packager
36*/
ce5e88eeYuri Skorokhodov5 years ago37public static startPackager(): Promise<void> {
2e432a9eArtem Egorov8 years ago38return this.selectProject()
6e1bcd36RedMickey6 years ago39.then((appLauncher: AppLauncher) => {
40return ProjectVersionHelper.getReactNativePackageVersionsFromNodeModules(appLauncher.getPackager().getProjectPath())
7fa90b3bRedMickey6 years ago41.then(versions => {
6e1bcd36RedMickey6 years ago42return this.executeCommandInContext("startPackager", appLauncher.getWorkspaceFolder(), () => {
43return appLauncher.getPackager().isRunning()
af1474acRedMickey6 years ago44.then((running) => {
ce5e88eeYuri Skorokhodov5 years ago45return running ? appLauncher.getPackager().stop() : Promise.resolve();
af1474acRedMickey6 years ago46});
47})
6e1bcd36RedMickey6 years ago48.then(() => appLauncher.getPackager().start());
af1474acRedMickey6 years ago49});
2e432a9eArtem Egorov8 years ago50});
bef522ffMeena Kunnathur Balakrishnan10 years ago51}
52
0904a0d7Meena Kunnathur Balakrishnan10 years ago53/**
54* Kills the React Native packager invoked by the extension's packager
55*/
ce5e88eeYuri Skorokhodov5 years ago56public static stopPackager(): Promise<void> {
2e432a9eArtem Egorov8 years ago57return this.selectProject()
6e1bcd36RedMickey6 years ago58.then((appLauncher: AppLauncher) => {
59return this.executeCommandInContext("stopPackager", appLauncher.getWorkspaceFolder(), () => appLauncher.getPackager().stop());
2e432a9eArtem Egorov8 years ago60});
3194e9afMeena Kunnathur Balakrishnan10 years ago61}
62
ce5e88eeYuri Skorokhodov5 years ago63public static stopAllPackagers(): Promise<void> {
6e1bcd36RedMickey6 years ago64let keys = Object.keys(ProjectsStorage.projectsCache);
ce5e88eeYuri Skorokhodov5 years ago65let promises: Promise<void>[] = [];
4edcda70Artem Egorov8 years ago66keys.forEach((key) => {
6e1bcd36RedMickey6 years ago67let appLauncher = ProjectsStorage.projectsCache[key];
68promises.push(this.executeCommandInContext("stopPackager", appLauncher.getWorkspaceFolder(), () => appLauncher.getPackager().stop()));
4edcda70Artem Egorov8 years ago69});
70
ce5e88eeYuri Skorokhodov5 years ago71return Promise.all(promises).then(() => {});
4edcda70Artem Egorov8 years ago72}
73
f2a58eefBret Johnson9 years ago74/**
75* Restarts the React Native packager
76*/
ce5e88eeYuri Skorokhodov5 years ago77public static restartPackager(): Promise<void> {
2e432a9eArtem Egorov8 years ago78return this.selectProject()
6e1bcd36RedMickey6 years ago79.then((appLauncher: AppLauncher) => {
80return ProjectVersionHelper.getReactNativePackageVersionsFromNodeModules(appLauncher.getPackager().getProjectPath())
7fa90b3bRedMickey6 years ago81.then(versions => {
6e1bcd36RedMickey6 years ago82return this.executeCommandInContext("restartPackager", appLauncher.getWorkspaceFolder(), () =>
83this.runRestartPackagerCommandAndUpdateStatus(appLauncher));
af1474acRedMickey6 years ago84});
2e432a9eArtem Egorov8 years ago85});
f2a58eefBret Johnson9 years ago86}
87
7893fb7eJimmy Thomson9 years ago88/**
89* Execute command to publish to exponent host.
90*/
ce5e88eeYuri Skorokhodov5 years ago91public static publishToExpHost(): Promise<void> {
2e432a9eArtem Egorov8 years ago92return this.selectProject()
6e1bcd36RedMickey6 years ago93.then((appLauncher: AppLauncher) => {
94return this.executeCommandInContext("publishToExpHost", appLauncher.getWorkspaceFolder(), () => {
95return this.executePublishToExpHost(appLauncher).then((didPublish) => {
2e432a9eArtem Egorov8 years ago96if (!didPublish) {
d7d405aeYuri Skorokhodov7 years ago97CommandPaletteHandler.logger.warning(localize("ExponentPublishingWasUnsuccessfulMakeSureYoureLoggedInToExpo", "Publishing was unsuccessful. Please make sure you are logged in Expo and your project is a valid Expo project"));
2e432a9eArtem Egorov8 years ago98}
99});
100});
7893fb7eJimmy Thomson9 years ago101});
102}
103
68a5b8d5JiglioNero5 years ago104public static async launchAndroidEmulator(): Promise<void> {
105const appLauncher = await this.selectProject();
106const adbHelper = new AdbHelper(appLauncher.getPackager().getProjectPath());
107const androidEmulatorManager = new AndroidEmulatorManager(adbHelper);
108const emulator = await androidEmulatorManager.startSelection();
109if (emulator) {
110androidEmulatorManager.tryLaunchEmulatorByName(emulator);
111}
112}
113
3194e9afMeena Kunnathur Balakrishnan10 years ago114/**
115* Executes the 'react-native run-android' command
116*/
ce5e88eeYuri Skorokhodov5 years ago117public static runAndroid(target: TargetType = "simulator"): Promise<void> {
2e432a9eArtem Egorov8 years ago118return this.selectProject()
6e1bcd36RedMickey6 years ago119.then((appLauncher: AppLauncher) => {
259c018fYuri Skorokhodov5 years ago120TargetPlatformHelper.checkTargetPlatformSupport(PlatformType.Android);
6e1bcd36RedMickey6 years ago121return ProjectVersionHelper.getReactNativePackageVersionsFromNodeModules(appLauncher.getPackager().getProjectPath())
7fa90b3bRedMickey6 years ago122.then(versions => {
6e1bcd36RedMickey6 years ago123appLauncher.setReactNativeVersions(versions);
124return this.executeCommandInContext("runAndroid", appLauncher.getWorkspaceFolder(), () => {
259c018fYuri Skorokhodov5 years ago125const platform = <AndroidPlatform>this.createPlatform(appLauncher, PlatformType.Android, AndroidPlatform, target);
68a5b8d5JiglioNero5 years ago126return platform.resolveVirtualDevice(target)
259c018fYuri Skorokhodov5 years ago127.then(() => platform.beforeStartPackager())
128.then(() => {
129return platform.startPackager();
130})
131.then(() => {
132return platform.runApp(/*shouldLaunchInAllDevices*/true);
133})
134.then(() => {
135return platform.disableJSDebuggingMode();
136});
2e432a9eArtem Egorov8 years ago137});
af1474acRedMickey6 years ago138});
0a68f8dbArtem Egorov8 years ago139});
3194e9afMeena Kunnathur Balakrishnan10 years ago140}
141
142/**
143* Executes the 'react-native run-ios' command
144*/
ce5e88eeYuri Skorokhodov5 years ago145public static runIos(target: TargetType = "simulator"): Promise<void> {
2e432a9eArtem Egorov8 years ago146return this.selectProject()
6e1bcd36RedMickey6 years ago147.then((appLauncher: AppLauncher) => {
148return ProjectVersionHelper.getReactNativePackageVersionsFromNodeModules(appLauncher.getPackager().getProjectPath())
7fa90b3bRedMickey6 years ago149.then(versions => {
6e1bcd36RedMickey6 years ago150appLauncher.setReactNativeVersions(versions);
259c018fYuri Skorokhodov5 years ago151TargetPlatformHelper.checkTargetPlatformSupport(PlatformType.iOS);
6e1bcd36RedMickey6 years ago152return this.executeCommandInContext("runIos", appLauncher.getWorkspaceFolder(), () => {
259c018fYuri Skorokhodov5 years ago153const platform = <IOSPlatform>this.createPlatform(appLauncher, PlatformType.iOS, IOSPlatform, target);
68a5b8d5JiglioNero5 years ago154return platform.resolveVirtualDevice(target)
155.then(() => platform.beforeStartPackager())
ba953e9fRedMickey6 years ago156.then(() => {
157return platform.startPackager();
158})
159.then(() => {
160// Set the Debugging setting to disabled, because in iOS it's persisted across runs of the app
161return platform.disableJSDebuggingMode();
162})
163.catch(() => { }) // If setting the debugging mode fails, we ignore the error and we run the run ios command anyways
164.then(() => {
165return platform.runApp();
166});
167});
af1474acRedMickey6 years ago168});
4787ec09Artem Egorov8 years ago169});
170}
171
172/**
173* Starts the Exponent packager
174*/
ce5e88eeYuri Skorokhodov5 years ago175public static runExponent(): Promise<void> {
4787ec09Artem Egorov8 years ago176return this.selectProject()
6e1bcd36RedMickey6 years ago177.then((appLauncher: AppLauncher) => {
178return ProjectVersionHelper.getReactNativePackageVersionsFromNodeModules(appLauncher.getPackager().getProjectPath())
7fa90b3bRedMickey6 years ago179.then(versions => {
6e1bcd36RedMickey6 years ago180return this.loginToExponent(appLauncher)
af1474acRedMickey6 years ago181.then(() => {
6e1bcd36RedMickey6 years ago182return this.executeCommandInContext("runExponent", appLauncher.getWorkspaceFolder(), () => {
183appLauncher.setReactNativeVersions(versions);
259c018fYuri Skorokhodov5 years ago184const platform = <ExponentPlatform>this.createPlatform(appLauncher, PlatformType.Exponent, ExponentPlatform);
af1474acRedMickey6 years ago185return platform.beforeStartPackager()
186.then(() => {
187return platform.startPackager();
188})
189.then(() => {
190return platform.runApp();
191});
4787ec09Artem Egorov8 years ago192});
af1474acRedMickey6 years ago193});
4787ec09Artem Egorov8 years ago194});
2e432a9eArtem Egorov8 years ago195});
3194e9afMeena Kunnathur Balakrishnan10 years ago196}
197
ce5e88eeYuri Skorokhodov5 years ago198public static showDevMenu(): Promise<void> {
a41f5c68Artem Egorov8 years ago199return this.selectProject()
6e1bcd36RedMickey6 years ago200.then((appLauncher: AppLauncher) => {
259c018fYuri Skorokhodov5 years ago201const androidPlatform = <AndroidPlatform>this.createPlatform(appLauncher, PlatformType.Android, AndroidPlatform);
db6fd42aRuslan Bikkinin7 years ago202androidPlatform.showDevMenu()
a41f5c68Artem Egorov8 years ago203.catch(() => { }); // Ignore any errors
2ecfbd20Yuri Skorokhodov7 years ago204
205if (process.platform === "darwin") {
259c018fYuri Skorokhodov5 years ago206const iosPlatform = <IOSPlatform>this.createPlatform(appLauncher, PlatformType.iOS, IOSPlatform);
7e74daf7Yuri Skorokhodov6 years ago207iosPlatform.showDevMenu(appLauncher)
2ecfbd20Yuri Skorokhodov7 years ago208.catch(() => { }); // Ignore any errors
209}
ce5e88eeYuri Skorokhodov5 years ago210return Promise.resolve();
a41f5c68Artem Egorov8 years ago211});
7daed3fcArtem Egorov8 years ago212}
213
ce5e88eeYuri Skorokhodov5 years ago214public static reloadApp(): Promise<void> {
a41f5c68Artem Egorov8 years ago215return this.selectProject()
6e1bcd36RedMickey6 years ago216.then((appLauncher: AppLauncher) => {
259c018fYuri Skorokhodov5 years ago217const androidPlatform = <AndroidPlatform>this.createPlatform(appLauncher, PlatformType.Android, AndroidPlatform);
db6fd42aRuslan Bikkinin7 years ago218androidPlatform.reloadApp()
a41f5c68Artem Egorov8 years ago219.catch(() => { }); // Ignore any errors
2ecfbd20Yuri Skorokhodov7 years ago220
221if (process.platform === "darwin") {
259c018fYuri Skorokhodov5 years ago222const iosPlatform = <IOSPlatform>this.createPlatform(appLauncher, PlatformType.iOS, IOSPlatform);
7e74daf7Yuri Skorokhodov6 years ago223iosPlatform.reloadApp(appLauncher)
2ecfbd20Yuri Skorokhodov7 years ago224.catch(() => { }); // Ignore any errors
225}
ce5e88eeYuri Skorokhodov5 years ago226return Promise.resolve();
a41f5c68Artem Egorov8 years ago227});
7daed3fcArtem Egorov8 years ago228}
229
ce5e88eeYuri Skorokhodov5 years ago230public static runElementInspector(): Promise<void> {
14fc3172Artem Egorov7 years ago231if (!CommandPaletteHandler.elementInspector) {
6277aa08Yuri Skorokhodov7 years ago232// Remove the following env variables to prevent running electron app in node mode.
af0c5c30Yuri Skorokhodov5 years ago233// https://github.com/microsoft/vscode/issues/3011#issuecomment-184577502
6277aa08Yuri Skorokhodov7 years ago234let env = Object.assign({}, process.env);
235delete env.ATOM_SHELL_INTERNAL_RUN_AS_NODE;
236delete env.ELECTRON_RUN_AS_NODE;
237let command = HostPlatform.getNpmCliCommand("react-devtools");
238CommandPaletteHandler.elementInspector = spawn(command, [], {
239env,
240});
241if (!CommandPaletteHandler.elementInspector.pid) {
242CommandPaletteHandler.elementInspector = null;
ce5e88eeYuri Skorokhodov5 years ago243return Promise.reject(ErrorHelper.getInternalError(InternalErrorCode.ReactDevtoolsIsNotInstalled));
fd2c4686Yuri Skorokhodov7 years ago244}
6277aa08Yuri Skorokhodov7 years ago245CommandPaletteHandler.elementInspector.stdout.on("data", (data: string) => {
246this.logger.info(data);
247});
248CommandPaletteHandler.elementInspector.stderr.on("data", (data: string) => {
249this.logger.error(data);
250});
251CommandPaletteHandler.elementInspector.once("exit", () => {
252CommandPaletteHandler.elementInspector = null;
253});
62e2a78aYuri Skorokhodov7 years ago254} else {
d7d405aeYuri Skorokhodov7 years ago255this.logger.info(localize("AnotherElementInspectorAlreadyRun", "Another element inspector already run"));
62e2a78aYuri Skorokhodov7 years ago256}
ce5e88eeYuri Skorokhodov5 years ago257return Promise.resolve();
d8b69cd3Yuri Skorokhodov7 years ago258}
14fc3172Artem Egorov7 years ago259
260public static stopElementInspector(): void {
261return CommandPaletteHandler.elementInspector ? CommandPaletteHandler.elementInspector.kill() : void 0;
262}
263
031832ffArtem Egorov8 years ago264public static getPlatformByCommandName(commandName: string): string {
265commandName = commandName.toLocaleLowerCase();
266
259c018fYuri Skorokhodov5 years ago267if (commandName.indexOf(PlatformType.Android) > -1) {
268return PlatformType.Android;
031832ffArtem Egorov8 years ago269}
270
259c018fYuri Skorokhodov5 years ago271if (commandName.indexOf(PlatformType.iOS) > -1) {
272return PlatformType.iOS;
031832ffArtem Egorov8 years ago273}
274
259c018fYuri Skorokhodov5 years ago275if (commandName.indexOf(PlatformType.Exponent) > -1) {
276return PlatformType.Exponent;
031832ffArtem Egorov8 years ago277}
278
279return "";
280}
281
259c018fYuri Skorokhodov5 years ago282private static createPlatform(appLauncher: AppLauncher, platform: PlatformType.iOS | PlatformType.Android | PlatformType.Exponent, platformClass: typeof GeneralMobilePlatform, target?: TargetType): GeneralMobilePlatform {
6e1bcd36RedMickey6 years ago283const runOptions = CommandPaletteHandler.getRunOptions(appLauncher, platform, target);
db6fd42aRuslan Bikkinin7 years ago284return new platformClass(runOptions, {
6e1bcd36RedMickey6 years ago285packager: appLauncher.getPackager(),
db6fd42aRuslan Bikkinin7 years ago286});
287}
288
ce5e88eeYuri Skorokhodov5 years ago289private static runRestartPackagerCommandAndUpdateStatus(appLauncher: AppLauncher): Promise<void> {
6e1bcd36RedMickey6 years ago290return appLauncher.getPackager().restart(SettingsHelper.getPackagerPort(appLauncher.getWorkspaceFolderUri().fsPath));
3194e9afMeena Kunnathur Balakrishnan10 years ago291}
b3a793eeNisheet Jain10 years ago292
293/**
294* Ensures that we are in a React Native project and then executes the operation
295* Otherwise, displays an error message banner
296* {operation} - a function that performs the expected operation
297*/
ce5e88eeYuri Skorokhodov5 years ago298private static executeCommandInContext(rnCommand: string, workspaceFolder: vscode.WorkspaceFolder, operation: () => Promise<void>): Promise<void> {
031832ffArtem Egorov8 years ago299const extProps = {
300platform: {
301value: CommandPaletteHandler.getPlatformByCommandName(rnCommand),
302isPii: false,
303},
304};
305
306return TelemetryHelper.generate("RNCommand", extProps, (generator) => {
8512ccfeMeena Kunnathur Balakrishnan10 years ago307generator.add("command", rnCommand, false);
e4dd9aa4Serge Svekolnikov8 years ago308const projectRoot = SettingsHelper.getReactNativeProjectRoot(workspaceFolder.uri.fsPath);
db6fd42aRuslan Bikkinin7 years ago309this.logger.debug(`Command palette: run project ${projectRoot} in context`);
310return ReactNativeProjectHelper.isReactNativeProject(projectRoot)
311.then(isRNProject => {
312generator.add("isRNProject", isRNProject, false);
313if (isRNProject) {
314// Bring the log channel to focus
315this.logger.setFocusOnLogChannel();
316
317// Execute the operation
318return operation();
319} else {
320vscode.window.showErrorMessage(`${projectRoot} workspace is not a React Native project.`);
321return;
322}
323});
10873e11digeff10 years ago324});
b3a793eeNisheet Jain10 years ago325}
7893fb7eJimmy Thomson9 years ago326
327/**
328* Publish project to exponent server. In order to do this we need to make sure the user is logged in exponent and the packager is running.
329*/
ce5e88eeYuri Skorokhodov5 years ago330private static executePublishToExpHost(appLauncher: AppLauncher): Promise<boolean> {
d7d405aeYuri Skorokhodov7 years ago331CommandPaletteHandler.logger.info(localize("PublishingAppToExponentServer", "Publishing app to Expo server. This might take a moment."));
6e1bcd36RedMickey6 years ago332return this.loginToExponent(appLauncher)
7059d307Patricio Beltran9 years ago333.then(user => {
2e432a9eArtem Egorov8 years ago334CommandPaletteHandler.logger.debug(`Publishing as ${user.username}...`);
4787ec09Artem Egorov8 years ago335return this.runExponent()
7059d307Patricio Beltran9 years ago336.then(() =>
6e1bcd36RedMickey6 years ago337XDL.publish(appLauncher.getWorkspaceFolderUri().fsPath))
7059d307Patricio Beltran9 years ago338.then(response => {
339if (response.err || !response.url) {
340return false;
341}
d7d405aeYuri Skorokhodov7 years ago342const publishedOutput = localize("ExpoAppSuccessfullyPublishedTo", "Expo app successfully published to {0}", response.url);
2e432a9eArtem Egorov8 years ago343CommandPaletteHandler.logger.info(publishedOutput);
7059d307Patricio Beltran9 years ago344vscode.window.showInformationMessage(publishedOutput);
345return true;
346});
347});
348}
349
ce5e88eeYuri Skorokhodov5 years ago350private static loginToExponent(appLauncher: AppLauncher): Promise<XDL.IUser> {
6e1bcd36RedMickey6 years ago351return appLauncher.getExponentHelper().loginToExponent(
5c8365a6Artem Egorov8 years ago352(message, password) => {
ce5e88eeYuri Skorokhodov5 years ago353return new Promise((resolve, reject) => {
5c8365a6Artem Egorov8 years ago354vscode.window.showInputBox({ placeHolder: message, password: password })
2e432a9eArtem Egorov8 years ago355.then(login => {
356resolve(login || "");
357}, reject);
5c8365a6Artem Egorov8 years ago358});
359},
360(message) => {
ce5e88eeYuri Skorokhodov5 years ago361return new Promise((resolve, reject) => {
5c8365a6Artem Egorov8 years ago362vscode.window.showInformationMessage(message)
2e432a9eArtem Egorov8 years ago363.then(password => {
364resolve(password || "");
365}, reject);
5c8365a6Artem Egorov8 years ago366});
367}
4787ec09Artem Egorov8 years ago368)
369.catch((err) => {
d7d405aeYuri Skorokhodov7 years ago370CommandPaletteHandler.logger.warning(localize("ExpoErrorOccuredMakeSureYouAreLoggedIn", "An error has occured. Please make sure you are logged in to Expo, your project is setup correctly for publishing and your packager is running as Expo."));
4787ec09Artem Egorov8 years ago371throw err;
372});
7893fb7eJimmy Thomson9 years ago373}
2e432a9eArtem Egorov8 years ago374
ce5e88eeYuri Skorokhodov5 years ago375private static selectProject(): Promise<AppLauncher> {
6e1bcd36RedMickey6 years ago376let keys = Object.keys(ProjectsStorage.projectsCache);
2e432a9eArtem Egorov8 years ago377if (keys.length > 1) {
ce5e88eeYuri Skorokhodov5 years ago378return new Promise((resolve, reject) => {
2e432a9eArtem Egorov8 years ago379vscode.window.showQuickPick(keys)
380.then((selected) => {
381if (selected) {
db6fd42aRuslan Bikkinin7 years ago382this.logger.debug(`Command palette: selected project ${selected}`);
6e1bcd36RedMickey6 years ago383resolve(ProjectsStorage.projectsCache[selected]);
2e432a9eArtem Egorov8 years ago384}
385}, reject);
386});
387} else if (keys.length === 1) {
db6fd42aRuslan Bikkinin7 years ago388this.logger.debug(`Command palette: once project ${keys[0]}`);
ce5e88eeYuri Skorokhodov5 years ago389return Promise.resolve(ProjectsStorage.projectsCache[keys[0]]);
2e432a9eArtem Egorov8 years ago390} else {
ce5e88eeYuri Skorokhodov5 years ago391return Promise.reject(ErrorHelper.getInternalError(InternalErrorCode.WorkspaceNotFound, "Current workspace does not contain React Native projects."));
2e432a9eArtem Egorov8 years ago392}
393}
d1fc7f8aArtem Egorov8 years ago394
259c018fYuri Skorokhodov5 years ago395private static getRunOptions(appLauncher: AppLauncher, platform: PlatformType.iOS | PlatformType.Android | PlatformType.Exponent, target: TargetType = "simulator"): IAndroidRunOptions | IIOSRunOptions {
6e1bcd36RedMickey6 years ago396const packagerPort = SettingsHelper.getPackagerPort(appLauncher.getWorkspaceFolderUri().fsPath);
397const runArgs = SettingsHelper.getRunArgs(platform, target, appLauncher.getWorkspaceFolderUri());
398const envArgs = SettingsHelper.getEnvArgs(platform, target, appLauncher.getWorkspaceFolderUri());
399const envFile = SettingsHelper.getEnvFile(platform, target, appLauncher.getWorkspaceFolderUri());
400const projectRoot = SettingsHelper.getReactNativeProjectRoot(appLauncher.getWorkspaceFolderUri().fsPath);
d1fc7f8aArtem Egorov8 years ago401const runOptions: IAndroidRunOptions | IIOSRunOptions = {
402platform: platform,
6e1bcd36RedMickey6 years ago403workspaceRoot: appLauncher.getWorkspaceFolderUri().fsPath,
d1fc7f8aArtem Egorov8 years ago404projectRoot: projectRoot,
405packagerPort: packagerPort,
406runArguments: runArgs,
407env: envArgs,
408envFile: envFile,
6e1bcd36RedMickey6 years ago409reactNativeVersions: appLauncher.getReactNativeVersions() || {reactNativeVersion: "", reactNativeWindowsVersion: ""},
d1fc7f8aArtem Egorov8 years ago410};
411
4dfc9ffdRedMickey5 years ago412if (platform === PlatformType.iOS && target === "device") {
413runOptions.target = "device";
414}
415
6e1bcd36RedMickey6 years ago416CommandExecutor.ReactNativeCommand = SettingsHelper.getReactNativeGlobalCommandName(appLauncher.getWorkspaceFolderUri());
af1474acRedMickey6 years ago417
d1fc7f8aArtem Egorov8 years ago418return runOptions;
419}
d7d405aeYuri Skorokhodov7 years ago420}