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 56fbdbb commit 4e9101e
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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 4e9101e

Please sign in to comment.