diff --git a/.eslintrc.js b/.eslintrc.js index 15b160a215e43..199408e5ceff0 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -26,6 +26,9 @@ module.exports = { // Flow declares trip up the no-redeclare rule 'no-redeclare': 'off', + // Flow handles these rules + 'no-unreachable': 'off', + // Prettier and ESLint may disagree on the following rules indent: 'off', 'array-bracket-spacing': 'off', diff --git a/packages/react-relay/ReactRelayLocalQueryRenderer.js b/packages/react-relay/ReactRelayLocalQueryRenderer.js index 4ac1abc7beabd..06525d98d44ab 100644 --- a/packages/react-relay/ReactRelayLocalQueryRenderer.js +++ b/packages/react-relay/ReactRelayLocalQueryRenderer.js @@ -40,7 +40,7 @@ const queryRendererContext: ReactRelayQueryRendererContextType = { rootIsQueryRenderer: true, }; -function useDeepCompare(value: T): T { +hook useDeepCompare(value: T): T { const latestValue = React.useRef(value); if (!areEqual(latestValue.current, value)) { if (__DEV__) { diff --git a/packages/react-relay/multi-actor/useRelayActorEnvironment.js b/packages/react-relay/multi-actor/useRelayActorEnvironment.js index aa88e5fa26cb7..71c2fe95fc2ac 100644 --- a/packages/react-relay/multi-actor/useRelayActorEnvironment.js +++ b/packages/react-relay/multi-actor/useRelayActorEnvironment.js @@ -20,7 +20,7 @@ const ReactRelayContext = require('./../ReactRelayContext'); const invariant = require('invariant'); const {useContext} = require('react'); -function useRelayActorEnvironment( +hook useRelayActorEnvironment( actorIdentifier: ActorIdentifier, ): IActorEnvironment { const context = useContext(ReactRelayContext); diff --git a/packages/react-relay/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js b/packages/react-relay/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js index 5e274c8ddadf0..b4a1c566939e1 100644 --- a/packages/react-relay/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js +++ b/packages/react-relay/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js @@ -48,23 +48,31 @@ type ExpectedReturnType< // $FlowFixMe[prop-missing] // $FlowFixMe[incompatible-cast] // $FlowFixMe[incompatible-exact] +// $FlowFixMe[react-rule-hook] (useBlockingPaginationFragment( refetchableFragmentInput, keyNonNullable, ): ExpectedReturnType); +// $FlowFixMe[react-rule-hook] (useBlockingPaginationFragment( refetchableFragmentInput, keyNullable, ): ExpectedReturnType); // $FlowExpectedError: can't cast nullable to non-nullable +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[incompatible-cast] (useBlockingPaginationFragment( refetchableFragmentInput, keyNullable, ): ExpectedReturnType); // $FlowExpectedError: actual type of returned data is correct +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[incompatible-exact] +// $FlowFixMe[prop-missing] +// $FlowFixMe[incompatible-cast] (useBlockingPaginationFragment( refetchableFragmentInput, // $FlowExpectedError[incompatible-call] @@ -72,6 +80,7 @@ type ExpectedReturnType< ): ExpectedReturnType); // $FlowExpectedError[incompatible-call] `Example_user$fragmentType` is incompatible with `FragmentType` +// $FlowFixMe[react-rule-hook] (useBlockingPaginationFragment( refetchableFragmentInput, // $FlowExpectedError[incompatible-call] @@ -79,18 +88,28 @@ type ExpectedReturnType< ): ExpectedReturnType); // $FlowExpectedError: Key should not be a user provided object +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[prop-missing] +// $FlowFixMe[cannot-resolve-name] useBlockingPaginationFragment(fragmentInput, {abc: 123}); // $FlowExpectedError: Key should not be an empty object +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[prop-missing] +// $FlowFixMe[cannot-resolve-name] useBlockingPaginationFragment(fragmentInput, {}); // $FlowExpectedError: Key should be the `$key` type from generated flow +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[prop-missing] +// $FlowFixMe[cannot-resolve-name] useBlockingPaginationFragment(fragmentInput, fragmentData); // Refetch function options: declare var variables: QueryVariables; declare var environment: IEnvironment; +// $FlowFixMe[react-rule-hook] const {refetch} = useBlockingPaginationFragment( refetchableFragmentInput, keyNonNullable, @@ -109,6 +128,7 @@ refetch(variables, { declare var extraVariables: {nickname: string}; declare var invalidVariables: {foo: string}; +// $FlowFixMe[react-rule-hook] const {loadNext} = useBlockingPaginationFragment( refetchableFragmentInput, keyNonNullable, diff --git a/packages/react-relay/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js b/packages/react-relay/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js index 8659e851196dd..392b4978506f9 100644 --- a/packages/react-relay/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js +++ b/packages/react-relay/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js @@ -50,29 +50,39 @@ type ExpectedReturnType< // $FlowFixMe[prop-missing] // $FlowFixMe[incompatible-cast] // $FlowFixMe[incompatible-exact] +// $FlowFixMe[react-rule-hook] (usePaginationFragment( refetchableFragmentInput, keyNonNullable, ): ExpectedReturnType); +// $FlowFixMe[react-rule-hook] (usePaginationFragment( refetchableFragmentInput, keyNullable, ): ExpectedReturnType); // $FlowExpectedError: can't cast nullable to non-nullable +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[incompatible-cast] (usePaginationFragment( refetchableFragmentInput, keyNullable, ): ExpectedReturnType); // $FlowExpectedError: actual type of returned data is correct +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[incompatible-exact] +// $FlowFixMe[prop-missing] +// $FlowFixMe[incompatible-cast] (usePaginationFragment( refetchableFragmentInput, // $FlowFixMe[incompatible-call] keyAnotherNonNullable, ): ExpectedReturnType); // $FlowExpectedError +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[incompatible-cast] (usePaginationFragment( refetchableFragmentInput, // $FlowFixMe[incompatible-call] @@ -80,18 +90,25 @@ type ExpectedReturnType< ): ExpectedReturnType); // $FlowExpectedError: Key should not be a user provided object +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[prop-missing] usePaginationFragment(refetchableFragmentInput, {abc: 123}); // $FlowExpectedError: Key should not be an empty object +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[prop-missing] usePaginationFragment(refetchableFragmentInput, {}); // $FlowExpectedError: Key should be the `$key` type from generated flow +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[prop-missing] usePaginationFragment(refetchableFragmentInput, fragmentData); // Refetch function options: declare var variables: QueryVariables; declare var environment: IEnvironment; +// $FlowFixMe[react-rule-hook] const {refetch} = usePaginationFragment( refetchableFragmentInput, keyNonNullable, @@ -110,6 +127,7 @@ refetch(variables, { declare var extraVariables: {nickname: string}; declare var invalidVariables: {foo: string}; +// $FlowFixMe[react-rule-hook] const {loadNext} = usePaginationFragment( refetchableFragmentInput, keyNonNullable, diff --git a/packages/react-relay/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js b/packages/react-relay/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js index bce02701b676c..1dff30df69495 100644 --- a/packages/react-relay/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js +++ b/packages/react-relay/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js @@ -34,53 +34,74 @@ import { // $FlowFixMe[prop-missing] // $FlowFixMe[incompatible-cast] // $FlowFixMe[incompatible-exact] +// $FlowFixMe[react-rule-hook] (useRefetchableFragment(refetchableFragmentInput, keyNonNullable): [ NonNullableData, FetchFn, ]); +// $FlowFixMe[react-rule-hook] (useRefetchableFragment(refetchableFragmentInput, keyNullable): [ NullableData, FetchFn, ]); // $FlowExpectedError: can't cast nullable to non-nullable +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[incompatible-cast] (useRefetchableFragment(refetchableFragmentInput, keyNullable): [ NonNullableData, FetchFn, ]); // $FlowExpectedError: refetch requires exact type if key is nullable +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[incompatible-exact] +// $FlowFixMe[prop-missing] (useRefetchableFragment(refetchableFragmentInput, keyNullable): [ NullableData, FetchFn, ]); // $FlowExpectedError: actual type of returned data is correct +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[incompatible-call] +// $FlowFixMe[incompatible-exact] +// $FlowFixMe[prop-missing] +// $FlowFixMe[incompatible-cast] (useRefetchableFragment(refetchableFragmentInput, keyAnotherNonNullable): [ NonNullableData, FetchFn, ]); // $FlowExpectedError - incompatible key types +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[incompatible-call] (useRefetchableFragment(refetchableFragmentInput, keyAnotherNullable): [ NullableData, FetchFn, ]); // $FlowExpectedError: Key should not be a user provided object +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[prop-missing] useRefetchableFragment(refetchableFragmentInput, {abc: 123}); // $FlowExpectedError: Key should not be an empty object +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[prop-missing] useRefetchableFragment(refetchableFragmentInput, {}); // $FlowExpectedError: Key should be the `$key` type from generated flow +// $FlowFixMe[react-rule-hook] +// $FlowFixMe[prop-missing] useRefetchableFragment(refetchableFragmentInput, fragmentData); // Refetch function options: declare var variables: QueryVariables; declare var environment: IEnvironment; +// $FlowFixMe[react-rule-hook] const [, refetch] = useRefetchableFragment( refetchableFragmentInput, keyNonNullable, diff --git a/packages/react-relay/relay-hooks/__tests__/LazyLoadEntryPointContainer_DEEPRECATED-test.js b/packages/react-relay/relay-hooks/__tests__/LazyLoadEntryPointContainer_DEEPRECATED-test.js index 1ddb26a20e996..26b2abac679b9 100644 --- a/packages/react-relay/relay-hooks/__tests__/LazyLoadEntryPointContainer_DEEPRECATED-test.js +++ b/packages/react-relay/relay-hooks/__tests__/LazyLoadEntryPointContainer_DEEPRECATED-test.js @@ -298,6 +298,7 @@ it('renders synchronously when the query and component are already loaded', () = it('re-renders without reloading when non-prefetch props change', () => { // $FlowFixMe[missing-local-annot] error found when enabling Flow LTI mode const Component = jest.fn(props => { + // $FlowFixMe[react-rule-hook] const data = usePreloadedQuery(query, props.queries.prefetched); return data.node?.name; }); @@ -340,6 +341,7 @@ it('re-renders without reloading when non-prefetch props change', () => { it('re-renders and reloads when prefetch params change', () => { // $FlowFixMe[missing-local-annot] error found when enabling Flow LTI mode const Component = jest.fn(props => { + // $FlowFixMe[react-rule-hook] const data = usePreloadedQuery(query, props.queries.prefetched); return data.node?.name; }); diff --git a/packages/react-relay/relay-hooks/__tests__/loadQuery-test.js b/packages/react-relay/relay-hooks/__tests__/loadQuery-test.js index 13deae79e9092..13b6a11f21b97 100644 --- a/packages/react-relay/relay-hooks/__tests__/loadQuery-test.js +++ b/packages/react-relay/relay-hooks/__tests__/loadQuery-test.js @@ -900,6 +900,7 @@ describe('loadQuery', () => { beforeEach(() => { Container = (props: {children: React.Node}) => { + // $FlowFixMe[react-rule-hook] useTrackLoadQueryInRender(); return props.children; }; diff --git a/packages/react-relay/relay-hooks/__tests__/useEntryPointLoader-test.js b/packages/react-relay/relay-hooks/__tests__/useEntryPointLoader-test.js index 5cb751ff79643..59df975fc115a 100644 --- a/packages/react-relay/relay-hooks/__tests__/useEntryPointLoader-test.js +++ b/packages/react-relay/relay-hooks/__tests__/useEntryPointLoader-test.js @@ -78,6 +78,7 @@ beforeEach(() => { }) { renderCount = (renderCount || 0) + 1; [loadedEntryPoint, entryPointLoaderCallback, disposeEntryPoint] = + // $FlowFixMe[react-rule-hook] useEntryPointLoader<{...}, any, any, any, any, any, any>( environmentProvider, entryPoint, diff --git a/packages/react-relay/relay-hooks/__tests__/useFragment-test.js b/packages/react-relay/relay-hooks/__tests__/useFragment-test.js index 313d02db37918..0c9e6f3e06c63 100644 --- a/packages/react-relay/relay-hooks/__tests__/useFragment-test.js +++ b/packages/react-relay/relay-hooks/__tests__/useFragment-test.js @@ -58,7 +58,7 @@ let SingularRenderer; let PluralRenderer; let ContextProvider; -function useFragment( +hook useFragment( fragmentNode: | Fragment< useFragmentTestUserFragment$fragmentType, diff --git a/packages/react-relay/relay-hooks/__tests__/useFragmentNode-required-test.js b/packages/react-relay/relay-hooks/__tests__/useFragmentNode-required-test.js index f70f8bc8571aa..969ffab8ad921 100644 --- a/packages/react-relay/relay-hooks/__tests__/useFragmentNode-required-test.js +++ b/packages/react-relay/relay-hooks/__tests__/useFragmentNode-required-test.js @@ -32,7 +32,7 @@ let singularQuery; let renderSingularFragment; let renderSpy; -function useFragmentNode( +hook useFragmentNode( fragmentNode: ReaderFragment, fragmentRef: $TEMPORARY$object<{ __fragmentOwner: RequestDescriptor, diff --git a/packages/react-relay/relay-hooks/__tests__/useFragmentNode-test.js b/packages/react-relay/relay-hooks/__tests__/useFragmentNode-test.js index 8d43b50245fa0..db599b3dba20c 100644 --- a/packages/react-relay/relay-hooks/__tests__/useFragmentNode-test.js +++ b/packages/react-relay/relay-hooks/__tests__/useFragmentNode-test.js @@ -92,7 +92,7 @@ type ReturnType = { disableStoreUpdates: () => void, enableStoreUpdates: () => void, }; -function useFragmentNode_NEW( +hook useFragmentNode_NEW( fragment: | Fragment< useFragmentNodeTestUserFragment$fragmentType, diff --git a/packages/react-relay/relay-hooks/__tests__/usePaginationFragment-test.js b/packages/react-relay/relay-hooks/__tests__/usePaginationFragment-test.js index dae81484e4a3a..cc676ba43f72c 100644 --- a/packages/react-relay/relay-hooks/__tests__/usePaginationFragment-test.js +++ b/packages/react-relay/relay-hooks/__tests__/usePaginationFragment-test.js @@ -117,7 +117,7 @@ class ErrorBoundary extends React.Component { } } -function usePaginationFragment(fragmentNode: any, fragmentRef: any) { +hook usePaginationFragment(fragmentNode: any, fragmentRef: any) { /* $FlowFixMe[underconstrained-implicit-instantiation] error found when * enabling Flow LTI mode */ const {data, ...result} = usePaginationFragmentImpl( diff --git a/packages/react-relay/relay-hooks/legacy/useBlockingPaginationFragment.js b/packages/react-relay/relay-hooks/legacy/useBlockingPaginationFragment.js index ba49cb0882221..702e4b8b6d76d 100644 --- a/packages/react-relay/relay-hooks/legacy/useBlockingPaginationFragment.js +++ b/packages/react-relay/relay-hooks/legacy/useBlockingPaginationFragment.js @@ -65,7 +65,7 @@ type ReturnType = { refetch: RefetchFn, }; -function useBlockingPaginationFragment< +hook useBlockingPaginationFragment< TFragmentType: FragmentType, TVariables: Variables, TData, @@ -166,7 +166,7 @@ function useBlockingPaginationFragment< }; } -function useLoadMore(args: { +hook useLoadMore(args: { disableStoreUpdates: () => void, enableStoreUpdates: () => void, ...$Exact< diff --git a/packages/react-relay/relay-hooks/legacy/useFragmentNode.js b/packages/react-relay/relay-hooks/legacy/useFragmentNode.js index 462d68904dc8e..996d4a8c687a8 100644 --- a/packages/react-relay/relay-hooks/legacy/useFragmentNode.js +++ b/packages/react-relay/relay-hooks/legacy/useFragmentNode.js @@ -26,7 +26,7 @@ type ReturnType = { enableStoreUpdates: () => void, }; -function useFragmentNode( +hook useFragmentNode( fragmentNode: ReaderFragment, fragmentRef: mixed, componentDisplayName: string, diff --git a/packages/react-relay/relay-hooks/legacy/useRefetchableFragmentNode.js b/packages/react-relay/relay-hooks/legacy/useRefetchableFragmentNode.js index 1587c3062a8a9..f3bac9430145f 100644 --- a/packages/react-relay/relay-hooks/legacy/useRefetchableFragmentNode.js +++ b/packages/react-relay/relay-hooks/legacy/useRefetchableFragmentNode.js @@ -162,7 +162,7 @@ function reducer(state: RefetchState, action: Action): RefetchState { } } -function useRefetchableFragmentNode< +hook useRefetchableFragmentNode< TQuery: OperationType, TKey: ?{+$data?: mixed, ...}, >( @@ -367,7 +367,7 @@ function useRefetchableFragmentNode< }; } -function useRefetchFunction( +hook useRefetchFunction( componentDisplayName: string, dispatch: ( | { diff --git a/packages/react-relay/relay-hooks/loadQuery.js b/packages/react-relay/relay-hooks/loadQuery.js index d6253965781b9..66e8177afea44 100644 --- a/packages/react-relay/relay-hooks/loadQuery.js +++ b/packages/react-relay/relay-hooks/loadQuery.js @@ -46,7 +46,7 @@ const warning = require('warning'); let RenderDispatcher = null; let fetchKey = 100001; -function useTrackLoadQueryInRender() { +hook useTrackLoadQueryInRender() { if (RenderDispatcher === null) { // Flow does not know of React internals (rightly so), but we need to // ensure here that this function isn't called inside render. diff --git a/packages/react-relay/relay-hooks/useClientQuery.js b/packages/react-relay/relay-hooks/useClientQuery.js index f32ab864b6eb5..0d8204475680a 100644 --- a/packages/react-relay/relay-hooks/useClientQuery.js +++ b/packages/react-relay/relay-hooks/useClientQuery.js @@ -20,7 +20,7 @@ const useLazyLoadQuery = require('./useLazyLoadQuery'); * These queries are consist of queries for client-only data, * schematized via local schema extensions and/or Relay resolvers. */ -function useClientQuery( +hook useClientQuery( gqlQuery: ClientQuery, variables: TVariables, options?: { diff --git a/packages/react-relay/relay-hooks/useEntryPointLoader.js b/packages/react-relay/relay-hooks/useEntryPointLoader.js index 7040a87fb67a8..6c59cbf8a011f 100644 --- a/packages/react-relay/relay-hooks/useEntryPointLoader.js +++ b/packages/react-relay/relay-hooks/useEntryPointLoader.js @@ -50,7 +50,7 @@ type NullEntryPointReference = { }; const initialNullEntryPointReferenceState = {kind: 'NullEntryPointReference'}; -function useLoadEntryPoint< +hook useLoadEntryPoint< TEntryPointParams: {...}, TPreloadedQueries: {...}, TPreloadedEntryPoints: {...}, diff --git a/packages/react-relay/relay-hooks/useFetchTrackingRef.js b/packages/react-relay/relay-hooks/useFetchTrackingRef.js index 5e79d27fe3e44..be9f04b822f21 100644 --- a/packages/react-relay/relay-hooks/useFetchTrackingRef.js +++ b/packages/react-relay/relay-hooks/useFetchTrackingRef.js @@ -28,7 +28,7 @@ const {useCallback, useEffect} = require('react'); * The additional functions returned by this Hook can be used to mutate * the ref. */ -function useFetchTrackingRef(): { +hook useFetchTrackingRef(): { isFetchingRef: {current: ?boolean, ...}, startFetch: Subscription => void, disposeFetch: () => void, diff --git a/packages/react-relay/relay-hooks/useFragment.js b/packages/react-relay/relay-hooks/useFragment.js index 5d488d7625cf0..8a4f7f2735700 100644 --- a/packages/react-relay/relay-hooks/useFragment.js +++ b/packages/react-relay/relay-hooks/useFragment.js @@ -25,30 +25,30 @@ type HasSpread = { }; // if the key is non-nullable, return non-nullable value -declare function useFragment( +declare hook useFragment( fragment: Fragment, key: HasSpread, ): TData; // if the key is nullable, return nullable value -declare function useFragment( +declare hook useFragment( fragment: Fragment, key: ?HasSpread, ): ?TData; // if the key is a non-nullable array of keys, return non-nullable array -declare function useFragment( +declare hook useFragment( fragment: Fragment, key: $ReadOnlyArray>, ): TData; // if the key is a nullable array of keys, return nullable array -declare function useFragment( +declare hook useFragment( fragment: Fragment, key: ?$ReadOnlyArray>, ): ?TData; -function useFragment(fragment: GraphQLTaggedNode, key: mixed): mixed { +hook useFragment(fragment: GraphQLTaggedNode, key: mixed): mixed { // We need to use this hook in order to be able to track if // loadQuery was called during render useTrackLoadQueryInRender(); @@ -58,6 +58,7 @@ function useFragment(fragment: GraphQLTaggedNode, key: mixed): mixed { const data = useFragmentInternal(fragmentNode, key, 'useFragment()'); if (__DEV__) { // eslint-disable-next-line react-hooks/rules-of-hooks + // $FlowFixMe[react-rule-hook] useDebugValue({fragment: fragmentNode.name, data}); } return data; diff --git a/packages/react-relay/relay-hooks/useFragmentInternal.js b/packages/react-relay/relay-hooks/useFragmentInternal.js index 285885a5172b7..9ad7d1cad69c5 100644 --- a/packages/react-relay/relay-hooks/useFragmentInternal.js +++ b/packages/react-relay/relay-hooks/useFragmentInternal.js @@ -360,7 +360,7 @@ function getFragmentState( } // fragmentNode cannot change during the lifetime of the component, though fragmentRef may change. -function useFragmentInternal( +hook useFragmentInternal( fragmentNode: ReaderFragment, fragmentRef: mixed, hookDisplayName: string, @@ -466,6 +466,7 @@ function useFragmentInternal( // a static (constant) property of the fragment. In practice, this effect will // always or never run for a given invocation of this hook. // eslint-disable-next-line react-hooks/rules-of-hooks + // $FlowFixMe[react-rule-hook] const [clientEdgeQueries, activeRequestPromises] = useMemo(() => { const missingClientEdges = getMissingClientEdges(state); // eslint-disable-next-line no-shadow @@ -496,6 +497,7 @@ function useFragmentInternal( // See above note // eslint-disable-next-line react-hooks/rules-of-hooks + // $FlowFixMe[react-rule-hook] useEffect(() => { const QueryResource = getQueryResourceForEnvironment(environment); if (clientEdgeQueries?.length) { @@ -602,6 +604,7 @@ function useFragmentInternal( // for a particular useFragment invocation site const fragmentRefIsNullish = fragmentRef == null; // for less sensitive memoization // eslint-disable-next-line react-hooks/rules-of-hooks + // $FlowFixMe[react-rule-hook] data = useMemo(() => { if (state.kind === 'bailout') { // Bailout state can happen if the fragmentRef is a plural array that is empty or has no @@ -652,6 +655,7 @@ function useFragmentInternal( if (__DEV__) { // eslint-disable-next-line react-hooks/rules-of-hooks + // $FlowFixMe[react-rule-hook] useDebugValue({fragment: fragmentNode.name, data}); } diff --git a/packages/react-relay/relay-hooks/useIsMountedRef.js b/packages/react-relay/relay-hooks/useIsMountedRef.js index 8ce8443eb6898..e00a5ee650f09 100644 --- a/packages/react-relay/relay-hooks/useIsMountedRef.js +++ b/packages/react-relay/relay-hooks/useIsMountedRef.js @@ -13,7 +13,7 @@ const {useEffect, useRef} = require('react'); -function useIsMountedRef(): {current: boolean} { +hook useIsMountedRef(): {current: boolean} { const isMountedRef = useRef(true); useEffect(() => { diff --git a/packages/react-relay/relay-hooks/useIsOperationNodeActive.js b/packages/react-relay/relay-hooks/useIsOperationNodeActive.js index 66aff34feec99..0f204996ba797 100644 --- a/packages/react-relay/relay-hooks/useIsOperationNodeActive.js +++ b/packages/react-relay/relay-hooks/useIsOperationNodeActive.js @@ -23,7 +23,7 @@ const { const {useEffect, useState, useMemo} = React; -function useIsOperationNodeActive( +hook useIsOperationNodeActive( fragmentNode: ReaderFragment, fragmentRef: mixed, ): boolean { diff --git a/packages/react-relay/relay-hooks/useIsParentQueryActive.js b/packages/react-relay/relay-hooks/useIsParentQueryActive.js index fb97fe3a693f5..080598b7998db 100644 --- a/packages/react-relay/relay-hooks/useIsParentQueryActive.js +++ b/packages/react-relay/relay-hooks/useIsParentQueryActive.js @@ -17,9 +17,12 @@ const useIsOperationNodeActive = require('./useIsOperationNodeActive'); const useStaticFragmentNodeWarning = require('./useStaticFragmentNodeWarning'); const {getFragment} = require('relay-runtime'); -function useIsParentQueryActive< +hook useIsParentQueryActive< TKey: ?{+$data?: mixed, +$fragmentSpreads: FragmentType, ...}, ->(fragmentInput: GraphQLTaggedNode, fragmentRef: TKey): boolean { +>( + fragmentInput: GraphQLTaggedNode, + fragmentRef: TKey, +): boolean { const fragmentNode = getFragment(fragmentInput); useStaticFragmentNodeWarning( fragmentNode, diff --git a/packages/react-relay/relay-hooks/useLazyLoadQuery.js b/packages/react-relay/relay-hooks/useLazyLoadQuery.js index a699c65bf1440..28c9cf42b1cce 100644 --- a/packages/react-relay/relay-hooks/useLazyLoadQuery.js +++ b/packages/react-relay/relay-hooks/useLazyLoadQuery.js @@ -41,7 +41,7 @@ export type UseLazyLoadQueryHookType = ( }, ) => TData; -function useLazyLoadQuery( +hook useLazyLoadQuery( gqlQuery: Query, variables: TVariables, options?: { @@ -75,4 +75,5 @@ function useLazyLoadQuery( return data; } +// $FlowFixMe[react-rule-hook-incompatible] module.exports = (useLazyLoadQuery: UseLazyLoadQueryHookType); diff --git a/packages/react-relay/relay-hooks/useLazyLoadQueryNode.js b/packages/react-relay/relay-hooks/useLazyLoadQueryNode.js index f221c807a0535..761437071e424 100644 --- a/packages/react-relay/relay-hooks/useLazyLoadQueryNode.js +++ b/packages/react-relay/relay-hooks/useLazyLoadQueryNode.js @@ -32,7 +32,7 @@ const React = require('react'); const {useContext, useEffect, useState, useRef} = React; -function useLazyLoadQueryNode({ +hook useLazyLoadQueryNode({ query, componentDisplayName, fetchObservable, diff --git a/packages/react-relay/relay-hooks/useLoadMoreFunction.js b/packages/react-relay/relay-hooks/useLoadMoreFunction.js index 779574d1458ac..8c87e52222ed6 100644 --- a/packages/react-relay/relay-hooks/useLoadMoreFunction.js +++ b/packages/react-relay/relay-hooks/useLoadMoreFunction.js @@ -61,7 +61,7 @@ export type UseLoadMoreFunctionArgs = { onReset: () => void, }; -function useLoadMoreFunction( +hook useLoadMoreFunction( args: UseLoadMoreFunctionArgs, ): [LoadMoreFn, boolean, () => void] { const { diff --git a/packages/react-relay/relay-hooks/useMemoOperationDescriptor.js b/packages/react-relay/relay-hooks/useMemoOperationDescriptor.js index ff9a98e0d8d84..1ffe171d67a95 100644 --- a/packages/react-relay/relay-hooks/useMemoOperationDescriptor.js +++ b/packages/react-relay/relay-hooks/useMemoOperationDescriptor.js @@ -24,7 +24,7 @@ const {createOperationDescriptor, getRequest} = require('relay-runtime'); const {useMemo} = React; -function useMemoOperationDescriptor( +hook useMemoOperationDescriptor( gqlQuery: GraphQLTaggedNode, variables: Variables, cacheConfig?: ?CacheConfig, diff --git a/packages/react-relay/relay-hooks/useMemoVariables.js b/packages/react-relay/relay-hooks/useMemoVariables.js index db4f80522580c..85fc54a7b6650 100644 --- a/packages/react-relay/relay-hooks/useMemoVariables.js +++ b/packages/react-relay/relay-hooks/useMemoVariables.js @@ -21,7 +21,7 @@ const {useState} = require('react'); * This is useful when a `variables` object is used as a value in a depencency * array as it might often be constructed during render. */ -function useMemoVariables( +hook useMemoVariables( variables: TVariables, ): TVariables { const [mirroredVariables, setMirroredVariables] = useState(variables); diff --git a/packages/react-relay/relay-hooks/useMutation.js b/packages/react-relay/relay-hooks/useMutation.js index 0f97bacf39f26..c4031929abf4b 100644 --- a/packages/react-relay/relay-hooks/useMutation.js +++ b/packages/react-relay/relay-hooks/useMutation.js @@ -64,7 +64,7 @@ type UseMutationConfigInternal = { variables: TVariables, }; -function useMutation( +hook useMutation( mutation: Mutation, commitMutationFn?: ( environment: IEnvironment, diff --git a/packages/react-relay/relay-hooks/usePaginationFragment.js b/packages/react-relay/relay-hooks/usePaginationFragment.js index f7a02f8bd6805..6e3fd2fb13ff7 100644 --- a/packages/react-relay/relay-hooks/usePaginationFragment.js +++ b/packages/react-relay/relay-hooks/usePaginationFragment.js @@ -80,7 +80,7 @@ export type UsePaginationFragmentType = < parentFragmentRef: TKey, ) => ReturnType; -function usePaginationFragment< +hook usePaginationFragment< TFragmentType: FragmentType, TVariables: Variables, TData, @@ -144,6 +144,7 @@ function usePaginationFragment< if (__DEV__) { // eslint-disable-next-line react-hooks/rules-of-hooks + // $FlowFixMe[react-rule-hook] useDebugValue({ fragment: fragmentNode.name, data: fragmentData, @@ -166,7 +167,7 @@ function usePaginationFragment< }; } -function useLoadMore( +hook useLoadMore( args: $Diff< UseLoadMoreFunctionArgs, { diff --git a/packages/react-relay/relay-hooks/usePreloadedQuery.js b/packages/react-relay/relay-hooks/usePreloadedQuery.js index ace1414195c49..346079604171b 100644 --- a/packages/react-relay/relay-hooks/usePreloadedQuery.js +++ b/packages/react-relay/relay-hooks/usePreloadedQuery.js @@ -52,7 +52,7 @@ type PreloadedQuery< TEnvironmentProviderOptions, >; -function usePreloadedQuery< +hook usePreloadedQuery< TVariables: Variables, TData, TRawResponse: ?{...} = void, @@ -164,6 +164,7 @@ function usePreloadedQuery< if (__DEV__) { // eslint-disable-next-line react-hooks/rules-of-hooks + // $FlowFixMe[react-rule-hook] useDebugValue({ query: preloadedQuery.name, variables: preloadedQuery.variables, diff --git a/packages/react-relay/relay-hooks/useQueryLoader.js b/packages/react-relay/relay-hooks/useQueryLoader.js index ba25733f965dc..b6a839103d38b 100644 --- a/packages/react-relay/relay-hooks/useQueryLoader.js +++ b/packages/react-relay/relay-hooks/useQueryLoader.js @@ -108,11 +108,7 @@ declare function useQueryLoader( initialQueryReference?: ?PreloadedQuery, ): UseQueryLoaderHookReturnType; -function useQueryLoader< - TVariables: Variables, - TData, - TRawResponse: ?{...} = void, ->( +hook useQueryLoader( preloadableRequest: Query, initialQueryReference?: ?PreloadedQuery<{ response: TData, diff --git a/packages/react-relay/relay-hooks/useRefetchableFragment.js b/packages/react-relay/relay-hooks/useRefetchableFragment.js index e61c9a28c613c..69c99c39d78da 100644 --- a/packages/react-relay/relay-hooks/useRefetchableFragment.js +++ b/packages/react-relay/relay-hooks/useRefetchableFragment.js @@ -64,7 +64,7 @@ export type UseRefetchableFragmentType = < key: TKey, ) => ReturnType; -function useRefetchableFragment< +hook useRefetchableFragment< TFragmentType: FragmentType, TVariables: Variables, TData, @@ -84,6 +84,7 @@ function useRefetchableFragment< >(fragmentNode, fragmentRef, 'useRefetchableFragment()'); if (__DEV__) { // eslint-disable-next-line react-hooks/rules-of-hooks + // $FlowFixMe[react-rule-hook] useDebugValue({fragment: fragmentNode.name, data: fragmentData}); } // $FlowFixMe[incompatible-return] diff --git a/packages/react-relay/relay-hooks/useRefetchableFragmentInternal.js b/packages/react-relay/relay-hooks/useRefetchableFragmentInternal.js index 535022f11ee4f..f82dcc25d1b0f 100644 --- a/packages/react-relay/relay-hooks/useRefetchableFragmentInternal.js +++ b/packages/react-relay/relay-hooks/useRefetchableFragmentInternal.js @@ -160,7 +160,7 @@ function reducer(state: RefetchState, action: Action): RefetchState { } } -function useRefetchableFragmentNode< +hook useRefetchableFragmentNode< TQuery: OperationType, TKey: ?{+$data?: mixed, ...}, >( @@ -355,7 +355,7 @@ function useRefetchableFragmentNode< }; } -function useRefetchFunction( +hook useRefetchFunction( componentDisplayName: string, dispatch: ( | { diff --git a/packages/react-relay/relay-hooks/useRelayEnvironment.js b/packages/react-relay/relay-hooks/useRelayEnvironment.js index 4ec75b0539537..ddb2a8e41b96d 100644 --- a/packages/react-relay/relay-hooks/useRelayEnvironment.js +++ b/packages/react-relay/relay-hooks/useRelayEnvironment.js @@ -17,7 +17,7 @@ const ReactRelayContext = require('./../ReactRelayContext'); const invariant = require('invariant'); const {useContext} = require('react'); -function useRelayEnvironment(): IEnvironment { +hook useRelayEnvironment(): IEnvironment { const context = useContext(ReactRelayContext); invariant( context != null, diff --git a/packages/react-relay/relay-hooks/useStaticFragmentNodeWarning.js b/packages/react-relay/relay-hooks/useStaticFragmentNodeWarning.js index 3b6975071a22b..d76c92af596fd 100644 --- a/packages/react-relay/relay-hooks/useStaticFragmentNodeWarning.js +++ b/packages/react-relay/relay-hooks/useStaticFragmentNodeWarning.js @@ -16,7 +16,7 @@ import type {ReaderFragment} from 'relay-runtime'; const useUnsafeRef_DEPRECATED = require('./useUnsafeRef_DEPRECATED'); const warning = require('warning'); -function useStaticFragmentNodeWarning( +hook useStaticFragmentNodeWarning( fragmentNode: ReaderFragment, warningContext: string, ): void { @@ -25,6 +25,7 @@ function useStaticFragmentNodeWarning( // __DEV__ setting which shouldn't change. This allows us to only pay the // cost of `useRef` in development mode to produce the warning. // eslint-disable-next-line react-hooks/rules-of-hooks + // $FlowFixMe[react-rule-hook] const initialPropRef = useUnsafeRef_DEPRECATED(fragmentNode.name); warning( initialPropRef.current === fragmentNode.name, diff --git a/packages/react-relay/relay-hooks/useSubscribeToInvalidationState.js b/packages/react-relay/relay-hooks/useSubscribeToInvalidationState.js index 12ac10d5330ad..8f24c8ad7d3d5 100644 --- a/packages/react-relay/relay-hooks/useSubscribeToInvalidationState.js +++ b/packages/react-relay/relay-hooks/useSubscribeToInvalidationState.js @@ -25,7 +25,7 @@ const {useEffect, useRef} = require('react'); * re-established and the previous one will be disposed. * The subscription will automatically be disposed on unmount */ -function useSubscribeToInvalidationState( +hook useSubscribeToInvalidationState( dataIDs: $ReadOnlyArray, callback: () => void, ): Disposable { diff --git a/packages/react-relay/relay-hooks/useSubscription.js b/packages/react-relay/relay-hooks/useSubscription.js index d9aa82d558fd0..0256c669d342a 100644 --- a/packages/react-relay/relay-hooks/useSubscription.js +++ b/packages/react-relay/relay-hooks/useSubscription.js @@ -26,7 +26,7 @@ type RequestSubscriptionFn = ( config: GraphQLSubscriptionConfig, ) => Disposable; -function useSubscription( +hook useSubscription( config: GraphQLSubscriptionConfig, requestSubscriptionFn?: RequestSubscriptionFn< TVariables, diff --git a/packages/react-relay/relay-hooks/useUnsafeRef_DEPRECATED.js b/packages/react-relay/relay-hooks/useUnsafeRef_DEPRECATED.js index 72842dbc8d9bc..fb7e7412f9fc9 100644 --- a/packages/react-relay/relay-hooks/useUnsafeRef_DEPRECATED.js +++ b/packages/react-relay/relay-hooks/useUnsafeRef_DEPRECATED.js @@ -18,7 +18,7 @@ const {useMemo} = require('react'); * pattern to read or write from a ref during render as it does not trigger * a rerender and might result in bugs. */ -function useUnsafeRef_DEPRECATED(init: T): {current: T} { +hook useUnsafeRef_DEPRECATED(init: T): {current: T} { return useMemo<{current: T}>(() => ({current: init}), []); }