mirror of
https://github.com/status-im/react-native.git
synced 2025-02-24 15:18:10 +00:00
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';
|
||||
|
||||
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');
|
||||
|
||||
@ -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
|
||||
*/
|
||||
@ -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();
|
||||
|
@ -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');
|
||||
@ -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.
|
||||
*
|
||||
@ -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'),
|
||||
|
Loading…
x
Reference in New Issue
Block a user