mirror of
https://github.com/status-im/react-native.git
synced 2025-02-22 14:18:23 +00:00
Summary: This updates React Native to use latest CLI. We also create Metro configuration, because CLI looks for React Native in "node_modules" by default. Since we are running React Native from source, it will fail to find required files. To avoid hacky logic to detect if we are running from source backed into the CLI, I decided to leverage the Metro configuration instead. Pull Request resolved: https://github.com/facebook/react-native/pull/23052 Reviewed By: rickhanlonii Differential Revision: D13719938 Pulled By: cpojer fbshipit-source-id: 1f40a40b3cdbb07ccd42daf75feb457556d3e40f
123 lines
2.8 KiB
JavaScript
123 lines
2.8 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @format
|
|
* @flow
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const path = require('path');
|
|
|
|
const REACT_NATIVE_CI = process.cwd() === path.resolve(__dirname, '..');
|
|
|
|
let pluginsPath;
|
|
|
|
if (REACT_NATIVE_CI) {
|
|
pluginsPath = '..';
|
|
} else {
|
|
pluginsPath = '../../../';
|
|
}
|
|
|
|
function getPlugins() {
|
|
try {
|
|
// @todo do not rely on private files
|
|
const findPlugins = require('@react-native-community/cli/build/core/findPlugins');
|
|
|
|
return findPlugins(path.resolve(__dirname, pluginsPath));
|
|
} catch (e) {
|
|
return {
|
|
haste: {
|
|
providesModuleNodeModules: [],
|
|
platforms: [],
|
|
},
|
|
};
|
|
}
|
|
}
|
|
|
|
const plugins = getPlugins();
|
|
|
|
// Detect out-of-tree platforms and add them to the whitelists
|
|
const pluginRoots /*: Array<
|
|
string,
|
|
> */ = plugins.haste.providesModuleNodeModules.map(
|
|
name => path.resolve(__dirname, '../../', name) + path.sep,
|
|
);
|
|
|
|
const pluginNameReducers /*: Array<
|
|
[RegExp, string],
|
|
> */ = plugins.haste.platforms.map(name => [
|
|
new RegExp(`^(.*)\.(${name})$`),
|
|
'$1',
|
|
]);
|
|
|
|
const ROOTS = [path.resolve(__dirname, '..') + path.sep, ...pluginRoots];
|
|
|
|
const BLACKLISTED_PATTERNS /*: Array<RegExp> */ = [
|
|
/.*[\\\/]__(mocks|tests)__[\\\/].*/,
|
|
/^Libraries[\\\/]Animated[\\\/]src[\\\/]polyfills[\\\/].*/,
|
|
/^Libraries[\\\/]Renderer[\\\/]fb[\\\/].*/,
|
|
];
|
|
|
|
const WHITELISTED_PREFIXES /*: Array<string> */ = [
|
|
'IntegrationTests',
|
|
'Libraries',
|
|
'ReactAndroid',
|
|
'RNTester',
|
|
];
|
|
|
|
const NAME_REDUCERS /*: Array<[RegExp, string]> */ = [
|
|
// extract basename
|
|
[/^(?:.*[\\\/])?([a-zA-Z0-9$_.-]+)$/, '$1'],
|
|
// strip .js/.js.flow suffix
|
|
[/^(.*)\.js(\.flow)?$/, '$1'],
|
|
// strip platform suffix
|
|
[/^(.*)\.(android|ios|native)$/, '$1'],
|
|
// strip plugin platform suffixes
|
|
...pluginNameReducers,
|
|
];
|
|
|
|
const haste = {
|
|
/*
|
|
* @return {string|void} hasteName for module at filePath; or undefined if
|
|
* filePath is not a haste module
|
|
*/
|
|
getHasteName(
|
|
filePath /*: string */,
|
|
sourceCode /*: ?string */,
|
|
) /*: string | void */ {
|
|
if (!isHastePath(filePath)) {
|
|
return undefined;
|
|
}
|
|
|
|
const hasteName = NAME_REDUCERS.reduce(
|
|
(name, [pattern, replacement]) => name.replace(pattern, replacement),
|
|
filePath,
|
|
);
|
|
|
|
return hasteName;
|
|
},
|
|
};
|
|
|
|
function isHastePath(filePath /*: string */) /*: boolean */ {
|
|
if (!filePath.endsWith('.js') && !filePath.endsWith('.js.flow')) {
|
|
return false;
|
|
}
|
|
|
|
const root = ROOTS.find(r => filePath.startsWith(r));
|
|
if (!root) {
|
|
return false;
|
|
}
|
|
|
|
filePath = filePath.substr(root.length);
|
|
if (BLACKLISTED_PATTERNS.some(pattern => pattern.test(filePath))) {
|
|
return false;
|
|
}
|
|
return WHITELISTED_PREFIXES.some(prefix => filePath.startsWith(prefix));
|
|
}
|
|
|
|
module.exports = haste;
|