microsoft/vscode-react-native
Publicmirrored from https://github.com/microsoft/vscode-react-nativeAvailable
src/extension/exponent/xdlInterface.ts
152lines · modeblame
7059d307Patricio Beltran9 years ago | 1 | // Copyright (c) Microsoft Corporation. All rights reserved. |
| 2 | // Licensed under the MIT license. See LICENSE file in the project root for details. | |
| 3 | | |
65e55367RedMickey4 years ago | 4 | import { join as pathJoin } from "path"; |
7059d307Patricio Beltran9 years ago | 5 | import * as XDLPackage from "xdl"; |
242759feJiglioNero5 years ago | 6 | import * as MetroConfigPackage from "metro-config"; |
716f31d0JiglioNero5 years ago | 7 | import { PackageLoader, PackageConfig } from "../../common/packageLoader"; |
65e55367RedMickey4 years ago | 8 | import { removeModuleFromRequireCacheByName } from "../../common/utils"; |
716f31d0JiglioNero5 years ago | 9 | import { SettingsHelper } from "../settingsHelper"; |
0a68f8dbArtem Egorov8 years ago | 10 | |
00a26245RedMickey5 years ago | 11 | const XDL_PACKAGE = "xdl"; |
242759feJiglioNero5 years ago | 12 | const METRO_CONFIG_PACKAGE = "@expo/metro-config"; |
| 13 | | |
716f31d0JiglioNero5 years ago | 14 | const xdlPackageConfig = new PackageConfig( |
| 15 | XDL_PACKAGE, | |
| 16 | SettingsHelper.getExpoDependencyVersion(XDL_PACKAGE), | |
| 17 | ); | |
| 18 | const metroConfigPackageConfig = new PackageConfig( | |
| 19 | METRO_CONFIG_PACKAGE, | |
c0dc4020etatanova4 years ago | 20 | SettingsHelper.getExpoDependencyVersion(METRO_CONFIG_PACKAGE), |
716f31d0JiglioNero5 years ago | 21 | ); |
| 22 | | |
| 23 | const 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 | |
| 33 | const EXPO_DEPS: PackageConfig[] = [xdlPackageConfig, metroConfigPackageConfig]; | |
242759feJiglioNero5 years ago | 34 | |
09f6024fHeniker4 years ago | 35 | export const getXDLPackage: () => Promise<typeof XDLPackage> = |
| 36 | PackageLoader.getInstance().generateGetPackageFunction<typeof XDLPackage>( | |
| 37 | xdlPackageConfig, | |
| 38 | ...EXPO_DEPS, | |
| 39 | ); | |
| 40 | export const getMetroConfigPackage: () => Promise<typeof MetroConfigPackage> = | |
| 41 | PackageLoader.getInstance().generateGetPackageFunction<typeof MetroConfigPackage>( | |
| 42 | metroConfigPackageConfig, | |
| 43 | ...EXPO_DEPS, | |
| 44 | ); | |
| 45 | export const getNgrokResolver: () => Promise<XDLPackage.ResolveNgrok> = | |
| 46 | PackageLoader.getInstance().generateGetPackageFunction<XDLPackage.ResolveNgrok>( | |
| 47 | ngrokPackageConfig, | |
| 48 | ...EXPO_DEPS, | |
| 49 | ); | |
7059d307Patricio Beltran9 years ago | 50 | |
| 51 | export type IUser = XDLPackage.IUser; | |
| 52 | | |
0d77292aJiglioNero4 years ago | 53 | export async function configReactNativeVersionWarnings(): Promise<void> { |
50a7f6ecbenjaminbi2 years ago | 54 | const xdlPackage = await getXDLPackage(); |
| 55 | if (xdlPackage.Config.validation !== undefined) { | |
| 56 | xdlPackage.Config.validation.reactNativeVersionWarnings = false; | |
| 57 | } | |
7059d307Patricio Beltran9 years ago | 58 | } |
| 59 | | |
0d77292aJiglioNero4 years ago | 60 | export async function attachLoggerStream( |
34472878RedMickey5 years ago | 61 | rootPath: string, |
| 62 | options?: XDLPackage.IBunyanStream | any, | |
| 63 | ): Promise<void> { | |
0d77292aJiglioNero4 years ago | 64 | (await getXDLPackage()).ProjectUtils.attachLoggerStream(rootPath, options); |
7059d307Patricio Beltran9 years ago | 65 | } |
| 66 | | |
0d77292aJiglioNero4 years ago | 67 | export async function currentUser(): Promise<XDLPackage.IUser> { |
| 68 | const xdl = await getXDLPackage(); | |
| 69 | return await (xdl.User | |
| 70 | ? xdl.User.getCurrentUserAsync() | |
| 71 | : xdl.UserManager.getCurrentUserAsync()); | |
7059d307Patricio Beltran9 years ago | 72 | } |
| 73 | | |
0d77292aJiglioNero4 years ago | 74 | export async function login(username: string, password: string): Promise<XDLPackage.IUser> { |
| 75 | const xdl = await getXDLPackage(); | |
| 76 | return await (xdl.User | |
09f6024fHeniker4 years ago | 77 | ? xdl.User.loginAsync("user-pass", { username, password }) |
0d77292aJiglioNero4 years ago | 78 | : xdl.UserManager.loginAsync("user-pass", { |
09f6024fHeniker4 years ago | 79 | username, |
| 80 | password, | |
0d77292aJiglioNero4 years ago | 81 | })); |
7059d307Patricio Beltran9 years ago | 82 | } |
| 83 | | |
0d77292aJiglioNero4 years ago | 84 | export async function getExpoSdkVersions(): Promise<XDLPackage.SDKVersions> { |
| 85 | return (await getXDLPackage()).Versions.sdkVersionsAsync(); | |
8f50947fRedMickey5 years ago | 86 | } |
| 87 | | |
0d77292aJiglioNero4 years ago | 88 | export async function getReleasedExpoSdkVersions(): Promise<XDLPackage.SDKVersions> { |
| 89 | return (await getXDLPackage()).Versions.releasedSdkVersionsAsync(); | |
7059d307Patricio Beltran9 years ago | 90 | } |
| 91 | | |
0d77292aJiglioNero4 years ago | 92 | export async function publish( |
34472878RedMickey5 years ago | 93 | projectRoot: string, |
| 94 | options?: XDLPackage.IPublishOptions, | |
| 95 | ): Promise<XDLPackage.IPublishResponse> { | |
0d77292aJiglioNero4 years ago | 96 | return (await getXDLPackage()).Project.publishAsync(projectRoot, options); |
7059d307Patricio Beltran9 years ago | 97 | } |
| 98 | | |
ec230406RedMickey4 years ago | 99 | export async function setOptions(projectRoot: string, options: XDLPackage.IOptions): Promise<void> { |
| 100 | await (await getXDLPackage()).ProjectSettings.setPackagerInfoAsync(projectRoot, options); | |
7059d307Patricio Beltran9 years ago | 101 | } |
| 102 | | |
0d77292aJiglioNero4 years ago | 103 | export async function startExponentServer(projectRoot: string): Promise<void> { |
| 104 | await (await getXDLPackage()).Project.startExpoServerAsync(projectRoot); | |
7059d307Patricio Beltran9 years ago | 105 | } |
| 106 | | |
0d77292aJiglioNero4 years ago | 107 | export async function startTunnels(projectRoot: string): Promise<void> { |
| 108 | await (await getXDLPackage()).Project.startTunnelsAsync(projectRoot); | |
7059d307Patricio Beltran9 years ago | 109 | } |
| 110 | | |
0d77292aJiglioNero4 years ago | 111 | export async function getUrl( |
| 112 | projectRoot: string, | |
| 113 | options?: XDLPackage.IUrlOptions, | |
| 114 | ): Promise<string> { | |
| 115 | return (await getXDLPackage()).UrlUtils.constructManifestUrlAsync(projectRoot, options); | |
7059d307Patricio Beltran9 years ago | 116 | } |
| 117 | | |
0d77292aJiglioNero4 years ago | 118 | export async function stopAll(projectRoot: string): Promise<void> { |
| 119 | await (await getXDLPackage()).Project.stopAsync(projectRoot); | |
7059d307Patricio Beltran9 years ago | 120 | } |
62c4de22RedMickey6 years ago | 121 | |
0d77292aJiglioNero4 years ago | 122 | export async function startAdbReverse(projectRoot: string): Promise<boolean> { |
| 123 | return (await getXDLPackage()).Android.startAdbReverseAsync(projectRoot); | |
62c4de22RedMickey6 years ago | 124 | } |
| 125 | | |
0d77292aJiglioNero4 years ago | 126 | export async function stopAdbReverse(projectRoot: string): Promise<void> { |
| 127 | await (await getXDLPackage()).Android.stopAdbReverseAsync(projectRoot); | |
242759feJiglioNero5 years ago | 128 | } |
| 129 | | |
0d77292aJiglioNero4 years ago | 130 | export async function getMetroConfig( |
| 131 | projectRoot: string, | |
| 132 | ): Promise<MetroConfigPackage.IMetroConfig> { | |
| 133 | return (await getMetroConfigPackage()).loadAsync(projectRoot); | |
62c4de22RedMickey6 years ago | 134 | } |
efb436fcRedMickey5 years ago | 135 | |
0d77292aJiglioNero4 years ago | 136 | export 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, | |
65e55367RedMickey4 years ago | 142 | }); |
0d77292aJiglioNero4 years ago | 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 | } | |
efb436fcRedMickey5 years ago | 152 | } |