@react-native/community-cli-plugin 0.76.0-nightly-20240715-2eb7bcb8d → 0.76.0-nightly-20240719-6d56cea28
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.
- package/dist/commands/bundle/buildBundle.js +4 -4
- package/dist/commands/bundle/saveAssets.js +7 -7
- package/dist/commands/start/attachKeyHandlers.js +8 -8
- package/dist/commands/start/middleware.js +42 -0
- package/dist/commands/start/middleware.js.flow +13 -0
- package/dist/commands/start/runServer.js +49 -8
- package/dist/utils/KeyPressHandler.js +4 -3
- package/dist/utils/errors.js +24 -0
- package/dist/utils/errors.js.flow +25 -0
- package/dist/utils/loadMetroConfig.js +5 -4
- package/dist/utils/logger.js +92 -0
- package/dist/utils/logger.js.flow +21 -0
- package/dist/utils/version.js +143 -0
- package/dist/utils/version.js.flow +38 -0
- package/package.json +11 -5
|
@@ -7,11 +7,11 @@ 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");
|
|
10
11
|
var _parseKeyValueParamArray = _interopRequireDefault(
|
|
11
12
|
require("../../utils/parseKeyValueParamArray")
|
|
12
13
|
);
|
|
13
14
|
var _saveAssets = _interopRequireDefault(require("./saveAssets"));
|
|
14
|
-
var _cliTools = require("@react-native-community/cli-tools");
|
|
15
15
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
16
16
|
var _Server = _interopRequireDefault(require("metro/src/Server"));
|
|
17
17
|
var _bundle = _interopRequireDefault(require("metro/src/shared/output/bundle"));
|
|
@@ -39,12 +39,12 @@ async function buildBundleWithConfig(
|
|
|
39
39
|
args.resolverOption ?? []
|
|
40
40
|
);
|
|
41
41
|
if (config.resolver.platforms.indexOf(args.platform) === -1) {
|
|
42
|
-
|
|
42
|
+
_logger.logger.error(
|
|
43
43
|
`Invalid platform ${
|
|
44
44
|
args.platform ? `"${_chalk.default.bold(args.platform)}" ` : ""
|
|
45
45
|
}selected.`
|
|
46
46
|
);
|
|
47
|
-
|
|
47
|
+
_logger.logger.info(
|
|
48
48
|
`Available platforms are: ${config.resolver.platforms
|
|
49
49
|
.map((x) => `"${_chalk.default.bold(x)}"`)
|
|
50
50
|
.join(
|
|
@@ -70,7 +70,7 @@ async function buildBundleWithConfig(
|
|
|
70
70
|
const server = new _Server.default(config);
|
|
71
71
|
try {
|
|
72
72
|
const bundle = await bundleImpl.build(server, requestOpts);
|
|
73
|
-
await bundleImpl.save(bundle, args,
|
|
73
|
+
await bundleImpl.save(bundle, args, _logger.logger.info);
|
|
74
74
|
const outputAssets = await server.getAssets({
|
|
75
75
|
..._Server.default.DEFAULT_BUNDLE_OPTIONS,
|
|
76
76
|
...requestOpts,
|
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true,
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
+
var _logger = require("../../utils/logger");
|
|
7
8
|
var _assetCatalogIOS = require("./assetCatalogIOS");
|
|
8
9
|
var _filterPlatformAssetScales = _interopRequireDefault(
|
|
9
10
|
require("./filterPlatformAssetScales")
|
|
@@ -14,7 +15,6 @@ var _getAssetDestPathAndroid = _interopRequireDefault(
|
|
|
14
15
|
var _getAssetDestPathIOS = _interopRequireDefault(
|
|
15
16
|
require("./getAssetDestPathIOS")
|
|
16
17
|
);
|
|
17
|
-
var _cliTools = require("@react-native-community/cli-tools");
|
|
18
18
|
var _fs = _interopRequireDefault(require("fs"));
|
|
19
19
|
var _path = _interopRequireDefault(require("path"));
|
|
20
20
|
function _interopRequireDefault(obj) {
|
|
@@ -22,7 +22,7 @@ function _interopRequireDefault(obj) {
|
|
|
22
22
|
}
|
|
23
23
|
async function saveAssets(assets, platform, assetsDest, assetCatalogDest) {
|
|
24
24
|
if (assetsDest == null) {
|
|
25
|
-
|
|
25
|
+
_logger.logger.warn("Assets destination folder is not set, skipping...");
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
28
|
const filesToCopy = {};
|
|
@@ -52,12 +52,12 @@ async function saveAssets(assets, platform, assetsDest, assetCatalogDest) {
|
|
|
52
52
|
"RNAssets.xcassets"
|
|
53
53
|
);
|
|
54
54
|
if (!_fs.default.existsSync(catalogDir)) {
|
|
55
|
-
|
|
55
|
+
_logger.logger.error(
|
|
56
56
|
`Could not find asset catalog 'RNAssets.xcassets' in ${assetCatalogDest}. Make sure to create it if it does not exist.`
|
|
57
57
|
);
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
|
-
|
|
60
|
+
_logger.logger.info("Adding images to asset catalog", catalogDir);
|
|
61
61
|
(0, _assetCatalogIOS.cleanAssetCatalog)(catalogDir);
|
|
62
62
|
for (const asset of assets) {
|
|
63
63
|
if ((0, _assetCatalogIOS.isCatalogAsset)(asset)) {
|
|
@@ -71,7 +71,7 @@ async function saveAssets(assets, platform, assetsDest, assetCatalogDest) {
|
|
|
71
71
|
addAssetToCopy(asset);
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
|
-
|
|
74
|
+
_logger.logger.info("Done adding images to asset catalog");
|
|
75
75
|
} else {
|
|
76
76
|
assets.forEach(addAssetToCopy);
|
|
77
77
|
}
|
|
@@ -82,7 +82,7 @@ function copyAll(filesToCopy) {
|
|
|
82
82
|
if (queue.length === 0) {
|
|
83
83
|
return Promise.resolve();
|
|
84
84
|
}
|
|
85
|
-
|
|
85
|
+
_logger.logger.info(`Copying ${queue.length} asset files`);
|
|
86
86
|
return new Promise((resolve, reject) => {
|
|
87
87
|
const copyNext = (error) => {
|
|
88
88
|
if (error) {
|
|
@@ -90,7 +90,7 @@ function copyAll(filesToCopy) {
|
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
92
92
|
if (queue.length === 0) {
|
|
93
|
-
|
|
93
|
+
_logger.logger.info("Done copying assets");
|
|
94
94
|
resolve();
|
|
95
95
|
} else {
|
|
96
96
|
const src = queue.shift();
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = attachKeyHandlers;
|
|
7
7
|
var _KeyPressHandler = require("../../utils/KeyPressHandler");
|
|
8
|
-
var
|
|
8
|
+
var _logger = require("../../utils/logger");
|
|
9
9
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
10
10
|
var _execa = _interopRequireDefault(require("execa"));
|
|
11
11
|
var _nodeFetch = _interopRequireDefault(require("node-fetch"));
|
|
@@ -21,7 +21,7 @@ function attachKeyHandlers({
|
|
|
21
21
|
experimentalDebuggerFrontend,
|
|
22
22
|
}) {
|
|
23
23
|
if (process.stdin.isTTY !== true) {
|
|
24
|
-
|
|
24
|
+
_logger.logger.debug(
|
|
25
25
|
"Interactive mode is not supported in this environment"
|
|
26
26
|
);
|
|
27
27
|
return;
|
|
@@ -34,15 +34,15 @@ function attachKeyHandlers({
|
|
|
34
34
|
const keyPressHandler = new _KeyPressHandler.KeyPressHandler(async (key) => {
|
|
35
35
|
switch (key) {
|
|
36
36
|
case "r":
|
|
37
|
-
|
|
37
|
+
_logger.logger.info("Reloading connected app(s)...");
|
|
38
38
|
messageSocket.broadcast("reload", null);
|
|
39
39
|
break;
|
|
40
40
|
case "d":
|
|
41
|
-
|
|
41
|
+
_logger.logger.info("Opening Dev Menu...");
|
|
42
42
|
messageSocket.broadcast("devMenu", null);
|
|
43
43
|
break;
|
|
44
44
|
case "i":
|
|
45
|
-
|
|
45
|
+
_logger.logger.info("Opening app on iOS...");
|
|
46
46
|
(0, _execa.default)(
|
|
47
47
|
"npx",
|
|
48
48
|
[
|
|
@@ -54,7 +54,7 @@ function attachKeyHandlers({
|
|
|
54
54
|
).stdout?.pipe(process.stdout);
|
|
55
55
|
break;
|
|
56
56
|
case "a":
|
|
57
|
-
|
|
57
|
+
_logger.logger.info("Opening app on Android...");
|
|
58
58
|
(0, _execa.default)(
|
|
59
59
|
"npx",
|
|
60
60
|
[
|
|
@@ -75,7 +75,7 @@ function attachKeyHandlers({
|
|
|
75
75
|
break;
|
|
76
76
|
case CTRL_C:
|
|
77
77
|
case CTRL_D:
|
|
78
|
-
|
|
78
|
+
_logger.logger.info("Stopping server");
|
|
79
79
|
keyPressHandler.stopInterceptingKeyStrokes();
|
|
80
80
|
process.emit("SIGINT");
|
|
81
81
|
process.exit();
|
|
@@ -83,7 +83,7 @@ function attachKeyHandlers({
|
|
|
83
83
|
});
|
|
84
84
|
keyPressHandler.createInteractionListener();
|
|
85
85
|
keyPressHandler.startInterceptingKeyStrokes();
|
|
86
|
-
|
|
86
|
+
_logger.logger.log(
|
|
87
87
|
[
|
|
88
88
|
"",
|
|
89
89
|
`${_chalk.default.bold("i")} - run on iOS`,
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true,
|
|
5
|
+
});
|
|
6
|
+
exports.indexPageMiddleware = exports.createDevServerMiddleware = void 0;
|
|
7
|
+
var _logger = require("../../utils/logger");
|
|
8
|
+
const noopNextHandle = (req, res, next) => {
|
|
9
|
+
next();
|
|
10
|
+
};
|
|
11
|
+
const unusedStubWSServer = {};
|
|
12
|
+
const unusedMiddlewareStub = {};
|
|
13
|
+
const communityMiddlewareFallback = {
|
|
14
|
+
createDevServerMiddleware: (params) => ({
|
|
15
|
+
middleware: unusedMiddlewareStub,
|
|
16
|
+
websocketEndpoints: {},
|
|
17
|
+
messageSocketEndpoint: {
|
|
18
|
+
server: unusedStubWSServer,
|
|
19
|
+
broadcast: (method, _params) => {},
|
|
20
|
+
},
|
|
21
|
+
eventsSocketEndpoint: {
|
|
22
|
+
server: unusedStubWSServer,
|
|
23
|
+
reportEvent: (event) => {},
|
|
24
|
+
},
|
|
25
|
+
}),
|
|
26
|
+
indexPageMiddleware: noopNextHandle,
|
|
27
|
+
};
|
|
28
|
+
try {
|
|
29
|
+
const community = require("@react-native-community/cli-server-api");
|
|
30
|
+
communityMiddlewareFallback.indexPageMiddleware =
|
|
31
|
+
community.indexPageMiddleware;
|
|
32
|
+
communityMiddlewareFallback.createDevServerMiddleware =
|
|
33
|
+
community.createDevServerMiddleware;
|
|
34
|
+
} catch {
|
|
35
|
+
_logger.logger.debug(`⚠️ Unable to find @react-native-community/cli-server-api
|
|
36
|
+
Starting the server without the community middleware.`);
|
|
37
|
+
}
|
|
38
|
+
const createDevServerMiddleware =
|
|
39
|
+
communityMiddlewareFallback.createDevServerMiddleware;
|
|
40
|
+
exports.createDevServerMiddleware = createDevServerMiddleware;
|
|
41
|
+
const indexPageMiddleware = communityMiddlewareFallback.indexPageMiddleware;
|
|
42
|
+
exports.indexPageMiddleware = indexPageMiddleware;
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
declare export const createDevServerMiddleware: $FlowFixMe;
|
|
13
|
+
declare export const indexPageMiddleware: $FlowFixMe;
|
|
@@ -10,15 +10,56 @@ var _isDevServerRunning = _interopRequireDefault(
|
|
|
10
10
|
var _loadMetroConfig = _interopRequireDefault(
|
|
11
11
|
require("../../utils/loadMetroConfig")
|
|
12
12
|
);
|
|
13
|
+
var _logger = require("../../utils/logger");
|
|
14
|
+
var version = _interopRequireWildcard(require("../../utils/version"));
|
|
13
15
|
var _attachKeyHandlers = _interopRequireDefault(require("./attachKeyHandlers"));
|
|
14
16
|
var _cliServerApi = require("@react-native-community/cli-server-api");
|
|
15
|
-
var _cliTools = require("@react-native-community/cli-tools");
|
|
16
17
|
var _devMiddleware = require("@react-native/dev-middleware");
|
|
17
18
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
18
19
|
var _metro = _interopRequireDefault(require("metro"));
|
|
19
20
|
var _metroCore = require("metro-core");
|
|
20
21
|
var _path = _interopRequireDefault(require("path"));
|
|
21
22
|
var _url = _interopRequireDefault(require("url"));
|
|
23
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
24
|
+
if (typeof WeakMap !== "function") return null;
|
|
25
|
+
var cacheBabelInterop = new WeakMap();
|
|
26
|
+
var cacheNodeInterop = new WeakMap();
|
|
27
|
+
return (_getRequireWildcardCache = function (nodeInterop) {
|
|
28
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
29
|
+
})(nodeInterop);
|
|
30
|
+
}
|
|
31
|
+
function _interopRequireWildcard(obj, nodeInterop) {
|
|
32
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
33
|
+
return obj;
|
|
34
|
+
}
|
|
35
|
+
if (obj === null || (typeof obj !== "object" && typeof obj !== "function")) {
|
|
36
|
+
return { default: obj };
|
|
37
|
+
}
|
|
38
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
39
|
+
if (cache && cache.has(obj)) {
|
|
40
|
+
return cache.get(obj);
|
|
41
|
+
}
|
|
42
|
+
var newObj = {};
|
|
43
|
+
var hasPropertyDescriptor =
|
|
44
|
+
Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
45
|
+
for (var key in obj) {
|
|
46
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
47
|
+
var desc = hasPropertyDescriptor
|
|
48
|
+
? Object.getOwnPropertyDescriptor(obj, key)
|
|
49
|
+
: null;
|
|
50
|
+
if (desc && (desc.get || desc.set)) {
|
|
51
|
+
Object.defineProperty(newObj, key, desc);
|
|
52
|
+
} else {
|
|
53
|
+
newObj[key] = obj[key];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
newObj.default = obj;
|
|
58
|
+
if (cache) {
|
|
59
|
+
cache.set(obj, newObj);
|
|
60
|
+
}
|
|
61
|
+
return newObj;
|
|
62
|
+
}
|
|
22
63
|
function _interopRequireDefault(obj) {
|
|
23
64
|
return obj && obj.__esModule ? obj : { default: obj };
|
|
24
65
|
}
|
|
@@ -44,24 +85,24 @@ async function runServer(_argv, ctx, args) {
|
|
|
44
85
|
hostname,
|
|
45
86
|
port,
|
|
46
87
|
});
|
|
47
|
-
|
|
88
|
+
_logger.logger.info(`Welcome to React Native v${ctx.reactNativeVersion}`);
|
|
48
89
|
const serverStatus = await (0, _isDevServerRunning.default)(
|
|
49
90
|
devServerUrl,
|
|
50
91
|
projectRoot
|
|
51
92
|
);
|
|
52
93
|
if (serverStatus === "matched_server_running") {
|
|
53
|
-
|
|
94
|
+
_logger.logger.info(
|
|
54
95
|
`A dev server is already running for this project on port ${port}. Exiting.`
|
|
55
96
|
);
|
|
56
97
|
return;
|
|
57
98
|
} else if (serverStatus === "port_taken") {
|
|
58
|
-
|
|
99
|
+
_logger.logger.error(
|
|
59
100
|
`Another process is running on port ${port}. Please terminate this ` +
|
|
60
101
|
'process and try again, or use another port with "--port".'
|
|
61
102
|
);
|
|
62
103
|
return;
|
|
63
104
|
}
|
|
64
|
-
|
|
105
|
+
_logger.logger.info(
|
|
65
106
|
`Starting dev server on port ${_chalk.default.bold(String(port))}...`
|
|
66
107
|
);
|
|
67
108
|
if (args.assetPlugins) {
|
|
@@ -83,7 +124,7 @@ async function runServer(_argv, ctx, args) {
|
|
|
83
124
|
_devMiddleware.createDevMiddleware)({
|
|
84
125
|
projectRoot,
|
|
85
126
|
serverBaseUrl: devServerUrl,
|
|
86
|
-
logger:
|
|
127
|
+
logger: _logger.logger,
|
|
87
128
|
unstable_experiments: {
|
|
88
129
|
enableNewDebugger: args.experimentalDebugger,
|
|
89
130
|
},
|
|
@@ -99,7 +140,7 @@ async function runServer(_argv, ctx, args) {
|
|
|
99
140
|
reportEvent(event);
|
|
100
141
|
}
|
|
101
142
|
if (args.interactive && event.type === "initialize_done") {
|
|
102
|
-
|
|
143
|
+
_logger.logger.info("Dev server ready");
|
|
103
144
|
(0, _attachKeyHandlers.default)({
|
|
104
145
|
cliConfig: ctx,
|
|
105
146
|
devServerUrl,
|
|
@@ -126,7 +167,7 @@ async function runServer(_argv, ctx, args) {
|
|
|
126
167
|
});
|
|
127
168
|
reportEvent = eventsSocketEndpoint.reportEvent;
|
|
128
169
|
serverInstance.keepAliveTimeout = 30000;
|
|
129
|
-
await
|
|
170
|
+
await version.logIfUpdateAvailable(ctx.root);
|
|
130
171
|
}
|
|
131
172
|
function getReporterImpl(customLogReporterPath) {
|
|
132
173
|
if (customLogReporterPath == null) {
|
|
@@ -4,7 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true,
|
|
5
5
|
});
|
|
6
6
|
exports.KeyPressHandler = void 0;
|
|
7
|
-
var
|
|
7
|
+
var _errors = require("./errors");
|
|
8
|
+
var _logger = require("./logger");
|
|
8
9
|
const CTRL_C = "\u0003";
|
|
9
10
|
class KeyPressHandler {
|
|
10
11
|
_isInterceptingKeyStrokes = false;
|
|
@@ -30,10 +31,10 @@ class KeyPressHandler {
|
|
|
30
31
|
}
|
|
31
32
|
this._isHandlingKeyPress = true;
|
|
32
33
|
try {
|
|
33
|
-
|
|
34
|
+
_logger.logger.debug(`Key pressed: ${key}`);
|
|
34
35
|
await this._onPress(key);
|
|
35
36
|
} catch (error) {
|
|
36
|
-
return new
|
|
37
|
+
return new _errors.CLIError(
|
|
37
38
|
"There was an error with the key press handler."
|
|
38
39
|
);
|
|
39
40
|
} finally {
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true,
|
|
5
|
+
});
|
|
6
|
+
exports.inlineString = exports.UnknownProjectError = exports.CLIError = void 0;
|
|
7
|
+
class CLIError extends Error {
|
|
8
|
+
constructor(msg, originalError) {
|
|
9
|
+
super(inlineString(msg));
|
|
10
|
+
if (originalError != null) {
|
|
11
|
+
this.stack =
|
|
12
|
+
typeof originalError === "string"
|
|
13
|
+
? originalError
|
|
14
|
+
: originalError.stack || "".split("\n").slice(0, 2).join("\n");
|
|
15
|
+
} else {
|
|
16
|
+
this.stack = "";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.CLIError = CLIError;
|
|
21
|
+
class UnknownProjectError extends Error {}
|
|
22
|
+
exports.UnknownProjectError = UnknownProjectError;
|
|
23
|
+
const inlineString = (str = "") => str.replace(/(\s{2,})/gm, " ").trim();
|
|
24
|
+
exports.inlineString = inlineString;
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
/**
|
|
13
|
+
* A custom Error that creates a single-lined message to match current styling inside CLI.
|
|
14
|
+
* Uses original stack trace when `originalError` is passed or erase the stack if it's not defined.
|
|
15
|
+
*/
|
|
16
|
+
declare export class CLIError extends Error {
|
|
17
|
+
constructor(msg: string, originalError?: Error | string): void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Raised when we're unable to find a package.json
|
|
22
|
+
*/
|
|
23
|
+
declare export class UnknownProjectError extends Error {}
|
|
24
|
+
|
|
25
|
+
declare export const inlineString: (str: string) => string;
|
|
@@ -4,8 +4,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true,
|
|
5
5
|
});
|
|
6
6
|
exports.default = loadMetroConfig;
|
|
7
|
+
var _errors = require("./errors");
|
|
8
|
+
var _logger = require("./logger");
|
|
7
9
|
var _metroPlatformResolver = require("./metroPlatformResolver");
|
|
8
|
-
var _cliTools = require("@react-native-community/cli-tools");
|
|
9
10
|
var _metroConfig = require("metro-config");
|
|
10
11
|
var _path = _interopRequireDefault(require("path"));
|
|
11
12
|
function _interopRequireDefault(obj) {
|
|
@@ -60,9 +61,9 @@ async function loadMetroConfig(ctx, options = {}) {
|
|
|
60
61
|
cwd
|
|
61
62
|
);
|
|
62
63
|
if (projectConfig.isEmpty) {
|
|
63
|
-
throw new
|
|
64
|
+
throw new _errors.CLIError(`No Metro config found in ${cwd}`);
|
|
64
65
|
}
|
|
65
|
-
|
|
66
|
+
_logger.logger.debug(`Reading Metro config from ${projectConfig.filepath}`);
|
|
66
67
|
if (!global.__REACT_NATIVE_METRO_CONFIG_LOADED) {
|
|
67
68
|
for (const line of `
|
|
68
69
|
=================================================================================================
|
|
@@ -74,7 +75,7 @@ This warning will be removed in future (https://github.com/facebook/metro/issues
|
|
|
74
75
|
`
|
|
75
76
|
.trim()
|
|
76
77
|
.split("\n")) {
|
|
77
|
-
|
|
78
|
+
_logger.logger.warn(line);
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
81
|
const config = await (0, _metroConfig.loadConfig)({
|
|
@@ -0,0 +1,92 @@
|
|
|
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(obj) {
|
|
9
|
+
return obj && obj.__esModule ? obj : { default: obj };
|
|
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 = 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
|
+
exports.logger = logger;
|
|
90
|
+
if (communityLogger == null) {
|
|
91
|
+
logger.debug("Using @react-native/communityu-cli-plugin's logger");
|
|
92
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
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;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true,
|
|
5
|
+
});
|
|
6
|
+
exports.default = getLatestRelease;
|
|
7
|
+
exports.logIfUpdateAvailable = logIfUpdateAvailable;
|
|
8
|
+
var _logger = require("./logger");
|
|
9
|
+
var _chalk = _interopRequireDefault(require("chalk"));
|
|
10
|
+
var _fs = require("fs");
|
|
11
|
+
var _path = _interopRequireDefault(require("path"));
|
|
12
|
+
var _semver = _interopRequireDefault(require("semver"));
|
|
13
|
+
function _interopRequireDefault(obj) {
|
|
14
|
+
return obj && obj.__esModule ? obj : { default: obj };
|
|
15
|
+
}
|
|
16
|
+
function getReactNativeVersion(projectRoot) {
|
|
17
|
+
try {
|
|
18
|
+
const resolvedPath = require.resolve("react-native/package.json", {
|
|
19
|
+
paths: [projectRoot],
|
|
20
|
+
});
|
|
21
|
+
_logger.logger.debug(
|
|
22
|
+
`Found 'react-native' from '${projectRoot}' -> '${resolvedPath}'`
|
|
23
|
+
);
|
|
24
|
+
return JSON.parse((0, _fs.readFileSync)(resolvedPath, "utf8")).version;
|
|
25
|
+
} catch {
|
|
26
|
+
_logger.logger.debug("Couldn't read the version of 'react-native'");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function logIfUpdateAvailable(projectRoot) {
|
|
30
|
+
const versions = await latest(projectRoot);
|
|
31
|
+
if (!versions?.upgrade) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
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}).
|
|
38
|
+
Changelog: ${_chalk.default.dim.underline(
|
|
39
|
+
versions.upgrade?.changelogUrl ?? "none"
|
|
40
|
+
)}
|
|
41
|
+
Diff: ${_chalk.default.dim.underline(versions.upgrade?.diffUrl ?? "none")}
|
|
42
|
+
`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function latest(projectRoot) {
|
|
46
|
+
try {
|
|
47
|
+
const currentVersion = getReactNativeVersion(projectRoot);
|
|
48
|
+
if (currentVersion == null) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const { name } = JSON.parse(
|
|
52
|
+
(0, _fs.readFileSync)(
|
|
53
|
+
_path.default.join(projectRoot, "package.json"),
|
|
54
|
+
"utf8"
|
|
55
|
+
)
|
|
56
|
+
);
|
|
57
|
+
const upgrade = await getLatestRelease(name, currentVersion);
|
|
58
|
+
if (upgrade) {
|
|
59
|
+
return {
|
|
60
|
+
name,
|
|
61
|
+
current: currentVersion,
|
|
62
|
+
upgrade,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
} catch (e) {
|
|
66
|
+
_logger.logger.debug(
|
|
67
|
+
"Cannot detect current version of React Native, " +
|
|
68
|
+
"skipping check for a newer release"
|
|
69
|
+
);
|
|
70
|
+
_logger.logger.debug(e);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function isDiffPurgeEntry(data) {
|
|
74
|
+
return (
|
|
75
|
+
[data.name, data.zipball_url, data.tarball_url, data.node_id].filter(
|
|
76
|
+
(e) => typeof e !== "undefined"
|
|
77
|
+
).length === 0
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
async function getLatestRelease(name, currentVersion) {
|
|
81
|
+
_logger.logger.debug("Checking for a newer version of React Native");
|
|
82
|
+
try {
|
|
83
|
+
_logger.logger.debug(`Current version: ${currentVersion}`);
|
|
84
|
+
if (["-canary", "-nightly"].some((s) => currentVersion.includes(s))) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
_logger.logger.debug("Checking for newer releases on GitHub");
|
|
88
|
+
const latestVersion = await getLatestRnDiffPurgeVersion(name);
|
|
89
|
+
if (latestVersion == null) {
|
|
90
|
+
_logger.logger.debug("Failed to get latest release");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const { stable, candidate } = latestVersion;
|
|
94
|
+
_logger.logger.debug(`Latest release: ${stable} (${candidate ?? ""})`);
|
|
95
|
+
if (_semver.default.compare(stable, currentVersion) >= 0) {
|
|
96
|
+
return {
|
|
97
|
+
stable,
|
|
98
|
+
candidate,
|
|
99
|
+
changelogUrl: buildChangelogUrl(stable),
|
|
100
|
+
diffUrl: buildDiffUrl(currentVersion, stable),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
} catch (e) {
|
|
104
|
+
_logger.logger.debug(
|
|
105
|
+
"Something went wrong with remote version checking, moving on"
|
|
106
|
+
);
|
|
107
|
+
_logger.logger.debug(e);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function buildChangelogUrl(version) {
|
|
111
|
+
return `https://github.com/facebook/react-native/releases/tag/v${version}`;
|
|
112
|
+
}
|
|
113
|
+
function buildDiffUrl(oldVersion, newVersion) {
|
|
114
|
+
return `https://react-native-community.github.io/upgrade-helper/?from=${oldVersion}&to=${newVersion}`;
|
|
115
|
+
}
|
|
116
|
+
async function getLatestRnDiffPurgeVersion(name) {
|
|
117
|
+
const resp = await fetch(
|
|
118
|
+
"https://api.github.com/repos/react-native-community/rn-diff-purge/tags",
|
|
119
|
+
{
|
|
120
|
+
headers: {
|
|
121
|
+
"User-Agent": "@react-native/community-cli-plugin",
|
|
122
|
+
},
|
|
123
|
+
}
|
|
124
|
+
);
|
|
125
|
+
const result = {
|
|
126
|
+
stable: "0.0.0",
|
|
127
|
+
};
|
|
128
|
+
if (resp.status !== 200) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const body = (await resp.json()).filter(isDiffPurgeEntry);
|
|
132
|
+
for (const { name: version } of body) {
|
|
133
|
+
if (result.candidate != null && version.includes("-rc")) {
|
|
134
|
+
result.candidate = version.substring(8);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (!version.includes("-rc")) {
|
|
138
|
+
result.stable = version.substring(8);
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 Release = {
|
|
13
|
+
// The current stable release
|
|
14
|
+
stable: string,
|
|
15
|
+
// The current candidate release. These are only populated if the latest release is a candidate release.
|
|
16
|
+
candidate?: string,
|
|
17
|
+
changelogUrl: string,
|
|
18
|
+
diffUrl: string,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Logs out a message if the user's version is behind a stable version of React Native
|
|
23
|
+
*/
|
|
24
|
+
declare export function logIfUpdateAvailable(
|
|
25
|
+
projectRoot: string
|
|
26
|
+
): Promise<void>;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Checks via GitHub API if there is a newer stable React Native release and,
|
|
30
|
+
* if it exists, returns the release data.
|
|
31
|
+
*
|
|
32
|
+
* If the latest release is not newer or if it's a prerelease, the function
|
|
33
|
+
* will return undefined.
|
|
34
|
+
*/
|
|
35
|
+
declare export default function getLatestRelease(
|
|
36
|
+
name: string,
|
|
37
|
+
currentVersion: string
|
|
38
|
+
): Promise<Release | void>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-native/community-cli-plugin",
|
|
3
|
-
"version": "0.76.0-nightly-
|
|
3
|
+
"version": "0.76.0-nightly-20240719-6d56cea28",
|
|
4
4
|
"description": "Core CLI commands for React Native",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react-native",
|
|
@@ -22,10 +22,8 @@
|
|
|
22
22
|
"dist"
|
|
23
23
|
],
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@react-native
|
|
26
|
-
"@react-native
|
|
27
|
-
"@react-native/dev-middleware": "0.76.0-nightly-20240715-2eb7bcb8d",
|
|
28
|
-
"@react-native/metro-babel-transformer": "0.76.0-nightly-20240715-2eb7bcb8d",
|
|
25
|
+
"@react-native/dev-middleware": "0.76.0-nightly-20240719-6d56cea28",
|
|
26
|
+
"@react-native/metro-babel-transformer": "0.76.0-nightly-20240719-6d56cea28",
|
|
29
27
|
"chalk": "^4.0.0",
|
|
30
28
|
"execa": "^5.1.1",
|
|
31
29
|
"metro": "^0.80.3",
|
|
@@ -37,6 +35,14 @@
|
|
|
37
35
|
"devDependencies": {
|
|
38
36
|
"metro-resolver": "^0.80.3"
|
|
39
37
|
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"@react-native-community/cli-server-api": "*"
|
|
40
|
+
},
|
|
41
|
+
"peerDependenciesMeta": {
|
|
42
|
+
"@react-native-community/cli-server-api": {
|
|
43
|
+
"optional": true
|
|
44
|
+
}
|
|
45
|
+
},
|
|
40
46
|
"engines": {
|
|
41
47
|
"node": ">=18"
|
|
42
48
|
}
|