@react-native/community-cli-plugin 0.76.0-rc.2 → 0.76.0-rc.4

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.
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true,
5
+ });
6
+ exports.default = void 0;
7
+ var _chalk = _interopRequireDefault(require("chalk"));
8
+ var _nodeFetch = _interopRequireDefault(require("node-fetch"));
9
+ function _interopRequireDefault(e) {
10
+ return e && e.__esModule ? e : { default: e };
11
+ }
12
+ class OpenDebuggerKeyboardHandler {
13
+ #devServerUrl;
14
+ #reporter;
15
+ #targetsShownForSelection = null;
16
+ constructor({ devServerUrl, reporter }) {
17
+ this.#devServerUrl = devServerUrl;
18
+ this.#reporter = reporter;
19
+ }
20
+ async #tryOpenDebuggerForTarget(target) {
21
+ this.#targetsShownForSelection = null;
22
+ this.#clearTerminalMenu();
23
+ try {
24
+ await (0, _nodeFetch.default)(
25
+ new URL(
26
+ "/open-debugger?target=" + encodeURIComponent(target.id),
27
+ this.#devServerUrl
28
+ ).href,
29
+ {
30
+ method: "POST",
31
+ }
32
+ );
33
+ } catch (e) {
34
+ this.#log(
35
+ "error",
36
+ "Failed to open debugger for %s on %s debug targets: %s",
37
+ target.description,
38
+ target.deviceName,
39
+ e.message
40
+ );
41
+ this.#clearTerminalMenu();
42
+ }
43
+ }
44
+ async handleOpenDebugger() {
45
+ this.#setTerminalMenu("Fetching available debugging targets...");
46
+ this.#targetsShownForSelection = null;
47
+ try {
48
+ const res = await (0, _nodeFetch.default)(
49
+ this.#devServerUrl + "/json/list",
50
+ {
51
+ method: "POST",
52
+ }
53
+ );
54
+ if (res.status !== 200) {
55
+ throw new Error(`Unexpected status code: ${res.status}`);
56
+ }
57
+ const targets = await res.json();
58
+ if (!Array.isArray(targets)) {
59
+ throw new Error("Expected array.");
60
+ }
61
+ if (targets.length === 0) {
62
+ this.#log("warn", "No connected targets");
63
+ this.#clearTerminalMenu();
64
+ } else if (targets.length === 1) {
65
+ const target = targets[0];
66
+ void this.#tryOpenDebuggerForTarget(target);
67
+ } else {
68
+ this.#targetsShownForSelection = targets;
69
+ if (targets.length > 9) {
70
+ this.#log(
71
+ "warn",
72
+ "10 or more debug targets available, showing the first 9."
73
+ );
74
+ }
75
+ this.#setTerminalMenu(
76
+ `Multiple debug targets available, please select:\n ${targets
77
+ .slice(0, 9)
78
+ .map(
79
+ ({ description, deviceName }, i) =>
80
+ ` ${_chalk.default.white.inverse(
81
+ ` ${i + 1} `
82
+ )} - "${description}" on "${deviceName}"`
83
+ )
84
+ .join("\n ")}`
85
+ );
86
+ }
87
+ } catch (e) {
88
+ this.#log("error", `Failed to fetch debug targets: ${e.message}`);
89
+ this.#clearTerminalMenu();
90
+ }
91
+ }
92
+ maybeHandleTargetSelection(keyName) {
93
+ if (keyName >= "1" && keyName <= "9") {
94
+ const targetIndex = Number(keyName) - 1;
95
+ if (
96
+ this.#targetsShownForSelection != null &&
97
+ targetIndex < this.#targetsShownForSelection.length
98
+ ) {
99
+ const target = this.#targetsShownForSelection[targetIndex];
100
+ void this.#tryOpenDebuggerForTarget(target);
101
+ return true;
102
+ }
103
+ }
104
+ return false;
105
+ }
106
+ dismiss() {
107
+ this.#clearTerminalMenu();
108
+ this.#targetsShownForSelection = null;
109
+ }
110
+ #log(level, ...data) {
111
+ this.#reporter.update({
112
+ type: "unstable_server_log",
113
+ level,
114
+ data,
115
+ });
116
+ }
117
+ #setTerminalMenu(message) {
118
+ this.#reporter.update({
119
+ type: "unstable_server_menu_updated",
120
+ message,
121
+ });
122
+ }
123
+ #clearTerminalMenu() {
124
+ this.#reporter.update({
125
+ type: "unstable_server_menu_cleared",
126
+ });
127
+ }
128
+ }
129
+ exports.default = OpenDebuggerKeyboardHandler;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and 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
+ * @flow strict-local
8
+ * @format
9
+ * @oncall react_native
10
+ */
11
+
12
+ import type TerminalReporter from "metro/src/lib/TerminalReporter";
13
+
14
+ declare export default class OpenDebuggerKeyboardHandler {
15
+ constructor({ devServerUrl: string, reporter: TerminalReporter }): void;
16
+ handleOpenDebugger(): Promise<void>;
17
+ maybeHandleTargetSelection(keyName: string): boolean;
18
+ dismiss(): void;
19
+ }
@@ -4,11 +4,15 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true,
5
5
  });
6
6
  exports.default = attachKeyHandlers;
7
- var _KeyPressHandler = require("../../utils/KeyPressHandler");
8
7
  var _logger = require("../../utils/logger");
8
+ var _OpenDebuggerKeyboardHandler = _interopRequireDefault(
9
+ require("./OpenDebuggerKeyboardHandler")
10
+ );
9
11
  var _chalk = _interopRequireDefault(require("chalk"));
10
12
  var _execa = _interopRequireDefault(require("execa"));
11
- var _nodeFetch = _interopRequireDefault(require("node-fetch"));
13
+ var _invariant = _interopRequireDefault(require("invariant"));
14
+ var _readline = _interopRequireDefault(require("readline"));
15
+ var _tty = require("tty");
12
16
  function _interopRequireDefault(e) {
13
17
  return e && e.__esModule ? e : { default: e };
14
18
  }
@@ -25,13 +29,20 @@ const throttle = (callback, timeout) => {
25
29
  }
26
30
  };
27
31
  };
28
- function attachKeyHandlers({ cliConfig, devServerUrl, messageSocket }) {
32
+ function attachKeyHandlers({
33
+ cliConfig,
34
+ devServerUrl,
35
+ messageSocket,
36
+ reporter,
37
+ }) {
29
38
  if (process.stdin.isTTY !== true) {
30
39
  _logger.logger.debug(
31
40
  "Interactive mode is not supported in this environment"
32
41
  );
33
42
  return;
34
43
  }
44
+ _readline.default.emitKeypressEvents(process.stdin);
45
+ setRawMode(true);
35
46
  const execaOptions = {
36
47
  env: {
37
48
  FORCE_COLOR: _chalk.default.supportsColor ? "true" : "false",
@@ -41,8 +52,16 @@ function attachKeyHandlers({ cliConfig, devServerUrl, messageSocket }) {
41
52
  _logger.logger.info("Reloading connected app(s)...");
42
53
  messageSocket.broadcast("reload", null);
43
54
  }, RELOAD_TIMEOUT);
44
- const keyPressHandler = new _KeyPressHandler.KeyPressHandler(async (key) => {
45
- switch (key.toLowerCase()) {
55
+ const openDebuggerKeyboardHandler = new _OpenDebuggerKeyboardHandler.default({
56
+ reporter,
57
+ devServerUrl,
58
+ });
59
+ process.stdin.on("keypress", (str, key) => {
60
+ _logger.logger.debug(`Key pressed: ${key.sequence}`);
61
+ if (openDebuggerKeyboardHandler.maybeHandleTargetSelection(key.name)) {
62
+ return;
63
+ }
64
+ switch (key.sequence) {
46
65
  case "r":
47
66
  reload();
48
67
  break;
@@ -75,20 +94,18 @@ function attachKeyHandlers({ cliConfig, devServerUrl, messageSocket }) {
75
94
  ).stdout?.pipe(process.stdout);
76
95
  break;
77
96
  case "j":
78
- await (0, _nodeFetch.default)(devServerUrl + "/open-debugger", {
79
- method: "POST",
80
- });
97
+ void openDebuggerKeyboardHandler.handleOpenDebugger();
81
98
  break;
82
99
  case CTRL_C:
83
100
  case CTRL_D:
101
+ openDebuggerKeyboardHandler.dismiss();
84
102
  _logger.logger.info("Stopping server");
85
- keyPressHandler.stopInterceptingKeyStrokes();
103
+ setRawMode(false);
104
+ process.stdin.pause();
86
105
  process.emit("SIGINT");
87
106
  process.exit();
88
107
  }
89
108
  });
90
- keyPressHandler.createInteractionListener();
91
- keyPressHandler.startInterceptingKeyStrokes();
92
109
  _logger.logger.log(
93
110
  [
94
111
  "",
@@ -101,3 +118,10 @@ function attachKeyHandlers({ cliConfig, devServerUrl, messageSocket }) {
101
118
  ].join("\n")
102
119
  );
103
120
  }
121
+ function setRawMode(enable) {
122
+ (0, _invariant.default)(
123
+ process.stdin instanceof _tty.ReadStream,
124
+ "process.stdin must be a readable stream to modify raw mode"
125
+ );
126
+ process.stdin.setRawMode(enable);
127
+ }
@@ -10,6 +10,7 @@
10
10
  */
11
11
 
12
12
  import type { Config } from "@react-native-community/cli-types";
13
+ import type TerminalReporter from "metro/src/lib/TerminalReporter";
13
14
 
14
15
  declare export default function attachKeyHandlers({
15
16
  cliConfig: Config,
@@ -18,4 +19,5 @@ declare export default function attachKeyHandlers({
18
19
  broadcast: (type: string, params?: Record<string, mixed> | null) => void,
19
20
  ...
20
21
  }>,
22
+ reporter: TerminalReporter,
21
23
  }): void;
@@ -4,6 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true,
5
5
  });
6
6
  exports.default = void 0;
7
+ var _createDevMiddlewareLogger = _interopRequireDefault(
8
+ require("../../utils/createDevMiddlewareLogger")
9
+ );
7
10
  var _isDevServerRunning = _interopRequireDefault(
8
11
  require("../../utils/isDevServerRunning")
9
12
  );
@@ -93,6 +96,10 @@ async function runServer(_argv, ctx, args) {
93
96
  require.resolve(plugin)
94
97
  );
95
98
  }
99
+ let reportEvent;
100
+ const terminal = new _metroCore.Terminal(process.stdout);
101
+ const ReporterImpl = getReporterImpl(args.customLogReporterPath);
102
+ const terminalReporter = new ReporterImpl(terminal);
96
103
  const {
97
104
  middleware: communityMiddleware,
98
105
  websocketEndpoints: communityWebsocketEndpoints,
@@ -107,12 +114,8 @@ async function runServer(_argv, ctx, args) {
107
114
  _devMiddleware.createDevMiddleware)({
108
115
  projectRoot,
109
116
  serverBaseUrl: devServerUrl,
110
- logger: _logger.logger,
117
+ logger: (0, _createDevMiddlewareLogger.default)(terminalReporter),
111
118
  });
112
- let reportEvent;
113
- const terminal = new _metroCore.Terminal(process.stdout);
114
- const ReporterImpl = getReporterImpl(args.customLogReporterPath);
115
- const terminalReporter = new ReporterImpl(terminal);
116
119
  metroConfig.reporter = {
117
120
  update(event) {
118
121
  terminalReporter.update(event);
@@ -125,6 +128,7 @@ async function runServer(_argv, ctx, args) {
125
128
  cliConfig: ctx,
126
129
  devServerUrl,
127
130
  messageSocket: messageSocketEndpoint,
131
+ reporter: terminalReporter,
128
132
  });
129
133
  }
130
134
  },
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true,
5
+ });
6
+ exports.default = createDevMiddlewareLogger;
7
+ function createDevMiddlewareLogger(reporter) {
8
+ return {
9
+ info: makeLogger(reporter, "info"),
10
+ warn: makeLogger(reporter, "warn"),
11
+ error: makeLogger(reporter, "error"),
12
+ };
13
+ }
14
+ function makeLogger(reporter, level) {
15
+ return (...data) =>
16
+ reporter.update({
17
+ type: "unstable_server_log",
18
+ level,
19
+ data,
20
+ });
21
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and 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
+ * @flow strict-local
8
+ * @format
9
+ * @oncall react_native
10
+ */
11
+
12
+ import type TerminalReporter from "metro/src/lib/TerminalReporter";
13
+
14
+ type LoggerFn = (...message: $ReadOnlyArray<string>) => void;
15
+
16
+ /**
17
+ * Create a dev-middleware logger object that will emit logs via Metro's
18
+ * terminal reporter.
19
+ */
20
+ declare export default function createDevMiddlewareLogger(
21
+ reporter: TerminalReporter
22
+ ): $ReadOnly<{
23
+ info: LoggerFn,
24
+ error: LoggerFn,
25
+ warn: LoggerFn,
26
+ }>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-native/community-cli-plugin",
3
- "version": "0.76.0-rc.2",
3
+ "version": "0.76.0-rc.4",
4
4
  "description": "Core CLI commands for React Native",
5
5
  "keywords": [
6
6
  "react-native",
@@ -22,18 +22,19 @@
22
22
  "dist"
23
23
  ],
24
24
  "dependencies": {
25
- "@react-native/dev-middleware": "0.76.0-rc.2",
26
- "@react-native/metro-babel-transformer": "0.76.0-rc.2",
25
+ "@react-native/dev-middleware": "0.76.0-rc.4",
26
+ "@react-native/metro-babel-transformer": "0.76.0-rc.4",
27
27
  "chalk": "^4.0.0",
28
28
  "execa": "^5.1.1",
29
- "metro": "^0.81.0-alpha.0",
30
- "metro-config": "^0.81.0-alpha.0",
31
- "metro-core": "^0.81.0-alpha.0",
29
+ "invariant": "^2.2.4",
30
+ "metro": "^0.81.0-alpha.2",
31
+ "metro-config": "^0.81.0-alpha.2",
32
+ "metro-core": "^0.81.0-alpha.2",
32
33
  "node-fetch": "^2.2.0",
33
34
  "readline": "^1.3.0"
34
35
  },
35
36
  "devDependencies": {
36
- "metro-resolver": "^0.81.0-alpha.0"
37
+ "metro-resolver": "^0.81.0-alpha.2"
37
38
  },
38
39
  "peerDependencies": {
39
40
  "@react-native-community/cli-server-api": "*"
@@ -1,66 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true,
5
- });
6
- exports.KeyPressHandler = void 0;
7
- var _errors = require("./errors");
8
- var _logger = require("./logger");
9
- const CTRL_C = "\u0003";
10
- class KeyPressHandler {
11
- _isInterceptingKeyStrokes = false;
12
- _isHandlingKeyPress = false;
13
- constructor(onPress) {
14
- this._onPress = onPress;
15
- }
16
- createInteractionListener() {
17
- let wasIntercepting = false;
18
- const listener = ({ pause }) => {
19
- if (pause) {
20
- wasIntercepting = this._isInterceptingKeyStrokes;
21
- this.stopInterceptingKeyStrokes();
22
- } else if (wasIntercepting) {
23
- this.startInterceptingKeyStrokes();
24
- }
25
- };
26
- return listener;
27
- }
28
- _handleKeypress = async (key) => {
29
- if (this._isHandlingKeyPress && key !== CTRL_C) {
30
- return;
31
- }
32
- this._isHandlingKeyPress = true;
33
- try {
34
- _logger.logger.debug(`Key pressed: ${key}`);
35
- await this._onPress(key);
36
- } catch (error) {
37
- return new _errors.CLIError(
38
- "There was an error with the key press handler."
39
- );
40
- } finally {
41
- this._isHandlingKeyPress = false;
42
- }
43
- };
44
- startInterceptingKeyStrokes() {
45
- if (this._isInterceptingKeyStrokes) {
46
- return;
47
- }
48
- this._isInterceptingKeyStrokes = true;
49
- const { stdin } = process;
50
- stdin.setRawMode(true);
51
- stdin.resume();
52
- stdin.setEncoding("utf8");
53
- stdin.on("data", this._handleKeypress);
54
- }
55
- stopInterceptingKeyStrokes() {
56
- if (!this._isInterceptingKeyStrokes) {
57
- return;
58
- }
59
- this._isInterceptingKeyStrokes = false;
60
- const { stdin } = process;
61
- stdin.removeListener("data", this._handleKeypress);
62
- stdin.setRawMode(false);
63
- stdin.resume();
64
- }
65
- }
66
- exports.KeyPressHandler = KeyPressHandler;
@@ -1,22 +0,0 @@
1
- /**
2
- * Copyright (c) Meta Platforms, Inc. and 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
- * @flow strict-local
8
- * @format
9
- * @oncall react_native
10
- */
11
-
12
- /** An abstract key stroke interceptor. */
13
- declare export class KeyPressHandler {
14
- _isInterceptingKeyStrokes: $FlowFixMe;
15
- _isHandlingKeyPress: $FlowFixMe;
16
- _onPress: (key: string) => Promise<void>;
17
- constructor(onPress: (key: string) => Promise<void>): void;
18
- createInteractionListener(): ({ pause: boolean, ... }) => void;
19
- _handleKeypress: $FlowFixMe;
20
- startInterceptingKeyStrokes(): void;
21
- stopInterceptingKeyStrokes(): void;
22
- }