microsoft/vscode-react-native

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
0.3.1

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/extension/commandPaletteHandler.ts

220lines · 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";
5import * as Q from "q";
7059d307Patricio Beltran9 years ago6import * as XDL from "../common/exponent/xdlInterface";
b0061ac6Meena Kunnathur Balakrishnan10 years ago7import {CommandExecutor} from "../common/commandExecutor";
df4bce40digeff10 years ago8import {SettingsHelper} from "./settingsHelper";
190e393cMeena Kunnathur Balakrishnan10 years ago9import {Log} from "../common/log/log";
1c32fe84Patricio Beltran9 years ago10import {Packager, PackagerRunAs} from "../common/packager";
52f3873ddigeff10 years ago11import {AndroidPlatform} from "../common/android/androidPlatform";
ffffa686Meena Kunnathur Balakrishnan10 years ago12import {PackagerStatus, PackagerStatusIndicator} from "./packagerStatusIndicator";
b0061ac6Meena Kunnathur Balakrishnan10 years ago13import {ReactNativeProjectHelper} from "../common/reactNativeProjectHelper";
aeaf46bcMeena Kunnathur Balakrishnan10 years ago14import {TargetPlatformHelper} from "../common/targetPlatformHelper";
d976d077Meena Kunnathur Balakrishnan10 years ago15import {TelemetryHelper} from "../common/telemetryHelper";
1ed272e1digeff10 years ago16import {IOSDebugModeManager} from "../common/ios/iOSDebugModeManager";
1c32fe84Patricio Beltran9 years ago17import {ExponentHelper} from "../common/exponent/exponentHelper";
bef522ffMeena Kunnathur Balakrishnan10 years ago18
e1c05e69dlebu10 years ago19export class CommandPaletteHandler {
bef522ffMeena Kunnathur Balakrishnan10 years ago20private reactNativePackager: Packager;
ffffa686Meena Kunnathur Balakrishnan10 years ago21private reactNativePackageStatusIndicator: PackagerStatusIndicator;
bef522ffMeena Kunnathur Balakrishnan10 years ago22private workspaceRoot: string;
1c32fe84Patricio Beltran9 years ago23private exponentHelper: ExponentHelper;
bef522ffMeena Kunnathur Balakrishnan10 years ago24
1c32fe84Patricio Beltran9 years ago25constructor(workspaceRoot: string, reactNativePackager: Packager, packagerStatusIndicator: PackagerStatusIndicator, exponentHelper: ExponentHelper) {
bef522ffMeena Kunnathur Balakrishnan10 years ago26this.workspaceRoot = workspaceRoot;
a822ac85dlebu10 years ago27this.reactNativePackager = reactNativePackager;
ffffa686Meena Kunnathur Balakrishnan10 years ago28this.reactNativePackageStatusIndicator = packagerStatusIndicator;
1c32fe84Patricio Beltran9 years ago29this.exponentHelper = exponentHelper;
bef522ffMeena Kunnathur Balakrishnan10 years ago30}
31
0904a0d7Meena Kunnathur Balakrishnan10 years ago32/**
33* Starts the React Native packager
34*/
10873e11digeff10 years ago35public startPackager(): Q.Promise<void> {
b0af599cJimmy Thomson9 years ago36return this.executeCommandInContext("startPackager", () =>
37this.reactNativePackager.isRunning()
38.then((running) => {
39if (running) {
40return this.reactNativePackager.stop();
41}
42})
43).then(() =>
44this.exponentHelper.configureReactNativeEnvironment()
45).then(() => this.runStartPackagerCommandAndUpdateStatus());
1c32fe84Patricio Beltran9 years ago46}
47
48/**
49* Starts the Exponent packager
50*/
51public startExponentPackager(): Q.Promise<void> {
b0af599cJimmy Thomson9 years ago52return this.executeCommandInContext("startExponentPackager", () =>
53this.reactNativePackager.isRunning()
54.then((running) => {
55if (running) {
56return this.reactNativePackager.stop();
57}
58})
59).then(() =>
60this.exponentHelper.configureExponentEnvironment()
61).then(() => this.runStartPackagerCommandAndUpdateStatus(PackagerRunAs.EXPONENT));
bef522ffMeena Kunnathur Balakrishnan10 years ago62}
63
0904a0d7Meena Kunnathur Balakrishnan10 years ago64/**
65* Kills the React Native packager invoked by the extension's packager
66*/
10873e11digeff10 years ago67public stopPackager(): Q.Promise<void> {
ffffa686Meena Kunnathur Balakrishnan10 years ago68return this.executeCommandInContext("stopPackager", () => this.reactNativePackager.stop())
69.then(() => this.reactNativePackageStatusIndicator.updatePackagerStatus(PackagerStatus.PACKAGER_STOPPED));
3194e9afMeena Kunnathur Balakrishnan10 years ago70}
71
f2a58eefBret Johnson9 years ago72/**
73* Restarts the React Native packager
74*/
75public restartPackager(): Q.Promise<void> {
76return this.executeCommandInContext("restartPackager", () =>
77this.runRestartPackagerCommandAndUpdateStatus());
78}
79
7893fb7eJimmy Thomson9 years ago80/**
81* Execute command to publish to exponent host.
82*/
83public publishToExpHost(): Q.Promise<void> {
84return this.executeCommandInContext("publishToExpHost", () => {
85this.executePublishToExpHost().then((didPublish) => {
86if (!didPublish) {
87Log.logMessage("Publishing was unsuccessful. Please make sure you are logged in Exponent and your project is a valid Exponentjs project");
88}
89});
90});
91}
92
3194e9afMeena Kunnathur Balakrishnan10 years ago93/**
94* Executes the 'react-native run-android' command
95*/
10873e11digeff10 years ago96public runAndroid(): Q.Promise<void> {
2d8b9177Daniel Lebu10 years ago97TargetPlatformHelper.checkTargetPlatformSupport("android");
52f3873ddigeff10 years ago98return this.executeCommandInContext("runAndroid", () => this.executeWithPackagerRunning(() => {
99const packagerPort = SettingsHelper.getPackagerPort();
100return new AndroidPlatform({ projectRoot: this.workspaceRoot, packagerPort: packagerPort }).runApp(/*shouldLaunchInAllDevices*/true);
101}));
3194e9afMeena Kunnathur Balakrishnan10 years ago102}
103
52f3873ddigeff10 years ago104
3194e9afMeena Kunnathur Balakrishnan10 years ago105/**
106* Executes the 'react-native run-ios' command
107*/
10873e11digeff10 years ago108public runIos(): Q.Promise<void> {
6e7f90d8Daniel Lebu10 years ago109TargetPlatformHelper.checkTargetPlatformSupport("ios");
10873e11digeff10 years ago110return this.executeCommandInContext("runIos", () => {
111// Set the Debugging setting to disabled, because in iOS it's persisted across runs of the app
112return new IOSDebugModeManager(this.workspaceRoot).setSimulatorJSDebuggingModeSetting(/*enable=*/ false)
113.catch(() => { }) // If setting the debugging mode fails, we ignore the error and we run the run ios command anyways
114.then(() => this.executeReactNativeRunCommand("run-ios"));
115});
3194e9afMeena Kunnathur Balakrishnan10 years ago116}
117
1c32fe84Patricio Beltran9 years ago118private runRestartPackagerCommandAndUpdateStatus(): Q.Promise<void> {
119return this.reactNativePackager.restart(SettingsHelper.getPackagerPort())
f2a58eefBret Johnson9 years ago120.then(() => this.reactNativePackageStatusIndicator.updatePackagerStatus(PackagerStatus.PACKAGER_STARTED));
121}
122
1c32fe84Patricio Beltran9 years ago123/**
124* Helper method to run packager and update appropriate configurations
125*/
126private runStartPackagerCommandAndUpdateStatus(startAs: PackagerRunAs = PackagerRunAs.REACT_NATIVE): Q.Promise<any> {
127if (startAs === PackagerRunAs.EXPONENT) {
7059d307Patricio Beltran9 years ago128return this.loginToExponent()
129.then(() =>
130this.reactNativePackager.startAsExponent(SettingsHelper.getPackagerPort())
131).then(exponentUrl => {
1c32fe84Patricio Beltran9 years ago132this.reactNativePackageStatusIndicator.updatePackagerStatus(PackagerStatus.EXPONENT_PACKAGER_STARTED);
133Log.logMessage("Application is running on Exponent.");
280c0746Patricio Beltran9 years ago134const exponentOutput = `Open your exponent app at ${exponentUrl}`;
135Log.logMessage(exponentOutput);
136vscode.window.showInformationMessage(exponentOutput);
1c32fe84Patricio Beltran9 years ago137});
138}
139return this.reactNativePackager.startAsReactNative(SettingsHelper.getPackagerPort())
5e651f3edigeff10 years ago140.then(() => this.reactNativePackageStatusIndicator.updatePackagerStatus(PackagerStatus.PACKAGER_STARTED));
141}
142
fb8f49fbMeena Kunnathur Balakrishnan10 years ago143/**
3cf70711Meena Kunnathur Balakrishnan10 years ago144* Executes a react-native command passed after starting the packager
fb8f49fbMeena Kunnathur Balakrishnan10 years ago145* {command} The command to be executed
146* {args} The arguments to be passed to the command
147*/
b3a793eeNisheet Jain10 years ago148private executeReactNativeRunCommand(command: string, args?: string[]): Q.Promise<void> {
52f3873ddigeff10 years ago149return this.executeWithPackagerRunning(() => {
150return new CommandExecutor(this.workspaceRoot).spawnReactCommand(command, args).outcome;
151});
152}
153
154/**
155* Executes a lambda function after starting the packager
156* {lambda} The lambda function to be executed
157*/
158private executeWithPackagerRunning(lambda: () => Q.Promise<void>): Q.Promise<void> {
ec6e115dMeena Kunnathur Balakrishnan10 years ago159// Start the packager before executing the React-Native command
53520386Meena Kunnathur Balakrishnan10 years ago160Log.logMessage("Attempting to start the React Native packager");
52f3873ddigeff10 years ago161return this.runStartPackagerCommandAndUpdateStatus().then(lambda);
3194e9afMeena Kunnathur Balakrishnan10 years ago162}
b3a793eeNisheet Jain10 years ago163
164/**
165* Ensures that we are in a React Native project and then executes the operation
166* Otherwise, displays an error message banner
167* {operation} - a function that performs the expected operation
168*/
5e651f3edigeff10 years ago169private executeCommandInContext(rnCommand: string, operation: () => Q.Promise<void> | void): Q.Promise<void> {
38edb09eAlexander Sorokin9 years ago170let reactNativeProjectHelper = new ReactNativeProjectHelper(this.workspaceRoot);
10873e11digeff10 years ago171return TelemetryHelper.generate("RNCommand", (generator) => {
8512ccfeMeena Kunnathur Balakrishnan10 years ago172generator.add("command", rnCommand, false);
173return reactNativeProjectHelper.isReactNativeProject().then(isRNProject => {
0633e07bMeena Kunnathur Balakrishnan10 years ago174generator.add("isRNProject", isRNProject, false);
8512ccfeMeena Kunnathur Balakrishnan10 years ago175if (isRNProject) {
cf138e34Meena Kunnathur Balakrishnan10 years ago176// Bring the log channel to focus
f1e34747Meena Kunnathur Balakrishnan10 years ago177Log.setFocusOnLogChannel();
cf138e34Meena Kunnathur Balakrishnan10 years ago178
179// Execute the operation
8512ccfeMeena Kunnathur Balakrishnan10 years ago180return operation();
181} else {
182vscode.window.showErrorMessage("Current workspace is not a React Native project.");
183}
184});
10873e11digeff10 years ago185});
b3a793eeNisheet Jain10 years ago186}
7893fb7eJimmy Thomson9 years ago187
188/**
189* 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.
190*/
191private executePublishToExpHost(): Q.Promise<boolean> {
192Log.logMessage("Publishing app to Exponent server. This might take a moment.");
7059d307Patricio Beltran9 years ago193return this.loginToExponent()
194.then(user => {
195Log.logMessage(`Publishing as ${user.username}...`);
196return this.startExponentPackager()
197.then(() =>
198XDL.publish(this.workspaceRoot))
199.then(response => {
200if (response.err || !response.url) {
201return false;
202}
203const publishedOutput = `App successfully published to ${response.url}`;
204Log.logMessage(publishedOutput);
205vscode.window.showInformationMessage(publishedOutput);
206return true;
207});
208}).catch(() => {
209Log.logWarning("An error has occured. Please make sure you are logged in to exponent, your project is setup correctly for publishing and your packager is running as exponent.");
7893fb7eJimmy Thomson9 years ago210return false;
7059d307Patricio Beltran9 years ago211});
212}
213
214private loginToExponent(): Q.Promise<XDL.IUser> {
215return this.exponentHelper.loginToExponent(
216(message, password) => { return Q(vscode.window.showInputBox({ placeHolder: message, password: password })); },
217(message) => { return Q(vscode.window.showInformationMessage(message)); }
218);
7893fb7eJimmy Thomson9 years ago219}
bef522ffMeena Kunnathur Balakrishnan10 years ago220}