@expo/cli 0.19.5 → 0.19.7

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/README.md CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
  ---
38
38
 
39
- The `@expo/cli` package is a CLI binary that should be used via `expo` like `npx expo start`.
39
+ The `@expo/cli` package is a CLI binary that should be used via the `expo` package, like `npx expo start` (or `npx expo` for short).
40
40
 
41
41
  ```
42
42
  npx expo
package/build/bin/cli CHANGED
@@ -120,7 +120,7 @@ const args = (0, _arg().default)({
120
120
  });
121
121
  if (args["--version"]) {
122
122
  // Version is added in the build script.
123
- console.log("0.19.5");
123
+ console.log("0.19.7");
124
124
  process.exit(0);
125
125
  }
126
126
  if (args["--non-interactive"]) {
@@ -11,7 +11,8 @@ function _export(target, all) {
11
11
  _export(exports, {
12
12
  validateDependenciesVersionsAsync: ()=>validateDependenciesVersionsAsync,
13
13
  logIncorrectDependencies: ()=>logIncorrectDependencies,
14
- getVersionedDependenciesAsync: ()=>getVersionedDependenciesAsync
14
+ getVersionedDependenciesAsync: ()=>getVersionedDependenciesAsync,
15
+ isDependencyVersionIncorrect: ()=>isDependencyVersionIncorrect
15
16
  });
16
17
  function _assert() {
17
18
  const data = /*#__PURE__*/ _interopRequireDefault(require("assert"));
@@ -232,8 +233,19 @@ function isDependencyVersionIncorrect(packageName, actualVersion, expectedVersio
232
233
  if (packageName === "expo") {
233
234
  return _semver().default.ltr(actualVersion, expectedVersionOrRange);
234
235
  }
235
- // all other packages: version range is based on Expo SDK version, so we always want to match range
236
- return !_semver().default.intersects(expectedVersionOrRange, actualVersion);
236
+ const actualPrerelease = _semver().default.prerelease(actualVersion);
237
+ const expectedPrerelease = _semver().default.prerelease(expectedVersionOrRange);
238
+ // If both are prereleases or both are not prereleases, use satisfies
239
+ if (actualPrerelease && expectedPrerelease || !actualPrerelease && !expectedPrerelease) {
240
+ return !_semver().default.satisfies(actualVersion, expectedVersionOrRange);
241
+ }
242
+ // If actual is prerelease but expected is not
243
+ if (actualPrerelease && !expectedPrerelease) {
244
+ const cleanedActualVersion = `${_semver().default.major(actualVersion)}.${_semver().default.minor(actualVersion)}.${_semver().default.patch(actualVersion)}`;
245
+ return !_semver().default.satisfies(cleanedActualVersion, expectedVersionOrRange);
246
+ }
247
+ // If expected is prerelease but actual is not, consider it incorrect
248
+ return true;
237
249
  }
238
250
  function findDependencyType(pkg, packageName) {
239
251
  if (pkg.devDependencies && packageName in pkg.devDependencies) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/doctor/dependencies/validateDependenciesVersions.ts"],"sourcesContent":["import { ExpoConfig, PackageJSONConfig } from '@expo/config';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport npmPackageArg from 'npm-package-arg';\nimport semver from 'semver';\nimport semverRangeSubset from 'semver/ranges/subset';\n\nimport { BundledNativeModules } from './bundledNativeModules';\nimport { getCombinedKnownVersionsAsync } from './getVersionedPackages';\nimport { resolveAllPackageVersionsAsync } from './resolvePackages';\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\n\nconst debug = require('debug')('expo:doctor:dependencies:validate') as typeof console.log;\n\ntype IncorrectDependency = {\n packageName: string;\n packageType: 'dependencies' | 'devDependencies';\n expectedVersionOrRange: string;\n actualVersion: string;\n};\n\ntype DependenciesToCheck = { known: string[]; unknown: string[] };\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 (env.EXPO_OFFLINE) {\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` {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(\n chalk`The following packages should be updated for best compatibility with the installed {bold expo} version:`\n );\n incorrectDeps.forEach((dep) => logInvalidDependency(dep));\n\n Log.warn(\n 'Your project may not work correctly until you install the expected versions of the packages.'\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 combinedKnownPackages,\n resolvedDependencies\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 resolveAllPackageVersionsAsync(\n projectRoot,\n resolvedPackagesToCheck\n );\n debug(`Package versions: %O`, packageVersions);\n // find incorrect dependencies by comparing the actual package versions with the bundled native module version ranges\n let incorrectDeps = findIncorrectDependencies(pkg, packageVersions, combinedKnownPackages);\n debug(`Incorrect dependencies: %O`, incorrectDeps);\n\n if (pkg?.expo?.install?.exclude) {\n const packagesToExclude = pkg.expo.install.exclude;\n\n // Parse the exclude list to ensure we can factor in any specified version ranges\n const parsedPackagesToExclude = packagesToExclude.reduce(\n (acc: Record<string, npmPackageArg.Result>, packageName: string) => {\n const npaResult = npmPackageArg(packageName);\n if (typeof npaResult.name === 'string') {\n acc[npaResult.name] = npaResult;\n } else {\n acc[packageName] = npaResult;\n }\n return acc;\n },\n {}\n );\n\n const incorrectAndExcludedDeps = incorrectDeps\n .filter((dep) => {\n if (parsedPackagesToExclude[dep.packageName]) {\n const { name, raw, rawSpec, type } = parsedPackagesToExclude[dep.packageName];\n const suggestedRange = combinedKnownPackages[name];\n\n // If only the package name itself is specified, then we keep it in the exclude list\n if (name === raw) {\n return true;\n } else if (type === 'version') {\n return suggestedRange === rawSpec;\n } else if (type === 'range') {\n // Fall through exclusions if the suggested range is invalid\n if (!semver.validRange(suggestedRange)) {\n debug(\n `Invalid semver range in combined known packages for package ${name} in expo.install.exclude: %O`,\n suggestedRange\n );\n return false;\n }\n\n return semverRangeSubset(suggestedRange, rawSpec);\n } else {\n debug(\n `Unsupported npm package argument type for package ${name} in expo.install.exclude: %O`,\n type\n );\n }\n }\n\n return false;\n })\n .map((dep) => dep.packageName);\n\n debug(\n `Incorrect dependency warnings filtered out by expo.install.exclude: %O`,\n incorrectAndExcludedDeps\n );\n incorrectDeps = incorrectDeps.filter(\n (dep) => !incorrectAndExcludedDeps.includes(dep.packageName)\n );\n }\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 bundledNativeModules: BundledNativeModules,\n dependencies?: Record<string, string> | null\n): DependenciesToCheck {\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\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 (isDependencyVersionIncorrect(packageName, actualVersion, expectedVersionOrRange)) {\n incorrectDeps.push({\n packageName,\n packageType: findDependencyType(pkg, packageName),\n expectedVersionOrRange,\n actualVersion,\n });\n }\n }\n return incorrectDeps;\n}\n\nfunction isDependencyVersionIncorrect(\n packageName: string,\n actualVersion: string,\n expectedVersionOrRange?: string\n) {\n if (!expectedVersionOrRange) {\n return false;\n }\n\n // we never want to go backwards with the expo patch version\n if (packageName === 'expo') {\n return semver.ltr(actualVersion, expectedVersionOrRange);\n }\n\n // all other packages: version range is based on Expo SDK version, so we always want to match range\n return !semver.intersects(expectedVersionOrRange, actualVersion);\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","debug","require","projectRoot","exp","pkg","packagesToCheck","env","EXPO_OFFLINE","Log","warn","incorrectDeps","logInvalidDependency","packageName","expectedVersionOrRange","actualVersion","chalk","length","forEach","dep","assert","sdkVersion","combinedKnownPackages","getCombinedKnownVersionsAsync","resolvedDependencies","getFilteredObject","dependencies","devDependencies","known","resolvedPackagesToCheck","unknown","getPackagesToCheck","packageVersions","resolveAllPackageVersionsAsync","findIncorrectDependencies","expo","install","exclude","packagesToExclude","parsedPackagesToExclude","reduce","acc","npaResult","npmPackageArg","name","incorrectAndExcludedDeps","filter","raw","rawSpec","type","suggestedRange","semver","validRange","semverRangeSubset","map","includes","keys","object","key","bundledNativeModules","dependencyNames","Object","dependencyName","push","packages","isDependencyVersionIncorrect","packageType","findDependencyType","ltr","intersects"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/doctor/dependencies/validateDependenciesVersions.ts"],"sourcesContent":["import { ExpoConfig, PackageJSONConfig } from '@expo/config';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport npmPackageArg from 'npm-package-arg';\nimport semver from 'semver';\nimport semverRangeSubset from 'semver/ranges/subset';\n\nimport { BundledNativeModules } from './bundledNativeModules';\nimport { getCombinedKnownVersionsAsync } from './getVersionedPackages';\nimport { resolveAllPackageVersionsAsync } from './resolvePackages';\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\n\nconst debug = require('debug')('expo:doctor:dependencies:validate') as typeof console.log;\n\ntype IncorrectDependency = {\n packageName: string;\n packageType: 'dependencies' | 'devDependencies';\n expectedVersionOrRange: string;\n actualVersion: string;\n};\n\ntype DependenciesToCheck = { known: string[]; unknown: string[] };\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 (env.EXPO_OFFLINE) {\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` {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(\n chalk`The following packages should be updated for best compatibility with the installed {bold expo} version:`\n );\n incorrectDeps.forEach((dep) => logInvalidDependency(dep));\n\n Log.warn(\n 'Your project may not work correctly until you install the expected versions of the packages.'\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 combinedKnownPackages,\n resolvedDependencies\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 resolveAllPackageVersionsAsync(\n projectRoot,\n resolvedPackagesToCheck\n );\n debug(`Package versions: %O`, packageVersions);\n // find incorrect dependencies by comparing the actual package versions with the bundled native module version ranges\n let incorrectDeps = findIncorrectDependencies(pkg, packageVersions, combinedKnownPackages);\n debug(`Incorrect dependencies: %O`, incorrectDeps);\n\n if (pkg?.expo?.install?.exclude) {\n const packagesToExclude = pkg.expo.install.exclude;\n\n // Parse the exclude list to ensure we can factor in any specified version ranges\n const parsedPackagesToExclude = packagesToExclude.reduce(\n (acc: Record<string, npmPackageArg.Result>, packageName: string) => {\n const npaResult = npmPackageArg(packageName);\n if (typeof npaResult.name === 'string') {\n acc[npaResult.name] = npaResult;\n } else {\n acc[packageName] = npaResult;\n }\n return acc;\n },\n {}\n );\n\n const incorrectAndExcludedDeps = incorrectDeps\n .filter((dep) => {\n if (parsedPackagesToExclude[dep.packageName]) {\n const { name, raw, rawSpec, type } = parsedPackagesToExclude[dep.packageName];\n const suggestedRange = combinedKnownPackages[name];\n\n // If only the package name itself is specified, then we keep it in the exclude list\n if (name === raw) {\n return true;\n } else if (type === 'version') {\n return suggestedRange === rawSpec;\n } else if (type === 'range') {\n // Fall through exclusions if the suggested range is invalid\n if (!semver.validRange(suggestedRange)) {\n debug(\n `Invalid semver range in combined known packages for package ${name} in expo.install.exclude: %O`,\n suggestedRange\n );\n return false;\n }\n\n return semverRangeSubset(suggestedRange, rawSpec);\n } else {\n debug(\n `Unsupported npm package argument type for package ${name} in expo.install.exclude: %O`,\n type\n );\n }\n }\n\n return false;\n })\n .map((dep) => dep.packageName);\n\n debug(\n `Incorrect dependency warnings filtered out by expo.install.exclude: %O`,\n incorrectAndExcludedDeps\n );\n incorrectDeps = incorrectDeps.filter(\n (dep) => !incorrectAndExcludedDeps.includes(dep.packageName)\n );\n }\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 bundledNativeModules: BundledNativeModules,\n dependencies?: Record<string, string> | null\n): DependenciesToCheck {\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\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\n for (const packageName of packages) {\n const expectedVersionOrRange = bundledNativeModules[packageName];\n const actualVersion = packageVersions[packageName];\n if (isDependencyVersionIncorrect(packageName, actualVersion, expectedVersionOrRange)) {\n incorrectDeps.push({\n packageName,\n packageType: findDependencyType(pkg, packageName),\n expectedVersionOrRange,\n actualVersion,\n });\n }\n }\n return incorrectDeps;\n}\n\nexport function isDependencyVersionIncorrect(\n packageName: string,\n actualVersion: string,\n expectedVersionOrRange?: string\n) {\n if (!expectedVersionOrRange) {\n return false;\n }\n\n // we never want to go backwards with the expo patch version\n if (packageName === 'expo') {\n return semver.ltr(actualVersion, expectedVersionOrRange);\n }\n\n const actualPrerelease = semver.prerelease(actualVersion);\n const expectedPrerelease = semver.prerelease(expectedVersionOrRange);\n\n // If both are prereleases or both are not prereleases, use satisfies\n if ((actualPrerelease && expectedPrerelease) || (!actualPrerelease && !expectedPrerelease)) {\n return !semver.satisfies(actualVersion, expectedVersionOrRange);\n }\n\n // If actual is prerelease but expected is not\n if (actualPrerelease && !expectedPrerelease) {\n const cleanedActualVersion = `${semver.major(actualVersion)}.${semver.minor(actualVersion)}.${semver.patch(actualVersion)}`;\n return !semver.satisfies(cleanedActualVersion, expectedVersionOrRange);\n }\n\n // If expected is prerelease but actual is not, consider it incorrect\n return true;\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","isDependencyVersionIncorrect","debug","require","projectRoot","exp","pkg","packagesToCheck","env","EXPO_OFFLINE","Log","warn","incorrectDeps","logInvalidDependency","packageName","expectedVersionOrRange","actualVersion","chalk","length","forEach","dep","assert","sdkVersion","combinedKnownPackages","getCombinedKnownVersionsAsync","resolvedDependencies","getFilteredObject","dependencies","devDependencies","known","resolvedPackagesToCheck","unknown","getPackagesToCheck","packageVersions","resolveAllPackageVersionsAsync","findIncorrectDependencies","expo","install","exclude","packagesToExclude","parsedPackagesToExclude","reduce","acc","npaResult","npmPackageArg","name","incorrectAndExcludedDeps","filter","raw","rawSpec","type","suggestedRange","semver","validRange","semverRangeSubset","map","includes","keys","object","key","bundledNativeModules","dependencyNames","Object","dependencyName","push","packages","packageType","findDependencyType","ltr","actualPrerelease","prerelease","expectedPrerelease","satisfies","cleanedActualVersion","major","minor","patch"],"mappings":"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"}
@@ -40,13 +40,24 @@ async function openJsInspector(metroBaseUrl, app) {
40
40
  url.searchParams.set("appId", app.description);
41
41
  url.searchParams.set("device", app.reactNative.logicalDeviceId);
42
42
  url.searchParams.set("target", app.id);
43
+ // Request to open the React Native DevTools, but limit it to 1s
44
+ // This is a workaround as this endpoint might not respond on some devices
43
45
  const response = await fetch(url, {
44
- method: "POST"
46
+ method: "POST",
47
+ signal: AbortSignal.timeout(1000)
48
+ }).catch((error)=>{
49
+ // Only swallow timeout errors
50
+ if (error.name === "TimeoutError") {
51
+ return null;
52
+ }
53
+ throw error;
45
54
  });
46
- if (!response.ok) {
55
+ if (!response) {
56
+ debug(`No response received from the React Native DevTools.`);
57
+ } else if (response.ok === false) {
47
58
  debug("Failed to open React Native DevTools, received response:", response.status);
48
59
  }
49
- return response.ok;
60
+ return (response == null ? void 0 : response.ok) ?? true;
50
61
  }
51
62
  async function queryInspectorAppAsync(metroServerOrigin, appId) {
52
63
  const apps = await queryAllInspectorAppsAsync(metroServerOrigin);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/JsInspector.ts"],"sourcesContent":["import type { CustomMessageHandlerConnection } from '@react-native/dev-middleware';\nimport chalk from 'chalk';\n\nimport { evaluateJsFromCdpAsync } from './CdpClient';\nimport { selectAsync } from '../../../../utils/prompts';\nimport { pageIsSupported } from '../../metro/debugging/pageIsSupported';\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:inspector:jsInspector'\n) as typeof console.log;\n\nexport interface MetroInspectorProxyApp {\n /** Unique device ID combined with the page ID */\n id: string;\n /** Information about the underlying CDP implementation, e.g. \"React Native Bridgeless [C++ connection]\" */\n title: string;\n /** The application ID that is currently running on the device, e.g. \"dev.expo.bareexpo\" */\n description: string;\n /** The CDP debugger type, which should always be \"node\" */\n type: 'node';\n /** The internal `devtools://..` URL for the debugger to connect to */\n devtoolsFrontendUrl: string;\n /** The websocket URL for the debugger to connect to */\n webSocketDebuggerUrl: string;\n /**\n * Human-readable device name\n * @since react-native@0.73\n */\n deviceName: string;\n /**\n * React Native specific information, like the unique device ID and native capabilities\n * @since react-native@0.74\n */\n reactNative?: {\n /** The unique device ID */\n logicalDeviceId: string;\n /** All supported native capabilities */\n capabilities: CustomMessageHandlerConnection['page']['capabilities'];\n };\n}\n\n/**\n * Launch the React Native DevTools by executing the `POST /open-debugger` request.\n * This endpoint is handled through `@react-native/dev-middleware`.\n */\nexport async function openJsInspector(metroBaseUrl: string, app: MetroInspectorProxyApp) {\n if (!app.reactNative?.logicalDeviceId) {\n debug('Failed to open React Native DevTools, target is missing device ID');\n return false;\n }\n\n const url = new URL('/open-debugger', metroBaseUrl);\n url.searchParams.set('appId', app.description);\n url.searchParams.set('device', app.reactNative.logicalDeviceId);\n url.searchParams.set('target', app.id);\n\n const response = await fetch(url, { method: 'POST' });\n if (!response.ok) {\n debug('Failed to open React Native DevTools, received response:', response.status);\n }\n\n return response.ok;\n}\n\nexport async function queryInspectorAppAsync(\n metroServerOrigin: string,\n appId: string\n): Promise<MetroInspectorProxyApp | null> {\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n return apps.find((app) => app.description === appId) ?? null;\n}\n\nexport async function queryAllInspectorAppsAsync(\n metroServerOrigin: string\n): Promise<MetroInspectorProxyApp[]> {\n const resp = await fetch(`${metroServerOrigin}/json/list`);\n const apps: MetroInspectorProxyApp[] = transformApps(await resp.json());\n const results: MetroInspectorProxyApp[] = [];\n for (const app of apps) {\n // Only use targets with better reloading support\n if (!pageIsSupported(app)) {\n continue;\n }\n // Hide targets that are marked as hidden from the inspector, e.g. instances from expo-dev-menu and expo-dev-launcher.\n if (await appShouldBeIgnoredAsync(app)) {\n continue;\n }\n results.push(app);\n }\n return results;\n}\n\nexport async function promptInspectorAppAsync(apps: MetroInspectorProxyApp[]) {\n if (apps.length === 1) {\n return apps[0];\n }\n\n // Check if multiple devices are connected with the same device names\n // In this case, append the actual app id (device ID + page number) to the prompt\n const hasDuplicateNames = apps.some(\n (app, index) => index !== apps.findIndex((other) => app.deviceName === other.deviceName)\n );\n\n const choices = apps.map((app) => {\n const name = app.deviceName ?? 'Unknown device';\n return {\n title: hasDuplicateNames ? chalk`${name}{dim - ${app.id}}` : name,\n value: app.id,\n app,\n };\n });\n\n const value = await selectAsync(chalk`Debug target {dim (Hermes only)}`, choices);\n\n return choices.find((item) => item.value === value)?.app;\n}\n\n// The description of `React Native Experimental (Improved Chrome Reloads)` target is `don't use` from metro.\n// This function tries to transform the unmeaningful description to appId\nfunction transformApps(apps: MetroInspectorProxyApp[]): MetroInspectorProxyApp[] {\n const deviceIdToAppId: Record<string, string> = {};\n\n for (const app of apps) {\n if (app.description !== \"don't use\") {\n const deviceId = app.reactNative?.logicalDeviceId ?? app.id.split('-')[0];\n const appId = app.description;\n deviceIdToAppId[deviceId] = appId;\n }\n }\n\n return apps.map((app) => {\n if (app.description === \"don't use\") {\n const deviceId = app.reactNative?.logicalDeviceId ?? app.id.split('-')[0];\n app.description = deviceIdToAppId[deviceId] ?? app.description;\n }\n return app;\n });\n}\n\nconst HIDE_FROM_INSPECTOR_ENV = 'globalThis.__expo_hide_from_inspector__';\n\nasync function appShouldBeIgnoredAsync(app: MetroInspectorProxyApp): Promise<boolean> {\n const hideFromInspector = await evaluateJsFromCdpAsync(\n app.webSocketDebuggerUrl,\n HIDE_FROM_INSPECTOR_ENV\n );\n debug(\n `[appShouldBeIgnoredAsync] webSocketDebuggerUrl[${app.webSocketDebuggerUrl}] hideFromInspector[${hideFromInspector}]`\n );\n return hideFromInspector !== undefined;\n}\n"],"names":["openJsInspector","queryInspectorAppAsync","queryAllInspectorAppsAsync","promptInspectorAppAsync","debug","require","metroBaseUrl","app","reactNative","logicalDeviceId","url","URL","searchParams","set","description","id","response","fetch","method","ok","status","metroServerOrigin","appId","apps","find","resp","transformApps","json","results","pageIsSupported","appShouldBeIgnoredAsync","push","choices","length","hasDuplicateNames","some","index","findIndex","other","deviceName","map","name","title","chalk","value","selectAsync","item","deviceIdToAppId","deviceId","split","HIDE_FROM_INSPECTOR_ENV","hideFromInspector","evaluateJsFromCdpAsync","webSocketDebuggerUrl","undefined"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/JsInspector.ts"],"sourcesContent":["import type { CustomMessageHandlerConnection } from '@react-native/dev-middleware';\nimport chalk from 'chalk';\n\nimport { evaluateJsFromCdpAsync } from './CdpClient';\nimport { selectAsync } from '../../../../utils/prompts';\nimport { pageIsSupported } from '../../metro/debugging/pageIsSupported';\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:inspector:jsInspector'\n) as typeof console.log;\n\nexport interface MetroInspectorProxyApp {\n /** Unique device ID combined with the page ID */\n id: string;\n /** Information about the underlying CDP implementation, e.g. \"React Native Bridgeless [C++ connection]\" */\n title: string;\n /** The application ID that is currently running on the device, e.g. \"dev.expo.bareexpo\" */\n description: string;\n /** The CDP debugger type, which should always be \"node\" */\n type: 'node';\n /** The internal `devtools://..` URL for the debugger to connect to */\n devtoolsFrontendUrl: string;\n /** The websocket URL for the debugger to connect to */\n webSocketDebuggerUrl: string;\n /**\n * Human-readable device name\n * @since react-native@0.73\n */\n deviceName: string;\n /**\n * React Native specific information, like the unique device ID and native capabilities\n * @since react-native@0.74\n */\n reactNative?: {\n /** The unique device ID */\n logicalDeviceId: string;\n /** All supported native capabilities */\n capabilities: CustomMessageHandlerConnection['page']['capabilities'];\n };\n}\n\n/**\n * Launch the React Native DevTools by executing the `POST /open-debugger` request.\n * This endpoint is handled through `@react-native/dev-middleware`.\n */\nexport async function openJsInspector(metroBaseUrl: string, app: MetroInspectorProxyApp) {\n if (!app.reactNative?.logicalDeviceId) {\n debug('Failed to open React Native DevTools, target is missing device ID');\n return false;\n }\n\n const url = new URL('/open-debugger', metroBaseUrl);\n url.searchParams.set('appId', app.description);\n url.searchParams.set('device', app.reactNative.logicalDeviceId);\n url.searchParams.set('target', app.id);\n\n // Request to open the React Native DevTools, but limit it to 1s\n // This is a workaround as this endpoint might not respond on some devices\n const response = await fetch(url, {\n method: 'POST',\n signal: AbortSignal.timeout(1000),\n }).catch((error) => {\n // Only swallow timeout errors\n if (error.name === 'TimeoutError') {\n return null;\n }\n\n throw error;\n });\n\n if (!response) {\n debug(`No response received from the React Native DevTools.`);\n } else if (response.ok === false) {\n debug('Failed to open React Native DevTools, received response:', response.status);\n }\n\n return response?.ok ?? true;\n}\n\nexport async function queryInspectorAppAsync(\n metroServerOrigin: string,\n appId: string\n): Promise<MetroInspectorProxyApp | null> {\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n return apps.find((app) => app.description === appId) ?? null;\n}\n\nexport async function queryAllInspectorAppsAsync(\n metroServerOrigin: string\n): Promise<MetroInspectorProxyApp[]> {\n const resp = await fetch(`${metroServerOrigin}/json/list`);\n const apps: MetroInspectorProxyApp[] = transformApps(await resp.json());\n const results: MetroInspectorProxyApp[] = [];\n for (const app of apps) {\n // Only use targets with better reloading support\n if (!pageIsSupported(app)) {\n continue;\n }\n // Hide targets that are marked as hidden from the inspector, e.g. instances from expo-dev-menu and expo-dev-launcher.\n if (await appShouldBeIgnoredAsync(app)) {\n continue;\n }\n results.push(app);\n }\n return results;\n}\n\nexport async function promptInspectorAppAsync(apps: MetroInspectorProxyApp[]) {\n if (apps.length === 1) {\n return apps[0];\n }\n\n // Check if multiple devices are connected with the same device names\n // In this case, append the actual app id (device ID + page number) to the prompt\n const hasDuplicateNames = apps.some(\n (app, index) => index !== apps.findIndex((other) => app.deviceName === other.deviceName)\n );\n\n const choices = apps.map((app) => {\n const name = app.deviceName ?? 'Unknown device';\n return {\n title: hasDuplicateNames ? chalk`${name}{dim - ${app.id}}` : name,\n value: app.id,\n app,\n };\n });\n\n const value = await selectAsync(chalk`Debug target {dim (Hermes only)}`, choices);\n\n return choices.find((item) => item.value === value)?.app;\n}\n\n// The description of `React Native Experimental (Improved Chrome Reloads)` target is `don't use` from metro.\n// This function tries to transform the unmeaningful description to appId\nfunction transformApps(apps: MetroInspectorProxyApp[]): MetroInspectorProxyApp[] {\n const deviceIdToAppId: Record<string, string> = {};\n\n for (const app of apps) {\n if (app.description !== \"don't use\") {\n const deviceId = app.reactNative?.logicalDeviceId ?? app.id.split('-')[0];\n const appId = app.description;\n deviceIdToAppId[deviceId] = appId;\n }\n }\n\n return apps.map((app) => {\n if (app.description === \"don't use\") {\n const deviceId = app.reactNative?.logicalDeviceId ?? app.id.split('-')[0];\n app.description = deviceIdToAppId[deviceId] ?? app.description;\n }\n return app;\n });\n}\n\nconst HIDE_FROM_INSPECTOR_ENV = 'globalThis.__expo_hide_from_inspector__';\n\nasync function appShouldBeIgnoredAsync(app: MetroInspectorProxyApp): Promise<boolean> {\n const hideFromInspector = await evaluateJsFromCdpAsync(\n app.webSocketDebuggerUrl,\n HIDE_FROM_INSPECTOR_ENV\n );\n debug(\n `[appShouldBeIgnoredAsync] webSocketDebuggerUrl[${app.webSocketDebuggerUrl}] hideFromInspector[${hideFromInspector}]`\n );\n return hideFromInspector !== undefined;\n}\n"],"names":["openJsInspector","queryInspectorAppAsync","queryAllInspectorAppsAsync","promptInspectorAppAsync","debug","require","metroBaseUrl","app","reactNative","logicalDeviceId","url","URL","searchParams","set","description","id","response","fetch","method","signal","AbortSignal","timeout","catch","error","name","ok","status","metroServerOrigin","appId","apps","find","resp","transformApps","json","results","pageIsSupported","appShouldBeIgnoredAsync","push","choices","length","hasDuplicateNames","some","index","findIndex","other","deviceName","map","title","chalk","value","selectAsync","item","deviceIdToAppId","deviceId","split","HIDE_FROM_INSPECTOR_ENV","hideFromInspector","evaluateJsFromCdpAsync","webSocketDebuggerUrl","undefined"],"mappings":"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"}
@@ -31,7 +31,7 @@ class FetchClient {
31
31
  this.headers = {
32
32
  accept: "application/json",
33
33
  "content-type": "application/json",
34
- "user-agent": `expo-cli/${"0.19.5"}`,
34
+ "user-agent": `expo-cli/${"0.19.7"}`,
35
35
  authorization: "Basic " + _nodeBuffer().Buffer.from(`${target}:`).toString("base64")
36
36
  };
37
37
  }
@@ -79,7 +79,7 @@ function createContext() {
79
79
  cpu: summarizeCpuInfo(),
80
80
  app: {
81
81
  name: "expo/cli",
82
- version: "0.19.5"
82
+ version: "0.19.7"
83
83
  },
84
84
  ci: _ciInfo().isCI ? {
85
85
  name: _ciInfo().name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/cli",
3
- "version": "0.19.5",
3
+ "version": "0.19.7",
4
4
  "description": "The Expo CLI",
5
5
  "main": "build/bin/cli",
6
6
  "bin": {
@@ -55,7 +55,7 @@
55
55
  "@expo/rudder-sdk-node": "^1.1.1",
56
56
  "@expo/spawn-async": "^1.7.2",
57
57
  "@expo/xcpretty": "^4.3.0",
58
- "@react-native/dev-middleware": "0.76.0",
58
+ "@react-native/dev-middleware": "0.76.1",
59
59
  "@urql/core": "^2.3.6",
60
60
  "@urql/exchange-retry": "0.3.0",
61
61
  "accepts": "^1.3.8",
@@ -167,5 +167,5 @@
167
167
  "tree-kill": "^1.2.2",
168
168
  "tsd": "^0.28.1"
169
169
  },
170
- "gitHead": "8b9f5addf49cb5ef7598ca27ff60c0accff6a1c3"
170
+ "gitHead": "71f25de1d8fe12c0b91242fd6e882ccfb4698e17"
171
171
  }