microsoft/vscode-react-native

Public

mirrored fromhttps://github.com/microsoft/vscode-react-nativeAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
test-microbuild1

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/extension/exponent/xdlInterface.ts

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