microsoft/vscode-react-native

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
7be1388c3442500874ff28fc32e6f332ad9724ef

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/extension/rn-extension.ts

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