mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Summary: Recently, both `metro-inspector-proxy`(https://github.com/facebook/react-native/pull/39045) and `react-native-community/cli-plugin-metro`(https://github.com/facebook/react-native/pull/38795) were moved to this repo and in the process of moving these packages, the `exports` field inside package.json was added, only exporting the `index.js` file. The problem is that Expo CLI (and possibly other community packages) rely on functions and classes that are not exported in the `index.js` file, e.g. Importing the InspectorProxy class from `react-native/dev-middleware/dist/inspector-proxy/InspectorProxy`. Normally this wouldn't be a problem and we would just import from `dist/` but due to the `exports` field, attempting to import from any other file not specified on this field will result in a `ERR_PACKAGE_PATH_NOT_EXPORTED` error. As a short-term fix, we should create `unstable_`-prefixed exports of individual features Expo currently depends on. ## Changelog: [INTERNAL] [CHANGED] - Expose unstable_InspectorProxy and unstable_Device from `react-native/dev-middleware` Pull Request resolved: https://github.com/facebook/react-native/pull/41370 Test Plan: N / A Reviewed By: robhogan Differential Revision: D51163134 Pulled By: blakef fbshipit-source-id: e67adaedc4fc64131e4c9dd8383c9877b8202283
132 lines
3.8 KiB
JavaScript
132 lines
3.8 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow strict-local
|
|
* @format
|
|
* @oncall react_native
|
|
*/
|
|
|
|
import type {NextHandleFunction} from 'connect';
|
|
import type {BrowserLauncher} from './types/BrowserLauncher';
|
|
import type {EventReporter} from './types/EventReporter';
|
|
import type {Experiments, ExperimentsConfig} from './types/Experiments';
|
|
import type {Logger} from './types/Logger';
|
|
|
|
import reactNativeDebuggerFrontendPath from '@react-native/debugger-frontend';
|
|
import connect from 'connect';
|
|
import path from 'path';
|
|
// $FlowFixMe[untyped-import] TODO: type serve-static
|
|
import serveStaticMiddleware from 'serve-static';
|
|
import deprecated_openFlipperMiddleware from './middleware/deprecated_openFlipperMiddleware';
|
|
import openDebuggerMiddleware from './middleware/openDebuggerMiddleware';
|
|
import InspectorProxy from './inspector-proxy/InspectorProxy';
|
|
import DefaultBrowserLauncher from './utils/DefaultBrowserLauncher';
|
|
|
|
type Options = $ReadOnly<{
|
|
projectRoot: string,
|
|
|
|
/**
|
|
* The base URL to the dev server, as addressible from the local developer
|
|
* machine. This is used in responses which return URLs to other endpoints,
|
|
* e.g. the debugger frontend and inspector proxy targets.
|
|
*
|
|
* Example: `'http://localhost:8081'`.
|
|
*/
|
|
serverBaseUrl: string,
|
|
|
|
logger?: Logger,
|
|
|
|
/**
|
|
* An interface for integrators to provide a custom implementation for
|
|
* opening URLs in a web browser.
|
|
*
|
|
* This is an unstable API with no semver guarantees.
|
|
*/
|
|
unstable_browserLauncher?: BrowserLauncher,
|
|
|
|
/**
|
|
* An interface for logging events.
|
|
*
|
|
* This is an unstable API with no semver guarantees.
|
|
*/
|
|
unstable_eventReporter?: EventReporter,
|
|
|
|
/**
|
|
* The set of experimental features to enable.
|
|
*
|
|
* This is an unstable API with no semver guarantees.
|
|
*/
|
|
unstable_experiments?: ExperimentsConfig,
|
|
|
|
/**
|
|
* An interface for using a modified inspector proxy implementation.
|
|
*
|
|
* This is an unstable API with no semver guarantees.
|
|
*/
|
|
unstable_InspectorProxy?: Class<InspectorProxy>,
|
|
}>;
|
|
|
|
type DevMiddlewareAPI = $ReadOnly<{
|
|
middleware: NextHandleFunction,
|
|
websocketEndpoints: {[path: string]: ws$WebSocketServer},
|
|
}>;
|
|
|
|
export default function createDevMiddleware({
|
|
projectRoot,
|
|
serverBaseUrl,
|
|
logger,
|
|
unstable_browserLauncher = DefaultBrowserLauncher,
|
|
unstable_eventReporter,
|
|
unstable_experiments: experimentConfig = {},
|
|
unstable_InspectorProxy,
|
|
}: Options): DevMiddlewareAPI {
|
|
const experiments = getExperiments(experimentConfig);
|
|
|
|
const InspectorProxyClass = unstable_InspectorProxy ?? InspectorProxy;
|
|
const inspectorProxy = new InspectorProxyClass(
|
|
projectRoot,
|
|
serverBaseUrl,
|
|
unstable_eventReporter,
|
|
experiments,
|
|
);
|
|
|
|
const middleware = connect()
|
|
.use(
|
|
'/open-debugger',
|
|
experiments.enableNewDebugger
|
|
? openDebuggerMiddleware({
|
|
serverBaseUrl,
|
|
inspectorProxy,
|
|
browserLauncher: unstable_browserLauncher,
|
|
eventReporter: unstable_eventReporter,
|
|
experiments,
|
|
logger,
|
|
})
|
|
: deprecated_openFlipperMiddleware({
|
|
logger,
|
|
}),
|
|
)
|
|
.use(
|
|
'/debugger-frontend',
|
|
serveStaticMiddleware(path.join(reactNativeDebuggerFrontendPath), {
|
|
fallthrough: false,
|
|
}),
|
|
)
|
|
.use((...args) => inspectorProxy.processRequest(...args));
|
|
|
|
return {
|
|
middleware,
|
|
websocketEndpoints: inspectorProxy.createWebSocketListeners(),
|
|
};
|
|
}
|
|
|
|
function getExperiments(config: ExperimentsConfig): Experiments {
|
|
return {
|
|
enableNewDebugger: config.enableNewDebugger ?? false,
|
|
enableOpenDebuggerRedirect: config.enableOpenDebuggerRedirect ?? false,
|
|
};
|
|
}
|