@expo/cli 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bin/cli +2 -2
- package/build/src/export/createBundles.js.map +1 -1
- package/build/src/export/exportApp.js +1 -2
- package/build/src/export/exportApp.js.map +1 -1
- package/build/src/export/fork-bundleAsync.js +3 -0
- package/build/src/export/fork-bundleAsync.js.map +1 -1
- package/build/src/install/checkPackages.js +3 -6
- package/build/src/install/checkPackages.js.map +1 -1
- package/build/src/install/installAsync.js +37 -3
- package/build/src/install/installAsync.js.map +1 -1
- package/build/src/install/resolveOptions.js.map +1 -1
- package/build/src/run/ios/appleDevice/ClientManager.js +5 -1
- package/build/src/run/ios/appleDevice/ClientManager.js.map +1 -1
- package/build/src/run/ios/appleDevice/client/LockdowndClient.js +5 -1
- package/build/src/run/ios/appleDevice/client/LockdowndClient.js.map +1 -1
- package/build/src/run/ios/appleDevice/protocol/AbstractProtocol.js +18 -0
- package/build/src/run/ios/appleDevice/protocol/AbstractProtocol.js.map +1 -1
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +13 -3
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
- package/build/src/start/doctor/ngrok/ExternalModule.js +6 -2
- package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
- package/build/src/start/doctor/typescript/updateTSConfig.js +1 -1
- package/build/src/start/doctor/typescript/updateTSConfig.js.map +1 -1
- package/build/src/start/interface/interactiveActions.js +7 -2
- package/build/src/start/interface/interactiveActions.js.map +1 -1
- package/build/src/start/server/BundlerDevServer.js +14 -10
- package/build/src/start/server/BundlerDevServer.js.map +1 -1
- package/build/src/start/server/DevServerManager.js +4 -1
- package/build/src/start/server/DevServerManager.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +5 -0
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/resolveFromProject.js +4 -0
- package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js +1 -1
- package/build/src/start/server/middleware/HistoryFallbackMiddleware.js +29 -0
- package/build/src/start/server/middleware/HistoryFallbackMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js +30 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/resolveEntryPoint.js +5 -1
- package/build/src/start/server/middleware/resolveEntryPoint.js.map +1 -1
- package/build/src/utils/FileNotifier.js +11 -2
- package/build/src/utils/FileNotifier.js.map +1 -1
- package/build/src/utils/analytics/getMetroDebugProperties.js +16 -0
- package/build/src/utils/analytics/getMetroDebugProperties.js.map +1 -0
- package/build/src/utils/analytics/getMetroProperties.js +29 -0
- package/build/src/utils/analytics/getMetroProperties.js.map +1 -0
- package/build/src/utils/analytics/metroDebuggerMiddleware.js +50 -0
- package/build/src/utils/analytics/metroDebuggerMiddleware.js.map +1 -0
- package/build/src/utils/analytics/rudderstackClient.js +2 -2
- package/build/src/utils/analytics/rudderstackClient.js.map +1 -1
- package/build/src/utils/array.js +11 -0
- package/build/src/utils/array.js.map +1 -1
- package/build/src/utils/env.js +3 -0
- package/build/src/utils/env.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/run/ios/appleDevice/protocol/AbstractProtocol.ts"],"sourcesContent":["/**\n * Copyright (c) 2021 Expo, Inc.\n * Copyright (c) 2018 Drifty Co.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport plist from '@expo/plist';\nimport { Socket } from 'net';\n\nimport { parsePlistBuffer } from '../../../../utils/plist';\n\nconst BPLIST_MAGIC = Buffer.from('bplist00');\n\nexport type ProtocolReaderCallback = (resp: any, err?: Error) => void;\n\nexport class ProtocolReaderFactory<T> {\n constructor(private ProtocolReader: new (callback: ProtocolReaderCallback) => T) {}\n\n create(callback: (resp: any, err?: Error) => void): T {\n return new this.ProtocolReader(callback);\n }\n}\n\nexport abstract class ProtocolReader {\n protected body!: Buffer; // TODO: ! -> ?\n protected bodyLength!: number; // TODO: ! -> ?\n protected buffer = Buffer.alloc(0);\n constructor(protected headerSize: number, protected callback: ProtocolReaderCallback) {\n this.onData = this.onData.bind(this);\n }\n\n /** Returns length of body, or -1 if header doesn't contain length */\n protected abstract parseHeader(data: Buffer): number;\n protected abstract parseBody(data: Buffer): any;\n\n onData(data?: Buffer) {\n try {\n // if there's data, add it on to existing buffer\n this.buffer = data ? Buffer.concat([this.buffer, data]) : this.buffer;\n // we haven't gotten the body length from the header yet\n if (!this.bodyLength) {\n if (this.buffer.length < this.headerSize) {\n // partial header, wait for rest\n return;\n }\n this.bodyLength = this.parseHeader(this.buffer);\n // move on to body\n this.buffer = this.buffer.slice(this.headerSize);\n if (!this.buffer.length) {\n // only got header, wait for body\n return;\n }\n }\n if (this.buffer.length < this.bodyLength) {\n // wait for rest of body\n return;\n }\n\n if (this.bodyLength === -1) {\n this.callback(this.parseBody(this.buffer));\n this.buffer = Buffer.alloc(0);\n } else {\n this.body = this.buffer.slice(0, this.bodyLength);\n this.bodyLength -= this.body.length;\n if (!this.bodyLength) {\n this.callback(this.parseBody(this.body));\n }\n this.buffer = this.buffer.slice(this.body.length);\n // There are multiple messages here, call parse again\n if (this.buffer.length) {\n this.onData();\n }\n }\n } catch (err: any) {\n this.callback(null, err);\n }\n }\n}\n\nexport abstract class PlistProtocolReader extends ProtocolReader {\n protected parseBody(body: Buffer) {\n if (BPLIST_MAGIC.compare(body, 0, 8) === 0) {\n return parsePlistBuffer(body);\n } else {\n return plist.parse(body.toString('utf8'));\n }\n }\n}\n\nexport interface ProtocolWriter {\n write(sock: Socket, msg: any): void;\n}\n\nexport abstract class ProtocolClient<MessageType = any> {\n constructor(\n public socket: Socket,\n protected readerFactory: ProtocolReaderFactory<ProtocolReader>,\n protected writer: ProtocolWriter\n ) {}\n\n sendMessage<ResponseType = any>(msg: MessageType): Promise<ResponseType>;\n sendMessage<CallbackType = void, ResponseType = any>(\n msg: MessageType,\n callback: (response: ResponseType, resolve: any, reject: any) => void\n ): Promise<CallbackType>;\n sendMessage<CallbackType = void, ResponseType = any>(\n msg: MessageType,\n callback?: (response: ResponseType, resolve: any, reject: any) => void\n ): Promise<CallbackType | ResponseType> {\n return new Promise<ResponseType | CallbackType>((resolve, reject) => {\n const reader = this.readerFactory.create(async (response: ResponseType, error?: Error) => {\n if (error) {\n reject(error);\n return;\n }\n if (callback) {\n callback(\n response,\n (value: any) => {\n this.socket.removeListener('data', reader.onData);\n resolve(value);\n },\n reject\n );\n } else {\n this.socket.removeListener('data', reader.onData);\n resolve(response);\n }\n });\n this.socket.on('data', reader.onData);\n this.writer.write(this.socket, msg);\n });\n }\n}\n"],"names":["BPLIST_MAGIC","Buffer","from","
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/run/ios/appleDevice/protocol/AbstractProtocol.ts"],"sourcesContent":["/**\n * Copyright (c) 2021 Expo, Inc.\n * Copyright (c) 2018 Drifty Co.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport plist from '@expo/plist';\nimport Debug from 'debug';\nimport { Socket } from 'net';\n\nimport { CommandError } from '../../../../utils/errors';\nimport { parsePlistBuffer } from '../../../../utils/plist';\n\nconst BPLIST_MAGIC = Buffer.from('bplist00');\nconst debug = Debug('expo:apple-device:protocol');\n\nexport class ProtocolClientError extends CommandError {\n constructor(msg: string, public error: Error, public protocolMessage?: any) {\n super(msg);\n }\n}\n\nexport type ProtocolReaderCallback = (resp: any, err?: Error) => void;\n\nexport class ProtocolReaderFactory<T> {\n constructor(private ProtocolReader: new (callback: ProtocolReaderCallback) => T) {}\n\n create(callback: (resp: any, err?: Error) => void): T {\n return new this.ProtocolReader(callback);\n }\n}\n\nexport abstract class ProtocolReader {\n protected body!: Buffer; // TODO: ! -> ?\n protected bodyLength!: number; // TODO: ! -> ?\n protected buffer = Buffer.alloc(0);\n constructor(protected headerSize: number, protected callback: ProtocolReaderCallback) {\n this.onData = this.onData.bind(this);\n }\n\n /** Returns length of body, or -1 if header doesn't contain length */\n protected abstract parseHeader(data: Buffer): number;\n protected abstract parseBody(data: Buffer): any;\n\n onData(data?: Buffer) {\n try {\n // if there's data, add it on to existing buffer\n this.buffer = data ? Buffer.concat([this.buffer, data]) : this.buffer;\n // we haven't gotten the body length from the header yet\n if (!this.bodyLength) {\n if (this.buffer.length < this.headerSize) {\n // partial header, wait for rest\n return;\n }\n this.bodyLength = this.parseHeader(this.buffer);\n // move on to body\n this.buffer = this.buffer.slice(this.headerSize);\n if (!this.buffer.length) {\n // only got header, wait for body\n return;\n }\n }\n if (this.buffer.length < this.bodyLength) {\n // wait for rest of body\n return;\n }\n\n if (this.bodyLength === -1) {\n this.callback(this.parseBody(this.buffer));\n this.buffer = Buffer.alloc(0);\n } else {\n this.body = this.buffer.slice(0, this.bodyLength);\n this.bodyLength -= this.body.length;\n if (!this.bodyLength) {\n this.callback(this.parseBody(this.body));\n }\n this.buffer = this.buffer.slice(this.body.length);\n // There are multiple messages here, call parse again\n if (this.buffer.length) {\n this.onData();\n }\n }\n } catch (err: any) {\n this.callback(null, err);\n }\n }\n}\n\nexport abstract class PlistProtocolReader extends ProtocolReader {\n protected parseBody(body: Buffer) {\n if (BPLIST_MAGIC.compare(body, 0, 8) === 0) {\n return parsePlistBuffer(body);\n } else {\n return plist.parse(body.toString('utf8'));\n }\n }\n}\n\nexport interface ProtocolWriter {\n write(sock: Socket, msg: any): void;\n}\n\nexport abstract class ProtocolClient<MessageType = any> {\n constructor(\n public socket: Socket,\n protected readerFactory: ProtocolReaderFactory<ProtocolReader>,\n protected writer: ProtocolWriter\n ) {}\n\n sendMessage<ResponseType = any>(msg: MessageType): Promise<ResponseType>;\n sendMessage<CallbackType = void, ResponseType = any>(\n msg: MessageType,\n callback: (response: ResponseType, resolve: any, reject: any) => void\n ): Promise<CallbackType>;\n sendMessage<CallbackType = void, ResponseType = any>(\n msg: MessageType,\n callback?: (response: ResponseType, resolve: any, reject: any) => void\n ): Promise<CallbackType | ResponseType> {\n const onError = (error: Error) => {\n debug('Unexpected protocol socket error encountered: %s', error);\n throw new ProtocolClientError(\n `Unexpected protocol error encountered: ${error.message}`,\n error,\n msg\n );\n };\n\n return new Promise<ResponseType | CallbackType>((resolve, reject) => {\n const reader = this.readerFactory.create(async (response: ResponseType, error?: Error) => {\n if (error) {\n reject(error);\n return;\n }\n if (callback) {\n callback(\n response,\n (value: any) => {\n this.socket.removeListener('data', reader.onData);\n this.socket.removeListener('error', onError);\n resolve(value);\n },\n reject\n );\n } else {\n this.socket.removeListener('data', reader.onData);\n this.socket.removeListener('error', onError);\n resolve(response);\n }\n });\n this.socket.on('data', reader.onData);\n this.socket.on('error', onError);\n this.writer.write(this.socket, msg);\n });\n }\n}\n"],"names":["BPLIST_MAGIC","Buffer","from","debug","Debug","ProtocolClientError","CommandError","constructor","msg","error","protocolMessage","ProtocolReaderFactory","ProtocolReader","create","callback","headerSize","buffer","alloc","onData","bind","data","concat","bodyLength","length","parseHeader","slice","parseBody","body","err","PlistProtocolReader","compare","parsePlistBuffer","plist","parse","toString","ProtocolClient","socket","readerFactory","writer","sendMessage","onError","message","Promise","resolve","reject","reader","response","value","removeListener","on","write"],"mappings":"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"}
|
|
@@ -78,7 +78,10 @@ async function getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCh
|
|
|
78
78
|
const resolvedDependencies = (packagesToCheck == null ? void 0 : packagesToCheck.length) ? getFilteredObject(packagesToCheck, {
|
|
79
79
|
...pkg.dependencies,
|
|
80
80
|
...pkg.devDependencies
|
|
81
|
-
}) :
|
|
81
|
+
}) : {
|
|
82
|
+
...pkg.dependencies,
|
|
83
|
+
...pkg.devDependencies
|
|
84
|
+
};
|
|
82
85
|
debug(`Checking dependencies for ${exp.sdkVersion}: %O`, resolvedDependencies);
|
|
83
86
|
// intersection of packages from package.json and bundled native modules
|
|
84
87
|
const { known: resolvedPackagesToCheck , unknown } = getPackagesToCheck(resolvedDependencies, combinedKnownPackages);
|
|
@@ -88,7 +91,7 @@ async function getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCh
|
|
|
88
91
|
const packageVersions = await resolvePackageVersionsAsync(projectRoot, resolvedPackagesToCheck);
|
|
89
92
|
debug(`Package versions: %O`, packageVersions);
|
|
90
93
|
// find incorrect dependencies by comparing the actual package versions with the bundled native module version ranges
|
|
91
|
-
const incorrectDeps = findIncorrectDependencies(packageVersions, combinedKnownPackages);
|
|
94
|
+
const incorrectDeps = findIncorrectDependencies(pkg, packageVersions, combinedKnownPackages);
|
|
92
95
|
debug(`Incorrect dependencies: %O`, incorrectDeps);
|
|
93
96
|
return incorrectDeps;
|
|
94
97
|
}
|
|
@@ -140,7 +143,7 @@ async function getPackageVersionAsync(projectRoot, packageName) {
|
|
|
140
143
|
const packageJson = await _jsonFile.default.readAsync(packageJsonPath);
|
|
141
144
|
return packageJson.version;
|
|
142
145
|
}
|
|
143
|
-
function findIncorrectDependencies(packageVersions, bundledNativeModules) {
|
|
146
|
+
function findIncorrectDependencies(pkg, packageVersions, bundledNativeModules) {
|
|
144
147
|
const packages = Object.keys(packageVersions);
|
|
145
148
|
const incorrectDeps = [];
|
|
146
149
|
for (const packageName of packages){
|
|
@@ -149,6 +152,7 @@ function findIncorrectDependencies(packageVersions, bundledNativeModules) {
|
|
|
149
152
|
if (typeof expectedVersionOrRange === "string" && !_semver.default.intersects(expectedVersionOrRange, actualVersion)) {
|
|
150
153
|
incorrectDeps.push({
|
|
151
154
|
packageName,
|
|
155
|
+
packageType: findDependencyType(pkg, packageName),
|
|
152
156
|
expectedVersionOrRange,
|
|
153
157
|
actualVersion
|
|
154
158
|
});
|
|
@@ -156,5 +160,11 @@ function findIncorrectDependencies(packageVersions, bundledNativeModules) {
|
|
|
156
160
|
}
|
|
157
161
|
return incorrectDeps;
|
|
158
162
|
}
|
|
163
|
+
function findDependencyType(pkg, packageName) {
|
|
164
|
+
if (pkg.devDependencies && packageName in pkg.devDependencies) {
|
|
165
|
+
return "devDependencies";
|
|
166
|
+
}
|
|
167
|
+
return "dependencies";
|
|
168
|
+
}
|
|
159
169
|
|
|
160
170
|
//# sourceMappingURL=validateDependenciesVersions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/doctor/dependencies/validateDependenciesVersions.ts"],"sourcesContent":["import { ExpoConfig, PackageJSONConfig } from '@expo/config';\nimport JsonFile from '@expo/json-file';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { APISettings } from '../../../api/settings';\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { BundledNativeModules } from './bundledNativeModules';\nimport { getCombinedKnownVersionsAsync } from './getVersionedPackages';\n\nconst debug = require('debug')('expo:doctor:dependencies:validate') as typeof console.log;\n\ninterface IncorrectDependency {\n packageName: string;\n expectedVersionOrRange: string;\n actualVersion: string;\n}\n\n/**\n * Print a list of incorrect dependency versions.\n * This only checks dependencies when not running in offline mode.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns `true` if there are no incorrect dependencies.\n */\nexport async function validateDependenciesVersionsAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<boolean | null> {\n if (APISettings.isOffline) {\n Log.warn('Skipping dependency validation in offline mode');\n return null;\n }\n\n const incorrectDeps = await getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCheck);\n return logIncorrectDependencies(incorrectDeps);\n}\n\nfunction logInvalidDependency({\n packageName,\n expectedVersionOrRange,\n actualVersion,\n}: IncorrectDependency) {\n Log.warn(\n // chalk` - {underline ${packageName}} - expected version: {underline ${expectedVersionOrRange}} - actual version installed: {underline ${actualVersion}}`\n chalk` {bold ${packageName}}{cyan @}{red ${actualVersion}} - expected version: {green ${expectedVersionOrRange}}`\n );\n}\n\nexport function logIncorrectDependencies(incorrectDeps: IncorrectDependency[]) {\n if (!incorrectDeps.length) {\n return true;\n }\n\n Log.warn(chalk`Some dependencies are incompatible with the installed {bold expo} version:`);\n incorrectDeps.forEach((dep) => logInvalidDependency(dep));\n\n const requiredVersions = incorrectDeps.map(\n ({ packageName, expectedVersionOrRange }) => `${packageName}@${expectedVersionOrRange}`\n );\n\n Log.warn(\n 'Your project may not work correctly until you install the correct versions of the packages.\\n' +\n chalk`Install individual packages by running {inverse npx expo install ${requiredVersions.join(\n ' '\n )}}`\n );\n return false;\n}\n\n/**\n * Return a list of versioned dependencies for the project SDK version.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns A list of incorrect dependencies.\n */\nexport async function getVersionedDependenciesAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<IncorrectDependency[]> {\n // This should never happen under normal circumstances since\n // the CLI is versioned in the `expo` package.\n assert(exp.sdkVersion, 'SDK Version is missing');\n\n // Get from both endpoints and combine the known package versions.\n const combinedKnownPackages = await getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion: exp.sdkVersion,\n });\n // debug(`Known dependencies: %O`, combinedKnownPackages);\n\n const resolvedDependencies = packagesToCheck?.length\n ? // Diff the provided packages to ensure we only check against installed packages.\n getFilteredObject(packagesToCheck, { ...pkg.dependencies, ...pkg.devDependencies })\n : // If no packages are provided, check against the `package.json` `dependencies` object.\n pkg.dependencies;\n debug(`Checking dependencies for ${exp.sdkVersion}: %O`, resolvedDependencies);\n\n // intersection of packages from package.json and bundled native modules\n const { known: resolvedPackagesToCheck, unknown } = getPackagesToCheck(\n resolvedDependencies,\n combinedKnownPackages\n );\n debug(`Comparing known versions: %O`, resolvedPackagesToCheck);\n debug(`Skipping packages that cannot be versioned automatically: %O`, unknown);\n // read package versions from the file system (node_modules)\n const packageVersions = await resolvePackageVersionsAsync(projectRoot, resolvedPackagesToCheck);\n debug(`Package versions: %O`, packageVersions);\n // find incorrect dependencies by comparing the actual package versions with the bundled native module version ranges\n const incorrectDeps = findIncorrectDependencies(packageVersions, combinedKnownPackages);\n debug(`Incorrect dependencies: %O`, incorrectDeps);\n\n return incorrectDeps;\n}\n\nfunction getFilteredObject(keys: string[], object: Record<string, string>) {\n return keys.reduce<Record<string, string>>((acc, key) => {\n acc[key] = object[key];\n return acc;\n }, {});\n}\n\nfunction getPackagesToCheck(\n dependencies: Record<string, string> | null | undefined,\n bundledNativeModules: BundledNativeModules\n): { known: string[]; unknown: string[] } {\n const dependencyNames = Object.keys(dependencies ?? {});\n const known: string[] = [];\n const unknown: string[] = [];\n for (const dependencyName of dependencyNames) {\n if (dependencyName in bundledNativeModules) {\n known.push(dependencyName);\n } else {\n unknown.push(dependencyName);\n }\n }\n return { known, unknown };\n}\n\nasync function resolvePackageVersionsAsync(\n projectRoot: string,\n packages: string[]\n): Promise<Record<string, string>> {\n const packageVersionsFromPackageJSON = await Promise.all(\n packages.map((packageName) => getPackageVersionAsync(projectRoot, packageName))\n );\n return packages.reduce((acc, packageName, idx) => {\n acc[packageName] = packageVersionsFromPackageJSON[idx];\n return acc;\n }, {} as Record<string, string>);\n}\n\nasync function getPackageVersionAsync(projectRoot: string, packageName: string): Promise<string> {\n let packageJsonPath: string | undefined;\n try {\n packageJsonPath = resolveFrom(projectRoot, `${packageName}/package.json`);\n } catch (error: any) {\n // This is a workaround for packages using `exports`. If this doesn't\n // include `package.json`, we have to use the error message to get the location.\n if (error.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') {\n packageJsonPath = error.message.match(/(\"exports\"|defined) in (.*)$/i)?.[2];\n }\n }\n if (!packageJsonPath) {\n throw new CommandError(\n `\"${packageName}\" is added as a dependency in your project's package.json but it doesn't seem to be installed. Please run \"yarn\" or \"npm install\" to fix this issue.`\n );\n }\n const packageJson = await JsonFile.readAsync<BundledNativeModules>(packageJsonPath);\n return packageJson.version;\n}\n\nfunction findIncorrectDependencies(\n packageVersions: Record<string, string>,\n bundledNativeModules: BundledNativeModules\n): IncorrectDependency[] {\n const packages = Object.keys(packageVersions);\n const incorrectDeps: IncorrectDependency[] = [];\n for (const packageName of packages) {\n const expectedVersionOrRange = bundledNativeModules[packageName];\n const actualVersion = packageVersions[packageName];\n if (\n typeof expectedVersionOrRange === 'string' &&\n !semver.intersects(expectedVersionOrRange, actualVersion)\n ) {\n incorrectDeps.push({\n packageName,\n expectedVersionOrRange,\n actualVersion,\n });\n }\n }\n return incorrectDeps;\n}\n"],"names":["validateDependenciesVersionsAsync","logIncorrectDependencies","getVersionedDependenciesAsync","Log","debug","require","projectRoot","exp","pkg","packagesToCheck","APISettings","isOffline","warn","incorrectDeps","logInvalidDependency","packageName","expectedVersionOrRange","actualVersion","chalk","length","forEach","dep","requiredVersions","map","join","assert","sdkVersion","combinedKnownPackages","getCombinedKnownVersionsAsync","resolvedDependencies","getFilteredObject","dependencies","devDependencies","known","resolvedPackagesToCheck","unknown","getPackagesToCheck","packageVersions","resolvePackageVersionsAsync","findIncorrectDependencies","keys","object","reduce","acc","key","bundledNativeModules","dependencyNames","Object","dependencyName","push","packages","packageVersionsFromPackageJSON","Promise","all","getPackageVersionAsync","idx","packageJsonPath","resolveFrom","error","code","message","match","CommandError","packageJson","JsonFile","readAsync","version","semver","intersects"],"mappings":"AAAA;;;;QA+BsBA,iCAAiC,GAAjCA,iCAAiC;QA0BvCC,wBAAwB,GAAxBA,wBAAwB;QA8BlBC,6BAA6B,GAA7BA,6BAA6B;AAtF9B,IAAA,SAAiB,kCAAjB,iBAAiB,EAAA;AACnB,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AACT,IAAA,MAAO,kCAAP,OAAO,EAAA;AACD,IAAA,YAAc,kCAAd,cAAc,EAAA;AACnB,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AAEC,IAAA,SAAuB,WAAvB,uBAAuB,CAAA;AACvCC,IAAAA,GAAG,mCAAM,cAAc,EAApB;AACc,IAAA,OAAuB,WAAvB,uBAAuB,CAAA;AAEN,IAAA,qBAAwB,WAAxB,wBAAwB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEtE,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,mCAAmC,CAAC,AAAsB,AAAC;AAkBnF,eAAeL,iCAAiC,CACrDM,WAAmB,EACnBC,GAAmC,EACnCC,GAAsB,EACtBC,eAA0B,EACD;IACzB,IAAIC,SAAW,YAAA,CAACC,SAAS,EAAE;QACzBR,GAAG,CAACS,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;KACb;IAED,MAAMC,aAAa,GAAG,MAAMX,6BAA6B,CAACI,WAAW,EAAEC,GAAG,EAAEC,GAAG,EAAEC,eAAe,CAAC,AAAC;IAClG,OAAOR,wBAAwB,CAACY,aAAa,CAAC,CAAC;CAChD;AAED,SAASC,oBAAoB,CAAC,EAC5BC,WAAW,CAAA,EACXC,sBAAsB,CAAA,EACtBC,aAAa,CAAA,EACO,EAAE;IACtBd,GAAG,CAACS,IAAI,CACN,0JAA0J;IAC1JM,MAAK,QAAA,CAAC,QAAQ,EAAEH,WAAW,CAAC,cAAc,EAAEE,aAAa,CAAC,6BAA6B,EAAED,sBAAsB,CAAC,CAAC,CAAC,CACnH,CAAC;CACH;AAEM,SAASf,wBAAwB,CAACY,aAAoC,EAAE;IAC7E,IAAI,CAACA,aAAa,CAACM,MAAM,EAAE;QACzB,OAAO,IAAI,CAAC;KACb;IAEDhB,GAAG,CAACS,IAAI,CAACM,MAAK,QAAA,CAAC,0EAA0E,CAAC,CAAC,CAAC;IAC5FL,aAAa,CAACO,OAAO,CAAC,CAACC,GAAG,GAAKP,oBAAoB,CAACO,GAAG,CAAC;IAAA,CAAC,CAAC;IAE1D,MAAMC,gBAAgB,GAAGT,aAAa,CAACU,GAAG,CACxC,CAAC,EAAER,WAAW,CAAA,EAAEC,sBAAsB,CAAA,EAAE,GAAK,CAAC,EAAED,WAAW,CAAC,CAAC,EAAEC,sBAAsB,CAAC,CAAC;IAAA,CACxF,AAAC;IAEFb,GAAG,CAACS,IAAI,CACN,+FAA+F,GAC7FM,MAAK,QAAA,CAAC,iEAAiE,EAAEI,gBAAgB,CAACE,IAAI,CAC5F,GAAG,CACJ,CAAC,CAAC,CAAC,CACP,CAAC;IACF,OAAO,KAAK,CAAC;CACd;AAWM,eAAetB,6BAA6B,CACjDI,WAAmB,EACnBC,GAAmC,EACnCC,GAAsB,EACtBC,eAA0B,EACM;IAChC,4DAA4D;IAC5D,8CAA8C;IAC9CgB,CAAAA,GAAAA,OAAM,AAA0C,CAAA,QAA1C,CAAClB,GAAG,CAACmB,UAAU,EAAE,wBAAwB,CAAC,CAAC;IAEjD,kEAAkE;IAClE,MAAMC,qBAAqB,GAAG,MAAMC,CAAAA,GAAAA,qBAA6B,AAG/D,CAAA,8BAH+D,CAAC;QAChEtB,WAAW;QACXoB,UAAU,EAAEnB,GAAG,CAACmB,UAAU;KAC3B,CAAC,AAAC;IACH,0DAA0D;IAE1D,MAAMG,oBAAoB,GAAGpB,CAAAA,eAAe,QAAQ,GAAvBA,KAAAA,CAAuB,GAAvBA,eAAe,CAAEU,MAAM,CAAA,GAEhDW,iBAAiB,CAACrB,eAAe,EAAE;QAAE,GAAGD,GAAG,CAACuB,YAAY;QAAE,GAAGvB,GAAG,CAACwB,eAAe;KAAE,CAAC,GAEnFxB,GAAG,CAACuB,YAAY,AAAC;IACrB3B,KAAK,CAAC,CAAC,0BAA0B,EAAEG,GAAG,CAACmB,UAAU,CAAC,IAAI,CAAC,EAAEG,oBAAoB,CAAC,CAAC;IAE/E,wEAAwE;IACxE,MAAM,EAAEI,KAAK,EAAEC,uBAAuB,CAAA,EAAEC,OAAO,CAAA,EAAE,GAAGC,kBAAkB,CACpEP,oBAAoB,EACpBF,qBAAqB,CACtB,AAAC;IACFvB,KAAK,CAAC,CAAC,4BAA4B,CAAC,EAAE8B,uBAAuB,CAAC,CAAC;IAC/D9B,KAAK,CAAC,CAAC,4DAA4D,CAAC,EAAE+B,OAAO,CAAC,CAAC;IAC/E,4DAA4D;IAC5D,MAAME,eAAe,GAAG,MAAMC,2BAA2B,CAAChC,WAAW,EAAE4B,uBAAuB,CAAC,AAAC;IAChG9B,KAAK,CAAC,CAAC,oBAAoB,CAAC,EAAEiC,eAAe,CAAC,CAAC;IAC/C,qHAAqH;IACrH,MAAMxB,aAAa,GAAG0B,yBAAyB,CAACF,eAAe,EAAEV,qBAAqB,CAAC,AAAC;IACxFvB,KAAK,CAAC,CAAC,0BAA0B,CAAC,EAAES,aAAa,CAAC,CAAC;IAEnD,OAAOA,aAAa,CAAC;CACtB;AAED,SAASiB,iBAAiB,CAACU,IAAc,EAAEC,MAA8B,EAAE;IACzE,OAAOD,IAAI,CAACE,MAAM,CAAyB,CAACC,GAAG,EAAEC,GAAG,GAAK;QACvDD,GAAG,CAACC,GAAG,CAAC,GAAGH,MAAM,CAACG,GAAG,CAAC,CAAC;QACvB,OAAOD,GAAG,CAAC;KACZ,EAAE,EAAE,CAAC,CAAC;CACR;AAED,SAASP,kBAAkB,CACzBL,YAAuD,EACvDc,oBAA0C,EACF;IACxC,MAAMC,eAAe,GAAGC,MAAM,CAACP,IAAI,CAACT,YAAY,WAAZA,YAAY,GAAI,EAAE,CAAC,AAAC;IACxD,MAAME,KAAK,GAAa,EAAE,AAAC;IAC3B,MAAME,OAAO,GAAa,EAAE,AAAC;IAC7B,KAAK,MAAMa,cAAc,IAAIF,eAAe,CAAE;QAC5C,IAAIE,cAAc,IAAIH,oBAAoB,EAAE;YAC1CZ,KAAK,CAACgB,IAAI,CAACD,cAAc,CAAC,CAAC;SAC5B,MAAM;YACLb,OAAO,CAACc,IAAI,CAACD,cAAc,CAAC,CAAC;SAC9B;KACF;IACD,OAAO;QAAEf,KAAK;QAAEE,OAAO;KAAE,CAAC;CAC3B;AAED,eAAeG,2BAA2B,CACxChC,WAAmB,EACnB4C,QAAkB,EACe;IACjC,MAAMC,8BAA8B,GAAG,MAAMC,OAAO,CAACC,GAAG,CACtDH,QAAQ,CAAC3B,GAAG,CAAC,CAACR,WAAW,GAAKuC,sBAAsB,CAAChD,WAAW,EAAES,WAAW,CAAC;IAAA,CAAC,CAChF,AAAC;IACF,OAAOmC,QAAQ,CAACR,MAAM,CAAC,CAACC,GAAG,EAAE5B,WAAW,EAAEwC,GAAG,GAAK;QAChDZ,GAAG,CAAC5B,WAAW,CAAC,GAAGoC,8BAA8B,CAACI,GAAG,CAAC,CAAC;QACvD,OAAOZ,GAAG,CAAC;KACZ,EAAE,EAAE,CAA2B,CAAC;CAClC;AAED,eAAeW,sBAAsB,CAAChD,WAAmB,EAAES,WAAmB,EAAmB;IAC/F,IAAIyC,eAAe,AAAoB,AAAC;IACxC,IAAI;QACFA,eAAe,GAAGC,CAAAA,GAAAA,YAAW,AAA4C,CAAA,QAA5C,CAACnD,WAAW,EAAE,CAAC,EAAES,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;KAC3E,CAAC,OAAO2C,KAAK,EAAO;QACnB,qEAAqE;QACrE,gFAAgF;QAChF,IAAIA,KAAK,CAACC,IAAI,KAAK,+BAA+B,EAAE;gBAChCD,GAAoD;YAAtEF,eAAe,GAAGE,CAAAA,GAAoD,GAApDA,KAAK,CAACE,OAAO,CAACC,KAAK,iCAAiC,SAAK,GAAzDH,KAAAA,CAAyD,GAAzDA,GAAoD,AAAE,CAAC,CAAC,CAAC,CAAC;SAC7E;KACF;IACD,IAAI,CAACF,eAAe,EAAE;QACpB,MAAM,IAAIM,OAAY,aAAA,CACpB,CAAC,CAAC,EAAE/C,WAAW,CAAC,oJAAoJ,CAAC,CACtK,CAAC;KACH;IACD,MAAMgD,WAAW,GAAG,MAAMC,SAAQ,QAAA,CAACC,SAAS,CAAuBT,eAAe,CAAC,AAAC;IACpF,OAAOO,WAAW,CAACG,OAAO,CAAC;CAC5B;AAED,SAAS3B,yBAAyB,CAChCF,eAAuC,EACvCQ,oBAA0C,EACnB;IACvB,MAAMK,QAAQ,GAAGH,MAAM,CAACP,IAAI,CAACH,eAAe,CAAC,AAAC;IAC9C,MAAMxB,aAAa,GAA0B,EAAE,AAAC;IAChD,KAAK,MAAME,WAAW,IAAImC,QAAQ,CAAE;QAClC,MAAMlC,sBAAsB,GAAG6B,oBAAoB,CAAC9B,WAAW,CAAC,AAAC;QACjE,MAAME,aAAa,GAAGoB,eAAe,CAACtB,WAAW,CAAC,AAAC;QACnD,IACE,OAAOC,sBAAsB,KAAK,QAAQ,IAC1C,CAACmD,OAAM,QAAA,CAACC,UAAU,CAACpD,sBAAsB,EAAEC,aAAa,CAAC,EACzD;YACAJ,aAAa,CAACoC,IAAI,CAAC;gBACjBlC,WAAW;gBACXC,sBAAsB;gBACtBC,aAAa;aACd,CAAC,CAAC;SACJ;KACF;IACD,OAAOJ,aAAa,CAAC;CACtB"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/doctor/dependencies/validateDependenciesVersions.ts"],"sourcesContent":["import { ExpoConfig, PackageJSONConfig } from '@expo/config';\nimport JsonFile from '@expo/json-file';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { APISettings } from '../../../api/settings';\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { BundledNativeModules } from './bundledNativeModules';\nimport { getCombinedKnownVersionsAsync } from './getVersionedPackages';\n\nconst debug = require('debug')('expo:doctor:dependencies:validate') as typeof console.log;\n\ninterface IncorrectDependency {\n packageName: string;\n packageType: 'dependencies' | 'devDependencies';\n expectedVersionOrRange: string;\n actualVersion: string;\n}\n\n/**\n * Print a list of incorrect dependency versions.\n * This only checks dependencies when not running in offline mode.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns `true` if there are no incorrect dependencies.\n */\nexport async function validateDependenciesVersionsAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<boolean | null> {\n if (APISettings.isOffline) {\n Log.warn('Skipping dependency validation in offline mode');\n return null;\n }\n\n const incorrectDeps = await getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCheck);\n return logIncorrectDependencies(incorrectDeps);\n}\n\nfunction logInvalidDependency({\n packageName,\n expectedVersionOrRange,\n actualVersion,\n}: IncorrectDependency) {\n Log.warn(\n // chalk` - {underline ${packageName}} - expected version: {underline ${expectedVersionOrRange}} - actual version installed: {underline ${actualVersion}}`\n chalk` {bold ${packageName}}{cyan @}{red ${actualVersion}} - expected version: {green ${expectedVersionOrRange}}`\n );\n}\n\nexport function logIncorrectDependencies(incorrectDeps: IncorrectDependency[]) {\n if (!incorrectDeps.length) {\n return true;\n }\n\n Log.warn(chalk`Some dependencies are incompatible with the installed {bold expo} version:`);\n incorrectDeps.forEach((dep) => logInvalidDependency(dep));\n\n const requiredVersions = incorrectDeps.map(\n ({ packageName, expectedVersionOrRange }) => `${packageName}@${expectedVersionOrRange}`\n );\n\n Log.warn(\n 'Your project may not work correctly until you install the correct versions of the packages.\\n' +\n chalk`Install individual packages by running {inverse npx expo install ${requiredVersions.join(\n ' '\n )}}`\n );\n return false;\n}\n\n/**\n * Return a list of versioned dependencies for the project SDK version.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns A list of incorrect dependencies.\n */\nexport async function getVersionedDependenciesAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<IncorrectDependency[]> {\n // This should never happen under normal circumstances since\n // the CLI is versioned in the `expo` package.\n assert(exp.sdkVersion, 'SDK Version is missing');\n\n // Get from both endpoints and combine the known package versions.\n const combinedKnownPackages = await getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion: exp.sdkVersion,\n });\n // debug(`Known dependencies: %O`, combinedKnownPackages);\n\n const resolvedDependencies = packagesToCheck?.length\n ? // Diff the provided packages to ensure we only check against installed packages.\n getFilteredObject(packagesToCheck, { ...pkg.dependencies, ...pkg.devDependencies })\n : // If no packages are provided, check against the `package.json` `dependencies` + `devDependencies` object.\n { ...pkg.dependencies, ...pkg.devDependencies };\n debug(`Checking dependencies for ${exp.sdkVersion}: %O`, resolvedDependencies);\n\n // intersection of packages from package.json and bundled native modules\n const { known: resolvedPackagesToCheck, unknown } = getPackagesToCheck(\n resolvedDependencies,\n combinedKnownPackages\n );\n debug(`Comparing known versions: %O`, resolvedPackagesToCheck);\n debug(`Skipping packages that cannot be versioned automatically: %O`, unknown);\n // read package versions from the file system (node_modules)\n const packageVersions = await resolvePackageVersionsAsync(projectRoot, resolvedPackagesToCheck);\n debug(`Package versions: %O`, packageVersions);\n // find incorrect dependencies by comparing the actual package versions with the bundled native module version ranges\n const incorrectDeps = findIncorrectDependencies(pkg, packageVersions, combinedKnownPackages);\n debug(`Incorrect dependencies: %O`, incorrectDeps);\n\n return incorrectDeps;\n}\n\nfunction getFilteredObject(keys: string[], object: Record<string, string>) {\n return keys.reduce<Record<string, string>>((acc, key) => {\n acc[key] = object[key];\n return acc;\n }, {});\n}\n\nfunction getPackagesToCheck(\n dependencies: Record<string, string> | null | undefined,\n bundledNativeModules: BundledNativeModules\n): { known: string[]; unknown: string[] } {\n const dependencyNames = Object.keys(dependencies ?? {});\n const known: string[] = [];\n const unknown: string[] = [];\n for (const dependencyName of dependencyNames) {\n if (dependencyName in bundledNativeModules) {\n known.push(dependencyName);\n } else {\n unknown.push(dependencyName);\n }\n }\n return { known, unknown };\n}\n\nasync function resolvePackageVersionsAsync(\n projectRoot: string,\n packages: string[]\n): Promise<Record<string, string>> {\n const packageVersionsFromPackageJSON = await Promise.all(\n packages.map((packageName) => getPackageVersionAsync(projectRoot, packageName))\n );\n return packages.reduce((acc, packageName, idx) => {\n acc[packageName] = packageVersionsFromPackageJSON[idx];\n return acc;\n }, {} as Record<string, string>);\n}\n\nasync function getPackageVersionAsync(projectRoot: string, packageName: string): Promise<string> {\n let packageJsonPath: string | undefined;\n try {\n packageJsonPath = resolveFrom(projectRoot, `${packageName}/package.json`);\n } catch (error: any) {\n // This is a workaround for packages using `exports`. If this doesn't\n // include `package.json`, we have to use the error message to get the location.\n if (error.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') {\n packageJsonPath = error.message.match(/(\"exports\"|defined) in (.*)$/i)?.[2];\n }\n }\n if (!packageJsonPath) {\n throw new CommandError(\n `\"${packageName}\" is added as a dependency in your project's package.json but it doesn't seem to be installed. Please run \"yarn\" or \"npm install\" to fix this issue.`\n );\n }\n const packageJson = await JsonFile.readAsync<BundledNativeModules>(packageJsonPath);\n return packageJson.version;\n}\n\nfunction findIncorrectDependencies(\n pkg: PackageJSONConfig,\n packageVersions: Record<string, string>,\n bundledNativeModules: BundledNativeModules\n): IncorrectDependency[] {\n const packages = Object.keys(packageVersions);\n const incorrectDeps: IncorrectDependency[] = [];\n for (const packageName of packages) {\n const expectedVersionOrRange = bundledNativeModules[packageName];\n const actualVersion = packageVersions[packageName];\n if (\n typeof expectedVersionOrRange === 'string' &&\n !semver.intersects(expectedVersionOrRange, actualVersion)\n ) {\n incorrectDeps.push({\n packageName,\n packageType: findDependencyType(pkg, packageName),\n expectedVersionOrRange,\n actualVersion,\n });\n }\n }\n return incorrectDeps;\n}\n\nfunction findDependencyType(\n pkg: PackageJSONConfig,\n packageName: string\n): IncorrectDependency['packageType'] {\n if (pkg.devDependencies && packageName in pkg.devDependencies) {\n return 'devDependencies';\n }\n\n return 'dependencies';\n}\n"],"names":["validateDependenciesVersionsAsync","logIncorrectDependencies","getVersionedDependenciesAsync","Log","debug","require","projectRoot","exp","pkg","packagesToCheck","APISettings","isOffline","warn","incorrectDeps","logInvalidDependency","packageName","expectedVersionOrRange","actualVersion","chalk","length","forEach","dep","requiredVersions","map","join","assert","sdkVersion","combinedKnownPackages","getCombinedKnownVersionsAsync","resolvedDependencies","getFilteredObject","dependencies","devDependencies","known","resolvedPackagesToCheck","unknown","getPackagesToCheck","packageVersions","resolvePackageVersionsAsync","findIncorrectDependencies","keys","object","reduce","acc","key","bundledNativeModules","dependencyNames","Object","dependencyName","push","packages","packageVersionsFromPackageJSON","Promise","all","getPackageVersionAsync","idx","packageJsonPath","resolveFrom","error","code","message","match","CommandError","packageJson","JsonFile","readAsync","version","semver","intersects","packageType","findDependencyType"],"mappings":"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"}
|
|
@@ -98,9 +98,13 @@ class ExternalModule {
|
|
|
98
98
|
});
|
|
99
99
|
try {
|
|
100
100
|
if (shouldGloballyInstall) {
|
|
101
|
-
await packageManager.addGlobalAsync(
|
|
101
|
+
await packageManager.addGlobalAsync([
|
|
102
|
+
packageName
|
|
103
|
+
]);
|
|
102
104
|
} else {
|
|
103
|
-
await packageManager.addDevAsync(
|
|
105
|
+
await packageManager.addDevAsync([
|
|
106
|
+
packageName
|
|
107
|
+
]);
|
|
104
108
|
}
|
|
105
109
|
Log.log(`Installed ${packageName}`);
|
|
106
110
|
} catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/doctor/ngrok/ExternalModule.ts"],"sourcesContent":["import * as PackageManager from '@expo/package-manager';\nimport requireGlobal from 'requireg';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport * as Log from '../../../log';\nimport { delayAsync } from '../../../utils/delay';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { confirmAsync } from '../../../utils/prompts';\n\nconst debug = require('debug')('expo:doctor:externalModule') as typeof console.log;\n\n/** An error that is thrown when a package is installed but doesn't meet the version criteria. */\nexport class ExternalModuleVersionError extends CommandError {\n constructor(message: string, public readonly shouldGloballyInstall: boolean) {\n super('EXTERNAL_MODULE_VERSION', message);\n }\n}\n\ninterface PromptOptions {\n /** Should prompt the user to install, when false the module will just assert on missing packages, default `true`. Ignored when `autoInstall` is true. */\n shouldPrompt?: boolean;\n /** Should automatically install the package without prompting, default `false` */\n autoInstall?: boolean;\n}\n\nexport interface InstallPromptOptions extends PromptOptions {\n /** Should install the package globally, default `false` */\n shouldGloballyInstall?: boolean;\n}\n\nexport interface ResolvePromptOptions extends PromptOptions {\n /**\n * Prefer to install the package globally, this can be overridden if the function\n * detects that a locally installed package simply needs an upgrade, default `false`\n */\n prefersGlobalInstall?: boolean;\n}\n\n/** Resolves a local or globally installed package, prompts to install if missing. */\nexport class ExternalModule<TModule> {\n private instance: TModule | null = null;\n\n constructor(\n /** Project root for checking if the package is installed locally. */\n private projectRoot: string,\n /** Info on the external package. */\n private pkg: {\n /** NPM package name. */\n name: string;\n /** Required semver range, ex: `^1.0.0`. */\n versionRange: string;\n },\n /** A function used to create the installation prompt message. */\n private promptMessage: (pkgName: string) => string\n ) {}\n\n /** Resolve the globally or locally installed instance, or prompt to install. */\n async resolveAsync({\n prefersGlobalInstall,\n ...options\n }: ResolvePromptOptions = {}): Promise<TModule> {\n try {\n return (\n this.getVersioned() ??\n this.installAsync({\n ...options,\n shouldGloballyInstall: prefersGlobalInstall,\n })\n );\n } catch (error: any) {\n if (error instanceof ExternalModuleVersionError) {\n // If the module version in not compliant with the version range,\n // we should prompt the user to install the package where it already exists.\n return this.installAsync({\n ...options,\n shouldGloballyInstall: error.shouldGloballyInstall ?? prefersGlobalInstall,\n });\n }\n throw error;\n }\n }\n\n /** Prompt the user to install the package and try again. */\n async installAsync({\n shouldPrompt = true,\n autoInstall,\n shouldGloballyInstall,\n }: InstallPromptOptions = {}): Promise<TModule> {\n const packageName = [this.pkg.name, this.pkg.versionRange].join('@');\n if (!autoInstall) {\n // Delay the prompt so it doesn't conflict with other dev tool logs\n await delayAsync(100);\n }\n const answer =\n autoInstall ||\n (shouldPrompt &&\n (await confirmAsync({\n message: this.promptMessage(packageName),\n initial: true,\n })));\n if (answer) {\n Log.log(`Installing ${packageName}...`);\n\n // Always use npm for global installs\n const packageManager = shouldGloballyInstall\n ? new PackageManager.NpmPackageManager({\n cwd: this.projectRoot,\n log: Log.log,\n silent: !env.EXPO_DEBUG,\n })\n : PackageManager.createForProject(this.projectRoot, {\n silent: !env.EXPO_DEBUG,\n });\n\n try {\n if (shouldGloballyInstall) {\n await packageManager.addGlobalAsync(packageName);\n } else {\n await packageManager.addDevAsync(packageName);\n }\n Log.log(`Installed ${packageName}`);\n } catch (error: any) {\n error.message = `Failed to install ${packageName} ${\n shouldGloballyInstall ? 'globally' : 'locally'\n }: ${error.message}`;\n throw error;\n }\n return await this.resolveAsync({ shouldPrompt: false });\n }\n\n throw new CommandError(\n 'EXTERNAL_MODULE_AVAILABILITY',\n `Please install ${packageName} and try again`\n );\n }\n\n /** Get the module. */\n get(): TModule | null {\n try {\n return this.getVersioned();\n } catch {\n return null;\n }\n }\n\n /** Get the module, throws if the module is not versioned correctly. */\n getVersioned(): TModule | null {\n this.instance ??= this._resolveModule(true) ?? this._resolveModule(false);\n return this.instance;\n }\n\n /** Exposed for testing. */\n _require(moduleId: string): any {\n return require(moduleId);\n }\n\n /** Resolve a copy that's installed in the project. Exposed for testing. */\n _resolveLocal(moduleId: string): string {\n return resolveFrom(this.projectRoot, moduleId);\n }\n\n /** Resolve a copy that's installed globally. Exposed for testing. */\n _resolveGlobal(moduleId: string): string {\n return requireGlobal.resolve(moduleId);\n }\n\n /** Resolve the module and verify the version. Exposed for testing. */\n _resolveModule(isLocal: boolean): TModule | null {\n const resolver = isLocal ? this._resolveLocal.bind(this) : this._resolveGlobal.bind(this);\n try {\n const packageJsonPath = resolver(`${this.pkg.name}/package.json`);\n const packageJson = this._require(packageJsonPath);\n if (packageJson) {\n if (semver.satisfies(packageJson.version, this.pkg.versionRange)) {\n const modulePath = resolver(this.pkg.name);\n const requiredModule = this._require(modulePath);\n if (requiredModule == null) {\n throw new CommandError(\n 'EXTERNAL_MODULE_EXPORT',\n `${this.pkg.name} exports a nullish value, which is not allowed.`\n );\n }\n return requiredModule;\n }\n throw new ExternalModuleVersionError(\n `Required module '${this.pkg.name}@${packageJson.version}' does not satisfy ${this.pkg.versionRange}. Installed at: ${packageJsonPath}`,\n !isLocal\n );\n }\n } catch (error: any) {\n if (error instanceof CommandError) {\n throw error;\n } else if (error.code !== 'MODULE_NOT_FOUND') {\n debug('Failed to resolve module', error.message);\n }\n }\n return null;\n }\n}\n"],"names":["PackageManager","Log","debug","require","ExternalModuleVersionError","CommandError","constructor","message","shouldGloballyInstall","ExternalModule","projectRoot","pkg","promptMessage","instance","resolveAsync","prefersGlobalInstall","options","getVersioned","installAsync","error","shouldPrompt","autoInstall","packageName","name","versionRange","join","delayAsync","answer","confirmAsync","initial","log","packageManager","NpmPackageManager","cwd","silent","env","EXPO_DEBUG","createForProject","addGlobalAsync","addDevAsync","get","_resolveModule","_require","moduleId","_resolveLocal","resolveFrom","_resolveGlobal","requireGlobal","resolve","isLocal","resolver","bind","packageJsonPath","packageJson","semver","satisfies","version","modulePath","requiredModule","code"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/doctor/ngrok/ExternalModule.ts"],"sourcesContent":["import * as PackageManager from '@expo/package-manager';\nimport requireGlobal from 'requireg';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport * as Log from '../../../log';\nimport { delayAsync } from '../../../utils/delay';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { confirmAsync } from '../../../utils/prompts';\n\nconst debug = require('debug')('expo:doctor:externalModule') as typeof console.log;\n\n/** An error that is thrown when a package is installed but doesn't meet the version criteria. */\nexport class ExternalModuleVersionError extends CommandError {\n constructor(message: string, public readonly shouldGloballyInstall: boolean) {\n super('EXTERNAL_MODULE_VERSION', message);\n }\n}\n\ninterface PromptOptions {\n /** Should prompt the user to install, when false the module will just assert on missing packages, default `true`. Ignored when `autoInstall` is true. */\n shouldPrompt?: boolean;\n /** Should automatically install the package without prompting, default `false` */\n autoInstall?: boolean;\n}\n\nexport interface InstallPromptOptions extends PromptOptions {\n /** Should install the package globally, default `false` */\n shouldGloballyInstall?: boolean;\n}\n\nexport interface ResolvePromptOptions extends PromptOptions {\n /**\n * Prefer to install the package globally, this can be overridden if the function\n * detects that a locally installed package simply needs an upgrade, default `false`\n */\n prefersGlobalInstall?: boolean;\n}\n\n/** Resolves a local or globally installed package, prompts to install if missing. */\nexport class ExternalModule<TModule> {\n private instance: TModule | null = null;\n\n constructor(\n /** Project root for checking if the package is installed locally. */\n private projectRoot: string,\n /** Info on the external package. */\n private pkg: {\n /** NPM package name. */\n name: string;\n /** Required semver range, ex: `^1.0.0`. */\n versionRange: string;\n },\n /** A function used to create the installation prompt message. */\n private promptMessage: (pkgName: string) => string\n ) {}\n\n /** Resolve the globally or locally installed instance, or prompt to install. */\n async resolveAsync({\n prefersGlobalInstall,\n ...options\n }: ResolvePromptOptions = {}): Promise<TModule> {\n try {\n return (\n this.getVersioned() ??\n this.installAsync({\n ...options,\n shouldGloballyInstall: prefersGlobalInstall,\n })\n );\n } catch (error: any) {\n if (error instanceof ExternalModuleVersionError) {\n // If the module version in not compliant with the version range,\n // we should prompt the user to install the package where it already exists.\n return this.installAsync({\n ...options,\n shouldGloballyInstall: error.shouldGloballyInstall ?? prefersGlobalInstall,\n });\n }\n throw error;\n }\n }\n\n /** Prompt the user to install the package and try again. */\n async installAsync({\n shouldPrompt = true,\n autoInstall,\n shouldGloballyInstall,\n }: InstallPromptOptions = {}): Promise<TModule> {\n const packageName = [this.pkg.name, this.pkg.versionRange].join('@');\n if (!autoInstall) {\n // Delay the prompt so it doesn't conflict with other dev tool logs\n await delayAsync(100);\n }\n const answer =\n autoInstall ||\n (shouldPrompt &&\n (await confirmAsync({\n message: this.promptMessage(packageName),\n initial: true,\n })));\n if (answer) {\n Log.log(`Installing ${packageName}...`);\n\n // Always use npm for global installs\n const packageManager = shouldGloballyInstall\n ? new PackageManager.NpmPackageManager({\n cwd: this.projectRoot,\n log: Log.log,\n silent: !env.EXPO_DEBUG,\n })\n : PackageManager.createForProject(this.projectRoot, {\n silent: !env.EXPO_DEBUG,\n });\n\n try {\n if (shouldGloballyInstall) {\n await packageManager.addGlobalAsync([packageName]);\n } else {\n await packageManager.addDevAsync([packageName]);\n }\n Log.log(`Installed ${packageName}`);\n } catch (error: any) {\n error.message = `Failed to install ${packageName} ${\n shouldGloballyInstall ? 'globally' : 'locally'\n }: ${error.message}`;\n throw error;\n }\n return await this.resolveAsync({ shouldPrompt: false });\n }\n\n throw new CommandError(\n 'EXTERNAL_MODULE_AVAILABILITY',\n `Please install ${packageName} and try again`\n );\n }\n\n /** Get the module. */\n get(): TModule | null {\n try {\n return this.getVersioned();\n } catch {\n return null;\n }\n }\n\n /** Get the module, throws if the module is not versioned correctly. */\n getVersioned(): TModule | null {\n this.instance ??= this._resolveModule(true) ?? this._resolveModule(false);\n return this.instance;\n }\n\n /** Exposed for testing. */\n _require(moduleId: string): any {\n return require(moduleId);\n }\n\n /** Resolve a copy that's installed in the project. Exposed for testing. */\n _resolveLocal(moduleId: string): string {\n return resolveFrom(this.projectRoot, moduleId);\n }\n\n /** Resolve a copy that's installed globally. Exposed for testing. */\n _resolveGlobal(moduleId: string): string {\n return requireGlobal.resolve(moduleId);\n }\n\n /** Resolve the module and verify the version. Exposed for testing. */\n _resolveModule(isLocal: boolean): TModule | null {\n const resolver = isLocal ? this._resolveLocal.bind(this) : this._resolveGlobal.bind(this);\n try {\n const packageJsonPath = resolver(`${this.pkg.name}/package.json`);\n const packageJson = this._require(packageJsonPath);\n if (packageJson) {\n if (semver.satisfies(packageJson.version, this.pkg.versionRange)) {\n const modulePath = resolver(this.pkg.name);\n const requiredModule = this._require(modulePath);\n if (requiredModule == null) {\n throw new CommandError(\n 'EXTERNAL_MODULE_EXPORT',\n `${this.pkg.name} exports a nullish value, which is not allowed.`\n );\n }\n return requiredModule;\n }\n throw new ExternalModuleVersionError(\n `Required module '${this.pkg.name}@${packageJson.version}' does not satisfy ${this.pkg.versionRange}. Installed at: ${packageJsonPath}`,\n !isLocal\n );\n }\n } catch (error: any) {\n if (error instanceof CommandError) {\n throw error;\n } else if (error.code !== 'MODULE_NOT_FOUND') {\n debug('Failed to resolve module', error.message);\n }\n }\n return null;\n }\n}\n"],"names":["PackageManager","Log","debug","require","ExternalModuleVersionError","CommandError","constructor","message","shouldGloballyInstall","ExternalModule","projectRoot","pkg","promptMessage","instance","resolveAsync","prefersGlobalInstall","options","getVersioned","installAsync","error","shouldPrompt","autoInstall","packageName","name","versionRange","join","delayAsync","answer","confirmAsync","initial","log","packageManager","NpmPackageManager","cwd","silent","env","EXPO_DEBUG","createForProject","addGlobalAsync","addDevAsync","get","_resolveModule","_require","moduleId","_resolveLocal","resolveFrom","_resolveGlobal","requireGlobal","resolve","isLocal","resolver","bind","packageJsonPath","packageJson","semver","satisfies","version","modulePath","requiredModule","code"],"mappings":"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"}
|
|
@@ -74,7 +74,7 @@ async function updateTSConfigAsync({ tsConfigPath , isBootstrapping }) {
|
|
|
74
74
|
}
|
|
75
75
|
function logModifications(modifications) {
|
|
76
76
|
Log.log();
|
|
77
|
-
Log.log(`\u203A {bold Required} modifications made to the {cyan tsconfig.json}:`);
|
|
77
|
+
Log.log(_chalk.default`\u203A {bold Required} modifications made to the {cyan tsconfig.json}:`);
|
|
78
78
|
Log.log();
|
|
79
79
|
// Sort the items based on key name length
|
|
80
80
|
printTable(modifications.sort((a, b)=>a[0].length - b[0].length
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/doctor/typescript/updateTSConfig.ts"],"sourcesContent":["import JsonFile from '@expo/json-file';\nimport chalk from 'chalk';\n\nimport * as Log from '../../../log';\n\nexport const baseTSConfigName = 'expo/tsconfig.base';\n\nexport async function updateTSConfigAsync({\n tsConfigPath,\n isBootstrapping,\n}: {\n tsConfigPath: string;\n isBootstrapping: boolean;\n}): Promise<void> {\n if (isBootstrapping) {\n await JsonFile.writeAsync(tsConfigPath, {});\n }\n\n const projectTSConfig = JsonFile.read(tsConfigPath, {\n // Some tsconfig.json files have a generated comment in the file.\n json5: true,\n });\n if (projectTSConfig.compilerOptions == null) {\n projectTSConfig.compilerOptions = {};\n isBootstrapping = true;\n }\n\n const modifications: [string, string][] = [];\n\n // If the extends field isn't defined, set it to the expo default\n if (!projectTSConfig.extends) {\n // if (projectTSConfig.extends !== baseTSConfigName) {\n projectTSConfig.extends = baseTSConfigName;\n modifications.push(['extends', baseTSConfigName]);\n }\n\n // If no changes, then quietly bail out\n if (!modifications.length) {\n return;\n }\n\n // Write changes and log out a summary of what changed\n await JsonFile.writeAsync(tsConfigPath, projectTSConfig);\n\n Log.log();\n\n if (isBootstrapping) {\n Log.log(chalk`{bold TypeScript}: A {cyan tsconfig.json} has been auto-generated`);\n } else {\n Log.log(\n chalk`{bold TypeScript}: The {cyan tsconfig.json} has been updated {dim (Use EXPO_NO_TYPESCRIPT_SETUP to skip)}`\n );\n logModifications(modifications);\n }\n Log.log();\n}\n\nfunction logModifications(modifications: string[][]) {\n Log.log();\n\n Log.log(`\\u203A {bold Required} modifications made to the {cyan tsconfig.json}:`);\n\n Log.log();\n\n // Sort the items based on key name length\n printTable(modifications.sort((a, b) => a[0].length - b[0].length));\n\n Log.log();\n}\n\nfunction printTable(items: string[][]) {\n const tableFormat = (name: string, msg: string) =>\n ` ${chalk.bold`${name}`} is now ${chalk.cyan(msg)}`;\n for (const [key, value] of items) {\n Log.log(tableFormat(key, value));\n }\n}\n"],"names":["updateTSConfigAsync","Log","baseTSConfigName","tsConfigPath","isBootstrapping","JsonFile","writeAsync","projectTSConfig","read","json5","compilerOptions","modifications","extends","push","length","log","chalk","logModifications","printTable","sort","a","b","items","tableFormat","name","msg","bold","cyan","key","value"],"mappings":"AAAA;;;;QAOsBA,mBAAmB,GAAnBA,mBAAmB;;AAPpB,IAAA,SAAiB,kCAAjB,iBAAiB,EAAA;AACpB,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEbC,IAAAA,GAAG,mCAAM,cAAc,EAApB;;;;;;;;;;;;;;;;;;;;;;;;;;;AAER,MAAMC,gBAAgB,GAAG,oBAAoB,AAAC;QAAxCA,gBAAgB,GAAhBA,gBAAgB;AAEtB,eAAeF,mBAAmB,CAAC,EACxCG,YAAY,CAAA,EACZC,eAAe,CAAA,EAIhB,EAAiB;IAChB,IAAIA,eAAe,EAAE;QACnB,MAAMC,SAAQ,QAAA,CAACC,UAAU,CAACH,YAAY,EAAE,EAAE,CAAC,CAAC;KAC7C;IAED,MAAMI,eAAe,GAAGF,SAAQ,QAAA,CAACG,IAAI,CAACL,YAAY,EAAE;QAClD,iEAAiE;QACjEM,KAAK,EAAE,IAAI;KACZ,CAAC,AAAC;IACH,IAAIF,eAAe,CAACG,eAAe,IAAI,IAAI,EAAE;QAC3CH,eAAe,CAACG,eAAe,GAAG,EAAE,CAAC;QACrCN,eAAe,GAAG,IAAI,CAAC;KACxB;IAED,MAAMO,aAAa,GAAuB,EAAE,AAAC;IAE7C,iEAAiE;IACjE,IAAI,CAACJ,eAAe,CAACK,OAAO,EAAE;QAC5B,sDAAsD;QACtDL,eAAe,CAACK,OAAO,GAAGV,gBAAgB,CAAC;QAC3CS,aAAa,CAACE,IAAI,CAAC;YAAC,SAAS;YAAEX,gBAAgB;SAAC,CAAC,CAAC;KACnD;IAED,uCAAuC;IACvC,IAAI,CAACS,aAAa,CAACG,MAAM,EAAE;QACzB,OAAO;KACR;IAED,sDAAsD;IACtD,MAAMT,SAAQ,QAAA,CAACC,UAAU,CAACH,YAAY,EAAEI,eAAe,CAAC,CAAC;IAEzDN,GAAG,CAACc,GAAG,EAAE,CAAC;IAEV,IAAIX,eAAe,EAAE;QACnBH,GAAG,CAACc,GAAG,CAACC,MAAK,QAAA,CAAC,iEAAiE,CAAC,CAAC,CAAC;KACnF,MAAM;QACLf,GAAG,CAACc,GAAG,CACLC,MAAK,QAAA,CAAC,yGAAyG,CAAC,CACjH,CAAC;QACFC,gBAAgB,CAACN,aAAa,CAAC,CAAC;KACjC;IACDV,GAAG,CAACc,GAAG,EAAE,CAAC;CACX;AAED,SAASE,gBAAgB,CAACN,aAAyB,EAAE;IACnDV,GAAG,CAACc,GAAG,EAAE,CAAC;IAEVd,GAAG,CAACc,GAAG,
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/doctor/typescript/updateTSConfig.ts"],"sourcesContent":["import JsonFile from '@expo/json-file';\nimport chalk from 'chalk';\n\nimport * as Log from '../../../log';\n\nexport const baseTSConfigName = 'expo/tsconfig.base';\n\nexport async function updateTSConfigAsync({\n tsConfigPath,\n isBootstrapping,\n}: {\n tsConfigPath: string;\n isBootstrapping: boolean;\n}): Promise<void> {\n if (isBootstrapping) {\n await JsonFile.writeAsync(tsConfigPath, {});\n }\n\n const projectTSConfig = JsonFile.read(tsConfigPath, {\n // Some tsconfig.json files have a generated comment in the file.\n json5: true,\n });\n if (projectTSConfig.compilerOptions == null) {\n projectTSConfig.compilerOptions = {};\n isBootstrapping = true;\n }\n\n const modifications: [string, string][] = [];\n\n // If the extends field isn't defined, set it to the expo default\n if (!projectTSConfig.extends) {\n // if (projectTSConfig.extends !== baseTSConfigName) {\n projectTSConfig.extends = baseTSConfigName;\n modifications.push(['extends', baseTSConfigName]);\n }\n\n // If no changes, then quietly bail out\n if (!modifications.length) {\n return;\n }\n\n // Write changes and log out a summary of what changed\n await JsonFile.writeAsync(tsConfigPath, projectTSConfig);\n\n Log.log();\n\n if (isBootstrapping) {\n Log.log(chalk`{bold TypeScript}: A {cyan tsconfig.json} has been auto-generated`);\n } else {\n Log.log(\n chalk`{bold TypeScript}: The {cyan tsconfig.json} has been updated {dim (Use EXPO_NO_TYPESCRIPT_SETUP to skip)}`\n );\n logModifications(modifications);\n }\n Log.log();\n}\n\nfunction logModifications(modifications: string[][]) {\n Log.log();\n\n Log.log(chalk`\\u203A {bold Required} modifications made to the {cyan tsconfig.json}:`);\n\n Log.log();\n\n // Sort the items based on key name length\n printTable(modifications.sort((a, b) => a[0].length - b[0].length));\n\n Log.log();\n}\n\nfunction printTable(items: string[][]) {\n const tableFormat = (name: string, msg: string) =>\n ` ${chalk.bold`${name}`} is now ${chalk.cyan(msg)}`;\n for (const [key, value] of items) {\n Log.log(tableFormat(key, value));\n }\n}\n"],"names":["updateTSConfigAsync","Log","baseTSConfigName","tsConfigPath","isBootstrapping","JsonFile","writeAsync","projectTSConfig","read","json5","compilerOptions","modifications","extends","push","length","log","chalk","logModifications","printTable","sort","a","b","items","tableFormat","name","msg","bold","cyan","key","value"],"mappings":"AAAA;;;;QAOsBA,mBAAmB,GAAnBA,mBAAmB;;AAPpB,IAAA,SAAiB,kCAAjB,iBAAiB,EAAA;AACpB,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEbC,IAAAA,GAAG,mCAAM,cAAc,EAApB;;;;;;;;;;;;;;;;;;;;;;;;;;;AAER,MAAMC,gBAAgB,GAAG,oBAAoB,AAAC;QAAxCA,gBAAgB,GAAhBA,gBAAgB;AAEtB,eAAeF,mBAAmB,CAAC,EACxCG,YAAY,CAAA,EACZC,eAAe,CAAA,EAIhB,EAAiB;IAChB,IAAIA,eAAe,EAAE;QACnB,MAAMC,SAAQ,QAAA,CAACC,UAAU,CAACH,YAAY,EAAE,EAAE,CAAC,CAAC;KAC7C;IAED,MAAMI,eAAe,GAAGF,SAAQ,QAAA,CAACG,IAAI,CAACL,YAAY,EAAE;QAClD,iEAAiE;QACjEM,KAAK,EAAE,IAAI;KACZ,CAAC,AAAC;IACH,IAAIF,eAAe,CAACG,eAAe,IAAI,IAAI,EAAE;QAC3CH,eAAe,CAACG,eAAe,GAAG,EAAE,CAAC;QACrCN,eAAe,GAAG,IAAI,CAAC;KACxB;IAED,MAAMO,aAAa,GAAuB,EAAE,AAAC;IAE7C,iEAAiE;IACjE,IAAI,CAACJ,eAAe,CAACK,OAAO,EAAE;QAC5B,sDAAsD;QACtDL,eAAe,CAACK,OAAO,GAAGV,gBAAgB,CAAC;QAC3CS,aAAa,CAACE,IAAI,CAAC;YAAC,SAAS;YAAEX,gBAAgB;SAAC,CAAC,CAAC;KACnD;IAED,uCAAuC;IACvC,IAAI,CAACS,aAAa,CAACG,MAAM,EAAE;QACzB,OAAO;KACR;IAED,sDAAsD;IACtD,MAAMT,SAAQ,QAAA,CAACC,UAAU,CAACH,YAAY,EAAEI,eAAe,CAAC,CAAC;IAEzDN,GAAG,CAACc,GAAG,EAAE,CAAC;IAEV,IAAIX,eAAe,EAAE;QACnBH,GAAG,CAACc,GAAG,CAACC,MAAK,QAAA,CAAC,iEAAiE,CAAC,CAAC,CAAC;KACnF,MAAM;QACLf,GAAG,CAACc,GAAG,CACLC,MAAK,QAAA,CAAC,yGAAyG,CAAC,CACjH,CAAC;QACFC,gBAAgB,CAACN,aAAa,CAAC,CAAC;KACjC;IACDV,GAAG,CAACc,GAAG,EAAE,CAAC;CACX;AAED,SAASE,gBAAgB,CAACN,aAAyB,EAAE;IACnDV,GAAG,CAACc,GAAG,EAAE,CAAC;IAEVd,GAAG,CAACc,GAAG,CAACC,MAAK,QAAA,CAAC,sEAAsE,CAAC,CAAC,CAAC;IAEvFf,GAAG,CAACc,GAAG,EAAE,CAAC;IAEV,0CAA0C;IAC1CG,UAAU,CAACP,aAAa,CAACQ,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,GAAKD,CAAC,CAAC,CAAC,CAAC,CAACN,MAAM,GAAGO,CAAC,CAAC,CAAC,CAAC,CAACP,MAAM;IAAA,CAAC,CAAC,CAAC;IAEpEb,GAAG,CAACc,GAAG,EAAE,CAAC;CACX;AAED,SAASG,UAAU,CAACI,KAAiB,EAAE;IACrC,MAAMC,WAAW,GAAG,CAACC,IAAY,EAAEC,GAAW,GAC5C,CAAC,EAAE,EAAET,MAAK,QAAA,CAACU,IAAI,CAAC,EAAEF,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAER,MAAK,QAAA,CAACW,IAAI,CAACF,GAAG,CAAC,CAAC,CAAC;IAAC;IACvD,KAAK,MAAM,CAACG,GAAG,EAAEC,KAAK,CAAC,IAAIP,KAAK,CAAE;QAChCrB,GAAG,CAACc,GAAG,CAACQ,WAAW,CAACK,GAAG,EAAEC,KAAK,CAAC,CAAC,CAAC;KAClC;CACF"}
|
|
@@ -88,8 +88,13 @@ class DevServerManagerActions {
|
|
|
88
88
|
Log.warn(`No compatible apps connected. JavaScript Debugging can only be used with the Hermes engine. ${(0, _link).learnMore("https://docs.expo.dev/guides/using-hermes/")}`);
|
|
89
89
|
return;
|
|
90
90
|
}
|
|
91
|
-
|
|
92
|
-
(
|
|
91
|
+
try {
|
|
92
|
+
for (const app of apps){
|
|
93
|
+
await (0, _devServer).openJsInspector(app);
|
|
94
|
+
}
|
|
95
|
+
} catch (error) {
|
|
96
|
+
Log.error("Failed to open JavaScript inspector. This is often an issue with Google Chrome.");
|
|
97
|
+
Log.exception(error);
|
|
93
98
|
}
|
|
94
99
|
}
|
|
95
100
|
reloadApp() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/start/interface/interactiveActions.ts"],"sourcesContent":["import { openJsInspector, queryAllInspectorAppsAsync } from '@expo/dev-server';\nimport assert from 'assert';\nimport chalk from 'chalk';\n\nimport * as Log from '../../log';\nimport { learnMore } from '../../utils/link';\nimport { selectAsync } from '../../utils/prompts';\nimport { DevServerManager } from '../server/DevServerManager';\nimport { BLT, printHelp, printItem, printQRCode, printUsage, StartOptions } from './commandsTable';\n\nconst debug = require('debug')('expo:start:interface:interactiveActions') as typeof console.log;\n\n/** Wraps the DevServerManager and adds an interface for user actions. */\nexport class DevServerManagerActions {\n constructor(private devServerManager: DevServerManager) {}\n\n printDevServerInfo(\n options: Pick<StartOptions, 'devClient' | 'isWebSocketsEnabled' | 'platforms'>\n ) {\n // If native dev server is running, print its URL.\n if (this.devServerManager.getNativeDevServerPort()) {\n const devServer = this.devServerManager.getDefaultDevServer();\n try {\n const nativeRuntimeUrl = devServer.getNativeRuntimeUrl()!;\n const interstitialPageUrl = devServer.getRedirectUrl();\n\n printQRCode(interstitialPageUrl ?? nativeRuntimeUrl);\n\n if (interstitialPageUrl) {\n Log.log(\n printItem(\n chalk`Choose an app to open your project at {underline ${interstitialPageUrl}}`\n )\n );\n }\n Log.log(printItem(chalk`Metro waiting on {underline ${nativeRuntimeUrl}}`));\n // TODO: if development build, change this message!\n Log.log(printItem('Scan the QR code above with Expo Go (Android) or the Camera app (iOS)'));\n } catch (error) {\n // @ts-ignore: If there is no development build scheme, then skip the QR code.\n if (error.code !== 'NO_DEV_CLIENT_SCHEME') {\n throw error;\n } else {\n const serverUrl = devServer.getDevServerUrl();\n Log.log(printItem(chalk`Metro waiting on {underline ${serverUrl}}`));\n Log.log(printItem(`Linking is disabled because the client scheme cannot be resolved.`));\n }\n }\n }\n\n const webDevServer = this.devServerManager.getWebDevServer();\n const webUrl = webDevServer?.getDevServerUrl({ hostType: 'localhost' });\n if (webUrl) {\n Log.log();\n Log.log(printItem(chalk`Web is waiting on {underline ${webUrl}}`));\n }\n\n printUsage(options, { verbose: false });\n printHelp();\n Log.log();\n }\n\n async openJsInspectorAsync() {\n Log.log('Opening JavaScript inspector in the browser...');\n const metroServerOrigin = this.devServerManager.getDefaultDevServer().getJsInspectorBaseUrl();\n assert(metroServerOrigin, 'Metro dev server is not running');\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n if (!apps.length) {\n Log.warn(\n `No compatible apps connected. JavaScript Debugging can only be used with the Hermes engine. ${learnMore(\n 'https://docs.expo.dev/guides/using-hermes/'\n )}`\n );\n return;\n }\n for (const app of apps) {\n
|
|
1
|
+
{"version":3,"sources":["../../../../src/start/interface/interactiveActions.ts"],"sourcesContent":["import { openJsInspector, queryAllInspectorAppsAsync } from '@expo/dev-server';\nimport assert from 'assert';\nimport chalk from 'chalk';\n\nimport * as Log from '../../log';\nimport { learnMore } from '../../utils/link';\nimport { selectAsync } from '../../utils/prompts';\nimport { DevServerManager } from '../server/DevServerManager';\nimport { BLT, printHelp, printItem, printQRCode, printUsage, StartOptions } from './commandsTable';\n\nconst debug = require('debug')('expo:start:interface:interactiveActions') as typeof console.log;\n\n/** Wraps the DevServerManager and adds an interface for user actions. */\nexport class DevServerManagerActions {\n constructor(private devServerManager: DevServerManager) {}\n\n printDevServerInfo(\n options: Pick<StartOptions, 'devClient' | 'isWebSocketsEnabled' | 'platforms'>\n ) {\n // If native dev server is running, print its URL.\n if (this.devServerManager.getNativeDevServerPort()) {\n const devServer = this.devServerManager.getDefaultDevServer();\n try {\n const nativeRuntimeUrl = devServer.getNativeRuntimeUrl()!;\n const interstitialPageUrl = devServer.getRedirectUrl();\n\n printQRCode(interstitialPageUrl ?? nativeRuntimeUrl);\n\n if (interstitialPageUrl) {\n Log.log(\n printItem(\n chalk`Choose an app to open your project at {underline ${interstitialPageUrl}}`\n )\n );\n }\n Log.log(printItem(chalk`Metro waiting on {underline ${nativeRuntimeUrl}}`));\n // TODO: if development build, change this message!\n Log.log(printItem('Scan the QR code above with Expo Go (Android) or the Camera app (iOS)'));\n } catch (error) {\n // @ts-ignore: If there is no development build scheme, then skip the QR code.\n if (error.code !== 'NO_DEV_CLIENT_SCHEME') {\n throw error;\n } else {\n const serverUrl = devServer.getDevServerUrl();\n Log.log(printItem(chalk`Metro waiting on {underline ${serverUrl}}`));\n Log.log(printItem(`Linking is disabled because the client scheme cannot be resolved.`));\n }\n }\n }\n\n const webDevServer = this.devServerManager.getWebDevServer();\n const webUrl = webDevServer?.getDevServerUrl({ hostType: 'localhost' });\n if (webUrl) {\n Log.log();\n Log.log(printItem(chalk`Web is waiting on {underline ${webUrl}}`));\n }\n\n printUsage(options, { verbose: false });\n printHelp();\n Log.log();\n }\n\n async openJsInspectorAsync() {\n Log.log('Opening JavaScript inspector in the browser...');\n const metroServerOrigin = this.devServerManager.getDefaultDevServer().getJsInspectorBaseUrl();\n assert(metroServerOrigin, 'Metro dev server is not running');\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n if (!apps.length) {\n Log.warn(\n `No compatible apps connected. JavaScript Debugging can only be used with the Hermes engine. ${learnMore(\n 'https://docs.expo.dev/guides/using-hermes/'\n )}`\n );\n return;\n }\n try {\n for (const app of apps) {\n await openJsInspector(app);\n }\n } catch (error: any) {\n Log.error('Failed to open JavaScript inspector. This is often an issue with Google Chrome.');\n Log.exception(error);\n }\n }\n\n reloadApp() {\n Log.log(`${BLT} Reloading apps`);\n // Send reload requests over the dev servers\n this.devServerManager.broadcastMessage('reload');\n }\n\n async openMoreToolsAsync() {\n try {\n // Options match: Chrome > View > Developer\n const value = await selectAsync(chalk`Dev tools {dim (native only)}`, [\n { title: 'Inspect elements', value: 'toggleElementInspector' },\n { title: 'Toggle performance monitor', value: 'togglePerformanceMonitor' },\n { title: 'Toggle developer menu', value: 'toggleDevMenu' },\n { title: 'Reload app', value: 'reload' },\n // TODO: Maybe a \"View Source\" option to open code.\n // Toggling Remote JS Debugging is pretty rough, so leaving it disabled.\n // { title: 'Toggle Remote Debugging', value: 'toggleRemoteDebugging' },\n ]);\n this.devServerManager.broadcastMessage('sendDevCommand', { name: value });\n } catch (error: any) {\n debug(error);\n // do nothing\n } finally {\n printHelp();\n }\n }\n\n toggleDevMenu() {\n Log.log(`${BLT} Toggling dev menu`);\n this.devServerManager.broadcastMessage('devMenu');\n }\n}\n"],"names":["Log","debug","require","DevServerManagerActions","constructor","devServerManager","printDevServerInfo","options","getNativeDevServerPort","devServer","getDefaultDevServer","nativeRuntimeUrl","getNativeRuntimeUrl","interstitialPageUrl","getRedirectUrl","printQRCode","log","printItem","chalk","error","code","serverUrl","getDevServerUrl","webDevServer","getWebDevServer","webUrl","hostType","printUsage","verbose","printHelp","openJsInspectorAsync","metroServerOrigin","getJsInspectorBaseUrl","assert","apps","queryAllInspectorAppsAsync","length","warn","learnMore","app","openJsInspector","exception","reloadApp","BLT","broadcastMessage","openMoreToolsAsync","value","selectAsync","title","name","toggleDevMenu"],"mappings":"AAAA;;;;AAA4D,IAAA,UAAkB,WAAlB,kBAAkB,CAAA;AAC3D,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AACT,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEbA,IAAAA,GAAG,mCAAM,WAAW,EAAjB;AACW,IAAA,KAAkB,WAAlB,kBAAkB,CAAA;AAChB,IAAA,QAAqB,WAArB,qBAAqB,CAAA;AAEgC,IAAA,cAAiB,WAAjB,iBAAiB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAElG,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,yCAAyC,CAAC,AAAsB,AAAC;AAGzF,MAAMC,uBAAuB;IAClCC,YAAoBC,gBAAkC,CAAE;aAApCA,gBAAkC,GAAlCA,gBAAkC;KAAI;IAE1DC,kBAAkB,CAChBC,OAA8E,EAC9E;QACA,kDAAkD;QAClD,IAAI,IAAI,CAACF,gBAAgB,CAACG,sBAAsB,EAAE,EAAE;YAClD,MAAMC,SAAS,GAAG,IAAI,CAACJ,gBAAgB,CAACK,mBAAmB,EAAE,AAAC;YAC9D,IAAI;gBACF,MAAMC,gBAAgB,GAAGF,SAAS,CAACG,mBAAmB,EAAE,AAAC,AAAC;gBAC1D,MAAMC,mBAAmB,GAAGJ,SAAS,CAACK,cAAc,EAAE,AAAC;gBAEvDC,CAAAA,GAAAA,cAAW,AAAyC,CAAA,YAAzC,CAACF,mBAAmB,WAAnBA,mBAAmB,GAAIF,gBAAgB,CAAC,CAAC;gBAErD,IAAIE,mBAAmB,EAAE;oBACvBb,GAAG,CAACgB,GAAG,CACLC,CAAAA,GAAAA,cAAS,AAER,CAAA,UAFQ,CACPC,MAAK,QAAA,CAAC,iDAAiD,EAAEL,mBAAmB,CAAC,CAAC,CAAC,CAChF,CACF,CAAC;iBACH;gBACDb,GAAG,CAACgB,GAAG,CAACC,CAAAA,GAAAA,cAAS,AAAyD,CAAA,UAAzD,CAACC,MAAK,QAAA,CAAC,4BAA4B,EAAEP,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5E,mDAAmD;gBACnDX,GAAG,CAACgB,GAAG,CAACC,CAAAA,GAAAA,cAAS,AAAyE,CAAA,UAAzE,CAAC,uEAAuE,CAAC,CAAC,CAAC;aAC7F,CAAC,OAAOE,KAAK,EAAE;gBACd,8EAA8E;gBAC9E,IAAIA,KAAK,CAACC,IAAI,KAAK,sBAAsB,EAAE;oBACzC,MAAMD,KAAK,CAAC;iBACb,MAAM;oBACL,MAAME,SAAS,GAAGZ,SAAS,CAACa,eAAe,EAAE,AAAC;oBAC9CtB,GAAG,CAACgB,GAAG,CAACC,CAAAA,GAAAA,cAAS,AAAkD,CAAA,UAAlD,CAACC,MAAK,QAAA,CAAC,4BAA4B,EAAEG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrErB,GAAG,CAACgB,GAAG,CAACC,CAAAA,GAAAA,cAAS,AAAqE,CAAA,UAArE,CAAC,CAAC,iEAAiE,CAAC,CAAC,CAAC,CAAC;iBACzF;aACF;SACF;QAED,MAAMM,YAAY,GAAG,IAAI,CAAClB,gBAAgB,CAACmB,eAAe,EAAE,AAAC;QAC7D,MAAMC,MAAM,GAAGF,YAAY,QAAiB,GAA7BA,KAAAA,CAA6B,GAA7BA,YAAY,CAAED,eAAe,CAAC;YAAEI,QAAQ,EAAE,WAAW;SAAE,CAAC,AAAC;QACxE,IAAID,MAAM,EAAE;YACVzB,GAAG,CAACgB,GAAG,EAAE,CAAC;YACVhB,GAAG,CAACgB,GAAG,CAACC,CAAAA,GAAAA,cAAS,AAAgD,CAAA,UAAhD,CAACC,MAAK,QAAA,CAAC,6BAA6B,EAAEO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACpE;QAEDE,CAAAA,GAAAA,cAAU,AAA6B,CAAA,WAA7B,CAACpB,OAAO,EAAE;YAAEqB,OAAO,EAAE,KAAK;SAAE,CAAC,CAAC;QACxCC,CAAAA,GAAAA,cAAS,AAAE,CAAA,UAAF,EAAE,CAAC;QACZ7B,GAAG,CAACgB,GAAG,EAAE,CAAC;KACX;IAED,MAAMc,oBAAoB,GAAG;QAC3B9B,GAAG,CAACgB,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC1D,MAAMe,iBAAiB,GAAG,IAAI,CAAC1B,gBAAgB,CAACK,mBAAmB,EAAE,CAACsB,qBAAqB,EAAE,AAAC;QAC9FC,CAAAA,GAAAA,OAAM,AAAsD,CAAA,QAAtD,CAACF,iBAAiB,EAAE,iCAAiC,CAAC,CAAC;QAC7D,MAAMG,IAAI,GAAG,MAAMC,CAAAA,GAAAA,UAA0B,AAAmB,CAAA,2BAAnB,CAACJ,iBAAiB,CAAC,AAAC;QACjE,IAAI,CAACG,IAAI,CAACE,MAAM,EAAE;YAChBpC,GAAG,CAACqC,IAAI,CACN,CAAC,4FAA4F,EAAEC,CAAAA,GAAAA,KAAS,AAEvG,CAAA,UAFuG,CACtG,4CAA4C,CAC7C,CAAC,CAAC,CACJ,CAAC;YACF,OAAO;SACR;QACD,IAAI;YACF,KAAK,MAAMC,GAAG,IAAIL,IAAI,CAAE;gBACtB,MAAMM,CAAAA,GAAAA,UAAe,AAAK,CAAA,gBAAL,CAACD,GAAG,CAAC,CAAC;aAC5B;SACF,CAAC,OAAOpB,KAAK,EAAO;YACnBnB,GAAG,CAACmB,KAAK,CAAC,iFAAiF,CAAC,CAAC;YAC7FnB,GAAG,CAACyC,SAAS,CAACtB,KAAK,CAAC,CAAC;SACtB;KACF;IAEDuB,SAAS,GAAG;QACV1C,GAAG,CAACgB,GAAG,CAAC,CAAC,EAAE2B,cAAG,IAAA,CAAC,eAAe,CAAC,CAAC,CAAC;QACjC,4CAA4C;QAC5C,IAAI,CAACtC,gBAAgB,CAACuC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;KAClD;IAED,MAAMC,kBAAkB,GAAG;QACzB,IAAI;YACF,2CAA2C;YAC3C,MAAMC,KAAK,GAAG,MAAMC,CAAAA,GAAAA,QAAW,AAQ7B,CAAA,YAR6B,CAAC7B,MAAK,QAAA,CAAC,6BAA6B,CAAC,EAAE;gBACpE;oBAAE8B,KAAK,EAAE,kBAAkB;oBAAEF,KAAK,EAAE,wBAAwB;iBAAE;gBAC9D;oBAAEE,KAAK,EAAE,4BAA4B;oBAAEF,KAAK,EAAE,0BAA0B;iBAAE;gBAC1E;oBAAEE,KAAK,EAAE,uBAAuB;oBAAEF,KAAK,EAAE,eAAe;iBAAE;gBAC1D;oBAAEE,KAAK,EAAE,YAAY;oBAAEF,KAAK,EAAE,QAAQ;iBAAE;aAIzC,CAAC,AAAC;YACH,IAAI,CAACzC,gBAAgB,CAACuC,gBAAgB,CAAC,gBAAgB,EAAE;gBAAEK,IAAI,EAAEH,KAAK;aAAE,CAAC,CAAC;SAC3E,CAAC,OAAO3B,KAAK,EAAO;YACnBlB,KAAK,CAACkB,KAAK,CAAC,CAAC;QACb,aAAa;SACd,QAAS;YACRU,CAAAA,GAAAA,cAAS,AAAE,CAAA,UAAF,EAAE,CAAC;SACb;KACF;IAEDqB,aAAa,GAAG;QACdlD,GAAG,CAACgB,GAAG,CAAC,CAAC,EAAE2B,cAAG,IAAA,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACpC,IAAI,CAACtC,gBAAgB,CAACuC,gBAAgB,CAAC,SAAS,CAAC,CAAC;KACnD;CACF;QAvGYzC,uBAAuB,GAAvBA,uBAAuB"}
|
|
@@ -61,6 +61,7 @@ class BundlerDevServer {
|
|
|
61
61
|
this.instance = null;
|
|
62
62
|
this.platformManagers = {};
|
|
63
63
|
this.urlCreator = null;
|
|
64
|
+
this.notifier = null;
|
|
64
65
|
}
|
|
65
66
|
setInstance(instance) {
|
|
66
67
|
this.instance = instance;
|
|
@@ -133,8 +134,10 @@ class BundlerDevServer {
|
|
|
133
134
|
this.watchConfig();
|
|
134
135
|
}
|
|
135
136
|
watchConfig() {
|
|
136
|
-
|
|
137
|
-
notifier.
|
|
137
|
+
var ref;
|
|
138
|
+
(ref = this.notifier) == null ? void 0 : ref.stopObserving();
|
|
139
|
+
this.notifier = new _fileNotifier.FileNotifier(this.projectRoot, this.getConfigModuleIds());
|
|
140
|
+
this.notifier.startObserving();
|
|
138
141
|
}
|
|
139
142
|
/** Create ngrok instance and start the tunnel server. Exposed for testing. */ async _startTunnelAsync() {
|
|
140
143
|
var ref;
|
|
@@ -146,11 +149,10 @@ class BundlerDevServer {
|
|
|
146
149
|
return this.ngrok;
|
|
147
150
|
}
|
|
148
151
|
async startDevSessionAsync() {
|
|
149
|
-
// This is used to make Expo Go open the project in either Expo Go, or the web browser.
|
|
152
|
+
var // This is used to make Expo Go open the project in either Expo Go, or the web browser.
|
|
150
153
|
// Must come after ngrok (`startTunnelAsync`) setup.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
+
ref1;
|
|
155
|
+
(ref1 = this.devSession) == null ? void 0 : ref1.stopNotifying == null ? void 0 : ref1.stopNotifying();
|
|
154
156
|
this.devSession = new _developmentSession.DevelopmentSession(this.projectRoot, // This URL will be used on external devices so the computer IP won't be relevant.
|
|
155
157
|
this.isTargetingNative() ? this.getNativeRuntimeUrl() : this.getDevServerUrl({
|
|
156
158
|
hostType: "localhost"
|
|
@@ -193,11 +195,13 @@ class BundlerDevServer {
|
|
|
193
195
|
return this.instance;
|
|
194
196
|
}
|
|
195
197
|
/** Stop the running dev server instance. */ async stopAsync() {
|
|
196
|
-
var
|
|
198
|
+
var // Stop file watching.
|
|
199
|
+
ref4, ref2, ref3;
|
|
200
|
+
(ref4 = this.notifier) == null ? void 0 : ref4.stopObserving();
|
|
197
201
|
// Stop the dev session timer and tell Expo API to remove dev session.
|
|
198
202
|
await ((ref2 = this.devSession) == null ? void 0 : ref2.closeAsync());
|
|
199
203
|
// Stop ngrok if running.
|
|
200
|
-
await ((
|
|
204
|
+
await ((ref3 = this.ngrok) == null ? void 0 : ref3.stopAsync().catch((e)=>{
|
|
201
205
|
Log.error(`Error stopping ngrok:`);
|
|
202
206
|
Log.exception(e);
|
|
203
207
|
}));
|
|
@@ -267,8 +271,8 @@ class BundlerDevServer {
|
|
|
267
271
|
}
|
|
268
272
|
/** Get the tunnel URL from ngrok. */ getTunnelUrl() {
|
|
269
273
|
var ref;
|
|
270
|
-
var
|
|
271
|
-
return (
|
|
274
|
+
var ref5;
|
|
275
|
+
return (ref5 = (ref = this.ngrok) == null ? void 0 : ref.getActiveUrl()) != null ? ref5 : null;
|
|
272
276
|
}
|
|
273
277
|
/** Open the dev server in a runtime. */ async openPlatformAsync(launchTarget, resolver = {}) {
|
|
274
278
|
if (launchTarget === "desktop") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/start/server/BundlerDevServer.ts"],"sourcesContent":["import { MessageSocket } from '@expo/dev-server';\nimport assert from 'assert';\nimport openBrowserAsync from 'better-opn';\nimport resolveFrom from 'resolve-from';\n\nimport { APISettings } from '../../api/settings';\nimport * as Log from '../../log';\nimport { FileNotifier } from '../../utils/FileNotifier';\nimport { resolveWithTimeout } from '../../utils/delay';\nimport { env } from '../../utils/env';\nimport { CommandError } from '../../utils/errors';\nimport {\n BaseOpenInCustomProps,\n BaseResolveDeviceProps,\n PlatformManager,\n} from '../platforms/PlatformManager';\nimport { AsyncNgrok } from './AsyncNgrok';\nimport { DevelopmentSession } from './DevelopmentSession';\nimport { CreateURLOptions, UrlCreator } from './UrlCreator';\nimport { PlatformBundlers } from './platformBundlers';\n\nconst debug = require('debug')('expo:start:server:devServer') as typeof console.log;\n\nexport type ServerLike = {\n close(callback?: (err?: Error) => void): void;\n};\n\nexport type DevServerInstance = {\n /** Bundler dev server instance. */\n server: ServerLike;\n /** Dev server URL location properties. */\n location: {\n url: string;\n port: number;\n protocol: 'http' | 'https';\n host?: string;\n };\n /** Additional middleware that's attached to the `server`. */\n middleware: any;\n /** Message socket for communicating with the runtime. */\n messageSocket: MessageSocket;\n};\n\nexport interface BundlerStartOptions {\n /** Should the dev server use `https` protocol. */\n https?: boolean;\n /** Should start the dev servers in development mode (minify). */\n mode?: 'development' | 'production';\n /** Is dev client enabled. */\n devClient?: boolean;\n /** Should run dev servers with clean caches. */\n resetDevServer?: boolean;\n /** Which manifest type to serve. */\n forceManifestType?: 'expo-updates' | 'classic';\n /** Code signing private key path (defaults to same directory as certificate) */\n privateKeyPath?: string;\n\n /** Max amount of workers (threads) to use with Metro bundler, defaults to undefined for max workers. */\n maxWorkers?: number;\n /** Port to start the dev server on. */\n port?: number;\n\n /** Should start a headless dev server e.g. mock representation to approximate info from a server running in a different process. */\n headless?: boolean;\n /** Should instruct the bundler to create minified bundles. */\n minify?: boolean;\n\n // Webpack options\n /** Should modify and create PWA icons. */\n isImageEditingEnabled?: boolean;\n\n location: CreateURLOptions;\n}\n\nconst PLATFORM_MANAGERS = {\n simulator: () =>\n require('../platforms/ios/ApplePlatformManager')\n .ApplePlatformManager as typeof import('../platforms/ios/ApplePlatformManager').ApplePlatformManager,\n emulator: () =>\n require('../platforms/android/AndroidPlatformManager')\n .AndroidPlatformManager as typeof import('../platforms/android/AndroidPlatformManager').AndroidPlatformManager,\n};\n\nconst MIDDLEWARES = {\n classic: () =>\n require('./middleware/ClassicManifestMiddleware')\n .ClassicManifestMiddleware as typeof import('./middleware/ClassicManifestMiddleware').ClassicManifestMiddleware,\n 'expo-updates': () =>\n require('./middleware/ExpoGoManifestHandlerMiddleware')\n .ExpoGoManifestHandlerMiddleware as typeof import('./middleware/ExpoGoManifestHandlerMiddleware').ExpoGoManifestHandlerMiddleware,\n};\n\nexport abstract class BundlerDevServer {\n /** Name of the bundler. */\n abstract get name(): string;\n\n /** Ngrok instance for managing tunnel connections. */\n protected ngrok: AsyncNgrok | null = null;\n /** Interfaces with the Expo 'Development Session' API. */\n protected devSession: DevelopmentSession | null = null;\n /** Http server and related info. */\n protected instance: DevServerInstance | null = null;\n /** Native platform interfaces for opening projects. */\n private platformManagers: Record<string, PlatformManager<any>> = {};\n /** Manages the creation of dev server URLs. */\n protected urlCreator?: UrlCreator | null = null;\n\n constructor(\n /** Project root folder. */\n public projectRoot: string,\n /** A mapping of bundlers to platforms. */\n public platformBundlers: PlatformBundlers,\n // TODO: Replace with custom scheme maybe...\n public isDevClient?: boolean\n ) {}\n\n protected setInstance(instance: DevServerInstance) {\n this.instance = instance;\n }\n\n /** Get the manifest middleware function. */\n protected async getManifestMiddlewareAsync(\n options: Pick<\n BundlerStartOptions,\n 'minify' | 'mode' | 'forceManifestType' | 'privateKeyPath'\n > = {}\n ) {\n const manifestType = options.forceManifestType || 'classic';\n assert(manifestType in MIDDLEWARES, `Manifest middleware for type '${manifestType}' not found`);\n const Middleware = MIDDLEWARES[manifestType]();\n\n const urlCreator = this.getUrlCreator();\n const middleware = new Middleware(this.projectRoot, {\n constructUrl: urlCreator.constructUrl.bind(urlCreator),\n mode: options.mode,\n minify: options.minify,\n isNativeWebpack: this.name === 'webpack' && this.isTargetingNative(),\n privateKeyPath: options.privateKeyPath,\n });\n return middleware.getHandler();\n }\n\n /** Start the dev server using settings defined in the start command. */\n public async startAsync(options: BundlerStartOptions): Promise<DevServerInstance> {\n await this.stopAsync();\n\n let instance: DevServerInstance;\n if (options.headless) {\n instance = await this.startHeadlessAsync(options);\n } else {\n instance = await this.startImplementationAsync(options);\n }\n\n this.setInstance(instance);\n await this.postStartAsync(options);\n return instance;\n }\n\n protected abstract startImplementationAsync(\n options: BundlerStartOptions\n ): Promise<DevServerInstance>;\n\n /**\n * Creates a mock server representation that can be used to estimate URLs for a server started in another process.\n * This is used for the run commands where you can reuse the server from a previous run.\n */\n private async startHeadlessAsync(options: BundlerStartOptions): Promise<DevServerInstance> {\n if (!options.port)\n throw new CommandError('HEADLESS_SERVER', 'headless dev server requires a port option');\n this.urlCreator = this.getUrlCreator(options);\n\n return {\n // Create a mock server\n server: {\n close: () => {\n this.instance = null;\n },\n },\n location: {\n // The port is the main thing we want to send back.\n port: options.port,\n // localhost isn't always correct.\n host: 'localhost',\n // http is the only supported protocol on native.\n url: `http://localhost:${options.port}`,\n protocol: 'http',\n },\n middleware: {},\n messageSocket: {\n broadcast: () => {\n throw new CommandError('HEADLESS_SERVER', 'Cannot broadcast messages to headless server');\n },\n },\n };\n }\n\n /**\n * Runs after the `startAsync` function, performing any additional common operations.\n * You can assume the dev server is started by the time this function is called.\n */\n protected async postStartAsync(options: BundlerStartOptions) {\n if (\n options.location.hostType === 'tunnel' &&\n !APISettings.isOffline &&\n // This is a hack to prevent using tunnel on web since we block it upstream for some reason.\n this.isTargetingNative()\n ) {\n await this._startTunnelAsync();\n }\n await this.startDevSessionAsync();\n\n this.watchConfig();\n }\n\n protected abstract getConfigModuleIds(): string[];\n\n protected watchConfig() {\n const notifier = new FileNotifier(this.projectRoot, this.getConfigModuleIds());\n notifier.startObserving();\n }\n\n /** Create ngrok instance and start the tunnel server. Exposed for testing. */\n public async _startTunnelAsync(): Promise<AsyncNgrok | null> {\n const port = this.getInstance()?.location.port;\n if (!port) return null;\n debug('[ngrok] connect to port: ' + port);\n this.ngrok = new AsyncNgrok(this.projectRoot, port);\n await this.ngrok.startAsync();\n return this.ngrok;\n }\n\n protected async startDevSessionAsync() {\n // This is used to make Expo Go open the project in either Expo Go, or the web browser.\n // Must come after ngrok (`startTunnelAsync`) setup.\n\n if (this.devSession) {\n this.devSession.stopNotifying();\n }\n\n this.devSession = new DevelopmentSession(\n this.projectRoot,\n // This URL will be used on external devices so the computer IP won't be relevant.\n this.isTargetingNative()\n ? this.getNativeRuntimeUrl()\n : this.getDevServerUrl({ hostType: 'localhost' }),\n () => {\n // TODO: This appears to be happening consistently after an hour.\n // We should investigate why this is happening and fix it on our servers.\n // Log.error(\n // chalk.red(\n // '\\nAn unexpected error occurred while updating the Dev Session API. This project will not appear in the \"Development servers\" section of the Expo Go app until this process has been restarted.'\n // )\n // );\n // Log.exception(error);\n this.devSession?.closeAsync().catch((error) => {\n debug('[dev-session] error closing: ' + error.message);\n });\n }\n );\n\n await this.devSession.startAsync({\n runtime: this.isTargetingNative() ? 'native' : 'web',\n });\n }\n\n public isTargetingNative() {\n // Temporary hack while we implement multi-bundler dev server proxy.\n return true;\n }\n\n public isTargetingWeb() {\n return this.platformBundlers.web === this.name;\n }\n\n /**\n * Sends a message over web sockets to any connected device,\n * does nothing when the dev server is not running.\n *\n * @param method name of the command. In RN projects `reload`, and `devMenu` are available. In Expo Go, `sendDevCommand` is available.\n * @param params\n */\n public broadcastMessage(\n method: 'reload' | 'devMenu' | 'sendDevCommand',\n params?: Record<string, any>\n ) {\n this.getInstance()?.messageSocket.broadcast(method, params);\n }\n\n /** Get the running dev server instance. */\n public getInstance() {\n return this.instance;\n }\n\n /** Stop the running dev server instance. */\n async stopAsync() {\n // Stop the dev session timer and tell Expo API to remove dev session.\n await this.devSession?.closeAsync();\n\n // Stop ngrok if running.\n await this.ngrok?.stopAsync().catch((e) => {\n Log.error(`Error stopping ngrok:`);\n Log.exception(e);\n });\n\n return resolveWithTimeout(\n () =>\n new Promise<void>((resolve, reject) => {\n // Close the server.\n debug(`Stopping dev server (bundler: ${this.name})`);\n\n if (this.instance?.server) {\n this.instance.server.close((error) => {\n debug(`Stopped dev server (bundler: ${this.name})`);\n this.instance = null;\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n } else {\n debug(`Stopped dev server (bundler: ${this.name})`);\n this.instance = null;\n resolve();\n }\n }),\n {\n // NOTE(Bacon): Metro dev server doesn't seem to be closing in time.\n timeout: 1000,\n errorMessage: `Timeout waiting for '${this.name}' dev server to close`,\n }\n );\n }\n\n protected getUrlCreator(options: Partial<Pick<BundlerStartOptions, 'port' | 'location'>> = {}) {\n if (!this.urlCreator) {\n assert(options?.port, 'Dev server instance not found');\n this.urlCreator = new UrlCreator(options.location, {\n port: options.port,\n getTunnelUrl: this.getTunnelUrl.bind(this),\n });\n }\n return this.urlCreator;\n }\n\n public getNativeRuntimeUrl(opts: Partial<CreateURLOptions> = {}) {\n return this.isDevClient\n ? this.getUrlCreator().constructDevClientUrl(opts) ?? this.getDevServerUrl()\n : this.getUrlCreator().constructUrl({ ...opts, scheme: 'exp' });\n }\n\n /** Get the URL for the running instance of the dev server. */\n public getDevServerUrl(options: { hostType?: 'localhost' } = {}): string | null {\n const instance = this.getInstance();\n if (!instance?.location) {\n return null;\n }\n const { location } = instance;\n if (options.hostType === 'localhost') {\n return `${location.protocol}://localhost:${location.port}`;\n }\n return location.url ?? null;\n }\n\n /** Get the base URL for JS inspector */\n public getJsInspectorBaseUrl(): string {\n if (this.name !== 'metro') {\n throw new CommandError(\n 'DEV_SERVER',\n `Cannot get the JS inspector base url - bundler[${this.name}]`\n );\n }\n return this.getUrlCreator().constructUrl({ scheme: 'http' });\n }\n\n /** Get the tunnel URL from ngrok. */\n public getTunnelUrl(): string | null {\n return this.ngrok?.getActiveUrl() ?? null;\n }\n\n /** Open the dev server in a runtime. */\n public async openPlatformAsync(\n launchTarget: keyof typeof PLATFORM_MANAGERS | 'desktop',\n resolver: BaseResolveDeviceProps<any> = {}\n ) {\n if (launchTarget === 'desktop') {\n const serverUrl = this.getDevServerUrl({ hostType: 'localhost' });\n // Allow opening the tunnel URL when using Metro web.\n const url = this.name === 'metro' ? this.getTunnelUrl() ?? serverUrl : serverUrl;\n await openBrowserAsync(url!);\n return { url };\n }\n\n const runtime = this.isTargetingNative() ? (this.isDevClient ? 'custom' : 'expo') : 'web';\n const manager = await this.getPlatformManagerAsync(launchTarget);\n return manager.openAsync({ runtime }, resolver);\n }\n\n /** Open the dev server in a runtime. */\n public async openCustomRuntimeAsync(\n launchTarget: keyof typeof PLATFORM_MANAGERS,\n launchProps: Partial<BaseOpenInCustomProps> = {},\n resolver: BaseResolveDeviceProps<any> = {}\n ) {\n const runtime = this.isTargetingNative() ? (this.isDevClient ? 'custom' : 'expo') : 'web';\n if (runtime !== 'custom') {\n throw new CommandError(\n `dev server cannot open custom runtimes either because it does not target native platforms or because it is not targeting dev clients. (target: ${runtime})`\n );\n }\n\n const manager = await this.getPlatformManagerAsync(launchTarget);\n return manager.openAsync({ runtime: 'custom', props: launchProps }, resolver);\n }\n\n /** Get the URL for opening in Expo Go. */\n protected getExpoGoUrl(): string {\n return this.getUrlCreator().constructUrl({ scheme: 'exp' });\n }\n\n /** Should use the interstitial page for selecting which runtime to use. */\n protected isRedirectPageEnabled(): boolean {\n return (\n !env.EXPO_NO_REDIRECT_PAGE &&\n // if user passed --dev-client flag, skip interstitial page\n !this.isDevClient &&\n // Checks if dev client is installed.\n !!resolveFrom.silent(this.projectRoot, 'expo-dev-client')\n );\n }\n\n /** Get the redirect URL when redirecting is enabled. */\n public getRedirectUrl(platform: keyof typeof PLATFORM_MANAGERS | null = null): string | null {\n if (!this.isRedirectPageEnabled()) {\n debug('Redirect page is disabled');\n return null;\n }\n\n return (\n this.getUrlCreator().constructLoadingUrl(\n {},\n platform === 'emulator' ? 'android' : platform === 'simulator' ? 'ios' : null\n ) ?? null\n );\n }\n\n protected async getPlatformManagerAsync(platform: keyof typeof PLATFORM_MANAGERS) {\n if (!this.platformManagers[platform]) {\n const Manager = PLATFORM_MANAGERS[platform]();\n const port = this.getInstance()?.location.port;\n if (!port || !this.urlCreator) {\n throw new CommandError(\n 'DEV_SERVER',\n 'Cannot interact with native platforms until dev server has started'\n );\n }\n debug(`Creating platform manager (platform: ${platform}, port: ${port})`);\n this.platformManagers[platform] = new Manager(this.projectRoot, port, {\n getCustomRuntimeUrl: this.urlCreator.constructDevClientUrl.bind(this.urlCreator),\n getExpoGoUrl: this.getExpoGoUrl.bind(this),\n getRedirectUrl: this.getRedirectUrl.bind(this, platform),\n getDevServerUrl: this.getDevServerUrl.bind(this, { hostType: 'localhost' }),\n });\n }\n return this.platformManagers[platform];\n }\n}\n"],"names":["Log","debug","require","PLATFORM_MANAGERS","simulator","ApplePlatformManager","emulator","AndroidPlatformManager","MIDDLEWARES","classic","ClassicManifestMiddleware","ExpoGoManifestHandlerMiddleware","BundlerDevServer","constructor","projectRoot","platformBundlers","isDevClient","ngrok","devSession","instance","platformManagers","urlCreator","setInstance","getManifestMiddlewareAsync","options","manifestType","forceManifestType","assert","Middleware","getUrlCreator","middleware","constructUrl","bind","mode","minify","isNativeWebpack","name","isTargetingNative","privateKeyPath","getHandler","startAsync","stopAsync","headless","startHeadlessAsync","startImplementationAsync","postStartAsync","port","CommandError","server","close","location","host","url","protocol","messageSocket","broadcast","hostType","APISettings","isOffline","_startTunnelAsync","startDevSessionAsync","watchConfig","notifier","FileNotifier","getConfigModuleIds","startObserving","getInstance","AsyncNgrok","stopNotifying","DevelopmentSession","getNativeRuntimeUrl","getDevServerUrl","closeAsync","catch","error","message","runtime","isTargetingWeb","web","broadcastMessage","method","params","e","exception","resolveWithTimeout","Promise","resolve","reject","timeout","errorMessage","UrlCreator","getTunnelUrl","opts","constructDevClientUrl","scheme","getJsInspectorBaseUrl","getActiveUrl","openPlatformAsync","launchTarget","resolver","serverUrl","openBrowserAsync","manager","getPlatformManagerAsync","openAsync","openCustomRuntimeAsync","launchProps","props","getExpoGoUrl","isRedirectPageEnabled","env","EXPO_NO_REDIRECT_PAGE","resolveFrom","silent","getRedirectUrl","platform","constructLoadingUrl","Manager","getCustomRuntimeUrl"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/start/server/BundlerDevServer.ts"],"sourcesContent":["import { MessageSocket } from '@expo/dev-server';\nimport assert from 'assert';\nimport openBrowserAsync from 'better-opn';\nimport resolveFrom from 'resolve-from';\n\nimport { APISettings } from '../../api/settings';\nimport * as Log from '../../log';\nimport { FileNotifier } from '../../utils/FileNotifier';\nimport { resolveWithTimeout } from '../../utils/delay';\nimport { env } from '../../utils/env';\nimport { CommandError } from '../../utils/errors';\nimport {\n BaseOpenInCustomProps,\n BaseResolveDeviceProps,\n PlatformManager,\n} from '../platforms/PlatformManager';\nimport { AsyncNgrok } from './AsyncNgrok';\nimport { DevelopmentSession } from './DevelopmentSession';\nimport { CreateURLOptions, UrlCreator } from './UrlCreator';\nimport { PlatformBundlers } from './platformBundlers';\n\nconst debug = require('debug')('expo:start:server:devServer') as typeof console.log;\n\nexport type ServerLike = {\n close(callback?: (err?: Error) => void): void;\n};\n\nexport type DevServerInstance = {\n /** Bundler dev server instance. */\n server: ServerLike;\n /** Dev server URL location properties. */\n location: {\n url: string;\n port: number;\n protocol: 'http' | 'https';\n host?: string;\n };\n /** Additional middleware that's attached to the `server`. */\n middleware: any;\n /** Message socket for communicating with the runtime. */\n messageSocket: MessageSocket;\n};\n\nexport interface BundlerStartOptions {\n /** Should the dev server use `https` protocol. */\n https?: boolean;\n /** Should start the dev servers in development mode (minify). */\n mode?: 'development' | 'production';\n /** Is dev client enabled. */\n devClient?: boolean;\n /** Should run dev servers with clean caches. */\n resetDevServer?: boolean;\n /** Which manifest type to serve. */\n forceManifestType?: 'expo-updates' | 'classic';\n /** Code signing private key path (defaults to same directory as certificate) */\n privateKeyPath?: string;\n\n /** Max amount of workers (threads) to use with Metro bundler, defaults to undefined for max workers. */\n maxWorkers?: number;\n /** Port to start the dev server on. */\n port?: number;\n\n /** Should start a headless dev server e.g. mock representation to approximate info from a server running in a different process. */\n headless?: boolean;\n /** Should instruct the bundler to create minified bundles. */\n minify?: boolean;\n\n // Webpack options\n /** Should modify and create PWA icons. */\n isImageEditingEnabled?: boolean;\n\n location: CreateURLOptions;\n}\n\nconst PLATFORM_MANAGERS = {\n simulator: () =>\n require('../platforms/ios/ApplePlatformManager')\n .ApplePlatformManager as typeof import('../platforms/ios/ApplePlatformManager').ApplePlatformManager,\n emulator: () =>\n require('../platforms/android/AndroidPlatformManager')\n .AndroidPlatformManager as typeof import('../platforms/android/AndroidPlatformManager').AndroidPlatformManager,\n};\n\nconst MIDDLEWARES = {\n classic: () =>\n require('./middleware/ClassicManifestMiddleware')\n .ClassicManifestMiddleware as typeof import('./middleware/ClassicManifestMiddleware').ClassicManifestMiddleware,\n 'expo-updates': () =>\n require('./middleware/ExpoGoManifestHandlerMiddleware')\n .ExpoGoManifestHandlerMiddleware as typeof import('./middleware/ExpoGoManifestHandlerMiddleware').ExpoGoManifestHandlerMiddleware,\n};\n\nexport abstract class BundlerDevServer {\n /** Name of the bundler. */\n abstract get name(): string;\n\n /** Ngrok instance for managing tunnel connections. */\n protected ngrok: AsyncNgrok | null = null;\n /** Interfaces with the Expo 'Development Session' API. */\n protected devSession: DevelopmentSession | null = null;\n /** Http server and related info. */\n protected instance: DevServerInstance | null = null;\n /** Native platform interfaces for opening projects. */\n private platformManagers: Record<string, PlatformManager<any>> = {};\n /** Manages the creation of dev server URLs. */\n protected urlCreator?: UrlCreator | null = null;\n\n private notifier: FileNotifier | null = null;\n\n constructor(\n /** Project root folder. */\n public projectRoot: string,\n /** A mapping of bundlers to platforms. */\n public platformBundlers: PlatformBundlers,\n // TODO: Replace with custom scheme maybe...\n public isDevClient?: boolean\n ) {}\n\n protected setInstance(instance: DevServerInstance) {\n this.instance = instance;\n }\n\n /** Get the manifest middleware function. */\n protected async getManifestMiddlewareAsync(\n options: Pick<\n BundlerStartOptions,\n 'minify' | 'mode' | 'forceManifestType' | 'privateKeyPath'\n > = {}\n ) {\n const manifestType = options.forceManifestType || 'classic';\n assert(manifestType in MIDDLEWARES, `Manifest middleware for type '${manifestType}' not found`);\n const Middleware = MIDDLEWARES[manifestType]();\n\n const urlCreator = this.getUrlCreator();\n const middleware = new Middleware(this.projectRoot, {\n constructUrl: urlCreator.constructUrl.bind(urlCreator),\n mode: options.mode,\n minify: options.minify,\n isNativeWebpack: this.name === 'webpack' && this.isTargetingNative(),\n privateKeyPath: options.privateKeyPath,\n });\n return middleware.getHandler();\n }\n\n /** Start the dev server using settings defined in the start command. */\n public async startAsync(options: BundlerStartOptions): Promise<DevServerInstance> {\n await this.stopAsync();\n\n let instance: DevServerInstance;\n if (options.headless) {\n instance = await this.startHeadlessAsync(options);\n } else {\n instance = await this.startImplementationAsync(options);\n }\n\n this.setInstance(instance);\n await this.postStartAsync(options);\n return instance;\n }\n\n protected abstract startImplementationAsync(\n options: BundlerStartOptions\n ): Promise<DevServerInstance>;\n\n /**\n * Creates a mock server representation that can be used to estimate URLs for a server started in another process.\n * This is used for the run commands where you can reuse the server from a previous run.\n */\n private async startHeadlessAsync(options: BundlerStartOptions): Promise<DevServerInstance> {\n if (!options.port)\n throw new CommandError('HEADLESS_SERVER', 'headless dev server requires a port option');\n this.urlCreator = this.getUrlCreator(options);\n\n return {\n // Create a mock server\n server: {\n close: () => {\n this.instance = null;\n },\n },\n location: {\n // The port is the main thing we want to send back.\n port: options.port,\n // localhost isn't always correct.\n host: 'localhost',\n // http is the only supported protocol on native.\n url: `http://localhost:${options.port}`,\n protocol: 'http',\n },\n middleware: {},\n messageSocket: {\n broadcast: () => {\n throw new CommandError('HEADLESS_SERVER', 'Cannot broadcast messages to headless server');\n },\n },\n };\n }\n\n /**\n * Runs after the `startAsync` function, performing any additional common operations.\n * You can assume the dev server is started by the time this function is called.\n */\n protected async postStartAsync(options: BundlerStartOptions) {\n if (\n options.location.hostType === 'tunnel' &&\n !APISettings.isOffline &&\n // This is a hack to prevent using tunnel on web since we block it upstream for some reason.\n this.isTargetingNative()\n ) {\n await this._startTunnelAsync();\n }\n await this.startDevSessionAsync();\n\n this.watchConfig();\n }\n\n protected abstract getConfigModuleIds(): string[];\n\n protected watchConfig() {\n this.notifier?.stopObserving();\n this.notifier = new FileNotifier(this.projectRoot, this.getConfigModuleIds());\n this.notifier.startObserving();\n }\n\n /** Create ngrok instance and start the tunnel server. Exposed for testing. */\n public async _startTunnelAsync(): Promise<AsyncNgrok | null> {\n const port = this.getInstance()?.location.port;\n if (!port) return null;\n debug('[ngrok] connect to port: ' + port);\n this.ngrok = new AsyncNgrok(this.projectRoot, port);\n await this.ngrok.startAsync();\n return this.ngrok;\n }\n\n protected async startDevSessionAsync() {\n // This is used to make Expo Go open the project in either Expo Go, or the web browser.\n // Must come after ngrok (`startTunnelAsync`) setup.\n this.devSession?.stopNotifying?.();\n this.devSession = new DevelopmentSession(\n this.projectRoot,\n // This URL will be used on external devices so the computer IP won't be relevant.\n this.isTargetingNative()\n ? this.getNativeRuntimeUrl()\n : this.getDevServerUrl({ hostType: 'localhost' }),\n () => {\n // TODO: This appears to be happening consistently after an hour.\n // We should investigate why this is happening and fix it on our servers.\n // Log.error(\n // chalk.red(\n // '\\nAn unexpected error occurred while updating the Dev Session API. This project will not appear in the \"Development servers\" section of the Expo Go app until this process has been restarted.'\n // )\n // );\n // Log.exception(error);\n this.devSession?.closeAsync().catch((error) => {\n debug('[dev-session] error closing: ' + error.message);\n });\n }\n );\n\n await this.devSession.startAsync({\n runtime: this.isTargetingNative() ? 'native' : 'web',\n });\n }\n\n public isTargetingNative() {\n // Temporary hack while we implement multi-bundler dev server proxy.\n return true;\n }\n\n public isTargetingWeb() {\n return this.platformBundlers.web === this.name;\n }\n\n /**\n * Sends a message over web sockets to any connected device,\n * does nothing when the dev server is not running.\n *\n * @param method name of the command. In RN projects `reload`, and `devMenu` are available. In Expo Go, `sendDevCommand` is available.\n * @param params\n */\n public broadcastMessage(\n method: 'reload' | 'devMenu' | 'sendDevCommand',\n params?: Record<string, any>\n ) {\n this.getInstance()?.messageSocket.broadcast(method, params);\n }\n\n /** Get the running dev server instance. */\n public getInstance() {\n return this.instance;\n }\n\n /** Stop the running dev server instance. */\n async stopAsync() {\n // Stop file watching.\n this.notifier?.stopObserving();\n\n // Stop the dev session timer and tell Expo API to remove dev session.\n await this.devSession?.closeAsync();\n\n // Stop ngrok if running.\n await this.ngrok?.stopAsync().catch((e) => {\n Log.error(`Error stopping ngrok:`);\n Log.exception(e);\n });\n\n return resolveWithTimeout(\n () =>\n new Promise<void>((resolve, reject) => {\n // Close the server.\n debug(`Stopping dev server (bundler: ${this.name})`);\n\n if (this.instance?.server) {\n this.instance.server.close((error) => {\n debug(`Stopped dev server (bundler: ${this.name})`);\n this.instance = null;\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n } else {\n debug(`Stopped dev server (bundler: ${this.name})`);\n this.instance = null;\n resolve();\n }\n }),\n {\n // NOTE(Bacon): Metro dev server doesn't seem to be closing in time.\n timeout: 1000,\n errorMessage: `Timeout waiting for '${this.name}' dev server to close`,\n }\n );\n }\n\n protected getUrlCreator(options: Partial<Pick<BundlerStartOptions, 'port' | 'location'>> = {}) {\n if (!this.urlCreator) {\n assert(options?.port, 'Dev server instance not found');\n this.urlCreator = new UrlCreator(options.location, {\n port: options.port,\n getTunnelUrl: this.getTunnelUrl.bind(this),\n });\n }\n return this.urlCreator;\n }\n\n public getNativeRuntimeUrl(opts: Partial<CreateURLOptions> = {}) {\n return this.isDevClient\n ? this.getUrlCreator().constructDevClientUrl(opts) ?? this.getDevServerUrl()\n : this.getUrlCreator().constructUrl({ ...opts, scheme: 'exp' });\n }\n\n /** Get the URL for the running instance of the dev server. */\n public getDevServerUrl(options: { hostType?: 'localhost' } = {}): string | null {\n const instance = this.getInstance();\n if (!instance?.location) {\n return null;\n }\n const { location } = instance;\n if (options.hostType === 'localhost') {\n return `${location.protocol}://localhost:${location.port}`;\n }\n return location.url ?? null;\n }\n\n /** Get the base URL for JS inspector */\n public getJsInspectorBaseUrl(): string {\n if (this.name !== 'metro') {\n throw new CommandError(\n 'DEV_SERVER',\n `Cannot get the JS inspector base url - bundler[${this.name}]`\n );\n }\n return this.getUrlCreator().constructUrl({ scheme: 'http' });\n }\n\n /** Get the tunnel URL from ngrok. */\n public getTunnelUrl(): string | null {\n return this.ngrok?.getActiveUrl() ?? null;\n }\n\n /** Open the dev server in a runtime. */\n public async openPlatformAsync(\n launchTarget: keyof typeof PLATFORM_MANAGERS | 'desktop',\n resolver: BaseResolveDeviceProps<any> = {}\n ) {\n if (launchTarget === 'desktop') {\n const serverUrl = this.getDevServerUrl({ hostType: 'localhost' });\n // Allow opening the tunnel URL when using Metro web.\n const url = this.name === 'metro' ? this.getTunnelUrl() ?? serverUrl : serverUrl;\n await openBrowserAsync(url!);\n return { url };\n }\n\n const runtime = this.isTargetingNative() ? (this.isDevClient ? 'custom' : 'expo') : 'web';\n const manager = await this.getPlatformManagerAsync(launchTarget);\n return manager.openAsync({ runtime }, resolver);\n }\n\n /** Open the dev server in a runtime. */\n public async openCustomRuntimeAsync(\n launchTarget: keyof typeof PLATFORM_MANAGERS,\n launchProps: Partial<BaseOpenInCustomProps> = {},\n resolver: BaseResolveDeviceProps<any> = {}\n ) {\n const runtime = this.isTargetingNative() ? (this.isDevClient ? 'custom' : 'expo') : 'web';\n if (runtime !== 'custom') {\n throw new CommandError(\n `dev server cannot open custom runtimes either because it does not target native platforms or because it is not targeting dev clients. (target: ${runtime})`\n );\n }\n\n const manager = await this.getPlatformManagerAsync(launchTarget);\n return manager.openAsync({ runtime: 'custom', props: launchProps }, resolver);\n }\n\n /** Get the URL for opening in Expo Go. */\n protected getExpoGoUrl(): string {\n return this.getUrlCreator().constructUrl({ scheme: 'exp' });\n }\n\n /** Should use the interstitial page for selecting which runtime to use. */\n protected isRedirectPageEnabled(): boolean {\n return (\n !env.EXPO_NO_REDIRECT_PAGE &&\n // if user passed --dev-client flag, skip interstitial page\n !this.isDevClient &&\n // Checks if dev client is installed.\n !!resolveFrom.silent(this.projectRoot, 'expo-dev-client')\n );\n }\n\n /** Get the redirect URL when redirecting is enabled. */\n public getRedirectUrl(platform: keyof typeof PLATFORM_MANAGERS | null = null): string | null {\n if (!this.isRedirectPageEnabled()) {\n debug('Redirect page is disabled');\n return null;\n }\n\n return (\n this.getUrlCreator().constructLoadingUrl(\n {},\n platform === 'emulator' ? 'android' : platform === 'simulator' ? 'ios' : null\n ) ?? null\n );\n }\n\n protected async getPlatformManagerAsync(platform: keyof typeof PLATFORM_MANAGERS) {\n if (!this.platformManagers[platform]) {\n const Manager = PLATFORM_MANAGERS[platform]();\n const port = this.getInstance()?.location.port;\n if (!port || !this.urlCreator) {\n throw new CommandError(\n 'DEV_SERVER',\n 'Cannot interact with native platforms until dev server has started'\n );\n }\n debug(`Creating platform manager (platform: ${platform}, port: ${port})`);\n this.platformManagers[platform] = new Manager(this.projectRoot, port, {\n getCustomRuntimeUrl: this.urlCreator.constructDevClientUrl.bind(this.urlCreator),\n getExpoGoUrl: this.getExpoGoUrl.bind(this),\n getRedirectUrl: this.getRedirectUrl.bind(this, platform),\n getDevServerUrl: this.getDevServerUrl.bind(this, { hostType: 'localhost' }),\n });\n }\n return this.platformManagers[platform];\n }\n}\n"],"names":["Log","debug","require","PLATFORM_MANAGERS","simulator","ApplePlatformManager","emulator","AndroidPlatformManager","MIDDLEWARES","classic","ClassicManifestMiddleware","ExpoGoManifestHandlerMiddleware","BundlerDevServer","constructor","projectRoot","platformBundlers","isDevClient","ngrok","devSession","instance","platformManagers","urlCreator","notifier","setInstance","getManifestMiddlewareAsync","options","manifestType","forceManifestType","assert","Middleware","getUrlCreator","middleware","constructUrl","bind","mode","minify","isNativeWebpack","name","isTargetingNative","privateKeyPath","getHandler","startAsync","stopAsync","headless","startHeadlessAsync","startImplementationAsync","postStartAsync","port","CommandError","server","close","location","host","url","protocol","messageSocket","broadcast","hostType","APISettings","isOffline","_startTunnelAsync","startDevSessionAsync","watchConfig","stopObserving","FileNotifier","getConfigModuleIds","startObserving","getInstance","AsyncNgrok","stopNotifying","DevelopmentSession","getNativeRuntimeUrl","getDevServerUrl","closeAsync","catch","error","message","runtime","isTargetingWeb","web","broadcastMessage","method","params","e","exception","resolveWithTimeout","Promise","resolve","reject","timeout","errorMessage","UrlCreator","getTunnelUrl","opts","constructDevClientUrl","scheme","getJsInspectorBaseUrl","getActiveUrl","openPlatformAsync","launchTarget","resolver","serverUrl","openBrowserAsync","manager","getPlatformManagerAsync","openAsync","openCustomRuntimeAsync","launchProps","props","getExpoGoUrl","isRedirectPageEnabled","env","EXPO_NO_REDIRECT_PAGE","resolveFrom","silent","getRedirectUrl","platform","constructLoadingUrl","Manager","getCustomRuntimeUrl"],"mappings":"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"}
|
|
@@ -47,7 +47,8 @@ class DevServerManager {
|
|
|
47
47
|
this.projectRoot = projectRoot;
|
|
48
48
|
this.options = options;
|
|
49
49
|
this.projectPrerequisites = [];
|
|
50
|
-
this.
|
|
50
|
+
this.notifier = null;
|
|
51
|
+
this.notifier = this.watchBabelConfig();
|
|
51
52
|
}
|
|
52
53
|
watchBabelConfig() {
|
|
53
54
|
const notifier = new _fileNotifier.FileNotifier(this.projectRoot, [
|
|
@@ -138,7 +139,9 @@ class DevServerManager {
|
|
|
138
139
|
return exp;
|
|
139
140
|
}
|
|
140
141
|
/** Stop all servers including ADB. */ async stopAsync() {
|
|
142
|
+
var ref;
|
|
141
143
|
await Promise.allSettled([
|
|
144
|
+
(ref = this.notifier) == null ? void 0 : ref.stopObserving(),
|
|
142
145
|
// Stop all dev servers
|
|
143
146
|
...devServers.map((server)=>server.stopAsync()
|
|
144
147
|
),
|