microsoft/vscode-react-native

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
0.4.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/extension/commandPaletteHandler.ts

219lines · 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})
94cd5149Artem Egorov8 years ago43)
44.then(() => this.runStartPackagerCommandAndUpdateStatus());
1c32fe84Patricio Beltran9 years ago45}
46
47/**
48* Starts the Exponent packager
49*/
50public startExponentPackager(): Q.Promise<void> {
b0af599cJimmy Thomson9 years ago51return this.executeCommandInContext("startExponentPackager", () =>
52this.reactNativePackager.isRunning()
53.then((running) => {
54if (running) {
55return this.reactNativePackager.stop();
56}
57})
58).then(() =>
59this.exponentHelper.configureExponentEnvironment()
60).then(() => this.runStartPackagerCommandAndUpdateStatus(PackagerRunAs.EXPONENT));
bef522ffMeena Kunnathur Balakrishnan10 years ago61}
62
0904a0d7Meena Kunnathur Balakrishnan10 years ago63/**
64* Kills the React Native packager invoked by the extension's packager
65*/
10873e11digeff10 years ago66public stopPackager(): Q.Promise<void> {
ffffa686Meena Kunnathur Balakrishnan10 years ago67return this.executeCommandInContext("stopPackager", () => this.reactNativePackager.stop())
68.then(() => this.reactNativePackageStatusIndicator.updatePackagerStatus(PackagerStatus.PACKAGER_STOPPED));
3194e9afMeena Kunnathur Balakrishnan10 years ago69}
70
f2a58eefBret Johnson9 years ago71/**
72* Restarts the React Native packager
73*/
74public restartPackager(): Q.Promise<void> {
75return this.executeCommandInContext("restartPackager", () =>
76this.runRestartPackagerCommandAndUpdateStatus());
77}
78
7893fb7eJimmy Thomson9 years ago79/**
80* Execute command to publish to exponent host.
81*/
82public publishToExpHost(): Q.Promise<void> {
83return this.executeCommandInContext("publishToExpHost", () => {
84this.executePublishToExpHost().then((didPublish) => {
85if (!didPublish) {
86Log.logMessage("Publishing was unsuccessful. Please make sure you are logged in Exponent and your project is a valid Exponentjs project");
87}
88});
89});
90}
91
3194e9afMeena Kunnathur Balakrishnan10 years ago92/**
93* Executes the 'react-native run-android' command
94*/
10873e11digeff10 years ago95public runAndroid(): Q.Promise<void> {
2d8b9177Daniel Lebu10 years ago96TargetPlatformHelper.checkTargetPlatformSupport("android");
52f3873ddigeff10 years ago97return this.executeCommandInContext("runAndroid", () => this.executeWithPackagerRunning(() => {
98const packagerPort = SettingsHelper.getPackagerPort();
99return new AndroidPlatform({ projectRoot: this.workspaceRoot, packagerPort: packagerPort }).runApp(/*shouldLaunchInAllDevices*/true);
100}));
3194e9afMeena Kunnathur Balakrishnan10 years ago101}
102
52f3873ddigeff10 years ago103
3194e9afMeena Kunnathur Balakrishnan10 years ago104/**
105* Executes the 'react-native run-ios' command
106*/
10873e11digeff10 years ago107public runIos(): Q.Promise<void> {
6e7f90d8Daniel Lebu10 years ago108TargetPlatformHelper.checkTargetPlatformSupport("ios");
10873e11digeff10 years ago109return this.executeCommandInContext("runIos", () => {
110// Set the Debugging setting to disabled, because in iOS it's persisted across runs of the app
111return new IOSDebugModeManager(this.workspaceRoot).setSimulatorJSDebuggingModeSetting(/*enable=*/ false)
112.catch(() => { }) // If setting the debugging mode fails, we ignore the error and we run the run ios command anyways
113.then(() => this.executeReactNativeRunCommand("run-ios"));
114});
3194e9afMeena Kunnathur Balakrishnan10 years ago115}
116
1c32fe84Patricio Beltran9 years ago117private runRestartPackagerCommandAndUpdateStatus(): Q.Promise<void> {
118return this.reactNativePackager.restart(SettingsHelper.getPackagerPort())
f2a58eefBret Johnson9 years ago119.then(() => this.reactNativePackageStatusIndicator.updatePackagerStatus(PackagerStatus.PACKAGER_STARTED));
120}
121
1c32fe84Patricio Beltran9 years ago122/**
123* Helper method to run packager and update appropriate configurations
124*/
125private runStartPackagerCommandAndUpdateStatus(startAs: PackagerRunAs = PackagerRunAs.REACT_NATIVE): Q.Promise<any> {
126if (startAs === PackagerRunAs.EXPONENT) {
7059d307Patricio Beltran9 years ago127return this.loginToExponent()
128.then(() =>
129this.reactNativePackager.startAsExponent(SettingsHelper.getPackagerPort())
130).then(exponentUrl => {
1c32fe84Patricio Beltran9 years ago131this.reactNativePackageStatusIndicator.updatePackagerStatus(PackagerStatus.EXPONENT_PACKAGER_STARTED);
132Log.logMessage("Application is running on Exponent.");
280c0746Patricio Beltran9 years ago133const exponentOutput = `Open your exponent app at ${exponentUrl}`;
134Log.logMessage(exponentOutput);
e23fa745Vladimir Kotikov9 years ago135vscode.commands.executeCommand("vscode.previewHtml", vscode.Uri.parse(exponentUrl), 1, "Expo QR code");
1c32fe84Patricio Beltran9 years ago136});
137}
138return this.reactNativePackager.startAsReactNative(SettingsHelper.getPackagerPort())
5e651f3edigeff10 years ago139.then(() => this.reactNativePackageStatusIndicator.updatePackagerStatus(PackagerStatus.PACKAGER_STARTED));
140}
141
fb8f49fbMeena Kunnathur Balakrishnan10 years ago142/**
3cf70711Meena Kunnathur Balakrishnan10 years ago143* Executes a react-native command passed after starting the packager
fb8f49fbMeena Kunnathur Balakrishnan10 years ago144* {command} The command to be executed
145* {args} The arguments to be passed to the command
146*/
b3a793eeNisheet Jain10 years ago147private executeReactNativeRunCommand(command: string, args?: string[]): Q.Promise<void> {
52f3873ddigeff10 years ago148return this.executeWithPackagerRunning(() => {
149return new CommandExecutor(this.workspaceRoot).spawnReactCommand(command, args).outcome;
150});
151}
152
153/**
154* Executes a lambda function after starting the packager
155* {lambda} The lambda function to be executed
156*/
157private executeWithPackagerRunning(lambda: () => Q.Promise<void>): Q.Promise<void> {
ec6e115dMeena Kunnathur Balakrishnan10 years ago158// Start the packager before executing the React-Native command
53520386Meena Kunnathur Balakrishnan10 years ago159Log.logMessage("Attempting to start the React Native packager");
52f3873ddigeff10 years ago160return this.runStartPackagerCommandAndUpdateStatus().then(lambda);
3194e9afMeena Kunnathur Balakrishnan10 years ago161}
b3a793eeNisheet Jain10 years ago162
163/**
164* Ensures that we are in a React Native project and then executes the operation
165* Otherwise, displays an error message banner
166* {operation} - a function that performs the expected operation
167*/
5e651f3edigeff10 years ago168private executeCommandInContext(rnCommand: string, operation: () => Q.Promise<void> | void): Q.Promise<void> {
38edb09eAlexander Sorokin9 years ago169let reactNativeProjectHelper = new ReactNativeProjectHelper(this.workspaceRoot);
10873e11digeff10 years ago170return TelemetryHelper.generate("RNCommand", (generator) => {
8512ccfeMeena Kunnathur Balakrishnan10 years ago171generator.add("command", rnCommand, false);
172return reactNativeProjectHelper.isReactNativeProject().then(isRNProject => {
0633e07bMeena Kunnathur Balakrishnan10 years ago173generator.add("isRNProject", isRNProject, false);
8512ccfeMeena Kunnathur Balakrishnan10 years ago174if (isRNProject) {
cf138e34Meena Kunnathur Balakrishnan10 years ago175// Bring the log channel to focus
f1e34747Meena Kunnathur Balakrishnan10 years ago176Log.setFocusOnLogChannel();
cf138e34Meena Kunnathur Balakrishnan10 years ago177
178// Execute the operation
8512ccfeMeena Kunnathur Balakrishnan10 years ago179return operation();
180} else {
181vscode.window.showErrorMessage("Current workspace is not a React Native project.");
182}
183});
10873e11digeff10 years ago184});
b3a793eeNisheet Jain10 years ago185}
7893fb7eJimmy Thomson9 years ago186
187/**
188* 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.
189*/
190private executePublishToExpHost(): Q.Promise<boolean> {
191Log.logMessage("Publishing app to Exponent server. This might take a moment.");
7059d307Patricio Beltran9 years ago192return this.loginToExponent()
193.then(user => {
194Log.logMessage(`Publishing as ${user.username}...`);
195return this.startExponentPackager()
196.then(() =>
197XDL.publish(this.workspaceRoot))
198.then(response => {
199if (response.err || !response.url) {
200return false;
201}
202const publishedOutput = `App successfully published to ${response.url}`;
203Log.logMessage(publishedOutput);
204vscode.window.showInformationMessage(publishedOutput);
205return true;
206});
207}).catch(() => {
208Log.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 ago209return false;
7059d307Patricio Beltran9 years ago210});
211}
212
213private loginToExponent(): Q.Promise<XDL.IUser> {
214return this.exponentHelper.loginToExponent(
215(message, password) => { return Q(vscode.window.showInputBox({ placeHolder: message, password: password })); },
216(message) => { return Q(vscode.window.showInformationMessage(message)); }
217);
7893fb7eJimmy Thomson9 years ago218}
bef522ffMeena Kunnathur Balakrishnan10 years ago219}