Skip to content

Commit 2143752

Browse files
authored
breaking: Drop browser helpers from cli-tools, simplify middleware (#2588)
1 parent c8b527a commit 2143752

12 files changed

+307
-120
lines changed

packages/cli-server-api/package.json

+2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
},
99
"dependencies": {
1010
"@react-native-community/cli-tools": "16.0.2",
11+
"body-parser": "^1.20.3",
1112
"compression": "^1.7.1",
1213
"connect": "^3.6.5",
1314
"errorhandler": "^1.5.1",
1415
"nocache": "^3.0.1",
16+
"open": "^6.2.0",
1517
"pretty-format": "^26.6.2",
1618
"serve-static": "^1.13.1",
1719
"ws": "^6.2.3"

packages/cli-server-api/src/index.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import nocache from 'nocache';
77
import serveStatic from 'serve-static';
88

99
import indexPageMiddleware from './indexPageMiddleware';
10-
import openStackFrameInEditorMiddleware from './openStackFrameInEditorMiddleware';
10+
import openStackFrameMiddleware from './openStackFrameMiddleware';
1111
import openURLMiddleware from './openURLMiddleware';
1212
import rawBodyMiddleware from './rawBodyMiddleware';
1313
import securityHeadersMiddleware from './securityHeadersMiddleware';
@@ -35,9 +35,10 @@ export function createDevServerMiddleware(options: MiddlewareOptions) {
3535
.use(compression())
3636
.use(nocache())
3737
.use('/', indexPageMiddleware)
38-
.use('/open-stack-frame', openStackFrameInEditorMiddleware(options))
38+
.use('/open-stack-frame', openStackFrameMiddleware(options))
3939
.use('/open-url', openURLMiddleware)
4040
.use('/status', statusPageMiddleware)
41+
// TODO: Remove. Requires standardized JSON body parsing support in Metro.
4142
.use('/symbolicate', rawBodyMiddleware)
4243
// @ts-ignore mismatch
4344
.use('/systrace', systraceProfileMiddleware)

packages/cli-server-api/src/openStackFrameInEditorMiddleware.ts

-35
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
import type {IncomingMessage, ServerResponse} from 'http';
9+
10+
import {json} from 'body-parser';
11+
import connect from 'connect';
12+
import {launchEditor} from '@react-native-community/cli-tools';
13+
14+
type Options = {
15+
watchFolders: ReadonlyArray<string>;
16+
};
17+
18+
/**
19+
* Open a stack frame in the user's text editor.
20+
*/
21+
export default function openStackFrameMiddleware(_: Options) {
22+
const handler = (
23+
req: IncomingMessage & {
24+
// Populated by body-parser
25+
body?: Object;
26+
},
27+
res: ServerResponse,
28+
next: (err?: Error) => void,
29+
) => {
30+
if (req.method === 'POST') {
31+
if (req.body == null) {
32+
res.writeHead(400);
33+
res.end('Missing request body');
34+
return;
35+
}
36+
37+
const frame = req.body as {
38+
file: string;
39+
lineNumber: number;
40+
};
41+
42+
launchEditor(frame.file, frame.lineNumber);
43+
44+
res.writeHead(200);
45+
res.end();
46+
}
47+
48+
next();
49+
};
50+
51+
return connect().use(json()).use(handler);
52+
}

packages/cli-server-api/src/openURLMiddleware.ts

+29-15
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,40 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*/
7-
import http from 'http';
8-
import {launchDefaultBrowser, logger} from '@react-native-community/cli-tools';
7+
8+
import type {IncomingMessage, ServerResponse} from 'http';
9+
10+
import {json} from 'body-parser';
911
import connect from 'connect';
10-
import rawBodyMiddleware from './rawBodyMiddleware';
12+
import open from 'open';
1113

1214
/**
13-
* Handle request from JS to open an arbitrary URL in Chrome
15+
* Open a URL in the system browser.
1416
*/
15-
function openURLMiddleware(
16-
req: http.IncomingMessage & {rawBody?: string},
17-
res: http.ServerResponse,
18-
next: (err?: any) => void,
17+
async function openURLMiddleware(
18+
req: IncomingMessage & {
19+
// Populated by body-parser
20+
body?: Object;
21+
},
22+
res: ServerResponse,
23+
next: (err?: Error) => void,
1924
) {
20-
if (!req.rawBody) {
21-
return next(new Error('missing request body'));
25+
if (req.method === 'POST') {
26+
if (req.body == null) {
27+
res.writeHead(400);
28+
res.end('Missing request body');
29+
return;
30+
}
31+
32+
const {url} = req.body as {url: string};
33+
34+
await open(url);
35+
36+
res.writeHead(200);
37+
res.end();
2238
}
23-
const {url} = JSON.parse(req.rawBody);
24-
logger.info(`Opening ${url}...`);
25-
launchDefaultBrowser(url);
26-
res.end('OK');
39+
40+
next();
2741
}
2842

29-
export default connect().use(rawBodyMiddleware).use(openURLMiddleware);
43+
export default connect().use(json()).use(openURLMiddleware);

packages/cli-tools/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
"find-up": "^5.0.0",
1515
"launch-editor": "^2.9.1",
1616
"mime": "^2.4.1",
17-
"open": "^6.2.0",
1817
"ora": "^5.4.1",
1918
"prompts": "^2.4.2",
2019
"semver": "^7.5.2"

packages/cli-tools/src/index.ts

-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ export {default as logger} from './logger';
22
export {default as isPackagerRunning} from './isPackagerRunning';
33
export {default as getDefaultUserTerminal} from './getDefaultUserTerminal';
44
export {fetch, fetchToTemp} from './fetch';
5-
export {default as launchDefaultBrowser} from './launchDefaultBrowser';
6-
export {default as launchDebugger} from './launchDebugger';
75
export {default as launchEditor} from './launchEditor';
86
export * as version from './releaseChecker';
97
export {default as resolveNodeModuleDir} from './resolveNodeModuleDir';

packages/cli-tools/src/launchDebugger.ts

-16
This file was deleted.

packages/cli-tools/src/launchDefaultBrowser.ts

-26
This file was deleted.

packages/cli-tools/src/launchEditor.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import launchEditorImpl from 'launch-editor';
1212
export default function launchEditor(
1313
fileName: string,
1414
lineNumber: number,
15-
_watchFolders: ReadonlyArray<string>,
15+
_watchFolders?: ReadonlyArray<string>,
1616
): void {
1717
launchEditorImpl(`${fileName}:${lineNumber}`, process.env.REACT_EDITOR);
1818
}

packages/cli-tools/src/throwIfNonAllowedProtocol.ts

-18
This file was deleted.

0 commit comments

Comments
 (0)