microsoft/vscode-react-native

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
8db64d13c751fc4d33c2c3fe14283b4e81347194

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/extension/rn-extension.ts

150lines · modecode

1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license. See LICENSE file in the project root for details.
3
4import * as Q from "q";
5import * as path from "path";
6import * as vscode from "vscode";
7
8import {FileSystem} from "../common/node/fileSystem";
9import {CommandPaletteHandler} from "./commandPaletteHandler";
10import {Packager} from "../common/packager";
11import {EntryPointHandler} from "../common/entryPointHandler";
12import {ErrorHelper} from "../common/error/errorHelper";
13import {InternalError} from "../common/error/internalError";
14import {InternalErrorCode} from "../common/error/internalErrorCode";
15import {Log} from "../common/log/log";
16import {PackagerStatusIndicator} from "./packagerStatusIndicator";
17import {ReactNativeProjectHelper} from "../common/reactNativeProjectHelper";
18import {ReactDirManager} from "./reactDirManager";
19import {IntellisenseHelper} from "./intellisenseHelper";
20import {TelemetryHelper} from "../common/telemetryHelper";
21import {ExtensionServer} from "./extensionServer";
22import {OutputChannelLogger} from "./outputChannelLogger";
23
24/* all components use the same packager instance */
25const globalPackager = new Packager(vscode.workspace.rootPath);
26const packagerStatusIndicator = new PackagerStatusIndicator();
27const commandPaletteHandler = new CommandPaletteHandler(vscode.workspace.rootPath, globalPackager, packagerStatusIndicator);
28
29const outputChannelLogger = new OutputChannelLogger(vscode.window.createOutputChannel("React-Native"));
30const entryPointHandler = new EntryPointHandler(false, outputChannelLogger);
31const reactNativeProjectHelper = new ReactNativeProjectHelper(vscode.workspace.rootPath);
32const fsUtil = new FileSystem();
33
34interface ISetupableDisposable extends vscode.Disposable {
35 setup(): Q.Promise<any>;
36}
37
38export function activate(context: vscode.ExtensionContext): void {
39 entryPointHandler.runApp("react-native", () => <string>require("../../package.json").version,
40 ErrorHelper.getInternalError(InternalErrorCode.ExtensionActivationFailed), () => {
41 return reactNativeProjectHelper.isReactNativeProject()
42 .then(isRNProject => {
43 if (isRNProject) {
44 warnWhenReactNativeVersionIsNotSupported();
45 entryPointHandler.runFunction("debugger.setupLauncherStub",
46 ErrorHelper.getInternalError(InternalErrorCode.DebuggerStubLauncherFailed), () =>
47 setupReactNativeDebugger()
48 .then(() =>
49 setupAndDispose(new ReactDirManager(), context))
50 .then(() =>
51 setupAndDispose(new ExtensionServer(globalPackager, packagerStatusIndicator), context))
52 .then(() => {}));
53 entryPointHandler.runFunction("intelliSense.setup",
54 ErrorHelper.getInternalError(InternalErrorCode.IntellisenseSetupFailed), () =>
55 IntellisenseHelper.setupReactNativeIntellisense());
56 }
57 entryPointHandler.runFunction("debugger.setupNodeDebuggerLocation",
58 ErrorHelper.getInternalError(InternalErrorCode.NodeDebuggerConfigurationFailed), () =>
59 configureNodeDebuggerLocation());
60 registerReactNativeCommands(context);
61 });
62 });
63}
64
65export function deactivate(): void {
66 // Kill any packager processes that we spawned
67 entryPointHandler.runFunction("extension.deactivate",
68 ErrorHelper.getInternalError(InternalErrorCode.FailedToStopPackagerOnExit),
69 () => {
70 commandPaletteHandler.stopPackager();
71 }, /*errorsAreFatal*/ true);
72}
73
74function configureNodeDebuggerLocation(): Q.Promise<void> {
75 const nodeDebugExtension = vscode.extensions.getExtension("ms-vscode.node-debug") // We try to get the new version
76 || vscode.extensions.getExtension("andreweinand.node-debug"); // If it's not available, we try to get the old version
77 if (!nodeDebugExtension) {
78 return Q.reject<void>("Couldn't find the location of the node-debugger extension.");
79 }
80 const nodeDebugPath = nodeDebugExtension.extensionPath;
81 return fsUtil.writeFile(path.resolve(__dirname, "../", "debugger", "nodeDebugLocation.json"), JSON.stringify({ nodeDebugPath }));
82}
83
84function setupAndDispose<T extends ISetupableDisposable>(setuptableDisposable: T, context: vscode.ExtensionContext): Q.Promise<T> {
85 return setuptableDisposable.setup()
86 .then(() => {
87 context.subscriptions.push(setuptableDisposable);
88 return setuptableDisposable;
89 });
90}
91
92function warnWhenReactNativeVersionIsNotSupported(): void {
93 return reactNativeProjectHelper.validateReactNativeVersion().done(() => { }, reason => {
94 TelemetryHelper.sendSimpleEvent("unsupportedRNVersion", { rnVersion: reason });
95 const shortMessage = `React Native Tools only supports React Native versions 0.19.0 and later`;
96 const longMessage = `${shortMessage}: ${reason}`;
97 vscode.window.showWarningMessage(shortMessage);
98 Log.logMessage(longMessage);
99 });
100}
101
102function registerReactNativeCommands(context: vscode.ExtensionContext): void {
103 // Register React Native commands
104 registerVSCodeCommand(context, "runAndroid", ErrorHelper.getInternalError(InternalErrorCode.FailedToRunOnAndroid), () => commandPaletteHandler.runAndroid());
105 registerVSCodeCommand(context, "runIos", ErrorHelper.getInternalError(InternalErrorCode.FailedToRunOnIos), () => commandPaletteHandler.runIos());
106 registerVSCodeCommand(context, "startPackager", ErrorHelper.getInternalError(InternalErrorCode.FailedToStartPackager), () => commandPaletteHandler.startPackager());
107 registerVSCodeCommand(context, "stopPackager", ErrorHelper.getInternalError(InternalErrorCode.FailedToStopPackager), () => commandPaletteHandler.stopPackager());
108}
109
110function registerVSCodeCommand(
111 context: vscode.ExtensionContext, commandName: string,
112 error: InternalError, commandHandler: () => Q.Promise<void>): void {
113 context.subscriptions.push(vscode.commands.registerCommand(
114 `reactNative.${commandName}`,
115 () =>
116 entryPointHandler.runFunction(
117 `commandPalette.${commandName}`, error,
118 commandHandler)));
119}
120
121/**
122 * Sets up the debugger for the React Native project by dropping
123 * the debugger stub into the workspace
124 */
125function setupReactNativeDebugger(): Q.Promise<void> {
126 const launcherPath = require.resolve("../debugger/launcher");
127 const pkg = require("../../package.json");
128 const extensionVersionNumber = pkg.version;
129 const extensionName = pkg.name;
130
131 let debuggerEntryCode =
132 `// This file is automatically generated by ${extensionName}@${extensionVersionNumber}
133// Please do not modify it manually. All changes will be lost.
134try {
135 var path = require("path");
136 var Launcher = require(${JSON.stringify(launcherPath)}).Launcher;
137 new Launcher(path.resolve(__dirname, "..")).launch();
138} catch (e) {
139 throw new Error("Unable to launch application. Try deleting .vscode/launchReactNative.js and restarting vscode.");
140}`;
141
142 const vscodeFolder = path.join(vscode.workspace.rootPath, ".vscode");
143 const debugStub = path.join(vscodeFolder, "launchReactNative.js");
144
145 return fsUtil.ensureDirectory(vscodeFolder)
146 .then(() => fsUtil.ensureFileWithContents(debugStub, debuggerEntryCode))
147 .catch((err: Error) => {
148 vscode.window.showErrorMessage(err.message);
149 });
150}