diff --git a/.eslintrc.js b/.eslintrc.js index 82abfbe632e21..e8ace6311d8dc 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -547,12 +547,10 @@ module.exports = { }, globals: { - $ElementType: 'readonly', $Flow$ModuleRef: 'readonly', $FlowFixMe: 'readonly', $Keys: 'readonly', $NonMaybeType: 'readonly', - $PropertyType: 'readonly', $ReadOnly: 'readonly', $ReadOnlyArray: 'readonly', $ArrayBufferView: 'readonly', @@ -567,6 +565,7 @@ module.exports = { BigInt: 'readonly', BigInt64Array: 'readonly', BigUint64Array: 'readonly', + CacheType: 'readonly', Class: 'readonly', ClientRect: 'readonly', CopyInspectedElementPath: 'readonly', @@ -586,9 +585,7 @@ module.exports = { NavigateEvent: 'readonly', PropagationPhases: 'readonly', PropertyDescriptor: 'readonly', - React$AbstractComponent: 'readonly', React$Component: 'readonly', - React$ComponentType: 'readonly', React$Config: 'readonly', React$Context: 'readonly', React$Element: 'readonly', diff --git a/flow-typed/environments/node.js b/flow-typed/environments/node.js index 66d20232a3395..a3edff20f893b 100644 --- a/flow-typed/environments/node.js +++ b/flow-typed/environments/node.js @@ -3236,7 +3236,7 @@ declare module 'util' { declare class TextDecoder { constructor( encoding?: string, - options: { + options?: { fatal?: boolean, ignoreBOM?: boolean, ... @@ -3253,8 +3253,12 @@ declare module 'util' { declare class TextEncoder { constructor(): void; - encode(input?: string): Uint8Array; - encoding: string; + encode(input: string): Uint8Array; + encodeInto( + input: string, + buffer: Uint8Array + ): {written: number, read: number}; + encoding: 'utf-8'; } declare var types: { diff --git a/package.json b/package.json index 2a83ef95f2090..f5b3052010c30 100644 --- a/package.json +++ b/package.json @@ -74,8 +74,8 @@ "eslint-plugin-react-internal": "link:./scripts/eslint-rules", "fbjs-scripts": "^3.0.1", "filesize": "^6.0.1", - "flow-bin": "^0.263", - "flow-remove-types": "^2.263", + "flow-bin": "^0.274", + "flow-remove-types": "^2.274", "flow-typed": "^4.1.1", "glob": "^7.1.6", "glob-stream": "^6.1.0", diff --git a/packages/internal-test-utils/enqueueTask.js b/packages/internal-test-utils/enqueueTask.js index 9ddcf1d5cab53..1edb75a7b1806 100644 --- a/packages/internal-test-utils/enqueueTask.js +++ b/packages/internal-test-utils/enqueueTask.js @@ -11,6 +11,7 @@ const {MessageChannel} = require('node:worker_threads'); export default function enqueueTask(task: () => void): void { const channel = new MessageChannel(); + // $FlowFixMe[prop-missing] channel.port1.onmessage = () => { channel.port1.close(); task(); diff --git a/packages/react-devtools-inline/src/frontend.js b/packages/react-devtools-inline/src/frontend.js index 056d5d2c27052..b8d1b2ef4d811 100644 --- a/packages/react-devtools-inline/src/frontend.js +++ b/packages/react-devtools-inline/src/frontend.js @@ -52,7 +52,7 @@ export function initialize( bridge?: FrontendBridge, store?: Store, } = {}, -): React.ComponentType { +): component(...props: Props) { if (bridge == null) { bridge = createBridge(contentWindow); } diff --git a/packages/react-devtools-shared/src/backend/fiber/renderer.js b/packages/react-devtools-shared/src/backend/fiber/renderer.js index 710b19097ea29..88a9b70093fd1 100644 --- a/packages/react-devtools-shared/src/backend/fiber/renderer.js +++ b/packages/react-devtools-shared/src/backend/fiber/renderer.js @@ -1317,9 +1317,9 @@ export function attach( if (componentLogsEntry === undefined) { componentLogsEntry = { errors: new Map(), - errorsCount: 0, + errorsCount: 0 as number, warnings: new Map(), - warningsCount: 0, + warningsCount: 0 as number, }; fiberToComponentLogsMap.set(fiber, componentLogsEntry); } @@ -6705,7 +6705,7 @@ export function attach( if (isMostRecentlyInspectedElement(id) && !forceFullData) { if (!hasElementUpdatedSinceLastInspected) { if (path !== null) { - let secondaryCategory = null; + let secondaryCategory: 'suspendedBy' | 'hooks' | null = null; if (path[0] === 'hooks') { secondaryCategory = 'hooks'; } diff --git a/packages/react-devtools-shared/src/backend/flight/renderer.js b/packages/react-devtools-shared/src/backend/flight/renderer.js index 3d8befd4215e7..9cdd63e150f7c 100644 --- a/packages/react-devtools-shared/src/backend/flight/renderer.js +++ b/packages/react-devtools-shared/src/backend/flight/renderer.js @@ -118,9 +118,9 @@ export function attach( if (componentLogsEntry === undefined) { componentLogsEntry = { errors: new Map(), - errorsCount: 0, + errorsCount: 0 as number, warnings: new Map(), - warningsCount: 0, + warningsCount: 0 as number, }; componentInfoToComponentLogsMap.set(componentInfo, componentLogsEntry); } diff --git a/packages/react-devtools-shared/src/backend/profilingHooks.js b/packages/react-devtools-shared/src/backend/profilingHooks.js index ca58cf655ce53..a3feb1748801c 100644 --- a/packages/react-devtools-shared/src/backend/profilingHooks.js +++ b/packages/react-devtools-shared/src/backend/profilingHooks.js @@ -278,6 +278,7 @@ export function createProfilingHooks({ const top = currentReactMeasuresStack.pop(); // $FlowFixMe[incompatible-type] + // $FlowFixMe[incompatible-use] if (top.type !== type) { console.error( 'Unexpected type "%s" completed at %sms before "%s" completed.', diff --git a/packages/react-devtools-shared/src/bridge.js b/packages/react-devtools-shared/src/bridge.js index f0638ae896b60..ccc66744a7046 100644 --- a/packages/react-devtools-shared/src/bridge.js +++ b/packages/react-devtools-shared/src/bridge.js @@ -314,7 +314,7 @@ class Bridge< send>( event: EventName, - ...payload: $ElementType + ...payload: OutgoingEvents[EventName] ) { if (this._isShutdown) { console.warn( diff --git a/packages/react-devtools-shared/src/devtools/views/Components/Components.js b/packages/react-devtools-shared/src/devtools/views/Components/Components.js index cfa73bbad8032..1f0927de98a5b 100644 --- a/packages/react-devtools-shared/src/devtools/views/Components/Components.js +++ b/packages/react-devtools-shared/src/devtools/views/Components/Components.js @@ -235,4 +235,4 @@ function setResizeCSSVariable( } } -export default (portaledContent(Components): React$ComponentType<{}>); +export default (portaledContent(Components): component()); diff --git a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementHooksTree.js b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementHooksTree.js index 44950acddf7af..2739325749786 100644 --- a/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementHooksTree.js +++ b/packages/react-devtools-shared/src/devtools/views/Components/InspectedElementHooksTree.js @@ -386,6 +386,6 @@ function HookView({ } } -export default (React.memo( - InspectedElementHooksTree, -): React.ComponentType); +export default (React.memo(InspectedElementHooksTree): component( + ...props: HookViewProps +)); diff --git a/packages/react-devtools-shared/src/devtools/views/Editor/EditorPane.js b/packages/react-devtools-shared/src/devtools/views/Editor/EditorPane.js index 43082e1423810..8237a59956d15 100644 --- a/packages/react-devtools-shared/src/devtools/views/Editor/EditorPane.js +++ b/packages/react-devtools-shared/src/devtools/views/Editor/EditorPane.js @@ -115,4 +115,4 @@ function EditorPane({selectedSource}: Props) { ); } -export default (portaledContent(EditorPane): React$ComponentType<{}>); +export default (portaledContent(EditorPane): component()); diff --git a/packages/react-devtools-shared/src/devtools/views/Profiler/CommitFlamegraphListItem.js b/packages/react-devtools-shared/src/devtools/views/Profiler/CommitFlamegraphListItem.js index f747b7ab4ab3f..5bfe0a299f68a 100644 --- a/packages/react-devtools-shared/src/devtools/views/Profiler/CommitFlamegraphListItem.js +++ b/packages/react-devtools-shared/src/devtools/views/Profiler/CommitFlamegraphListItem.js @@ -132,7 +132,6 @@ function CommitFlamegraphListItem({data, index, style}: Props): React.Node { ); } -export default (memo( - CommitFlamegraphListItem, - areEqual, -): React.ComponentType); +export default (memo(CommitFlamegraphListItem, areEqual): component( + ...props: Props +)); diff --git a/packages/react-devtools-shared/src/devtools/views/Profiler/CommitRankedListItem.js b/packages/react-devtools-shared/src/devtools/views/Profiler/CommitRankedListItem.js index 4a8ab9b7e6be2..707fddf6268cb 100644 --- a/packages/react-devtools-shared/src/devtools/views/Profiler/CommitRankedListItem.js +++ b/packages/react-devtools-shared/src/devtools/views/Profiler/CommitRankedListItem.js @@ -79,7 +79,6 @@ function CommitRankedListItem({data, index, style}: Props) { ); } -export default (memo( - CommitRankedListItem, - areEqual, -): React.ComponentType); +export default (memo(CommitRankedListItem, areEqual): component( + ...props: Props +)); diff --git a/packages/react-devtools-shared/src/devtools/views/Profiler/HookChangeSummary.js b/packages/react-devtools-shared/src/devtools/views/Profiler/HookChangeSummary.js index e5c8f9c0fa665..5ce3eec42bc00 100644 --- a/packages/react-devtools-shared/src/devtools/views/Profiler/HookChangeSummary.js +++ b/packages/react-devtools-shared/src/devtools/views/Profiler/HookChangeSummary.js @@ -38,34 +38,38 @@ type HookProps = { hookNames: Map | null, }; -const Hook: React.AbstractComponent = memo(({hook, hookNames}) => { - const hookSource = hook.hookSource; - const hookName = useMemo(() => { - if (!hookSource || !hookNames) return null; - const key = getHookSourceLocationKey(hookSource); - return hookNames.get(key) || null; - }, [hookSource, hookNames]); - - return ( -
    -
  • - {hook.id !== null && ( - - {String(hook.id + 1)} +const Hook: component(...props: HookProps) = memo( + ({hook, hookNames}: HookProps) => { + const hookSource = hook.hookSource; + const hookName = useMemo(() => { + if (!hookSource || !hookNames) return null; + const key = getHookSourceLocationKey(hookSource); + return hookNames.get(key) || null; + }, [hookSource, hookNames]); + + return ( +
      +
    • + {hook.id !== null && ( + + {String(hook.id + 1)} + + )} + + {hook.name} + {hookName && ({hookName})} - )} - - {hook.name} - {hookName && ({hookName})} - - {hook.subHooks?.map((subHook, index) => ( - - ))} -
    • -
    - ); -}); + {hook.subHooks?.map((subHook, index) => ( + + ))} +
  • +
+ ); + }, +); const shouldKeepHook = ( hook: HooksNode, @@ -105,12 +109,12 @@ const filterHooks = ( type Props = {| fiberID: number, - hooks: $PropertyType, - state: $PropertyType, + hooks: ChangeDescription['hooks'], + state: ChangeDescription['state'], displayMode?: 'detailed' | 'compact', |}; -const HookChangeSummary: React.AbstractComponent = memo( +const HookChangeSummary: component(...props: Props) = memo( ({hooks, fiberID, state, displayMode = 'detailed'}: Props) => { const {parseHookNames, toggleParseHookNames, inspectedElement} = useContext( InspectedElementContext, diff --git a/packages/react-devtools-shared/src/devtools/views/Profiler/Profiler.js b/packages/react-devtools-shared/src/devtools/views/Profiler/Profiler.js index cb06c98f933a2..4ac55b46f0e8c 100644 --- a/packages/react-devtools-shared/src/devtools/views/Profiler/Profiler.js +++ b/packages/react-devtools-shared/src/devtools/views/Profiler/Profiler.js @@ -190,4 +190,4 @@ const tabsWithTimeline = [ }, ]; -export default (portaledContent(Profiler): React.ComponentType<{}>); +export default (portaledContent(Profiler): component()); diff --git a/packages/react-devtools-shared/src/devtools/views/Profiler/SnapshotCommitListItem.js b/packages/react-devtools-shared/src/devtools/views/Profiler/SnapshotCommitListItem.js index c013ec759587b..d9f80f005319c 100644 --- a/packages/react-devtools-shared/src/devtools/views/Profiler/SnapshotCommitListItem.js +++ b/packages/react-devtools-shared/src/devtools/views/Profiler/SnapshotCommitListItem.js @@ -96,7 +96,6 @@ function SnapshotCommitListItem({data: itemData, index, style}: Props) { ); } -export default (memo( - SnapshotCommitListItem, - areEqual, -): React.ComponentType); +export default (memo(SnapshotCommitListItem, areEqual): component( + ...props: Props +)); diff --git a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseTab.js b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseTab.js index 19c039e1dc7e0..8a53365df5cef 100644 --- a/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseTab.js +++ b/packages/react-devtools-shared/src/devtools/views/SuspenseTab/SuspenseTab.js @@ -437,4 +437,4 @@ function setResizeCSSVariable( } } -export default (portaledContent(SuspenseTab): React$ComponentType<{}>); +export default (portaledContent(SuspenseTab): component()); diff --git a/packages/react-devtools-shared/src/devtools/views/portaledContent.js b/packages/react-devtools-shared/src/devtools/views/portaledContent.js index fb4455d0a08ea..ad0ef8e5f0bcc 100644 --- a/packages/react-devtools-shared/src/devtools/views/portaledContent.js +++ b/packages/react-devtools-shared/src/devtools/views/portaledContent.js @@ -17,8 +17,8 @@ import ThemeProvider from './ThemeProvider'; export type Props = {portalContainer?: Element, ...}; export default function portaledContent( - Component: React$ComponentType, -): React$ComponentType { + Component: component(...props: any), +): component(...props: any) { return function PortaledContent({portalContainer, ...rest}: Props) { const store = useContext(StoreContext); diff --git a/packages/react-devtools-shared/src/events.js b/packages/react-devtools-shared/src/events.js index 6d53844d83415..2442ec20f1551 100644 --- a/packages/react-devtools-shared/src/events.js +++ b/packages/react-devtools-shared/src/events.js @@ -12,7 +12,7 @@ export default class EventEmitter { addListener>( event: Event, - listener: (...$ElementType) => any, + listener: (...Events[Event]) => any, ): void { const listeners = this.listenersMap.get(event); if (listeners === undefined) { @@ -25,10 +25,7 @@ export default class EventEmitter { } } - emit>( - event: Event, - ...args: $ElementType - ): void { + emit>(event: Event, ...args: Events[Event]): void { const listeners = this.listenersMap.get(event); if (listeners !== undefined) { if (listeners.length === 1) { diff --git a/packages/react-devtools-shared/src/hookNamesCache.js b/packages/react-devtools-shared/src/hookNamesCache.js index f85bb3c6d8ea4..669f5f31c2bcd 100644 --- a/packages/react-devtools-shared/src/hookNamesCache.js +++ b/packages/react-devtools-shared/src/hookNamesCache.js @@ -103,7 +103,7 @@ export function loadHookNames( let timeoutID: $FlowFixMe | null; let didTimeout = false; - let status = 'unknown'; + let status: 'success' | 'error' | 'timeout' | 'unknown' = 'unknown'; let resolvedHookNames: HookNames | null = null; const wake = () => { diff --git a/packages/react-devtools-shared/src/hooks/parseHookNames/loadSourceAndMetadata.js b/packages/react-devtools-shared/src/hooks/parseHookNames/loadSourceAndMetadata.js index 2a72da0ce2575..5001ff31bf252 100644 --- a/packages/react-devtools-shared/src/hooks/parseHookNames/loadSourceAndMetadata.js +++ b/packages/react-devtools-shared/src/hooks/parseHookNames/loadSourceAndMetadata.js @@ -64,7 +64,7 @@ import type {FetchFileWithCaching} from 'react-devtools-shared/src/devtools/view // Prefer a cached albeit stale response to reduce download time. // We wouldn't want to load/parse a newer version of the source (even if one existed). -const FETCH_OPTIONS = {cache: 'force-cache'}; +const FETCH_OPTIONS = {cache: 'force-cache' as CacheType}; const MAX_SOURCE_LENGTH = 100_000_000; diff --git a/packages/react-devtools-shared/src/hydration.js b/packages/react-devtools-shared/src/hydration.js index ecadad7ab3fe2..2468917d939e4 100644 --- a/packages/react-devtools-shared/src/hydration.js +++ b/packages/react-devtools-shared/src/hydration.js @@ -133,7 +133,7 @@ export function dehydrate( path: Array, isPathAllowed: (path: Array) => boolean, level: number = 0, -): $PropertyType { +): DehydratedData['data'] { const type = getDataType(data); let isPathAllowedCheck; @@ -479,7 +479,7 @@ export function dehydrate( return createDehydrated(type, true, data, cleaned, path); } else { const object: { - [string]: $PropertyType, + [string]: DehydratedData['data'], } = {}; getAllEnumerableKeys(data).forEach(key => { const name = key.toString(); @@ -616,7 +616,7 @@ function dehydrateKey( path: Array, isPathAllowed: (path: Array) => boolean, level: number = 0, -): $PropertyType { +): DehydratedData['data'] { try { return dehydrate( parent[key], diff --git a/packages/react-devtools-shell/src/app/ToDoList/ListItem.js b/packages/react-devtools-shell/src/app/ToDoList/ListItem.js index f29e8fe418d8b..549d15c31ea20 100644 --- a/packages/react-devtools-shell/src/app/ToDoList/ListItem.js +++ b/packages/react-devtools-shell/src/app/ToDoList/ListItem.js @@ -46,4 +46,4 @@ function ListItem({item, removeItem, toggleItem}: Props) { ); } -export default (memo(ListItem): React.ComponentType); +export default (memo(ListItem): component(...props: Props)); diff --git a/packages/react-devtools-timeline/src/import-worker/preprocessData.js b/packages/react-devtools-timeline/src/import-worker/preprocessData.js index 5dc0423b08b87..f3186e65a745f 100644 --- a/packages/react-devtools-timeline/src/import-worker/preprocessData.js +++ b/packages/react-devtools-timeline/src/import-worker/preprocessData.js @@ -123,7 +123,7 @@ function updateLaneToLabelMap( let profilerVersion = null; -function getLastType(stack: $PropertyType) { +function getLastType(stack: ProcessorState['measureStack']) { if (stack.length > 0) { const {type} = stack[stack.length - 1]; return type; @@ -131,7 +131,7 @@ function getLastType(stack: $PropertyType) { return null; } -function getDepth(stack: $PropertyType) { +function getDepth(stack: ProcessorState['measureStack']) { if (stack.length > 0) { const {depth, type} = stack[stack.length - 1]; return type === 'render-idle' ? depth : depth + 1; @@ -180,7 +180,7 @@ function markWorkCompleted( type: ReactMeasureType, stopTime: Milliseconds, currentProfilerData: TimelineData, - stack: $PropertyType, + stack: ProcessorState['measureStack'], ) { if (stack.length === 0) { console.error( @@ -214,7 +214,7 @@ function markWorkCompleted( function throwIfIncomplete( type: ReactMeasureType, - stack: $PropertyType, + stack: ProcessorState['measureStack'], ) { const lastIndex = stack.length - 1; if (lastIndex >= 0) { @@ -509,7 +509,7 @@ function processTimelineEvent( } else if (name.startsWith('--schedule-forced-update-')) { const [laneBitmaskString, componentName] = name.slice(25).split('-'); - const forceUpdateEvent = { + const forceUpdateEvent: SchedulingEvent = { type: 'schedule-force-update', lanes: getLanesFromTransportDecimalBitmask(laneBitmaskString), componentName, @@ -527,7 +527,7 @@ function processTimelineEvent( } else if (name.startsWith('--schedule-state-update-')) { const [laneBitmaskString, componentName] = name.slice(24).split('-'); - const stateUpdateEvent = { + const stateUpdateEvent: SchedulingEvent = { type: 'schedule-state-update', lanes: getLanesFromTransportDecimalBitmask(laneBitmaskString), componentName, @@ -578,7 +578,7 @@ function processTimelineEvent( // We can't know if they'll be resolved or not at this point. // We'll just give them a default (fake) duration width. - const suspenseEvent = { + const suspenseEvent: SuspenseEvent = { componentName, depth, duration: null, diff --git a/packages/react-devtools-timeline/src/types.js b/packages/react-devtools-timeline/src/types.js index c28c78d88c80e..7ba6f935f2ac8 100644 --- a/packages/react-devtools-timeline/src/types.js +++ b/packages/react-devtools-timeline/src/types.js @@ -79,7 +79,7 @@ export type SchedulingEvent = | ReactScheduleRenderEvent | ReactScheduleStateUpdateEvent | ReactScheduleForceUpdateEvent; -export type SchedulingEventType = $PropertyType; +export type SchedulingEventType = SchedulingEvent['type']; export type ReactMeasureType = | 'commit' diff --git a/packages/react-dom-bindings/src/client/inputValueTracking.js b/packages/react-dom-bindings/src/client/inputValueTracking.js index f89617fe6dae6..e931283e6020c 100644 --- a/packages/react-dom-bindings/src/client/inputValueTracking.js +++ b/packages/react-dom-bindings/src/client/inputValueTracking.js @@ -140,7 +140,7 @@ export function trackHydrated( return false; } - let valueField; + let valueField: 'checked' | 'value'; let expectedValue; if (isCheckable(node)) { valueField = 'checked'; @@ -150,8 +150,11 @@ export function trackHydrated( valueField = 'value'; expectedValue = initialValue; } - // eslint-disable-next-line react-internal/safe-string-coercion - const currentValue = '' + (node[valueField]: any); + const currentValue = + // eslint-disable-next-line react-internal/safe-string-coercion + '' + + (// $FlowFixMe[prop-missing] + node[valueField]: any); node._valueTracker = trackValueOnNode(node, valueField, expectedValue); return currentValue !== expectedValue; } diff --git a/packages/react-dom-bindings/src/events/SyntheticEvent.js b/packages/react-dom-bindings/src/events/SyntheticEvent.js index 469cd0f010c3b..acd50cf8e0c97 100644 --- a/packages/react-dom-bindings/src/events/SyntheticEvent.js +++ b/packages/react-dom-bindings/src/events/SyntheticEvent.js @@ -146,7 +146,7 @@ function createSyntheticEvent(Interface: EventInterfaceType) { * @interface Event * @see http://www.w3.org/TR/DOM-Level-3-Events/ */ -const EventInterface = { +const EventInterface: EventInterfaceType = { eventPhase: 0, bubbles: 0, cancelable: 0, @@ -442,7 +442,7 @@ function getEventModifierState(nativeEvent: {[propName: string]: mixed}) { * @interface KeyboardEvent * @see http://www.w3.org/TR/DOM-Level-3-Events/ */ -const KeyboardEventInterface = { +const KeyboardEventInterface: EventInterfaceType = { ...UIEventInterface, key: getEventKey, code: 0, @@ -505,7 +505,7 @@ export const SyntheticKeyboardEvent: $FlowFixMe = createSyntheticEvent( * @interface PointerEvent * @see http://www.w3.org/TR/pointerevents/ */ -const PointerEventInterface = { +const PointerEventInterface: EventInterfaceType = { ...MouseEventInterface, pointerId: 0, width: 0, @@ -526,7 +526,7 @@ export const SyntheticPointerEvent: $FlowFixMe = createSyntheticEvent( * @interface TouchEvent * @see http://www.w3.org/TR/touch-events/ */ -const TouchEventInterface = { +const TouchEventInterface: EventInterfaceType = { ...UIEventInterface, touches: 0, targetTouches: 0, @@ -545,7 +545,7 @@ export const SyntheticTouchEvent: $FlowFixMe = * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events- * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent */ -const TransitionEventInterface = { +const TransitionEventInterface: EventInterfaceType = { ...EventInterface, propertyName: 0, elapsedTime: 0, @@ -559,7 +559,7 @@ export const SyntheticTransitionEvent: $FlowFixMe = createSyntheticEvent( * @interface WheelEvent * @see http://www.w3.org/TR/DOM-Level-3-Events/ */ -const WheelEventInterface = { +const WheelEventInterface: EventInterfaceType = { ...MouseEventInterface, deltaX(event: {[propName: string]: mixed}) { return 'deltaX' in event @@ -594,7 +594,7 @@ const WheelEventInterface = { export const SyntheticWheelEvent: $FlowFixMe = createSyntheticEvent(WheelEventInterface); -const ToggleEventInterface = { +const ToggleEventInterface: EventInterfaceType = { ...EventInterface, newState: 0, oldState: 0, diff --git a/packages/react-dom-bindings/src/shared/ReactDOMFormActions.js b/packages/react-dom-bindings/src/shared/ReactDOMFormActions.js index 6dd4e4da44479..6978f4884506b 100644 --- a/packages/react-dom-bindings/src/shared/ReactDOMFormActions.js +++ b/packages/react-dom-bindings/src/shared/ReactDOMFormActions.js @@ -31,7 +31,7 @@ export type FormStatus = FormStatusPending | FormStatusNotPending; // Since the "not pending" value is always the same, we can reuse the // same object across all transitions. -const sharedNotPendingObject = { +const sharedNotPendingObject: FormStatusNotPending = { pending: false, data: null, method: null, diff --git a/packages/react-markup/src/ReactMarkupServer.js b/packages/react-markup/src/ReactMarkupServer.js index 34d234b0be44f..5f69c3d44a317 100644 --- a/packages/react-markup/src/ReactMarkupServer.js +++ b/packages/react-markup/src/ReactMarkupServer.js @@ -47,7 +47,7 @@ import { type ReactMarkupNodeList = // This is the intersection of ReactNodeList and ReactClientValue minus // Client/ServerReferences. - | React$Element> + | component(...props: any) | LazyComponent | React$Element | string diff --git a/packages/react-native-renderer/src/ReactNativeBridgeEventPlugin.js b/packages/react-native-renderer/src/ReactNativeBridgeEventPlugin.js index 97c5cf05b1963..b22927d2cb288 100644 --- a/packages/react-native-renderer/src/ReactNativeBridgeEventPlugin.js +++ b/packages/react-native-renderer/src/ReactNativeBridgeEventPlugin.js @@ -10,6 +10,7 @@ import type { AnyNativeEvent, EventTypes, + LegacyPluginModule, } from './legacy-events/PluginModuleType'; import type {TopLevelType} from './legacy-events/TopLevelEventTypes'; import SyntheticEvent from './legacy-events/SyntheticEvent'; @@ -165,7 +166,7 @@ function accumulateDirectDispatches(events: ?(Array | Object)) { // End of inline type PropagationPhases = 'bubbled' | 'captured'; -const ReactNativeBridgeEventPlugin = { +const ReactNativeBridgeEventPlugin: LegacyPluginModule = { eventTypes: ({}: EventTypes), extractEvents: function ( diff --git a/packages/react-native-renderer/src/legacy-events/ResponderTouchHistoryStore.js b/packages/react-native-renderer/src/legacy-events/ResponderTouchHistoryStore.js index 50264d6c71945..4b523b0a92db2 100644 --- a/packages/react-native-renderer/src/legacy-events/ResponderTouchHistoryStore.js +++ b/packages/react-native-renderer/src/legacy-events/ResponderTouchHistoryStore.js @@ -207,6 +207,7 @@ const ResponderTouchHistoryStore = { touchHistory.numberActiveTouches = nativeEvent.touches.length; if (touchHistory.numberActiveTouches === 1) { touchHistory.indexOfSingleActiveTouch = + // $FlowFixMe[incompatible-type] might be null according to type nativeEvent.touches[0].identifier; } } else if (isEndish(topLevelType)) { diff --git a/packages/react-reconciler/src/ReactFiberApplyGesture.js b/packages/react-reconciler/src/ReactFiberApplyGesture.js index 1fa34e4957f84..fa75a1bdbd219 100644 --- a/packages/react-reconciler/src/ReactFiberApplyGesture.js +++ b/packages/react-reconciler/src/ReactFiberApplyGesture.js @@ -488,7 +488,7 @@ function recursivelyInsertNewFiber( const viewTransitionState: ViewTransitionState = finishedWork.stateNode; // TODO: If this was already cloned by a previous pass we can reuse those clones. viewTransitionState.clones = null; - let nextPhase; + let nextPhase: VisitPhase; if (visitPhase === INSERT_EXIT) { // This was an Enter of a ViewTransition. We now move onto inserting the inner // HostComponents and finding inner pairs. @@ -637,7 +637,7 @@ function recursivelyInsertClonesFromExistingTree( // So we need it to be cleared before we do that. // TODO: Use some other temporary state to track this. child.flags &= ~Update; - let nextPhase; + let nextPhase: VisitPhase; if (visitPhase === CLONE_EXIT) { // This was an Enter of a ViewTransition. We now move onto unhiding the inner // HostComponents and finding inner pairs. @@ -894,7 +894,7 @@ function insertDestinationClonesOfFiber( // Only insert clones if this tree is going to be visible. No need to // clone invisible content. // TODO: If this is visible but detached it should still be cloned. - let nextPhase; + let nextPhase: VisitPhase; if (visitPhase === CLONE_UPDATE && (flags & Visibility) !== NoFlags) { // This is the root of an appear. We need to trigger Enter transitions. nextPhase = CLONE_EXIT; @@ -922,7 +922,7 @@ function insertDestinationClonesOfFiber( const viewTransitionState: ViewTransitionState = finishedWork.stateNode; // TODO: If this was already cloned by a previous pass we can reuse those clones. viewTransitionState.clones = null; - let nextPhase; + let nextPhase: VisitPhase; if (visitPhase === CLONE_EXIT) { // This was an Enter of a ViewTransition. We now move onto unhiding the inner // HostComponents and finding inner pairs. diff --git a/packages/react-reconciler/src/ReactFiberCacheComponent.js b/packages/react-reconciler/src/ReactFiberCacheComponent.js index 26398210528dd..0ab12bd4ec4d3 100644 --- a/packages/react-reconciler/src/ReactFiberCacheComponent.js +++ b/packages/react-reconciler/src/ReactFiberCacheComponent.js @@ -25,7 +25,7 @@ const AbortControllerLocal: typeof AbortController = function AbortControllerShim() { const listeners = []; const signal = (this.signal = { - aborted: false, + aborted: false as boolean, addEventListener: (type, listener) => { listeners.push(listener); }, diff --git a/packages/react-reconciler/src/ReactFiberCommitWork.js b/packages/react-reconciler/src/ReactFiberCommitWork.js index 8689f2eacf24d..810ddf5fcbb60 100644 --- a/packages/react-reconciler/src/ReactFiberCommitWork.js +++ b/packages/react-reconciler/src/ReactFiberCommitWork.js @@ -5020,7 +5020,7 @@ function commitPassiveUnmountInsideDeletedTreeOnFiber( const instance: OffscreenInstance = offscreenFiber.stateNode; const transitions = instance._transitions; if (transitions !== null) { - const abortReason = { + const abortReason: TransitionAbort = { reason: 'suspense', name: current.memoizedProps.name || null, }; @@ -5061,7 +5061,7 @@ function commitPassiveUnmountInsideDeletedTreeOnFiber( const instance: TracingMarkerInstance = current.stateNode; const transitions = instance.transitions; if (transitions !== null) { - const abortReason = { + const abortReason: TransitionAbort = { reason: 'marker', name: current.memoizedProps.name, }; diff --git a/packages/react-reconciler/src/ReactFiberHooks.js b/packages/react-reconciler/src/ReactFiberHooks.js index 940dff5e69a06..b09caa4e28d23 100644 --- a/packages/react-reconciler/src/ReactFiberHooks.js +++ b/packages/react-reconciler/src/ReactFiberHooks.js @@ -1208,7 +1208,7 @@ function useMemoCache(size: number): Array { ? currentMemoCache.data : // Clone the memo cache before each render (copy-on-write) currentMemoCache.data.map(array => array.slice()), - index: 0, + index: 0 as number, }; } } @@ -1218,7 +1218,7 @@ function useMemoCache(size: number): Array { if (memoCache == null) { memoCache = { data: [], - index: 0, + index: 0 as number, }; } if (updateQueue === null) { diff --git a/packages/react-reconciler/src/ReactFiberPerformanceTrack.js b/packages/react-reconciler/src/ReactFiberPerformanceTrack.js index f7415dbf46dcc..57f121f6ec0cd 100644 --- a/packages/react-reconciler/src/ReactFiberPerformanceTrack.js +++ b/packages/react-reconciler/src/ReactFiberPerformanceTrack.js @@ -712,7 +712,6 @@ export function logTransitionStart( const color = eventIsRepeat ? 'secondary-light' : 'warning'; if (__DEV__ && debugTask) { debugTask.run( - // $FlowFixMe[method-unbinding] console.timeStamp.bind( console, eventIsRepeat ? '' : 'Event: ' + eventType, diff --git a/packages/react-reconciler/src/ReactFiberWorkLoop.js b/packages/react-reconciler/src/ReactFiberWorkLoop.js index e76083eb0a9fc..8c1f03bf1adf4 100644 --- a/packages/react-reconciler/src/ReactFiberWorkLoop.js +++ b/packages/react-reconciler/src/ReactFiberWorkLoop.js @@ -1060,7 +1060,7 @@ export function performWorkOnRoot( // even for regular pings. checkIfRootIsPrerendering(root, lanes); - let exitStatus = shouldTimeSlice + let exitStatus: RootExitStatus = shouldTimeSlice ? renderRootConcurrent(root, lanes) : renderRootSync(root, lanes, true); @@ -1212,7 +1212,7 @@ function recoverFromConcurrentError( root: FiberRoot, originallyAttemptedLanes: Lanes, errorRetryLanes: Lanes, -) { +): RootExitStatus { // If an error occurred during hydration, discard server response and fall // back to client side render. @@ -2520,7 +2520,7 @@ function workLoopSync() { } } -function renderRootConcurrent(root: FiberRoot, lanes: Lanes) { +function renderRootConcurrent(root: FiberRoot, lanes: Lanes): RootExitStatus { const prevExecutionContext = executionContext; executionContext |= RenderContext; const prevDispatcher = pushDispatcher(root.containerInfo); diff --git a/packages/react-reconciler/src/ReactTestSelectors.js b/packages/react-reconciler/src/ReactTestSelectors.js index de3e95c281e60..ec30b2112b219 100644 --- a/packages/react-reconciler/src/ReactTestSelectors.js +++ b/packages/react-reconciler/src/ReactTestSelectors.js @@ -48,7 +48,7 @@ type Type = symbol | number; type ComponentSelector = { $$typeof: Type, - value: React$ComponentType, + value: component(), }; type HasPseudoClassSelector = { @@ -79,7 +79,7 @@ type Selector = | TestNameSelector; export function createComponentSelector( - component: React$ComponentType, + component: component(), ): ComponentSelector { return { $$typeof: COMPONENT_TYPE, diff --git a/packages/react-refresh/src/ReactFreshRuntime.js b/packages/react-refresh/src/ReactFreshRuntime.js index 43e8148d3de11..079db6594ad77 100644 --- a/packages/react-refresh/src/ReactFreshRuntime.js +++ b/packages/react-refresh/src/ReactFreshRuntime.js @@ -671,8 +671,10 @@ export function isLikelyComponentType(type: any): boolean { // This looks like a class. return false; } - // eslint-disable-next-line no-proto - if (type.prototype.__proto__ !== Object.prototype) { + if ( + // $FlowFixMe[prop-missing] + type.prototype.__proto__ !== Object.prototype // eslint-disable-line no-proto + ) { // It has a superclass. return false; } diff --git a/packages/react-server/src/ReactFlightReplyServer.js b/packages/react-server/src/ReactFlightReplyServer.js index 7c94352f288dc..424e26d36da17 100644 --- a/packages/react-server/src/ReactFlightReplyServer.js +++ b/packages/react-server/src/ReactFlightReplyServer.js @@ -556,7 +556,7 @@ function createModelResolver( } } else { blocked = initializingChunkBlockedModel = { - deps: cyclic ? 0 : 1, + deps: (cyclic ? 0 : 1) as number, value: (null: any), }; } diff --git a/packages/react-server/src/ReactFlightServer.js b/packages/react-server/src/ReactFlightServer.js index b8b3af14d5993..440748ca2f440 100644 --- a/packages/react-server/src/ReactFlightServer.js +++ b/packages/react-server/src/ReactFlightServer.js @@ -476,7 +476,7 @@ type ReactJSONValue = // Serializable values export type ReactClientValue = // Server Elements and Lazy Components are unwrapped on the Server - | React$Element> + | React$Element | LazyComponent // References are passed by their value | ClientReference diff --git a/packages/react-test-renderer/src/ReactTestRenderer.js b/packages/react-test-renderer/src/ReactTestRenderer.js index d4466b34279dd..08676503fa49b 100644 --- a/packages/react-test-renderer/src/ReactTestRenderer.js +++ b/packages/react-test-renderer/src/ReactTestRenderer.js @@ -9,6 +9,7 @@ import type {Fiber, FiberRoot} from 'react-reconciler/src/ReactInternalTypes'; import type { + Container, PublicInstance, Instance, TextInstance, @@ -505,7 +506,7 @@ function create( isStrictMode = true; } } - let container = { + let container: Container = { children: ([]: Array), createNodeMock, tag: 'CONTAINER', diff --git a/packages/react/index.development.js b/packages/react/index.development.js index b4c0632b7fdc3..595135e606e64 100644 --- a/packages/react/index.development.js +++ b/packages/react/index.development.js @@ -8,8 +8,6 @@ */ // Keep in sync with https://github.com/facebook/flow/blob/main/lib/react.js -export type ComponentType<-P> = React$ComponentType

; -export type AbstractComponent<-Config> = React$AbstractComponent; export type ElementType = React$ElementType; export type Element<+C> = React$Element; export type Key = React$Key; diff --git a/packages/react/index.js b/packages/react/index.js index 4eb8f2dfc240b..cbeea0d28bb45 100644 --- a/packages/react/index.js +++ b/packages/react/index.js @@ -8,8 +8,6 @@ */ // Keep in sync with https://github.com/facebook/flow/blob/main/lib/react.js -export type ComponentType<-P> = React$ComponentType

; -export type AbstractComponent<-Config> = React$AbstractComponent; export type ElementType = React$ElementType; export type Element<+C> = React$Element; export type MixedElement = React$Element; diff --git a/packages/scheduler/src/forks/Scheduler.js b/packages/scheduler/src/forks/Scheduler.js index dcbcc2cf528a2..88239b710676f 100644 --- a/packages/scheduler/src/forks/Scheduler.js +++ b/packages/scheduler/src/forks/Scheduler.js @@ -283,7 +283,7 @@ function unstable_runWithPriority( } function unstable_next(eventHandler: () => T): T { - var priorityLevel; + var priorityLevel: PriorityLevel; switch (currentPriorityLevel) { case ImmediatePriority: case UserBlockingPriority: diff --git a/packages/scheduler/src/forks/SchedulerMock.js b/packages/scheduler/src/forks/SchedulerMock.js index a362b23e1b7ae..cf76126410e6c 100644 --- a/packages/scheduler/src/forks/SchedulerMock.js +++ b/packages/scheduler/src/forks/SchedulerMock.js @@ -286,7 +286,7 @@ function unstable_runWithPriority( } function unstable_next(eventHandler: () => T): T { - var priorityLevel; + var priorityLevel: PriorityLevel; switch (currentPriorityLevel) { case ImmediatePriority: case UserBlockingPriority: diff --git a/packages/scheduler/src/forks/SchedulerPostTask.js b/packages/scheduler/src/forks/SchedulerPostTask.js index e72df5f36413c..700ff2e5d2c56 100644 --- a/packages/scheduler/src/forks/SchedulerPostTask.js +++ b/packages/scheduler/src/forks/SchedulerPostTask.js @@ -76,7 +76,7 @@ export function unstable_scheduleCallback( callback: SchedulerCallback, options?: {delay?: number}, ): CallbackNode { - let postTaskPriority; + let postTaskPriority: PostTaskPriorityLevel; switch (priorityLevel) { case ImmediatePriority: case UserBlockingPriority: @@ -196,7 +196,7 @@ export function unstable_getCurrentPriorityLevel(): PriorityLevel { } export function unstable_next(callback: () => T): T { - let priorityLevel; + let priorityLevel: PriorityLevel; switch (currentPriorityLevel_DEPRECATED) { case ImmediatePriority: case UserBlockingPriority: diff --git a/packages/shared/ReactPerformanceTrackProperties.js b/packages/shared/ReactPerformanceTrackProperties.js index d523b84a52394..160c839c3ed52 100644 --- a/packages/shared/ReactPerformanceTrackProperties.js +++ b/packages/shared/ReactPerformanceTrackProperties.js @@ -19,7 +19,7 @@ const COMPLEX_ARRAY = 1; const PRIMITIVE_ARRAY = 2; // Primitive values only const ENTRIES_ARRAY = 3; // Tuple arrays of string and value (like Headers, Map, etc) function getArrayKind(array: Object): 0 | 1 | 2 | 3 { - let kind = EMPTY_ARRAY; + let kind: 0 | 1 | 2 | 3 = EMPTY_ARRAY; for (let i = 0; i < array.length; i++) { const value = array[i]; if (typeof value === 'object' && value !== null) { diff --git a/packages/use-sync-external-store/src/useSyncExternalStoreWithSelector.js b/packages/use-sync-external-store/src/useSyncExternalStoreWithSelector.js index a7be5c0fe8fda..ddbd77c69822f 100644 --- a/packages/use-sync-external-store/src/useSyncExternalStoreWithSelector.js +++ b/packages/use-sync-external-store/src/useSyncExternalStoreWithSelector.js @@ -23,8 +23,7 @@ export function useSyncExternalStoreWithSelector( selector: (snapshot: Snapshot) => Selection, isEqual?: (a: Selection, b: Selection) => boolean, ): Selection { - // Use this to track the rendered snapshot. - const instRef = useRef< + type Inst = | { hasValue: true, value: Selection, @@ -32,10 +31,11 @@ export function useSyncExternalStoreWithSelector( | { hasValue: false, value: null, - } - | null, - >(null); - let inst; + }; + + // Use this to track the rendered snapshot. + const instRef = useRef(null); + let inst: Inst; if (instRef.current === null) { inst = { hasValue: false, diff --git a/scripts/flow/config/flowconfig b/scripts/flow/config/flowconfig index 5fa574b50f74c..93b557d92d947 100644 --- a/scripts/flow/config/flowconfig +++ b/scripts/flow/config/flowconfig @@ -31,6 +31,7 @@ untyped-type-import=error internal-type=off deprecated-type=off +unsafe-object-assign=off [options] munge_underscores=false diff --git a/scripts/flow/environment.js b/scripts/flow/environment.js index d8b2ac28f0d70..5556fad1a0001 100644 --- a/scripts/flow/environment.js +++ b/scripts/flow/environment.js @@ -17,83 +17,17 @@ declare const __REACT_DEVTOOLS_GLOBAL_HOOK__: any; /*?{ inject: ?((stuff: Object) => void) };*/ -declare const globalThis: Object; - -declare const queueMicrotask: (fn: Function) => void; declare const reportError: (error: mixed) => void; -declare const AggregateError: Class; - -declare const FinalizationRegistry: any; declare module 'create-react-class' { declare const exports: $FlowFixMe; } -declare module 'error-stack-parser' { - // flow-typed signature: 132e48034ef4756600e1d98681a166b5 - // flow-typed version: c6154227d1/error-stack-parser_v2.x.x/flow_>=v0.104.x - - declare interface StackFrame { - constructor(object: StackFrame): StackFrame; - - isConstructor?: boolean; - getIsConstructor(): boolean; - setIsConstructor(): void; - - isEval?: boolean; - getIsEval(): boolean; - setIsEval(): void; - - isNative?: boolean; - getIsNative(): boolean; - setIsNative(): void; - - isTopLevel?: boolean; - getIsTopLevel(): boolean; - setIsTopLevel(): void; - - columnNumber?: number; - getColumnNumber(): number; - setColumnNumber(): void; - - lineNumber?: number; - getLineNumber(): number; - setLineNumber(): void; - - fileName?: string; - getFileName(): string; - setFileName(): void; - - functionName?: string; - getFunctionName(): string; - setFunctionName(): void; - - source?: string; - getSource(): string; - setSource(): void; - - args?: any[]; - getArgs(): any[]; - setArgs(): void; - - evalOrigin?: StackFrame; - getEvalOrigin(): StackFrame; - setEvalOrigin(): void; - - toString(): string; - } - - declare class ErrorStackParser { - parse(error: Error): Array; - } - - declare module.exports: ErrorStackParser; -} - declare interface ConsoleTask { run(f: () => T): T; } +// $FlowFixMe[libdef-override] declare var console: { assert(condition: mixed, ...data: Array): void, clear(): void, @@ -148,7 +82,7 @@ declare class ScrollTimeline extends AnimationTimeline { // Flow hides the props of React$Element, this overrides it to unhide // them for React internals. -// prettier-ignore +// $FlowFixMe[libdef-override] declare opaque type React$Element< +ElementType: React$ElementType, +P = React$ElementProps, @@ -227,100 +161,12 @@ declare var parcelRequire: { }, }; -declare module 'fs/promises' { - declare const access: (path: string, mode?: number) => Promise; - declare const lstat: ( - path: string, - options?: ?{bigint?: boolean}, - ) => Promise; - declare const readdir: ( - path: string, - options?: - | ?string - | { - encoding?: ?string, - withFileTypes?: ?boolean, - }, - ) => Promise; - declare const readFile: ( - path: string, - options?: - | ?string - | { - encoding?: ?string, - }, - ) => Promise; - declare const readlink: ( - path: string, - options?: - | ?string - | { - encoding?: ?string, - }, - ) => Promise; - declare const realpath: ( - path: string, - options?: - | ?string - | { - encoding?: ?string, - }, - ) => Promise; - declare const stat: ( - path: string, - options?: ?{bigint?: boolean}, - ) => Promise; -} declare module 'pg' { declare const Pool: (options: mixed) => { query: (query: string, values?: Array) => void, }; } -declare module 'util' { - declare function debuglog(section: string): (data: any, ...args: any) => void; - declare function format(format: string, ...placeholders: any): string; - declare function log(string: string): void; - declare function inspect(object: any, options?: util$InspectOptions): string; - declare function isArray(object: any): boolean; - declare function isRegExp(object: any): boolean; - declare function isDate(object: any): boolean; - declare function isError(object: any): boolean; - declare function inherits( - constructor: Function, - superConstructor: Function, - ): void; - declare function deprecate(f: Function, string: string): Function; - declare function promisify(f: Function): Function; - declare function callbackify(f: Function): Function; - declare class TextDecoder { - constructor( - encoding?: string, - options?: { - fatal?: boolean, - ignoreBOM?: boolean, - ... - }, - ): void; - decode( - input?: ArrayBuffer | DataView | $TypedArray, - options?: {stream?: boolean, ...}, - ): string; - encoding: string; - fatal: boolean; - ignoreBOM: boolean; - } - declare class TextEncoder { - constructor(encoding?: string): TextEncoder; - encode(buffer: string): Uint8Array; - encodeInto( - buffer: string, - dest: Uint8Array, - ): {read: number, written: number}; - encoding: string; - } -} - declare module 'busboy' { import type {Writable, Readable} from 'stream'; @@ -456,13 +302,6 @@ declare const async_hooks: { executionAsyncId(): number, }; -declare module 'node:worker_threads' { - declare class MessageChannel { - port1: MessagePort; - port2: MessagePort; - } -} - declare module 'jest-diff' { declare type CompareKeys = ((a: string, b: string) => number) | void; declare type DiffOptions = { diff --git a/yarn.lock b/yarn.lock index 0acce52fd454b..c6d9d03cead57 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9298,12 +9298,12 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== -flow-bin@^0.263: - version "0.263.0" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.263.0.tgz#0a836bdf82855d5df9858c781818ce51612be064" - integrity sha512-FkQywD+7wXru/7/SWJPVnZXUp6CW3XtrVZ26vhAdVfMx9xlwq/Zk/tXcn3OQuiHUA4kQvZNyfgRztp6oXgjsog== +flow-bin@^0.274: + version "0.274.2" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.274.2.tgz#79cff569aab38eb04f6b1e64b899c932a51444a4" + integrity sha512-vTF+5hiC5qymweFKj7xs5ABlDqMWbB2fPkYC4MI32m652dFYsq/zvEVNc2M09udwAzplLcMIK2O9VswPfd8Isw== -flow-remove-types@^2.263: +flow-remove-types@^2.274: version "2.279.0" resolved "https://registry.yarnpkg.com/flow-remove-types/-/flow-remove-types-2.279.0.tgz#3a3388d9158eba0f82c40d80d31d9640b883a3f5" integrity sha512-bPFloMR/A2b/r/sIsf7Ix0LaMicCJNjwhXc4xEEQVzJCIz5u7C7XDaEOXOiqveKlCYK7DcBNn6R01Cbbc9gsYA==