microsoft/vscode-react-native

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
1.9.2

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/extension/exponent/xdlInterface.ts

149lines · 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(METRO_CONFIG_PACKAGE),
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<typeof XDLPackage> =
36 PackageLoader.getInstance().generateGetPackageFunction<typeof XDLPackage>(
37 xdlPackageConfig,
38 ...EXPO_DEPS,
39 );
40export const getMetroConfigPackage: () => Promise<typeof MetroConfigPackage> =
41 PackageLoader.getInstance().generateGetPackageFunction<typeof MetroConfigPackage>(
42 metroConfigPackageConfig,
43 ...EXPO_DEPS,
44 );
45export const getNgrokResolver: () => Promise<XDLPackage.ResolveNgrok> =
46 PackageLoader.getInstance().generateGetPackageFunction<XDLPackage.ResolveNgrok>(
47 ngrokPackageConfig,
48 ...EXPO_DEPS,
49 );
50
51export type IUser = XDLPackage.IUser;
52
53export async function configReactNativeVersionWarnings(): Promise<void> {
54 (await getXDLPackage()).Config.validation.reactNativeVersionWarnings = false;
55}
56
57export async function attachLoggerStream(
58 rootPath: string,
59 options?: XDLPackage.IBunyanStream | any,
60): Promise<void> {
61 (await getXDLPackage()).ProjectUtils.attachLoggerStream(rootPath, options);
62}
63
64export async function currentUser(): Promise<XDLPackage.IUser> {
65 const xdl = await getXDLPackage();
66 return await (xdl.User
67 ? xdl.User.getCurrentUserAsync()
68 : xdl.UserManager.getCurrentUserAsync());
69}
70
71export async function login(username: string, password: string): Promise<XDLPackage.IUser> {
72 const xdl = await getXDLPackage();
73 return await (xdl.User
74 ? xdl.User.loginAsync("user-pass", { username, password })
75 : xdl.UserManager.loginAsync("user-pass", {
76 username,
77 password,
78 }));
79}
80
81export async function getExpoSdkVersions(): Promise<XDLPackage.SDKVersions> {
82 return (await getXDLPackage()).Versions.sdkVersionsAsync();
83}
84
85export async function getReleasedExpoSdkVersions(): Promise<XDLPackage.SDKVersions> {
86 return (await getXDLPackage()).Versions.releasedSdkVersionsAsync();
87}
88
89export async function publish(
90 projectRoot: string,
91 options?: XDLPackage.IPublishOptions,
92): Promise<XDLPackage.IPublishResponse> {
93 return (await getXDLPackage()).Project.publishAsync(projectRoot, options);
94}
95
96export async function setOptions(projectRoot: string, options: XDLPackage.IOptions): Promise<void> {
97 await (await getXDLPackage()).ProjectSettings.setPackagerInfoAsync(projectRoot, options);
98}
99
100export async function startExponentServer(projectRoot: string): Promise<void> {
101 await (await getXDLPackage()).Project.startExpoServerAsync(projectRoot);
102}
103
104export async function startTunnels(projectRoot: string): Promise<void> {
105 await (await getXDLPackage()).Project.startTunnelsAsync(projectRoot);
106}
107
108export async function getUrl(
109 projectRoot: string,
110 options?: XDLPackage.IUrlOptions,
111): Promise<string> {
112 return (await getXDLPackage()).UrlUtils.constructManifestUrlAsync(projectRoot, options);
113}
114
115export async function stopAll(projectRoot: string): Promise<void> {
116 await (await getXDLPackage()).Project.stopAsync(projectRoot);
117}
118
119export async function startAdbReverse(projectRoot: string): Promise<boolean> {
120 return (await getXDLPackage()).Android.startAdbReverseAsync(projectRoot);
121}
122
123export async function stopAdbReverse(projectRoot: string): Promise<void> {
124 await (await getXDLPackage()).Android.stopAdbReverseAsync(projectRoot);
125}
126
127export async function getMetroConfig(
128 projectRoot: string,
129): Promise<MetroConfigPackage.IMetroConfig> {
130 return (await getMetroConfigPackage()).loadAsync(projectRoot);
131}
132
133export async function isNgrokInstalled(projectRoot: string): Promise<boolean> {
134 const ngrokResolver = await getNgrokResolver();
135 try {
136 const ngrok = await ngrokResolver.resolveNgrokAsync(projectRoot, {
137 shouldPrompt: false,
138 autoInstall: false,
139 });
140 return !!ngrok;
141 } catch (err) {
142 // If unsupported version of the "@expo/ngrok" package was detected, we need to update the package.
143 // Since the "require" method used to parse the "ngrok⁄package.json" file in the "xdl" package caches
144 // all processed modules, we have to remove this file from cache to be able to require a new version
145 // of that file after the update of the "@expo/ngrok" package
146 removeModuleFromRequireCacheByName(pathJoin("ngrok", "package.json"));
147 throw err;
148 }
149}
150