Fix broken default getProjectRoots
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 https://github.com/facebook/react-native/pull/14412 Differential Revision: D5216887 Pulled By: hramos fbshipit-source-id: 7a3840ecf0ad8ea3f6d7bbd3d54e4f02950c6a32
This commit is contained in:
parent
c639a1f802
commit
f847fbe021
|
@ -1,111 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (c) 2015-present, Facebook, Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* This source code is licensed under the BSD-style license found in the
|
|
||||||
* LICENSE file in the root directory of this source tree. An additional grant
|
|
||||||
* of patent rights can be found in the PATENTS file in the same directory.
|
|
||||||
*
|
|
||||||
* @flow
|
|
||||||
*/
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const path = require('path');
|
|
||||||
const flatten = require('lodash').flatten;
|
|
||||||
const android = require('./android');
|
|
||||||
const findAssets = require('./findAssets');
|
|
||||||
const ios = require('./ios');
|
|
||||||
const windows = require('./windows');
|
|
||||||
const wrapCommands = require('./wrapCommands');
|
|
||||||
const findPlugins = require('./findPlugins');
|
|
||||||
const findSymlinksPaths = require('../util/findSymlinksPaths');
|
|
||||||
|
|
||||||
function getProjectPath() {
|
|
||||||
if (__dirname.match(/node_modules[\/\\]react-native[\/\\]local-cli[\/\\]core$/)) {
|
|
||||||
// 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 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 resolveSymlink = (roots) =>
|
|
||||||
roots.concat(
|
|
||||||
findSymlinksPaths(
|
|
||||||
path.join(getProjectPath(), 'node_modules'),
|
|
||||||
roots
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default configuration for the CLI.
|
|
||||||
*
|
|
||||||
* If you need to override any of this functions do so by defining the file
|
|
||||||
* `rn-cli.config.js` on the root of your project with the functions you need
|
|
||||||
* to tweak.
|
|
||||||
*/
|
|
||||||
const config = {
|
|
||||||
getProjectCommands() {
|
|
||||||
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() {
|
|
||||||
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 || [],
|
|
||||||
});
|
|
||||||
},
|
|
||||||
getProjectRoots() {
|
|
||||||
const root = process.env.REACT_NATIVE_APP_ROOT;
|
|
||||||
if (root) {
|
|
||||||
return resolveSymlink([path.resolve(root)]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return resolveSymlink([getProjectPath()]);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = config;
|
|
|
@ -10,9 +10,15 @@
|
||||||
*/
|
*/
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
const android = require('./android');
|
||||||
const Config = require('../util/Config');
|
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 minimist = require('minimist');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
|
@ -35,6 +41,61 @@ export type RNConfig = {
|
||||||
getDependencyConfig(pkgName: string): Object,
|
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
|
* Loads the CLI configuration
|
||||||
*/
|
*/
|
||||||
|
@ -44,7 +105,7 @@ function getCliConfig(): RNConfig {
|
||||||
? Config.loadFile(path.resolve(__dirname, cliArgs.config))
|
? Config.loadFile(path.resolve(__dirname, cliArgs.config))
|
||||||
: Config.findOptional(__dirname);
|
: Config.findOptional(__dirname);
|
||||||
|
|
||||||
return {...defaultConfig, ...config};
|
return {...defaultRNConfig, ...config};
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = getCliConfig();
|
module.exports = getCliConfig();
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
*/
|
*/
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
const findSymlinksPaths = require('./findSymlinksPaths');
|
||||||
|
|
||||||
const blacklist = require('metro-bundler/build/blacklist');
|
const blacklist = require('metro-bundler/build/blacklist');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const invariant = require('fbjs/lib/invariant');
|
const invariant = require('fbjs/lib/invariant');
|
||||||
|
@ -111,6 +113,26 @@ export type ConfigT = {
|
||||||
transformVariants: () => TransformVariants,
|
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.
|
* Module capable of getting the configuration out of a given file.
|
||||||
*
|
*
|
||||||
|
@ -126,7 +148,13 @@ const Config = {
|
||||||
getBlacklistRE: () => blacklist(),
|
getBlacklistRE: () => blacklist(),
|
||||||
getPlatforms: () => [],
|
getPlatforms: () => [],
|
||||||
getPolyfillModuleNames: () => [],
|
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(),
|
getProvidesModuleNodeModules: () => providesModuleNodeModules.slice(),
|
||||||
getSourceExts: () => [],
|
getSourceExts: () => [],
|
||||||
getTransformModulePath: () => require.resolve('metro-bundler/build/transformer.js'),
|
getTransformModulePath: () => require.resolve('metro-bundler/build/transformer.js'),
|
||||||
|
|
Loading…
Reference in New Issue