diff --git a/packages/cli/src/tools/config/__mocks__/resolveNodeModuleDir.js b/packages/cli/src/tools/config/__mocks__/resolveNodeModuleDir.js new file mode 100644 index 000000000..d85dee2ae --- /dev/null +++ b/packages/cli/src/tools/config/__mocks__/resolveNodeModuleDir.js @@ -0,0 +1,12 @@ +/** + * @flow + */ + +const path = require('path'); + +export default function resolveNodeModuleDir( + root: string, + packageName: string, +): string { + return path.join(root, 'node_modules', packageName); +} diff --git a/packages/cli/src/tools/config/__tests__/findDependencies-test.js b/packages/cli/src/tools/config/__tests__/findDependencies-test.js index d807cad03..779aeeb19 100644 --- a/packages/cli/src/tools/config/__tests__/findDependencies-test.js +++ b/packages/cli/src/tools/config/__tests__/findDependencies-test.js @@ -10,6 +10,8 @@ import { getTempDirectory, } from '../../../../../../jest/helpers'; +jest.mock('../resolveNodeModuleDir'); + beforeEach(() => { cleanup(DIR); jest.resetModules(); diff --git a/packages/cli/src/tools/config/__tests__/index-test.js b/packages/cli/src/tools/config/__tests__/index-test.js index bc4821f65..5a1953b3a 100644 --- a/packages/cli/src/tools/config/__tests__/index-test.js +++ b/packages/cli/src/tools/config/__tests__/index-test.js @@ -12,6 +12,8 @@ import { import {logger} from '@react-native-community/cli-tools'; +jest.mock('../resolveNodeModuleDir'); + const DIR = getTempDirectory('resolve_config_path_test'); // Removes string from all key/values within an object diff --git a/packages/cli/src/tools/config/index.js b/packages/cli/src/tools/config/index.js index ad3be6707..9c402b84e 100644 --- a/packages/cli/src/tools/config/index.js +++ b/packages/cli/src/tools/config/index.js @@ -19,6 +19,7 @@ import {type ConfigT} from 'types'; import assign from '../assign'; import merge from '../merge'; +import resolveNodeModuleDir from './resolveNodeModuleDir'; /** * Built-in platforms */ @@ -34,10 +35,10 @@ function loadConfig(projectRoot: string = process.cwd()): ConfigT { const finalConfig = findDependencies(projectRoot).reduce( (acc: ConfigT, dependencyName) => { - const root = path.join(projectRoot, 'node_modules', dependencyName); - + let root; let config; try { + root = resolveNodeModuleDir(projectRoot, dependencyName); config = readLegacyDependencyConfigFromDisk(root) || readDependencyConfigFromDisk(root); diff --git a/packages/cli/src/tools/config/resolveNodeModuleDir.js b/packages/cli/src/tools/config/resolveNodeModuleDir.js new file mode 100644 index 000000000..09a0e4917 --- /dev/null +++ b/packages/cli/src/tools/config/resolveNodeModuleDir.js @@ -0,0 +1,19 @@ +/** + * @flow + */ +import path from 'path'; + +/** + * Finds a path inside `node_modules` + */ +export default function resolveNodeModuleDir( + root: string, + packageName: string, +): string { + return path.dirname( + // $FlowIssue: Wrong `require.resolve` type definition + require.resolve(path.join(packageName, 'package.json'), { + paths: [root], + }), + ); +} diff --git a/packages/cli/src/tools/config/resolveReactNativePath.js b/packages/cli/src/tools/config/resolveReactNativePath.js index d814c2a6e..dbce4e5c8 100644 --- a/packages/cli/src/tools/config/resolveReactNativePath.js +++ b/packages/cli/src/tools/config/resolveReactNativePath.js @@ -1,21 +1,17 @@ /** * @flow */ -import path from 'path'; import {CLIError} from '@react-native-community/cli-tools'; +import resolveNodeModuleDir from './resolveNodeModuleDir'; + /** * Finds path to React Native inside `node_modules` or throws * an error otherwise. */ export default function resolveReactNativePath(root: string) { try { - return path.dirname( - // $FlowIssue: Wrong `require.resolve` type definition - require.resolve('react-native/package.json', { - paths: [root], - }), - ); + return resolveNodeModuleDir(root, 'react-native'); } catch (_ignored) { throw new CLIError(` Unable to find React Native files. Make sure "react-native" module is installed