microsoft/vscode-react-native

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
445b113fa38f291ca910604a6a87bab6cb5f95e9

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/extension/rn-extension.ts

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