expo
Version:
98 lines (80 loc) • 3.32 kB
text/typescript
// Based on https://github.com/facebook/react-native/blob/9ab95dd2b5746e8323ad1d65591d5a4ec7718790/packages/react-native/Libraries/Utilities/HMRClient.js
// @ts-expect-error missing types
import getDevServer from 'react-native/Libraries/Core/Devtools/getDevServer';
import LogBox from 'react-native/Libraries/LogBox/LogBox';
// @ts-expect-error missing types
import NativeRedBox from 'react-native/Libraries/NativeModules/specs/NativeRedBox';
import DevSettings from 'react-native/Libraries/Utilities/DevSettings';
import { HMRMetroBuildError } from './buildErrors';
export function showLoading(message: string, type: 'load' | 'refresh') {
const DevLoadingView = require('react-native/Libraries/Utilities/DevLoadingView').default;
DevLoadingView.showMessage(message, type);
}
export function hideLoading() {
const DevLoadingView = require('react-native/Libraries/Utilities/DevLoadingView').default;
DevLoadingView.hide();
}
export function resetErrorOverlay() {
dismissRedbox();
// @ts-expect-error clearAllLogs exists, but ts types are missing
LogBox.clearAllLogs();
}
export function reload() {
// @ts-expect-error missing types
DevSettings.reload('Bundle Splitting – Metro disconnected');
}
export function getFullBundlerUrl({
serverScheme,
serverHost,
bundleEntry,
platform,
}: {
serverScheme: string;
serverHost: string;
bundleEntry: string;
platform: string;
}): string {
return (
getDevServer().fullBundleUrl ??
`${serverScheme}://${serverHost}/hot?bundleEntry=${bundleEntry}&platform=${platform}`
);
}
export function getConnectionError(serverHost: string, e: Error): string {
let error = `Cannot connect to Expo CLI.
Try the following to fix the issue:
- Ensure that Expo dev server is running and available on the same network`;
if (process.env.EXPO_OS === 'android') {
error += `
- Ensure that your device/emulator is connected to your machine and has USB debugging enabled - run 'adb devices' to see a list of connected devices
- If you're on a physical device connected to the same machine, run 'adb reverse tcp:8081 tcp:8081' to forward requests from your device`;
}
error += `
URL: ${serverHost}
Error: ${e.message}`;
return error;
}
function dismissRedbox() {
if (process.env.EXPO_OS === 'ios' && NativeRedBox != null && NativeRedBox.dismiss != null) {
NativeRedBox.dismiss();
} else {
const NativeExceptionsManager =
require('react-native/Libraries/Core/NativeExceptionsManager').default;
NativeExceptionsManager &&
NativeExceptionsManager.dismissRedbox &&
NativeExceptionsManager.dismissRedbox();
}
}
export function handleCompileError(cause: any) {
if (cause === null) {
return;
}
// Even if there is already a redbox, syntax errors are more important.
// Otherwise you risk seeing a stale runtime error while a syntax error is more recent.
dismissRedbox();
const LogBox = require('react-native/Libraries/LogBox/LogBox').default;
// The error is passed thru LogBox APIs directly to the parsing function.
// Won't log the error in devtools console
// (using throw would mangle the error message and print with ANSI
// because throw on native is processed as console.error)
LogBox.addException(new HMRMetroBuildError(cause.message, cause.type, cause.cause));
}