microsoft/vscode-react-native

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
a9d77c8b0667ef4b6618231d585f8465dae8b0df

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/extension/rn-extension.ts

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