Skip to content

Commit

Permalink
Fix broken default getProjectRoots
Browse files Browse the repository at this point in the history
Summary:
In <= 0.44, the default implementation of getProjectRoots() came from `local-cli/core/default.config.js`. With changes happening in the CLI and the packager over the course of the last two months, various pieces of this logic (specifically `local-cli/utils/Config.js`) were rewritten, and though default.config.js was still being imported and used in `local-cli/core/index.js`, the default `getProjectRoots()` was being overriden by the defaults specified in `local-cli/utils/Config.js`.

This PR moves the logic from default.config.js into Config.js and index.js, as appropriate. Specifically:

- The `getProjectCommands()`, `getProjectConfig()`, and `getDependencyConfig()` methods, which have traditionally not been part of the rn-cli.config.js spec, are now defined in `local-cli/core/index.js`.
- The `getProjectRoots()` method, which contained logic for properly resolving the _actual_ project root as well as resolving symlinks within that root, has been moved to `local-cli/utils/Config.js`, to match the fact that other default  rn-cli.config.js definitions live there.
Closes #14412

Differential Revision: D5216887

Pulled By: hramos

fbshipit-source-id: 7a3840ecf0ad8ea3f6d7bbd3d54e4f02950c6a32
  • Loading branch information
Adam Miskiewicz authored and facebook-github-bot committed Jun 9, 2017
1 parent c639a1f commit f847fbe
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 114 deletions.
111 changes: 0 additions & 111 deletions local-cli/core/default.config.js

This file was deleted.

65 changes: 63 additions & 2 deletions local-cli/core/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,15 @@
*/
'use strict';

const android = require('./android');
const Config = require('../util/Config');
const findPlugins = require('./findPlugins');
const findAssets = require('./findAssets');
const ios = require('./ios');
const windows = require('./windows');
const wrapCommands = require('./wrapCommands');

const defaultConfig = require('./default.config');
const flatten = require('lodash').flatten;
const minimist = require('minimist');
const path = require('path');

Expand All @@ -35,6 +41,61 @@ export type RNConfig = {
getDependencyConfig(pkgName: string): Object,
};

const getRNPMConfig = (folder) =>
// $FlowFixMe non-literal require
require(path.join(folder, './package.json')).rnpm || {};

const attachPackage = (command, pkg) => Array.isArray(command)
? command.map(cmd => attachPackage(cmd, pkg))
: { ...command, pkg };

const defaultRNConfig = {
getProjectCommands(): Array<CommandT> {
const appRoot = process.cwd();
const plugins = findPlugins([appRoot])
.map(pathToCommands => {
const name = pathToCommands.split(path.sep)[0];

return attachPackage(
// $FlowFixMe non-literal require
require(path.join(appRoot, 'node_modules', pathToCommands)),
// $FlowFixMe non-literal require
require(path.join(appRoot, 'node_modules', name, 'package.json'))
);
});

return flatten(plugins);
},

getProjectConfig(): Object {
const folder = process.cwd();
const rnpm = getRNPMConfig(folder);

return Object.assign({}, rnpm, {
ios: ios.projectConfig(folder, rnpm.ios || {}),
android: android.projectConfig(folder, rnpm.android || {}),
windows: windows.projectConfig(folder, rnpm.windows || {}),
assets: findAssets(folder, rnpm.assets),
});
},

getDependencyConfig(packageName: string) {
const folder = path.join(process.cwd(), 'node_modules', packageName);
const rnpm = getRNPMConfig(
path.join(process.cwd(), 'node_modules', packageName)
);

return Object.assign({}, rnpm, {
ios: ios.dependencyConfig(folder, rnpm.ios || {}),
android: android.dependencyConfig(folder, rnpm.android || {}),
windows: windows.dependencyConfig(folder, rnpm.windows || {}),
assets: findAssets(folder, rnpm.assets),
commands: wrapCommands(rnpm.commands),
params: rnpm.params || [],
});
},
};

/**
* Loads the CLI configuration
*/
Expand All @@ -44,7 +105,7 @@ function getCliConfig(): RNConfig {
? Config.loadFile(path.resolve(__dirname, cliArgs.config))
: Config.findOptional(__dirname);

return {...defaultConfig, ...config};
return {...defaultRNConfig, ...config};
}

module.exports = getCliConfig();
30 changes: 29 additions & 1 deletion local-cli/util/Config.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
*/
'use strict';

const findSymlinksPaths = require('./findSymlinksPaths');

const blacklist = require('metro-bundler/build/blacklist');
const fs = require('fs');
const invariant = require('fbjs/lib/invariant');
Expand Down Expand Up @@ -111,6 +113,26 @@ export type ConfigT = {
transformVariants: () => TransformVariants,
};

function getProjectPath() {
if (__dirname.match(/node_modules[\/\\]react-native[\/\\]local-cli[\/\\]util$/)) {
// Packager is running from node_modules.
// This is the default case for all projects created using 'react-native init'.
return path.resolve(__dirname, '../../../..');
} else if (__dirname.match(/Pods[\/\\]React[\/\\]packager$/)) {
// React Native was installed using CocoaPods.
return path.resolve(__dirname, '../../../..');
}
return path.resolve(__dirname, '../..');
}

const resolveSymlink = (roots) =>
roots.concat(
findSymlinksPaths(
path.join(getProjectPath(), 'node_modules'),
roots
)
);

/**
* Module capable of getting the configuration out of a given file.
*
Expand All @@ -126,7 +148,13 @@ const Config = {
getBlacklistRE: () => blacklist(),
getPlatforms: () => [],
getPolyfillModuleNames: () => [],
getProjectRoots: () => [process.cwd()],
getProjectRoots: () => {
const root = process.env.REACT_NATIVE_APP_ROOT;
if (root) {
return resolveSymlink([path.resolve(root)]);
}
return resolveSymlink([getProjectPath()]);
},
getProvidesModuleNodeModules: () => providesModuleNodeModules.slice(),
getSourceExts: () => [],
getTransformModulePath: () => require.resolve('metro-bundler/build/transformer.js'),
Expand Down

0 comments on commit f847fbe

Please sign in to comment.