From 3e88ea8cbe2efc96107d5432690428edabc1ecea Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Mon, 27 Mar 2023 11:30:54 +0100 Subject: [PATCH 1/3] fix: Add runtime error when Metro config cannot be resolved --- .../src/tools/loadMetroConfig.ts | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts b/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts index 93288ab9e..28b7dbb69 100644 --- a/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts +++ b/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts @@ -1,5 +1,6 @@ import path from 'path'; -import {ConfigT, InputConfigT, loadConfig} from 'metro-config'; +import {ConfigT, InputConfigT, loadConfig, resolveConfig} from 'metro-config'; +import {CLIError, logger} from '@react-native-community/cli-tools'; import type {Config} from '@react-native-community/cli-types'; import {reactNativePlatformResolver} from './metroPlatformResolver'; @@ -69,13 +70,36 @@ export interface ConfigOptionsT { * Allows the CLI to override certain defaults in the base `metro.config.js` * based on dynamic user options in `ctx`. */ -export default function loadMetroConfig( +export default async function loadMetroConfig( ctx: ConfigLoadingContext, - options?: ConfigOptionsT, + options: ConfigOptionsT = {}, ): Promise { const overrideConfig = getOverrideConfig(ctx); - if (options && options.reporter) { + if (options.reporter) { overrideConfig.reporter = options.reporter; } + + const projectConfig = await resolveConfig(undefined, ctx.root); + + // @ts-ignore resolveConfig return value is mistyped + if (projectConfig.isEmpty) { + throw new CLIError(`No metro config found in ${ctx.root}`); + } + + // @ts-ignore resolveConfig return value is mistyped + logger.debug(`Reading Metro config from ${projectConfig.filepath}`); + + try { + require.resolve('@react-native/metro-config', { + paths: [ctx.root], + }); + } catch (e) { + console.warn( + 'warning: From React Native 0.72, your metro.config.js file should ' + + "extend '@react-native/metro-config', however this is not in your " + + "project's devDependencies.", + ); + } + return loadConfig({cwd: ctx.root, ...options}, overrideConfig); } From 86565a1a32f0ba04e3c753538d7b77fec15a3dc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Tue, 28 Mar 2023 11:48:13 -0500 Subject: [PATCH 2/3] Apply suggestions from code review --- packages/cli-plugin-metro/src/tools/loadMetroConfig.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts b/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts index 28b7dbb69..e3d8baccc 100644 --- a/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts +++ b/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts @@ -96,8 +96,8 @@ export default async function loadMetroConfig( } catch (e) { console.warn( 'warning: From React Native 0.72, your metro.config.js file should ' + - "extend '@react-native/metro-config', however this is not in your " + - "project's devDependencies.", + "extend '@react-native/metro-config', however it's not present in your " + + "project's devDependencies. Please install '@react-native/metro-config'.", ); } From 85b7d4abb8cd7efa089da40882fd3233643d88e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Tue, 28 Mar 2023 11:49:01 -0500 Subject: [PATCH 3/3] Update packages/cli-plugin-metro/src/tools/loadMetroConfig.ts --- packages/cli-plugin-metro/src/tools/loadMetroConfig.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts b/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts index e3d8baccc..34c66c8a8 100644 --- a/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts +++ b/packages/cli-plugin-metro/src/tools/loadMetroConfig.ts @@ -94,8 +94,8 @@ export default async function loadMetroConfig( paths: [ctx.root], }); } catch (e) { - console.warn( - 'warning: From React Native 0.72, your metro.config.js file should ' + + logger.warn( + "From React Native 0.72, your 'metro.config.js' file should " + "extend '@react-native/metro-config', however it's not present in your " + "project's devDependencies. Please install '@react-native/metro-config'.", );