mirror of
https://github.com/facebook/react.git
synced 2026-02-22 20:01:52 +00:00
* Require deep for reconcilers * Delete inline* files * Delete react-reconciler/persistent This no longer makes any sense because it react-reconciler takes supportsMutation or supportsPersistence as options. It's no longer based on feature flags. * Fix jest mocking * Fix Flow strategy We now explicitly list which paths we want to be checked by a renderer. For every other renderer config we ignore those paths. Nothing is "any" typed. So if some transitive dependency isn't reachable it won't be accidentally "any" that leaks.
97 lines
2.7 KiB
JavaScript
97 lines
2.7 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.
|
|
*
|
|
* @flow
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const chalk = require('chalk');
|
|
const fs = require('fs');
|
|
const mkdirp = require('mkdirp');
|
|
const inlinedHostConfigs = require('../shared/inlinedHostConfigs');
|
|
|
|
const configTemplate = fs
|
|
.readFileSync(__dirname + '/config/flowconfig')
|
|
.toString();
|
|
|
|
function writeConfig(renderer, rendererInfo, isServerSupported) {
|
|
const folder = __dirname + '/' + renderer;
|
|
mkdirp.sync(folder);
|
|
|
|
const serverRenderer = isServerSupported ? renderer : 'custom';
|
|
|
|
let ignoredPaths = [];
|
|
|
|
inlinedHostConfigs.forEach(otherRenderer => {
|
|
if (otherRenderer === rendererInfo) {
|
|
return;
|
|
}
|
|
otherRenderer.paths.forEach(otherPath => {
|
|
if (rendererInfo.paths.indexOf(otherPath) !== -1) {
|
|
return;
|
|
}
|
|
ignoredPaths.push(`.*/packages/${otherPath}`);
|
|
});
|
|
|
|
if (otherRenderer.shortName !== serverRenderer) {
|
|
ignoredPaths.push(
|
|
`.*/packages/.*/forks/.*.${otherRenderer.shortName}.js`,
|
|
);
|
|
}
|
|
});
|
|
|
|
const config = configTemplate
|
|
.replace(
|
|
'%REACT_RENDERER_FLOW_OPTIONS%',
|
|
`
|
|
module.name_mapper='ReactFiberHostConfig$$' -> 'forks/ReactFiberHostConfig.${renderer}'
|
|
module.name_mapper='ReactServerHostConfig$$' -> 'forks/ReactServerHostConfig.${serverRenderer}'
|
|
module.name_mapper='ReactServerFormatConfig$$' -> 'forks/ReactServerFormatConfig.${serverRenderer}'
|
|
module.name_mapper='ReactFlightClientHostConfig$$' -> 'forks/ReactFlightClientHostConfig.${serverRenderer}'
|
|
`.trim(),
|
|
)
|
|
.replace('%REACT_RENDERER_FLOW_IGNORES%', ignoredPaths.join('\n'));
|
|
|
|
const disclaimer = `
|
|
# ---------------------------------------------------------------#
|
|
# NOTE: this file is generated. #
|
|
# If you want to edit it, open ./scripts/flow/config/flowconfig. #
|
|
# Then run Yarn for changes to take effect. #
|
|
# ---------------------------------------------------------------#
|
|
`.trim();
|
|
|
|
const configFile = folder + '/.flowconfig';
|
|
let oldConfig;
|
|
try {
|
|
oldConfig = fs.readFileSync(configFile).toString();
|
|
} catch (err) {
|
|
oldConfig = null;
|
|
}
|
|
const newConfig = `
|
|
${disclaimer}
|
|
${config}
|
|
${disclaimer}
|
|
`.trim();
|
|
|
|
if (newConfig !== oldConfig) {
|
|
fs.writeFileSync(configFile, newConfig);
|
|
console.log(chalk.dim('Wrote a Flow config to ' + configFile));
|
|
}
|
|
}
|
|
|
|
// Write multiple configs in different folders
|
|
// so that we can run those checks in parallel if we want.
|
|
inlinedHostConfigs.forEach(rendererInfo => {
|
|
if (rendererInfo.isFlowTyped) {
|
|
writeConfig(
|
|
rendererInfo.shortName,
|
|
rendererInfo,
|
|
rendererInfo.isServerSupported,
|
|
);
|
|
}
|
|
});
|