microsoft/vscode-react-native

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
e866487435c097b8faba759339189dbe5705eea9

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/extension/exponent/xdlInterface.ts

153lines · 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 { join as pathJoin } from "path";
5import * as XDLPackage from "xdl";
6import * as MetroConfigPackage from "metro-config";
7import { PackageLoader, PackageConfig } from "../../common/packageLoader";
8import { removeModuleFromRequireCacheByName } from "../../common/utils";
9import { SettingsHelper } from "../settingsHelper";
10
11const XDL_PACKAGE = "xdl";
12const METRO_CONFIG_PACKAGE = "@expo/metro-config";
13
14const xdlPackageConfig = new PackageConfig(
15 XDL_PACKAGE,
16 SettingsHelper.getExpoDependencyVersion(XDL_PACKAGE),
17);
18const metroConfigPackageConfig = new PackageConfig(
19 METRO_CONFIG_PACKAGE,
20 SettingsHelper.getExpoDependencyVersion("metroConfig"),
21);
22
23const ngrokPackageConfig = new PackageConfig(
24 xdlPackageConfig.getPackageName(),
25 xdlPackageConfig.getVersion(),
26 "build/start/resolveNgrok",
27);
28
29// There is the problem with '--no-save' flag for 'npm install' command for npm v6.
30// Installing npm dependencies with the `--no-save` flag will remove
31// other dependencies that were installed previously in the same manner (https://github.com/npm/cli/issues/1460).
32// So we should workaround it passing all packages for install to only one npm install command
33const EXPO_DEPS: PackageConfig[] = [xdlPackageConfig, metroConfigPackageConfig];
34
35export const getXDLPackage: () => Promise<
36 typeof XDLPackage
37> = PackageLoader.getInstance().generateGetPackageFunction<typeof XDLPackage>(
38 xdlPackageConfig,
39 ...EXPO_DEPS,
40);
41export const getMetroConfigPackage: () => Promise<
42 typeof MetroConfigPackage
43> = PackageLoader.getInstance().generateGetPackageFunction<typeof MetroConfigPackage>(
44 metroConfigPackageConfig,
45 ...EXPO_DEPS,
46);
47export const getNgrokResolver: () => Promise<XDLPackage.ResolveNgrok> = PackageLoader.getInstance().generateGetPackageFunction<XDLPackage.ResolveNgrok>(
48 ngrokPackageConfig,
49 ...EXPO_DEPS,
50);
51
52export type IUser = XDLPackage.IUser;
53
54export async function configReactNativeVersionWarnings(): Promise<void> {
55 (await getXDLPackage()).Config.validation.reactNativeVersionWarnings = false;
56}
57
58export async function attachLoggerStream(
59 rootPath: string,
60 options?: XDLPackage.IBunyanStream | any,
61): Promise<void> {
62 (await getXDLPackage()).ProjectUtils.attachLoggerStream(rootPath, options);
63}
64
65export async function currentUser(): Promise<XDLPackage.IUser> {
66 const xdl = await getXDLPackage();
67 return await (xdl.User
68 ? xdl.User.getCurrentUserAsync()
69 : xdl.UserManager.getCurrentUserAsync());
70}
71
72export async function login(username: string, password: string): Promise<XDLPackage.IUser> {
73 const xdl = await getXDLPackage();
74 return await (xdl.User
75 ? xdl.User.loginAsync("user-pass", { username: username, password: password })
76 : xdl.UserManager.loginAsync("user-pass", {
77 username: username,
78 password: password,
79 }));
80}
81
82export async function getExpoSdkVersions(): Promise<XDLPackage.SDKVersions> {
83 return (await getXDLPackage()).Versions.sdkVersionsAsync();
84}
85
86export async function getReleasedExpoSdkVersions(): Promise<XDLPackage.SDKVersions> {
87 return (await getXDLPackage()).Versions.releasedSdkVersionsAsync();
88}
89
90export async function publish(
91 projectRoot: string,
92 options?: XDLPackage.IPublishOptions,
93): Promise<XDLPackage.IPublishResponse> {
94 return (await getXDLPackage()).Project.publishAsync(projectRoot, options);
95}
96
97export async function setOptions(
98 projectRoot: string,
99 options?: XDLPackage.IOptions,
100): Promise<void> {
101 await (await getXDLPackage()).Project.setOptionsAsync(projectRoot, options);
102}
103
104export async function startExponentServer(projectRoot: string): Promise<void> {
105 await (await getXDLPackage()).Project.startExpoServerAsync(projectRoot);
106}
107
108export async function startTunnels(projectRoot: string): Promise<void> {
109 await (await getXDLPackage()).Project.startTunnelsAsync(projectRoot);
110}
111
112export async function getUrl(
113 projectRoot: string,
114 options?: XDLPackage.IUrlOptions,
115): Promise<string> {
116 return (await getXDLPackage()).UrlUtils.constructManifestUrlAsync(projectRoot, options);
117}
118
119export async function stopAll(projectRoot: string): Promise<void> {
120 await (await getXDLPackage()).Project.stopAsync(projectRoot);
121}
122
123export async function startAdbReverse(projectRoot: string): Promise<boolean> {
124 return (await getXDLPackage()).Android.startAdbReverseAsync(projectRoot);
125}
126
127export async function stopAdbReverse(projectRoot: string): Promise<void> {
128 await (await getXDLPackage()).Android.stopAdbReverseAsync(projectRoot);
129}
130
131export async function getMetroConfig(
132 projectRoot: string,
133): Promise<MetroConfigPackage.IMetroConfig> {
134 return (await getMetroConfigPackage()).loadAsync(projectRoot);
135}
136
137export async function isNgrokInstalled(projectRoot: string): Promise<boolean> {
138 const ngrokResolver = await getNgrokResolver();
139 try {
140 const ngrok = await ngrokResolver.resolveNgrokAsync(projectRoot, {
141 shouldPrompt: false,
142 autoInstall: false,
143 });
144 return !!ngrok;
145 } catch (err) {
146 // If unsupported version of the "@expo/ngrok" package was detected, we need to update the package.
147 // Since the "require" method used to parse the "ngrok⁄package.json" file in the "xdl" package caches
148 // all processed modules, we have to remove this file from cache to be able to require a new version
149 // of that file after the update of the "@expo/ngrok" package
150 removeModuleFromRequireCacheByName(pathJoin("ngrok", "package.json"));
151 throw err;
152 }
153}
154