Skip to content

Commit

Permalink
Fix Flow strategy
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
sebmarkbage committed Mar 6, 2020
1 parent bf499d4 commit fd4699d
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 18 deletions.
3 changes: 3 additions & 0 deletions scripts/flow/config/flowconfig
Expand Up @@ -14,6 +14,9 @@
.*/__mocks__/.*
.*/__tests__/.*

# TODO: noop should get its own inlinedHostConfig entry
.*/packages/react-noop-renderer/.*

%REACT_RENDERER_FLOW_IGNORES%

[include]
Expand Down
46 changes: 28 additions & 18 deletions scripts/flow/createFlowConfigs.js
Expand Up @@ -18,37 +18,43 @@ const configTemplate = fs
.readFileSync(__dirname + '/config/flowconfig')
.toString();

function writeConfig(renderer, isServerSupported) {
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='react-reconciler/inline.${renderer}$$' -> 'react-reconciler/inline-typed'
module.name_mapper='ReactFiberHostConfig$$' -> 'forks/ReactFiberHostConfig.${renderer}'
module.name_mapper='react-server/inline.${renderer}$$' -> 'react-server/inline-typed'
module.name_mapper='react-server/flight.inline.${renderer}$$' -> 'react-server/flight.inline-typed'
module.name_mapper='ReactServerHostConfig$$' -> 'forks/ReactServerHostConfig.${serverRenderer}'
module.name_mapper='ReactServerFormatConfig$$' -> 'forks/ReactServerFormatConfig.${serverRenderer}'
module.name_mapper='react-flight/inline.${renderer}$$' -> 'react-flight/inline-typed'
module.name_mapper='ReactFlightClientHostConfig$$' -> 'forks/ReactFlightClientHostConfig.${serverRenderer}'
`.trim(),
)
.replace(
'%REACT_RENDERER_FLOW_IGNORES%',
renderer === 'dom' || renderer === 'dom-browser'
? ''
: // If we're not checking DOM, ignore the DOM package since it
// won't be consistent.
`
.*/packages/react-dom/.*
.*/packages/.*/forks/.*.dom.js
.*/packages/.*/forks/.*.dom-browser.js
`.trim(),
);
.replace('%REACT_RENDERER_FLOW_IGNORES%', ignoredPaths.join('\n'));

const disclaimer = `
# ---------------------------------------------------------------#
Expand Down Expand Up @@ -81,6 +87,10 @@ ${disclaimer}
// so that we can run those checks in parallel if we want.
inlinedHostConfigs.forEach(rendererInfo => {
if (rendererInfo.isFlowTyped) {
writeConfig(rendererInfo.shortName, rendererInfo.isServerSupported);
writeConfig(
rendererInfo.shortName,
rendererInfo,
rendererInfo.isServerSupported,
);
}
});
26 changes: 26 additions & 0 deletions scripts/shared/inlinedHostConfigs.js
Expand Up @@ -16,40 +16,65 @@ module.exports = [
'react-flight-dom-webpack/server.node',
'react-flight-dom-webpack',
],
paths: [
'react-dom',
'react-dom/unstable-fizz',
'react-dom/unstable-fizz.node',
'react-dom/src/server/ReactDOMFizzServerNode.js', // react-dom/unstable-fizz.node
'react-flight-dom-webpack',
'react-flight-dom-webpack/server',
'react-flight-dom-webpack/server.node',
'react-flight-dom-webpack/src/ReactFlightDOMServerNode.js', // react-flight-dom-webpack/server.browser
],
isFlowTyped: true,
isServerSupported: true,
},
{
shortName: 'dom-browser',
entryPoints: [
'react-dom',
'react-dom/testing',
'react-dom/unstable-fizz.browser',
'react-flight-dom-webpack/server.browser',
'react-flight-dom-webpack',
],
paths: [
'react-dom',
'react-dom/testing',
'react-dom/unstable-fizz.browser',
'react-dom/src/server/ReactDOMFizzServerBrowser.js', // react-dom/unstable-fizz.browser
'react-flight-dom-webpack',
'react-flight-dom-webpack/server.browser',
'react-flight-dom-webpack/src/ReactFlightDOMServerBrowser.js', // react-flight-dom-webpack/server.browser
],
isFlowTyped: true,
isServerSupported: true,
},
{
shortName: 'art',
entryPoints: ['react-art'],
paths: ['react-art'],
isFlowTyped: false, // TODO: type it.
isServerSupported: false,
},
{
shortName: 'native',
entryPoints: ['react-native-renderer'],
paths: ['react-native-renderer'],
isFlowTyped: true,
isServerSupported: false,
},
{
shortName: 'fabric',
entryPoints: ['react-native-renderer/fabric'],
paths: ['react-native-renderer'],
isFlowTyped: true,
isServerSupported: false,
},
{
shortName: 'test',
entryPoints: ['react-test-renderer'],
paths: ['react-test-renderer'],
isFlowTyped: true,
isServerSupported: false,
},
Expand All @@ -61,6 +86,7 @@ module.exports = [
'react-server',
'react-server/flight',
],
paths: [],
isFlowTyped: true,
isServerSupported: true,
},
Expand Down

0 comments on commit fd4699d

Please sign in to comment.