Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 32 additions & 2 deletions packages/cli-config/src/loadConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,15 +84,37 @@ const removeDuplicateCommands = <T extends boolean>(commands: Command<T>[]) => {
return Array.from(uniqueCommandsMap.values());
};

/**
* Returns the built-in platforms to seed the config with, honoring the
* `selectedPlatform` filter the same way dependency platforms are filtered. The
* project's own and dependencies' platforms are layered on top of these.
*/
const getBasePlatforms = (
platforms: Config['platforms'] | undefined,
selectedPlatform: string | undefined,
): {[platform: string]: Config['platforms'][string]} => {
if (!platforms) {
return {};
}
if (selectedPlatform != null) {
return platforms[selectedPlatform]
? {[selectedPlatform]: platforms[selectedPlatform]}
: {};
}
return platforms;
};

/**
* Loads CLI configuration
*/
export default function loadConfig({
projectRoot = findProjectRoot(),
selectedPlatform,
platforms,
}: {
projectRoot?: string;
selectedPlatform?: string;
platforms?: Config['platforms'];
}): Config {
let lazyProject: ProjectConfig;
const userConfig = readConfigFromDisk(projectRoot);
Expand All @@ -110,7 +132,10 @@ export default function loadConfig({
dependencies: userConfig.dependencies,
commands: userConfig.commands,
healthChecks: userConfig.healthChecks || [],
platforms: userConfig.platforms,
platforms: {
...getBasePlatforms(platforms, selectedPlatform),
...userConfig.platforms,
},
assets: userConfig.assets,
get project() {
if (lazyProject) {
Expand Down Expand Up @@ -188,9 +213,11 @@ export default function loadConfig({
export async function loadConfigAsync({
projectRoot = findProjectRoot(),
selectedPlatform,
platforms,
}: {
projectRoot?: string;
selectedPlatform?: string;
platforms?: Config['platforms'];
}): Promise<Config> {
let lazyProject: ProjectConfig;
const userConfig = await readConfigFromDiskAsync(projectRoot);
Expand All @@ -208,7 +235,10 @@ export async function loadConfigAsync({
dependencies: userConfig.dependencies,
commands: userConfig.commands,
healthChecks: userConfig.healthChecks || [],
platforms: userConfig.platforms,
platforms: {
...getBasePlatforms(platforms, selectedPlatform),
...userConfig.platforms,
},
assets: userConfig.assets,
get project() {
if (lazyProject) {
Expand Down
2 changes: 2 additions & 0 deletions packages/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
"@react-native-community/cli-clean": "20.2.0",
"@react-native-community/cli-config": "20.2.0",
"@react-native-community/cli-doctor": "20.2.0",
"@react-native-community/cli-platform-android": "20.2.0",
"@react-native-community/cli-platform-ios": "20.2.0",
"@react-native-community/cli-server-api": "20.2.0",
"@react-native-community/cli-tools": "20.2.0",
"@react-native-community/cli-types": "20.2.0",
Expand Down
4 changes: 4 additions & 0 deletions packages/cli/src/commands/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@ import {Command, DetachedCommand} from '@react-native-community/cli-types';
import {commands as cleanCommands} from '@react-native-community/cli-clean';
import {commands as doctorCommands} from '@react-native-community/cli-doctor';
import {commands as configCommands} from '@react-native-community/cli-config';
import {commands as androidCommands} from '@react-native-community/cli-platform-android';
import {commands as iosCommands} from '@react-native-community/cli-platform-ios';
import init from './init';

export const projectCommands = [
...configCommands,
cleanCommands.clean,
doctorCommands.info,
...iosCommands,
...androidCommands,
] as Command[];

export const detachedCommands = [
Expand Down
28 changes: 28 additions & 0 deletions packages/cli/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@ import type {
Config,
DetachedCommand,
} from '@react-native-community/cli-types';
import {
projectConfig as androidProjectConfig,
dependencyConfig as androidDependencyConfig,
} from '@react-native-community/cli-platform-android';
import {
projectConfig as iosProjectConfig,
dependencyConfig as iosDependencyConfig,
} from '@react-native-community/cli-platform-ios';
import childProcess from 'child_process';
import {Command as CommanderCommand} from 'commander';
import path from 'path';
Expand Down Expand Up @@ -197,6 +205,26 @@ async function setupAndRun(platformName?: string) {

config = await loadConfigAsync({
selectedPlatform,
// iOS and Android are core platforms bundled with the CLI, so they are
// always registered. The project's own and dependencies' configs can
// still override them.
//
// The cast is needed because the platform packages' `projectConfig`/
// `dependencyConfig` return `null` and take required params, whereas the
// `PlatformConfig` interface models these as `void`. These functions are
// the canonical implementations the CLI already calls via the config scan.
platforms: {
ios: {
npmPackageName: '@react-native-community/cli-platform-ios',
projectConfig: iosProjectConfig,
dependencyConfig: iosDependencyConfig,
},
android: {
npmPackageName: '@react-native-community/cli-platform-android',
projectConfig: androidProjectConfig,
dependencyConfig: androidDependencyConfig,
},
} as Config['platforms'],
});

logger.enable();
Expand Down
2 changes: 2 additions & 0 deletions packages/cli/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
{"path": "../cli-config"},
{"path": "../cli-doctor"},
{"path": "../cli-link-assets"},
{"path": "../cli-platform-android"},
{"path": "../cli-platform-ios"},
{"path": "../cli-server-api"},
{"path": "../cli-types"},
{"path": "../cli-tools"}
Expand Down
Loading