/
githubmirror
/
react-native
Обзор
Документация
Войти
/
githubmirror
/
react-native
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
packages/community-cli-plugin/src/utils/loadMetroConfig.js
124 строки
3 KB
Alex Hunt
Remove RN metro-config migration checks (#57648)
23 июл 2026, 16:52
23 июл 2026, 16:52
bf691fa
Код
Авторство
О чём код?
/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow strict-local * @format */ import type {Config} from '@react-native-community/cli-types'; import type {MetroConfig} from 'metro'; import {CLIError} from './errors'; import {reactNativePlatformResolver} from './metroPlatformResolver'; import {loadConfig, resolveConfig} from 'metro'; const debug = require('debug')('ReactNative:CommunityCliPlugin'); type HydratedMetroConfig = Awaited<ReturnType<typeof loadConfig>>; type ArgvInput = Parameters<typeof loadConfig>[0]; export type {Config}; export type ConfigLoadingContext = Readonly<{ root: Config['root'], platforms: Config['platforms'], ... }>; /** * Get the config options to override based on RN CLI inputs. */ function getCommunityCliDefaultConfig( ctx: ConfigLoadingContext, config: HydratedMetroConfig, ): MetroConfig { const outOfTreePlatforms = Object.keys(ctx.platforms).filter( platform => ctx.platforms[platform].npmPackageName, ); const resolver: Partial<{...HydratedMetroConfig['resolver']}> = { platforms: [...Object.keys(ctx.platforms), 'native'], }; if (outOfTreePlatforms.length) { resolver.resolveRequest = reactNativePlatformResolver( outOfTreePlatforms.reduce<{[platform: string]: string}>( (result, platform) => { result[platform] = ctx.platforms[platform].npmPackageName; return result; }, {}, ), config.resolver?.resolveRequest, ); } return { resolver, serializer: { // We can include multiple copies of setup-env here because Metro will // only add ones that are already part of the bundle getModulesRunBeforeMainModule: () => [ require.resolve('react-native/setup-env', { paths: [ctx.root], }), ...outOfTreePlatforms.map(platform => require.resolve( `${ctx.platforms[platform].npmPackageName}/setup-env`, {paths: [ctx.root]}, ), ), ], }, }; } /** * Load Metro config. * * Allows the CLI to override select values in `metro.config.js` based on * dynamic user options in `ctx`. */ export default async function loadMetroConfig( ctx: ConfigLoadingContext, options: NonNullable<ArgvInput> = {}, ): Promise<HydratedMetroConfig> { let RNMetroConfig = null; try { RNMetroConfig = require('@react-native/metro-config'); } catch (e) { throw new Error( "Cannot resolve `@react-native/metro-config`. Ensure it is listed in your project's `devDependencies`.", ); } // Get the RN defaults before our customisations const defaultConfig = RNMetroConfig.getDefaultConfig(ctx.root); // Add our defaults to `@react-native/metro-config` before the user config // loads them. if (typeof RNMetroConfig.setFrameworkDefaults !== 'function') { throw new Error( '`@react-native/metro-config` does not have the expected API. Ensure it matches your React Native version.', ); } RNMetroConfig.setFrameworkDefaults( getCommunityCliDefaultConfig(ctx, defaultConfig), ); const cwd = ctx.root; const projectConfig = await resolveConfig(options.config, cwd); if (projectConfig.isEmpty) { throw new CLIError(`No Metro config found in ${cwd}`); } debug(`Reading Metro config from ${projectConfig.filepath}`); return loadConfig({ cwd, ...options, }); }