@react-native/community-cli-plugin 0.77.0-nightly-20240930-513e9669e → 0.77.0-nightly-20241002-d19a2178b

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.
@@ -7,7 +7,6 @@ exports.unstable_buildBundleWithConfig = exports.default = void 0;
7
7
  var _loadMetroConfig = _interopRequireDefault(
8
8
  require("../../utils/loadMetroConfig")
9
9
  );
10
- var _logger = require("../../utils/logger");
11
10
  var _parseKeyValueParamArray = _interopRequireDefault(
12
11
  require("../../utils/parseKeyValueParamArray")
13
12
  );
@@ -40,12 +39,12 @@ async function buildBundleWithConfig(
40
39
  args.resolverOption ?? []
41
40
  );
42
41
  if (config.resolver.platforms.indexOf(args.platform) === -1) {
43
- _logger.logger.error(
44
- `Invalid platform ${
42
+ console.error(
43
+ `${_chalk.default.red("error")}: Invalid platform ${
45
44
  args.platform ? `"${_chalk.default.bold(args.platform)}" ` : ""
46
45
  }selected.`
47
46
  );
48
- _logger.logger.info(
47
+ console.info(
49
48
  `Available platforms are: ${config.resolver.platforms
50
49
  .map((x) => `"${_chalk.default.bold(x)}"`)
51
50
  .join(
@@ -75,7 +74,7 @@ async function buildBundleWithConfig(
75
74
  recursive: true,
76
75
  mode: 0o755,
77
76
  });
78
- await bundleImpl.save(bundle, args, _logger.logger.info);
77
+ await bundleImpl.save(bundle, args, console.info);
79
78
  const outputAssets = await server.getAssets({
80
79
  ..._Server.default.DEFAULT_BUNDLE_OPTIONS,
81
80
  ...requestOpts,
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true,
5
5
  });
6
6
  exports.default = void 0;
7
- var _logger = require("../../utils/logger");
8
7
  var _assetCatalogIOS = require("./assetCatalogIOS");
9
8
  var _filterPlatformAssetScales = _interopRequireDefault(
10
9
  require("./filterPlatformAssetScales")
@@ -15,6 +14,7 @@ var _getAssetDestPathAndroid = _interopRequireDefault(
15
14
  var _getAssetDestPathIOS = _interopRequireDefault(
16
15
  require("./getAssetDestPathIOS")
17
16
  );
17
+ var _chalk = _interopRequireDefault(require("chalk"));
18
18
  var _fs = _interopRequireDefault(require("fs"));
19
19
  var _path = _interopRequireDefault(require("path"));
20
20
  function _interopRequireDefault(e) {
@@ -22,7 +22,7 @@ function _interopRequireDefault(e) {
22
22
  }
23
23
  async function saveAssets(assets, platform, assetsDest, assetCatalogDest) {
24
24
  if (assetsDest == null) {
25
- _logger.logger.warn("Assets destination folder is not set, skipping...");
25
+ console.warn("Warning: Assets destination folder is not set, skipping...");
26
26
  return;
27
27
  }
28
28
  const filesToCopy = {};
@@ -52,12 +52,14 @@ async function saveAssets(assets, platform, assetsDest, assetCatalogDest) {
52
52
  "RNAssets.xcassets"
53
53
  );
54
54
  if (!_fs.default.existsSync(catalogDir)) {
55
- _logger.logger.error(
56
- `Could not find asset catalog 'RNAssets.xcassets' in ${assetCatalogDest}. Make sure to create it if it does not exist.`
55
+ console.error(
56
+ `${_chalk.default.red(
57
+ "error"
58
+ )}: Could not find asset catalog 'RNAssets.xcassets' in ${assetCatalogDest}. Make sure to create it if it does not exist.`
57
59
  );
58
60
  return;
59
61
  }
60
- _logger.logger.info("Adding images to asset catalog", catalogDir);
62
+ console.info("Adding images to asset catalog", catalogDir);
61
63
  (0, _assetCatalogIOS.cleanAssetCatalog)(catalogDir);
62
64
  for (const asset of assets) {
63
65
  if ((0, _assetCatalogIOS.isCatalogAsset)(asset)) {
@@ -71,7 +73,7 @@ async function saveAssets(assets, platform, assetsDest, assetCatalogDest) {
71
73
  addAssetToCopy(asset);
72
74
  }
73
75
  }
74
- _logger.logger.info("Done adding images to asset catalog");
76
+ console.info("Done adding images to asset catalog");
75
77
  } else {
76
78
  assets.forEach(addAssetToCopy);
77
79
  }
@@ -82,7 +84,7 @@ function copyAll(filesToCopy) {
82
84
  if (queue.length === 0) {
83
85
  return Promise.resolve();
84
86
  }
85
- _logger.logger.info(`Copying ${queue.length} asset files`);
87
+ console.info(`Copying ${queue.length} asset files`);
86
88
  return new Promise((resolve, reject) => {
87
89
  const copyNext = (error) => {
88
90
  if (error) {
@@ -90,7 +92,7 @@ function copyAll(filesToCopy) {
90
92
  return;
91
93
  }
92
94
  if (queue.length === 0) {
93
- _logger.logger.info("Done copying assets");
95
+ console.info("Done copying assets");
94
96
  resolve();
95
97
  } else {
96
98
  const src = queue.shift();
@@ -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,14 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true,
5
5
  });
6
6
  exports.default = attachKeyHandlers;
7
- var _KeyPressHandler = require("../../utils/KeyPressHandler");
8
- var _logger = require("../../utils/logger");
7
+ var _OpenDebuggerKeyboardHandler = _interopRequireDefault(
8
+ require("./OpenDebuggerKeyboardHandler")
9
+ );
9
10
  var _chalk = _interopRequireDefault(require("chalk"));
10
- var _execa = _interopRequireDefault(require("execa"));
11
- var _nodeFetch = _interopRequireDefault(require("node-fetch"));
11
+ var _child_process = require("child_process");
12
+ var _invariant = _interopRequireDefault(require("invariant"));
13
+ var _readline = _interopRequireDefault(require("readline"));
14
+ var _tty = require("tty");
12
15
  function _interopRequireDefault(e) {
13
16
  return e && e.__esModule ? e : { default: e };
14
17
  }
@@ -25,79 +28,122 @@ const throttle = (callback, timeout) => {
25
28
  }
26
29
  };
27
30
  };
28
- function attachKeyHandlers({ cliConfig, devServerUrl, messageSocket }) {
31
+ const spawnOptions = {
32
+ env: {
33
+ ...process.env,
34
+ FORCE_COLOR: _chalk.default.supportsColor ? "true" : "false",
35
+ },
36
+ };
37
+ function attachKeyHandlers({
38
+ cliConfig,
39
+ devServerUrl,
40
+ messageSocket,
41
+ reporter,
42
+ }) {
29
43
  if (process.stdin.isTTY !== true) {
30
- _logger.logger.debug(
31
- "Interactive mode is not supported in this environment"
32
- );
44
+ reporter.update({
45
+ type: "unstable_server_log",
46
+ level: "info",
47
+ data: "Interactive mode is not supported in this environment",
48
+ });
33
49
  return;
34
50
  }
35
- const execaOptions = {
36
- env: {
37
- FORCE_COLOR: _chalk.default.supportsColor ? "true" : "false",
38
- },
39
- };
51
+ _readline.default.emitKeypressEvents(process.stdin);
52
+ setRawMode(true);
40
53
  const reload = throttle(() => {
41
- _logger.logger.info("Reloading connected app(s)...");
54
+ reporter.update({
55
+ type: "unstable_server_log",
56
+ level: "info",
57
+ data: "Reloading connected app(s)...",
58
+ });
42
59
  messageSocket.broadcast("reload", null);
43
60
  }, RELOAD_TIMEOUT);
44
- const keyPressHandler = new _KeyPressHandler.KeyPressHandler(async (key) => {
45
- switch (key.toLowerCase()) {
61
+ const openDebuggerKeyboardHandler = new _OpenDebuggerKeyboardHandler.default({
62
+ reporter,
63
+ devServerUrl,
64
+ });
65
+ process.stdin.on("keypress", (str, key) => {
66
+ if (openDebuggerKeyboardHandler.maybeHandleTargetSelection(key.name)) {
67
+ return;
68
+ }
69
+ switch (key.sequence) {
46
70
  case "r":
47
71
  reload();
48
72
  break;
49
73
  case "d":
50
- _logger.logger.info("Opening Dev Menu...");
74
+ reporter.update({
75
+ type: "unstable_server_log",
76
+ level: "info",
77
+ data: "Opening Dev Menu...",
78
+ });
51
79
  messageSocket.broadcast("devMenu", null);
52
80
  break;
53
81
  case "i":
54
- _logger.logger.info("Opening app on iOS...");
55
- (0, _execa.default)(
82
+ reporter.update({
83
+ type: "unstable_server_log",
84
+ level: "info",
85
+ data: "Opening app on iOS...",
86
+ });
87
+ (0, _child_process.spawn)(
56
88
  "npx",
57
89
  [
58
90
  "react-native",
59
91
  "run-ios",
60
92
  ...(cliConfig.project.ios?.watchModeCommandParams ?? []),
61
93
  ],
62
- execaOptions
94
+ spawnOptions
63
95
  ).stdout?.pipe(process.stdout);
64
96
  break;
65
97
  case "a":
66
- _logger.logger.info("Opening app on Android...");
67
- (0, _execa.default)(
98
+ reporter.update({
99
+ type: "unstable_server_log",
100
+ level: "info",
101
+ data: "Opening app on Android...",
102
+ });
103
+ (0, _child_process.spawn)(
68
104
  "npx",
69
105
  [
70
106
  "react-native",
71
107
  "run-android",
72
108
  ...(cliConfig.project.android?.watchModeCommandParams ?? []),
73
109
  ],
74
- execaOptions
110
+ spawnOptions
75
111
  ).stdout?.pipe(process.stdout);
76
112
  break;
77
113
  case "j":
78
- await (0, _nodeFetch.default)(devServerUrl + "/open-debugger", {
79
- method: "POST",
80
- });
114
+ void openDebuggerKeyboardHandler.handleOpenDebugger();
81
115
  break;
82
116
  case CTRL_C:
83
117
  case CTRL_D:
84
- _logger.logger.info("Stopping server");
85
- keyPressHandler.stopInterceptingKeyStrokes();
118
+ openDebuggerKeyboardHandler.dismiss();
119
+ reporter.update({
120
+ type: "unstable_server_log",
121
+ level: "info",
122
+ data: "Stopping server",
123
+ });
124
+ setRawMode(false);
125
+ process.stdin.pause();
86
126
  process.emit("SIGINT");
87
127
  process.exit();
88
128
  }
89
129
  });
90
- keyPressHandler.createInteractionListener();
91
- keyPressHandler.startInterceptingKeyStrokes();
92
- _logger.logger.log(
93
- [
94
- "",
95
- `${_chalk.default.bold("i")} - run on iOS`,
96
- `${_chalk.default.bold("a")} - run on Android`,
97
- `${_chalk.default.bold("r")} - reload app`,
98
- `${_chalk.default.bold("d")} - open Dev Menu`,
99
- `${_chalk.default.bold("j")} - open DevTools`,
100
- "",
101
- ].join("\n")
130
+ reporter.update({
131
+ type: "unstable_server_log",
132
+ level: "info",
133
+ data: `Key commands available:
134
+
135
+ ${_chalk.default.bold.inverse(" i ")} - run on iOS
136
+ ${_chalk.default.bold.inverse(" a ")} - run on Android
137
+ ${_chalk.default.bold.inverse(" r ")} - reload app(s)
138
+ ${_chalk.default.bold.inverse(" d ")} - open Dev Menu
139
+ ${_chalk.default.bold.inverse(" j ")} - open DevTools
140
+ `,
141
+ });
142
+ }
143
+ function setRawMode(enable) {
144
+ (0, _invariant.default)(
145
+ process.stdin instanceof _tty.ReadStream,
146
+ "process.stdin must be a readable stream to modify raw mode"
102
147
  );
148
+ process.stdin.setRawMode(enable);
103
149
  }
@@ -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,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true,
5
5
  });
6
6
  exports.indexPageMiddleware = exports.createDevServerMiddleware = void 0;
7
- var _logger = require("../../utils/logger");
7
+ const debug = require("debug")("ReactNative:CommunityCliPlugin");
8
8
  const noopNextHandle = (req, res, next) => {
9
9
  next();
10
10
  };
@@ -32,7 +32,7 @@ try {
32
32
  communityMiddlewareFallback.createDevServerMiddleware =
33
33
  community.createDevServerMiddleware;
34
34
  } catch {
35
- _logger.logger.debug(`⚠️ Unable to find @react-native-community/cli-server-api
35
+ debug(`⚠️ Unable to find @react-native-community/cli-server-api
36
36
  Starting the server without the community middleware.`);
37
37
  }
38
38
  const createDevServerMiddleware = (exports.createDevServerMiddleware =
@@ -4,13 +4,15 @@ 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
  );
10
13
  var _loadMetroConfig = _interopRequireDefault(
11
14
  require("../../utils/loadMetroConfig")
12
15
  );
13
- var _logger = require("../../utils/logger");
14
16
  var version = _interopRequireWildcard(require("../../utils/version"));
15
17
  var _attachKeyHandlers = _interopRequireDefault(require("./attachKeyHandlers"));
16
18
  var _cliServerApi = require("@react-native-community/cli-server-api");
@@ -68,31 +70,37 @@ async function runServer(_argv, ctx, args) {
68
70
  hostname,
69
71
  port,
70
72
  });
71
- _logger.logger.info(`Welcome to React Native v${ctx.reactNativeVersion}`);
73
+ console.info(
74
+ _chalk.default.blue(`\nWelcome to React Native v${ctx.reactNativeVersion}`)
75
+ );
72
76
  const serverStatus = await (0, _isDevServerRunning.default)(
73
77
  devServerUrl,
74
78
  projectRoot
75
79
  );
76
80
  if (serverStatus === "matched_server_running") {
77
- _logger.logger.info(
81
+ console.info(
78
82
  `A dev server is already running for this project on port ${port}. Exiting.`
79
83
  );
80
84
  return;
81
85
  } else if (serverStatus === "port_taken") {
82
- _logger.logger.error(
83
- `Another process is running on port ${port}. Please terminate this ` +
86
+ console.error(
87
+ `${_chalk.default.red(
88
+ "error"
89
+ )}: Another process is running on port ${port}. Please terminate this ` +
84
90
  'process and try again, or use another port with "--port".'
85
91
  );
86
92
  return;
87
93
  }
88
- _logger.logger.info(
89
- `Starting dev server on port ${_chalk.default.bold(String(port))}...`
90
- );
94
+ console.info(`Starting dev server on ${devServerUrl}\n`);
91
95
  if (args.assetPlugins) {
92
96
  metroConfig.transformer.assetPlugins = args.assetPlugins.map((plugin) =>
93
97
  require.resolve(plugin)
94
98
  );
95
99
  }
100
+ let reportEvent;
101
+ const terminal = new _metroCore.Terminal(process.stdout);
102
+ const ReporterImpl = getReporterImpl(args.customLogReporterPath);
103
+ const terminalReporter = new ReporterImpl(terminal);
96
104
  const {
97
105
  middleware: communityMiddleware,
98
106
  websocketEndpoints: communityWebsocketEndpoints,
@@ -107,12 +115,8 @@ async function runServer(_argv, ctx, args) {
107
115
  _devMiddleware.createDevMiddleware)({
108
116
  projectRoot,
109
117
  serverBaseUrl: devServerUrl,
110
- logger: _logger.logger,
118
+ logger: (0, _createDevMiddlewareLogger.default)(terminalReporter),
111
119
  });
112
- let reportEvent;
113
- const terminal = new _metroCore.Terminal(process.stdout);
114
- const ReporterImpl = getReporterImpl(args.customLogReporterPath);
115
- const terminalReporter = new ReporterImpl(terminal);
116
120
  metroConfig.reporter = {
117
121
  update(event) {
118
122
  terminalReporter.update(event);
@@ -120,11 +124,18 @@ async function runServer(_argv, ctx, args) {
120
124
  reportEvent(event);
121
125
  }
122
126
  if (args.interactive && event.type === "initialize_done") {
123
- _logger.logger.info("Dev server ready");
127
+ terminalReporter.update({
128
+ type: "unstable_server_log",
129
+ level: "info",
130
+ data: `Dev server ready. ${_chalk.default.dim(
131
+ "Press Ctrl+C to exit."
132
+ )}`,
133
+ });
124
134
  (0, _attachKeyHandlers.default)({
125
135
  cliConfig: ctx,
126
136
  devServerUrl,
127
137
  messageSocket: messageSocketEndpoint,
138
+ reporter: terminalReporter,
128
139
  });
129
140
  }
130
141
  },
@@ -146,7 +157,7 @@ async function runServer(_argv, ctx, args) {
146
157
  });
147
158
  reportEvent = eventsSocketEndpoint.reportEvent;
148
159
  serverInstance.keepAliveTimeout = 30000;
149
- await version.logIfUpdateAvailable(ctx.root);
160
+ await version.logIfUpdateAvailable(ctx.root, terminalReporter);
150
161
  }
151
162
  function getReporterImpl(customLogReporterPath) {
152
163
  if (customLogReporterPath == null) {
@@ -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
+ }>;
@@ -5,13 +5,13 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = loadMetroConfig;
7
7
  var _errors = require("./errors");
8
- var _logger = require("./logger");
9
8
  var _metroPlatformResolver = require("./metroPlatformResolver");
10
9
  var _metroConfig = require("metro-config");
11
10
  var _path = _interopRequireDefault(require("path"));
12
11
  function _interopRequireDefault(e) {
13
12
  return e && e.__esModule ? e : { default: e };
14
13
  }
14
+ const debug = require("debug")("ReactNative:CommunityCliPlugin");
15
15
  function getOverrideConfig(ctx, config) {
16
16
  const outOfTreePlatforms = Object.keys(ctx.platforms).filter(
17
17
  (platform) => ctx.platforms[platform].npmPackageName
@@ -63,7 +63,7 @@ async function loadMetroConfig(ctx, options = {}) {
63
63
  if (projectConfig.isEmpty) {
64
64
  throw new _errors.CLIError(`No Metro config found in ${cwd}`);
65
65
  }
66
- _logger.logger.debug(`Reading Metro config from ${projectConfig.filepath}`);
66
+ debug(`Reading Metro config from ${projectConfig.filepath}`);
67
67
  if (!global.__REACT_NATIVE_METRO_CONFIG_LOADED) {
68
68
  for (const line of `
69
69
  =================================================================================================
@@ -75,7 +75,7 @@ This warning will be removed in future (https://github.com/facebook/metro/issues
75
75
  `
76
76
  .trim()
77
77
  .split("\n")) {
78
- _logger.logger.warn(line);
78
+ console.warn(line);
79
79
  }
80
80
  }
81
81
  const config = await (0, _metroConfig.loadConfig)({
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = getLatestRelease;
7
7
  exports.logIfUpdateAvailable = logIfUpdateAvailable;
8
- var _logger = require("./logger");
9
8
  var _chalk = _interopRequireDefault(require("chalk"));
10
9
  var _fs = require("fs");
11
10
  var _path = _interopRequireDefault(require("path"));
@@ -13,33 +12,36 @@ var _semver = _interopRequireDefault(require("semver"));
13
12
  function _interopRequireDefault(e) {
14
13
  return e && e.__esModule ? e : { default: e };
15
14
  }
15
+ const debug = require("debug")("ReactNative:CommunityCliPlugin");
16
16
  function getReactNativeVersion(projectRoot) {
17
17
  try {
18
18
  const resolvedPath = require.resolve("react-native/package.json", {
19
19
  paths: [projectRoot],
20
20
  });
21
- _logger.logger.debug(
22
- `Found 'react-native' from '${projectRoot}' -> '${resolvedPath}'`
23
- );
21
+ debug(`Found 'react-native' from '${projectRoot}' -> '${resolvedPath}'`);
24
22
  return JSON.parse((0, _fs.readFileSync)(resolvedPath, "utf8")).version;
25
23
  } catch {
26
- _logger.logger.debug("Couldn't read the version of 'react-native'");
24
+ debug("Couldn't read the version of 'react-native'");
27
25
  }
28
26
  }
29
- async function logIfUpdateAvailable(projectRoot) {
27
+ async function logIfUpdateAvailable(projectRoot, reporter) {
30
28
  const versions = await latest(projectRoot);
31
29
  if (!versions?.upgrade) {
32
30
  return;
33
31
  }
34
32
  if (_semver.default.gt(versions.upgrade.stable, versions.current)) {
35
- _logger.logger.info(`React Native v${
36
- versions.upgrade.stable
37
- } is now available (your project is running on v${versions.name}).
33
+ reporter.update({
34
+ type: "unstable_server_log",
35
+ level: "info",
36
+ data: `React Native v${
37
+ versions.upgrade.stable
38
+ } is now available (your project is running on v${versions.name}).
38
39
  Changelog: ${_chalk.default.dim.underline(
39
- versions.upgrade?.changelogUrl ?? "none"
40
- )}
40
+ versions.upgrade?.changelogUrl ?? "none"
41
+ )}
41
42
  Diff: ${_chalk.default.dim.underline(versions.upgrade?.diffUrl ?? "none")}
42
- `);
43
+ `,
44
+ });
43
45
  }
44
46
  }
45
47
  async function latest(projectRoot) {
@@ -63,11 +65,11 @@ async function latest(projectRoot) {
63
65
  };
64
66
  }
65
67
  } catch (e) {
66
- _logger.logger.debug(
68
+ debug(
67
69
  "Cannot detect current version of React Native, " +
68
70
  "skipping check for a newer release"
69
71
  );
70
- _logger.logger.debug(e);
72
+ debug(e);
71
73
  }
72
74
  }
73
75
  function isDiffPurgeEntry(data) {
@@ -78,20 +80,20 @@ function isDiffPurgeEntry(data) {
78
80
  );
79
81
  }
80
82
  async function getLatestRelease(name, currentVersion) {
81
- _logger.logger.debug("Checking for a newer version of React Native");
83
+ debug("Checking for a newer version of React Native");
82
84
  try {
83
- _logger.logger.debug(`Current version: ${currentVersion}`);
85
+ debug(`Current version: ${currentVersion}`);
84
86
  if (["-canary", "-nightly"].some((s) => currentVersion.includes(s))) {
85
87
  return;
86
88
  }
87
- _logger.logger.debug("Checking for newer releases on GitHub");
89
+ debug("Checking for newer releases on GitHub");
88
90
  const latestVersion = await getLatestRnDiffPurgeVersion(name);
89
91
  if (latestVersion == null) {
90
- _logger.logger.debug("Failed to get latest release");
92
+ debug("Failed to get latest release");
91
93
  return;
92
94
  }
93
95
  const { stable, candidate } = latestVersion;
94
- _logger.logger.debug(`Latest release: ${stable} (${candidate ?? ""})`);
96
+ debug(`Latest release: ${stable} (${candidate ?? ""})`);
95
97
  if (_semver.default.compare(stable, currentVersion) >= 0) {
96
98
  return {
97
99
  stable,
@@ -101,10 +103,8 @@ async function getLatestRelease(name, currentVersion) {
101
103
  };
102
104
  }
103
105
  } catch (e) {
104
- _logger.logger.debug(
105
- "Something went wrong with remote version checking, moving on"
106
- );
107
- _logger.logger.debug(e);
106
+ debug("Something went wrong with remote version checking, moving on");
107
+ debug(e);
108
108
  }
109
109
  }
110
110
  function buildChangelogUrl(version) {
@@ -9,6 +9,8 @@
9
9
  * @oncall react_native
10
10
  */
11
11
 
12
+ import type TerminalReporter from "metro/src/lib/TerminalReporter";
13
+
12
14
  type Release = {
13
15
  // The current stable release
14
16
  stable: string,
@@ -22,7 +24,8 @@ type Release = {
22
24
  * Logs out a message if the user's version is behind a stable version of React Native
23
25
  */
24
26
  declare export function logIfUpdateAvailable(
25
- projectRoot: string
27
+ projectRoot: string,
28
+ reporter: TerminalReporter
26
29
  ): Promise<void>;
27
30
 
28
31
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-native/community-cli-plugin",
3
- "version": "0.77.0-nightly-20240930-513e9669e",
3
+ "version": "0.77.0-nightly-20241002-d19a2178b",
4
4
  "description": "Core CLI commands for React Native",
5
5
  "keywords": [
6
6
  "react-native",
@@ -22,18 +22,20 @@
22
22
  "dist"
23
23
  ],
24
24
  "dependencies": {
25
- "@react-native/dev-middleware": "0.77.0-nightly-20240930-513e9669e",
26
- "@react-native/metro-babel-transformer": "0.77.0-nightly-20240930-513e9669e",
25
+ "@react-native/dev-middleware": "0.77.0-nightly-20241002-d19a2178b",
26
+ "@react-native/metro-babel-transformer": "0.77.0-nightly-20241002-d19a2178b",
27
27
  "chalk": "^4.0.0",
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",
28
+ "debug": "^2.2.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
- "readline": "^1.3.0"
34
+ "readline": "^1.3.0",
35
+ "semver": "^7.1.3"
34
36
  },
35
37
  "devDependencies": {
36
- "metro-resolver": "^0.81.0-alpha.0"
38
+ "metro-resolver": "^0.81.0-alpha.2"
37
39
  },
38
40
  "peerDependencies": {
39
41
  "@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
- }
@@ -1,91 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true,
5
- });
6
- exports.logger = void 0;
7
- var _chalk = _interopRequireDefault(require("chalk"));
8
- function _interopRequireDefault(e) {
9
- return e && e.__esModule ? e : { default: e };
10
- }
11
- const SEPARATOR = ", ";
12
- let verbose = process.argv.includes("--verbose");
13
- let disabled = false;
14
- let hidden = false;
15
- const formatMessages = (messages) =>
16
- _chalk.default.reset(messages.join(SEPARATOR));
17
- const success = (...messages) => {
18
- if (!disabled) {
19
- console.log(
20
- `${_chalk.default.green.bold("success")} ${formatMessages(messages)}`
21
- );
22
- }
23
- };
24
- const info = (...messages) => {
25
- if (!disabled) {
26
- console.log(
27
- `${_chalk.default.cyan.bold("info")} ${formatMessages(messages)}`
28
- );
29
- }
30
- };
31
- const warn = (...messages) => {
32
- if (!disabled) {
33
- console.warn(
34
- `${_chalk.default.yellow.bold("warn")} ${formatMessages(messages)}`
35
- );
36
- }
37
- };
38
- const error = (...messages) => {
39
- if (!disabled) {
40
- console.error(
41
- `${_chalk.default.red.bold("error")} ${formatMessages(messages)}`
42
- );
43
- }
44
- };
45
- const debug = (...messages) => {
46
- if (verbose && !disabled) {
47
- console.log(
48
- `${_chalk.default.gray.bold("debug")} ${formatMessages(messages)}`
49
- );
50
- } else {
51
- hidden = true;
52
- }
53
- };
54
- const log = (...messages) => {
55
- if (!disabled) {
56
- console.log(`${formatMessages(messages)}`);
57
- }
58
- };
59
- const setVerbose = (level) => {
60
- verbose = level;
61
- };
62
- const isVerbose = () => verbose;
63
- const disable = () => {
64
- disabled = true;
65
- };
66
- const enable = () => {
67
- disabled = false;
68
- };
69
- const hasDebugMessages = () => hidden;
70
- let communityLogger;
71
- try {
72
- const { logger } = require("@react-native-community/cli-tools");
73
- logger.debug("Using @react-naive-community/cli-tools' logger");
74
- communityLogger = logger;
75
- } catch {}
76
- const logger = (exports.logger = communityLogger ?? {
77
- success,
78
- info,
79
- warn,
80
- error,
81
- debug,
82
- log,
83
- setVerbose,
84
- isVerbose,
85
- hasDebugMessages,
86
- disable,
87
- enable,
88
- });
89
- if (communityLogger == null) {
90
- logger.debug("Using @react-native/communityu-cli-plugin's logger");
91
- }
@@ -1,21 +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
- type Logger = $ReadOnly<{
13
- debug: (...message: Array<string>) => void,
14
- error: (...message: Array<string>) => void,
15
- log: (...message: Array<string>) => void,
16
- info: (...message: Array<string>) => void,
17
- warn: (...message: Array<string>) => void,
18
- ...
19
- }>;
20
-
21
- declare export const logger: Logger;