Skip to content
Merged
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
158 changes: 3 additions & 155 deletions packages/cli-config/src/index.ts
Original file line number Diff line number Diff line change
@@ -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];
157 changes: 157 additions & 0 deletions packages/cli-config/src/loadConfig.ts
Original file line number Diff line number Diff line change
@@ -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;
8 changes: 4 additions & 4 deletions packages/cli/src/commands/index.ts
Original file line number Diff line number Diff line change
@@ -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[];

Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/commands/install/install.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<string>, ctx: Config): Promise<void> {
const name = args[0];
Expand Down
2 changes: 1 addition & 1 deletion yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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==
Expand Down