diff --git a/packages/cli/src/commands/config/config.ts b/packages/cli-config/src/commands/config.ts similarity index 100% rename from packages/cli/src/commands/config/config.ts rename to packages/cli-config/src/commands/config.ts diff --git a/packages/cli-config/src/index.ts b/packages/cli-config/src/index.ts index 24e5c8887..f12851649 100644 --- a/packages/cli-config/src/index.ts +++ b/packages/cli-config/src/index.ts @@ -1,157 +1,5 @@ -import path from 'path'; -import chalk from 'chalk'; -import { - UserDependencyConfig, - ProjectConfig, - Dependency, - UserConfig, - Config, -} from '@react-native-community/cli-types'; -import { - logger, - inlineString, - findProjectRoot, - resolveNodeModuleDir, -} from '@react-native-community/cli-tools'; -import findDependencies from './findDependencies'; -import resolveReactNativePath from './resolveReactNativePath'; -import findAssets from './findAssets'; -import { - readConfigFromDisk, - readDependencyConfigFromDisk, -} from './readConfigFromDisk'; -import assign from './assign'; -import merge from './merge'; +import config from './commands/config'; -function getDependencyConfig( - root: string, - dependencyName: string, - finalConfig: Config, - config: UserDependencyConfig, - userConfig: UserConfig, - isPlatform: boolean, -): Dependency { - return merge( - { - root, - name: dependencyName, - platforms: Object.keys(finalConfig.platforms).reduce( - (dependency, platform) => { - const platformConfig = finalConfig.platforms[platform]; - dependency[platform] = - // Linking platforms is not supported - isPlatform || !platformConfig - ? null - : platformConfig.dependencyConfig( - root, - config.dependency.platforms[platform], - ); - return dependency; - }, - {} as Config['platforms'], - ), - assets: findAssets(root, config.dependency.assets), - hooks: config.dependency.hooks, - params: config.dependency.params, - }, - userConfig.dependencies[dependencyName] || {}, - ) as Dependency; -} +export {default} from './loadConfig'; -/** - * Loads CLI configuration - */ -function loadConfig(projectRoot: string = findProjectRoot()): Config { - let lazyProject: ProjectConfig; - const userConfig = readConfigFromDisk(projectRoot); - - const initialConfig: Config = { - root: projectRoot, - get reactNativePath() { - return userConfig.reactNativePath - ? path.resolve(projectRoot, userConfig.reactNativePath) - : resolveReactNativePath(projectRoot); - }, - dependencies: userConfig.dependencies, - commands: userConfig.commands, - get assets() { - return findAssets(projectRoot, userConfig.assets); - }, - healthChecks: [], - platforms: userConfig.platforms, - get project() { - if (lazyProject) { - return lazyProject; - } - - lazyProject = {}; - for (const platform in finalConfig.platforms) { - const platformConfig = finalConfig.platforms[platform]; - if (platformConfig) { - lazyProject[platform] = platformConfig.projectConfig( - projectRoot, - userConfig.project[platform] || {}, - ); - } - } - - return lazyProject; - }, - }; - - const finalConfig = Array.from( - new Set([ - ...Object.keys(userConfig.dependencies), - ...findDependencies(projectRoot), - ]), - ).reduce((acc: Config, dependencyName) => { - const localDependencyRoot = - userConfig.dependencies[dependencyName] && - userConfig.dependencies[dependencyName].root; - let root: string; - let config: UserDependencyConfig; - try { - root = - localDependencyRoot || - resolveNodeModuleDir(projectRoot, dependencyName); - config = readDependencyConfigFromDisk(root); - } catch (error) { - logger.warn( - inlineString(` - Package ${chalk.bold( - dependencyName, - )} has been ignored because it contains invalid configuration. - - Reason: ${chalk.dim(error.message)}`), - ); - return acc; - } - - const isPlatform = Object.keys(config.platforms).length > 0; - - return assign({}, acc, { - dependencies: assign({}, acc.dependencies, { - get [dependencyName](): Dependency { - return getDependencyConfig( - root, - dependencyName, - finalConfig, - config, - userConfig, - isPlatform, - ); - }, - }), - commands: [...acc.commands, ...config.commands], - platforms: { - ...acc.platforms, - ...config.platforms, - }, - healthChecks: [...acc.healthChecks, ...config.healthChecks], - }) as Config; - }, initialConfig); - - return finalConfig; -} - -export default loadConfig; +export const commands = [config]; diff --git a/packages/cli-config/src/loadConfig.ts b/packages/cli-config/src/loadConfig.ts new file mode 100644 index 000000000..24e5c8887 --- /dev/null +++ b/packages/cli-config/src/loadConfig.ts @@ -0,0 +1,157 @@ +import path from 'path'; +import chalk from 'chalk'; +import { + UserDependencyConfig, + ProjectConfig, + Dependency, + UserConfig, + Config, +} from '@react-native-community/cli-types'; +import { + logger, + inlineString, + findProjectRoot, + resolveNodeModuleDir, +} from '@react-native-community/cli-tools'; +import findDependencies from './findDependencies'; +import resolveReactNativePath from './resolveReactNativePath'; +import findAssets from './findAssets'; +import { + readConfigFromDisk, + readDependencyConfigFromDisk, +} from './readConfigFromDisk'; +import assign from './assign'; +import merge from './merge'; + +function getDependencyConfig( + root: string, + dependencyName: string, + finalConfig: Config, + config: UserDependencyConfig, + userConfig: UserConfig, + isPlatform: boolean, +): Dependency { + return merge( + { + root, + name: dependencyName, + platforms: Object.keys(finalConfig.platforms).reduce( + (dependency, platform) => { + const platformConfig = finalConfig.platforms[platform]; + dependency[platform] = + // Linking platforms is not supported + isPlatform || !platformConfig + ? null + : platformConfig.dependencyConfig( + root, + config.dependency.platforms[platform], + ); + return dependency; + }, + {} as Config['platforms'], + ), + assets: findAssets(root, config.dependency.assets), + hooks: config.dependency.hooks, + params: config.dependency.params, + }, + userConfig.dependencies[dependencyName] || {}, + ) as Dependency; +} + +/** + * Loads CLI configuration + */ +function loadConfig(projectRoot: string = findProjectRoot()): Config { + let lazyProject: ProjectConfig; + const userConfig = readConfigFromDisk(projectRoot); + + const initialConfig: Config = { + root: projectRoot, + get reactNativePath() { + return userConfig.reactNativePath + ? path.resolve(projectRoot, userConfig.reactNativePath) + : resolveReactNativePath(projectRoot); + }, + dependencies: userConfig.dependencies, + commands: userConfig.commands, + get assets() { + return findAssets(projectRoot, userConfig.assets); + }, + healthChecks: [], + platforms: userConfig.platforms, + get project() { + if (lazyProject) { + return lazyProject; + } + + lazyProject = {}; + for (const platform in finalConfig.platforms) { + const platformConfig = finalConfig.platforms[platform]; + if (platformConfig) { + lazyProject[platform] = platformConfig.projectConfig( + projectRoot, + userConfig.project[platform] || {}, + ); + } + } + + return lazyProject; + }, + }; + + const finalConfig = Array.from( + new Set([ + ...Object.keys(userConfig.dependencies), + ...findDependencies(projectRoot), + ]), + ).reduce((acc: Config, dependencyName) => { + const localDependencyRoot = + userConfig.dependencies[dependencyName] && + userConfig.dependencies[dependencyName].root; + let root: string; + let config: UserDependencyConfig; + try { + root = + localDependencyRoot || + resolveNodeModuleDir(projectRoot, dependencyName); + config = readDependencyConfigFromDisk(root); + } catch (error) { + logger.warn( + inlineString(` + Package ${chalk.bold( + dependencyName, + )} has been ignored because it contains invalid configuration. + + Reason: ${chalk.dim(error.message)}`), + ); + return acc; + } + + const isPlatform = Object.keys(config.platforms).length > 0; + + return assign({}, acc, { + dependencies: assign({}, acc.dependencies, { + get [dependencyName](): Dependency { + return getDependencyConfig( + root, + dependencyName, + finalConfig, + config, + userConfig, + isPlatform, + ); + }, + }), + commands: [...acc.commands, ...config.commands], + platforms: { + ...acc.platforms, + ...config.platforms, + }, + healthChecks: [...acc.healthChecks, ...config.healthChecks], + }) as Config; + }, initialConfig); + + return finalConfig; +} + +export default loadConfig; diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index d8e5f9588..c79db2ff8 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -1,24 +1,24 @@ import {Command, DetachedCommand} from '@react-native-community/cli-types'; +import {commands as doctorCommands} from '@react-native-community/cli-doctor'; +import {commands as configCommands} from '@react-native-community/cli-config'; import {commands as metroCommands} from '@react-native-community/cli-plugin-metro'; +import profileHermes from '@react-native-community/cli-hermes'; import link from './link/link'; import unlink from './link/unlink'; import install from './install/install'; import uninstall from './install/uninstall'; import upgrade from './upgrade/upgrade'; -import {commands as doctorCommands} from '@react-native-community/cli-doctor'; -import config from './config/config'; import init from './init'; -import profileHermes from '@react-native-community/cli-hermes'; export const projectCommands = [ ...metroCommands, + ...configCommands, doctorCommands.info, link, unlink, install, uninstall, upgrade, - config, profileHermes, ] as Command[]; diff --git a/packages/cli/src/commands/install/install.ts b/packages/cli/src/commands/install/install.ts index e65a8139f..b4a830d5d 100644 --- a/packages/cli/src/commands/install/install.ts +++ b/packages/cli/src/commands/install/install.ts @@ -8,8 +8,8 @@ import {logger} from '@react-native-community/cli-tools'; import * as PackageManager from '../../tools/packageManager'; import link from '../link/link'; -import loadConfig from '@react-native-community/cli-config'; import {Config} from '@react-native-community/cli-types'; +import loadConfig from '@react-native-community/cli-config'; async function install(args: Array, ctx: Config): Promise { const name = args[0]; diff --git a/yarn.lock b/yarn.lock index d71278683..279d93dc7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9293,7 +9293,7 @@ ora@^2.1.0: strip-ansi "^4.0.0" wcwidth "^1.0.1" -ora@^5.6.0: +ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==