react-relay 14.1.0 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/ReactRelayContainerUtils.js.flow +1 -0
  2. package/ReactRelayContext.js +1 -1
  3. package/ReactRelayContext.js.flow +1 -0
  4. package/ReactRelayFragmentContainer.js.flow +6 -2
  5. package/ReactRelayFragmentMockRenderer.js.flow +1 -0
  6. package/ReactRelayLocalQueryRenderer.js.flow +5 -3
  7. package/ReactRelayPaginationContainer.js.flow +21 -12
  8. package/ReactRelayQueryFetcher.js.flow +20 -10
  9. package/ReactRelayQueryRenderer.js.flow +15 -11
  10. package/ReactRelayQueryRendererContext.js.flow +1 -0
  11. package/ReactRelayRefetchContainer.js.flow +9 -5
  12. package/ReactRelayTestMocker.js.flow +3 -1
  13. package/ReactRelayTypes.js.flow +2 -0
  14. package/RelayContext.js.flow +1 -0
  15. package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +2 -1
  16. package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +1 -0
  17. package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +1 -0
  18. package/__flowtests__/RelayModern-flowtest.js.flow +1 -0
  19. package/__flowtests__/RelayModernFlowtest_badref.graphql.js.flow +1 -0
  20. package/__flowtests__/RelayModernFlowtest_notref.graphql.js.flow +1 -0
  21. package/__flowtests__/RelayModernFlowtest_user.graphql.js.flow +1 -0
  22. package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +1 -0
  23. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +3 -1
  24. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +3 -1
  25. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +4 -2
  26. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +3 -1
  27. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +4 -2
  28. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +3 -1
  29. package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +4 -2
  30. package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +4 -2
  31. package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +3 -1
  32. package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +3 -1
  33. package/assertFragmentMap.js.flow +1 -0
  34. package/buildReactRelayContainer.js.flow +10 -6
  35. package/getRootVariablesForFragments.js.flow +1 -1
  36. package/hooks.js +1 -1
  37. package/hooks.js.flow +4 -0
  38. package/index.js +1 -1
  39. package/index.js.flow +4 -0
  40. package/isRelayEnvironment.js.flow +1 -0
  41. package/jest-react/enqueueTask.js.flow +1 -1
  42. package/jest-react/index.js.flow +1 -1
  43. package/jest-react/internalAct.js.flow +1 -1
  44. package/legacy.js +1 -1
  45. package/legacy.js.flow +1 -0
  46. package/lib/ReactRelayContainerUtils.js +0 -11
  47. package/lib/ReactRelayContext.js +1 -12
  48. package/lib/ReactRelayFragmentContainer.js +23 -122
  49. package/lib/ReactRelayFragmentMockRenderer.js +0 -12
  50. package/lib/ReactRelayLocalQueryRenderer.js +12 -41
  51. package/lib/ReactRelayPaginationContainer.js +45 -341
  52. package/lib/ReactRelayQueryFetcher.js +36 -111
  53. package/lib/ReactRelayQueryRenderer.js +29 -137
  54. package/lib/ReactRelayQueryRendererContext.js +0 -10
  55. package/lib/ReactRelayRefetchContainer.js +33 -166
  56. package/lib/ReactRelayTestMocker.js +18 -128
  57. package/lib/ReactRelayTypes.js +0 -9
  58. package/lib/RelayContext.js +0 -23
  59. package/lib/assertFragmentMap.js +0 -16
  60. package/lib/buildReactRelayContainer.js +7 -41
  61. package/lib/getRootVariablesForFragments.js +2 -19
  62. package/lib/hooks.js +3 -30
  63. package/lib/index.js +3 -39
  64. package/lib/isRelayEnvironment.js +1 -16
  65. package/lib/jest-react/enqueueTask.js +1 -25
  66. package/lib/jest-react/index.js +0 -1
  67. package/lib/jest-react/internalAct.js +2 -51
  68. package/lib/legacy.js +0 -20
  69. package/lib/multi-actor/ActorChange.js +0 -14
  70. package/lib/multi-actor/index.js +0 -10
  71. package/lib/multi-actor/useRelayActorEnvironment.js +2 -16
  72. package/lib/relay-hooks/EntryPointContainer.react.js +7 -23
  73. package/lib/relay-hooks/EntryPointTypes.flow.js +0 -10
  74. package/lib/relay-hooks/FragmentResource.js +130 -280
  75. package/lib/relay-hooks/HooksImplementation.js +0 -14
  76. package/lib/relay-hooks/InternalLogger.js +0 -11
  77. package/lib/relay-hooks/LRUCache.js +0 -39
  78. package/lib/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js +27 -65
  79. package/lib/relay-hooks/MatchContainer.js +9 -111
  80. package/lib/relay-hooks/NestedRelayEntryPointBuilderUtils.js +9 -0
  81. package/lib/relay-hooks/ProfilerContext.js +0 -14
  82. package/lib/relay-hooks/QueryResource.js +14 -149
  83. package/lib/relay-hooks/RelayEnvironmentProvider.js +3 -17
  84. package/lib/relay-hooks/SuspenseResource.js +2 -59
  85. package/lib/relay-hooks/loadEntryPoint.js +10 -45
  86. package/lib/relay-hooks/loadQuery.js +29 -169
  87. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +8 -58
  88. package/lib/relay-hooks/prepareEntryPoint_DEPRECATED.js +6 -24
  89. package/lib/relay-hooks/react-cache/RelayReactCache.js +4 -20
  90. package/lib/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js +13 -102
  91. package/lib/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js +18 -75
  92. package/lib/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js +79 -222
  93. package/lib/relay-hooks/react-cache/useFragment_REACT_CACHE.js +3 -27
  94. package/lib/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js +11 -33
  95. package/lib/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js +62 -85
  96. package/lib/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js +20 -63
  97. package/lib/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js +53 -179
  98. package/lib/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js +5 -27
  99. package/lib/relay-hooks/useBlockingPaginationFragment.js +58 -121
  100. package/lib/relay-hooks/useClientQuery.js +0 -21
  101. package/lib/relay-hooks/useEntryPointLoader.js +12 -100
  102. package/lib/relay-hooks/useFetchTrackingRef.js +6 -33
  103. package/lib/relay-hooks/useFragment.js +5 -32
  104. package/lib/relay-hooks/useFragmentNode.js +14 -55
  105. package/lib/relay-hooks/useIsMountedRef.js +2 -14
  106. package/lib/relay-hooks/useIsOperationNodeActive.js +6 -29
  107. package/lib/relay-hooks/useIsParentQueryActive.js +1 -15
  108. package/lib/relay-hooks/useLazyLoadQuery.js +2 -23
  109. package/lib/relay-hooks/useLazyLoadQueryNode.js +18 -63
  110. package/lib/relay-hooks/useLoadMoreFunction.js +44 -100
  111. package/lib/relay-hooks/useMemoOperationDescriptor.js +4 -23
  112. package/lib/relay-hooks/useMemoVariables.js +8 -43
  113. package/lib/relay-hooks/useMutation.js +6 -34
  114. package/lib/relay-hooks/usePaginationFragment.js +49 -89
  115. package/lib/relay-hooks/usePreloadedQuery.js +10 -54
  116. package/lib/relay-hooks/useQueryLoader.js +18 -116
  117. package/lib/relay-hooks/useRefetchableFragment.js +4 -30
  118. package/lib/relay-hooks/useRefetchableFragmentNode.js +58 -184
  119. package/lib/relay-hooks/useRelayEnvironment.js +2 -16
  120. package/lib/relay-hooks/useStaticFragmentNodeWarning.js +2 -20
  121. package/lib/relay-hooks/useSubscribeToInvalidationState.js +3 -28
  122. package/lib/relay-hooks/useSubscription.js +3 -22
  123. package/lib/relay-hooks/useUnsafeRef_DEPRECATED.js +12 -0
  124. package/multi-actor/ActorChange.js.flow +1 -1
  125. package/multi-actor/index.js.flow +1 -1
  126. package/multi-actor/useRelayActorEnvironment.js.flow +2 -2
  127. package/package.json +2 -2
  128. package/react-relay-hooks.js +2 -2
  129. package/react-relay-hooks.min.js +2 -2
  130. package/react-relay-legacy.js +2 -2
  131. package/react-relay-legacy.min.js +2 -2
  132. package/react-relay.js +2 -2
  133. package/react-relay.min.js +2 -2
  134. package/relay-hooks/EntryPointContainer.react.js.flow +6 -1
  135. package/relay-hooks/EntryPointTypes.flow.js.flow +23 -20
  136. package/relay-hooks/FragmentResource.js.flow +148 -34
  137. package/relay-hooks/HooksImplementation.js.flow +1 -1
  138. package/relay-hooks/InternalLogger.js.flow +1 -1
  139. package/relay-hooks/LRUCache.js.flow +1 -1
  140. package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +19 -10
  141. package/relay-hooks/MatchContainer.js.flow +1 -1
  142. package/relay-hooks/NestedRelayEntryPointBuilderUtils.js.flow +51 -0
  143. package/relay-hooks/ProfilerContext.js.flow +1 -1
  144. package/relay-hooks/QueryResource.js.flow +25 -5
  145. package/relay-hooks/RelayEnvironmentProvider.js.flow +2 -2
  146. package/relay-hooks/SuspenseResource.js.flow +1 -1
  147. package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +3 -1
  148. package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +9 -7
  149. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +3 -1
  150. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +3 -1
  151. package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +40 -33
  152. package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +1 -1
  153. package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +38 -32
  154. package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +20 -18
  155. package/relay-hooks/__flowtests__/utils.js.flow +13 -2
  156. package/relay-hooks/loadEntryPoint.js.flow +15 -8
  157. package/relay-hooks/loadQuery.js.flow +32 -8
  158. package/relay-hooks/preloadQuery_DEPRECATED.js.flow +5 -6
  159. package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +17 -10
  160. package/relay-hooks/react-cache/RelayReactCache.js.flow +1 -1
  161. package/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js.flow +4 -4
  162. package/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js.flow +5 -4
  163. package/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js.flow +32 -14
  164. package/relay-hooks/react-cache/useFragment_REACT_CACHE.js.flow +4 -10
  165. package/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js.flow +1 -1
  166. package/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js.flow +39 -49
  167. package/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js.flow +1 -2
  168. package/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js.flow +29 -16
  169. package/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js.flow +17 -33
  170. package/relay-hooks/useBlockingPaginationFragment.js.flow +85 -58
  171. package/relay-hooks/useClientQuery.js.flow +3 -3
  172. package/relay-hooks/useEntryPointLoader.js.flow +10 -6
  173. package/relay-hooks/useFetchTrackingRef.js.flow +5 -4
  174. package/relay-hooks/useFragment.js.flow +2 -2
  175. package/relay-hooks/useFragmentNode.js.flow +7 -6
  176. package/relay-hooks/useIsMountedRef.js.flow +1 -1
  177. package/relay-hooks/useIsOperationNodeActive.js.flow +1 -1
  178. package/relay-hooks/useIsParentQueryActive.js.flow +1 -1
  179. package/relay-hooks/useLazyLoadQuery.js.flow +2 -2
  180. package/relay-hooks/useLazyLoadQueryNode.js.flow +2 -2
  181. package/relay-hooks/useLoadMoreFunction.js.flow +27 -16
  182. package/relay-hooks/useMemoOperationDescriptor.js.flow +3 -3
  183. package/relay-hooks/useMemoVariables.js.flow +13 -29
  184. package/relay-hooks/useMutation.js.flow +30 -13
  185. package/relay-hooks/usePaginationFragment.js.flow +55 -54
  186. package/relay-hooks/usePreloadedQuery.js.flow +47 -22
  187. package/relay-hooks/useQueryLoader.js.flow +78 -21
  188. package/relay-hooks/useRefetchableFragment.js.flow +65 -33
  189. package/relay-hooks/useRefetchableFragmentNode.js.flow +38 -17
  190. package/relay-hooks/useRelayEnvironment.js.flow +2 -2
  191. package/relay-hooks/useStaticFragmentNodeWarning.js.flow +3 -3
  192. package/relay-hooks/useSubscribeToInvalidationState.js.flow +2 -2
  193. package/relay-hooks/useSubscription.js.flow +1 -1
  194. package/relay-hooks/useUnsafeRef_DEPRECATED.js.flow +25 -0
  195. package/lib/readContext.js +0 -27
  196. package/readContext.js.flow +0 -29
@@ -4,62 +4,46 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @emails oncall+relay
8
7
  * @flow strict-local
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
13
13
 
14
- import type {RefetchFnDynamic} from './useRefetchableFragmentInternal_REACT_CACHE';
15
- import type {
16
- FragmentType,
17
- GraphQLTaggedNode,
18
- OperationType,
19
- } from 'relay-runtime';
14
+ import type {ReturnType} from '../useRefetchableFragment';
15
+ import type {FragmentType, RefetchableFragment, Variables} from 'relay-runtime';
20
16
 
21
- const useRefetchableFragmentInternal = require('./useRefetchableFragmentInternal_REACT_CACHE');
22
17
  const useStaticFragmentNodeWarning = require('../useStaticFragmentNodeWarning');
18
+ const useRefetchableFragmentInternal = require('./useRefetchableFragmentInternal_REACT_CACHE');
23
19
  const {useDebugValue} = require('react');
24
20
  const {getFragment} = require('relay-runtime');
25
21
 
26
- type ReturnType<TQuery: OperationType, TKey: ?{+$data?: mixed, ...}> = [
27
- // NOTE: This $Call ensures that the type of the returned data is either:
28
- // - nullable if the provided ref type is nullable
29
- // - non-nullable if the provided ref type is non-nullable
30
- // prettier-ignore
31
- $Call<
32
- & (<TFragmentData>( { +$data?: TFragmentData, ... }) => TFragmentData)
33
- & (<TFragmentData>(?{ +$data?: TFragmentData, ... }) => ?TFragmentData),
34
- TKey,
35
- >,
36
- RefetchFnDynamic<TQuery, TKey>,
37
- ];
38
-
39
22
  function useRefetchableFragment<
40
- TQuery: OperationType,
41
- TKey: ?{+$data?: mixed, +$fragmentSpreads: FragmentType, ...},
23
+ TFragmentType: FragmentType,
24
+ TVariables: Variables,
25
+ TData,
26
+ TKey: ?{+$fragmentSpreads: TFragmentType, ...},
42
27
  >(
43
- fragmentInput: GraphQLTaggedNode,
28
+ fragmentInput: RefetchableFragment<TFragmentType, TData, TVariables>,
44
29
  fragmentRef: TKey,
45
- ): ReturnType<TQuery, TKey> {
30
+ ): ReturnType<TVariables, TData, TKey> {
46
31
  const fragmentNode = getFragment(fragmentInput);
47
32
  useStaticFragmentNodeWarning(
48
33
  fragmentNode,
49
34
  'first argument of useRefetchableFragment()',
50
35
  );
51
- const {fragmentData, refetch} = useRefetchableFragmentInternal<TQuery, TKey>(
52
- fragmentNode,
53
- fragmentRef,
54
- 'useRefetchableFragment()',
55
- );
36
+ const {fragmentData, refetch} = useRefetchableFragmentInternal<
37
+ {variables: TVariables, response: TData},
38
+ {data?: TData},
39
+ >(fragmentNode, fragmentRef, 'useRefetchableFragment()');
56
40
  if (__DEV__) {
57
41
  // eslint-disable-next-line react-hooks/rules-of-hooks
58
42
  useDebugValue({fragment: fragmentNode.name, data: fragmentData});
59
43
  }
60
- /* $FlowExpectedError[prop-missing] : Exposed options is a subset of internal
61
- * options */
62
- return [fragmentData, (refetch: RefetchFnDynamic<TQuery, TKey>)];
44
+ // $FlowFixMe[incompatible-return]
45
+ // $FlowFixMe[prop-missing]
46
+ return [fragmentData, refetch];
63
47
  }
64
48
 
65
49
  module.exports = useRefetchableFragment;
@@ -4,21 +4,22 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @emails oncall+relay
8
7
  * @flow strict-local
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
13
13
 
14
+ import type {RefetchableFragment} from '../../relay-runtime/util/RelayRuntimeTypes';
14
15
  import type {LoadMoreFn, UseLoadMoreFunctionArgs} from './useLoadMoreFunction';
15
- import type {RefetchFnDynamic} from './useRefetchableFragmentNode';
16
+ import type {Options} from './useRefetchableFragmentNode';
16
17
  import type {
18
+ Disposable,
17
19
  FragmentType,
18
20
  GraphQLResponse,
19
- GraphQLTaggedNode,
20
21
  Observer,
21
- OperationType,
22
+ Variables,
22
23
  } from 'relay-runtime';
23
24
 
24
25
  const useLoadMoreFunction = require('./useLoadMoreFunction');
@@ -32,35 +33,54 @@ const {
32
33
  getPaginationMetadata,
33
34
  } = require('relay-runtime');
34
35
 
35
- export type ReturnType<TQuery: OperationType, TKey, TFragmentData> = {
36
- data: TFragmentData,
37
- loadNext: LoadMoreFn<TQuery>,
38
- loadPrevious: LoadMoreFn<TQuery>,
36
+ type RefetchVariables<TVariables, TKey> =
37
+ // NOTE: This $Call ensures that the type of the variables is either:
38
+ // - nullable if the provided ref type is non-nullable
39
+ // - non-nullable if the provided ref type is nullable, and the caller need to provide the full set of variables
40
+ // prettier-ignore
41
+ $Call<
42
+ & (<TFragmentType>( { +$fragmentSpreads: TFragmentType, ... }) => Partial<TVariables>)
43
+ & (<TFragmentType>(?{ +$fragmentSpreads: TFragmentType, ... }) => TVariables),
44
+ TKey,
45
+ >;
46
+
47
+ type RefetchFnBase<TVars, TOptions> = (
48
+ vars: TVars,
49
+ options?: TOptions,
50
+ ) => Disposable;
51
+
52
+ type RefetchFn<TVariables, TKey, TOptions = Options> = RefetchFnBase<
53
+ RefetchVariables<TVariables, TKey>,
54
+ TOptions,
55
+ >;
56
+
57
+ type ReturnType<TVariables, TData, TKey> = {
58
+ // NOTE: This $Call ensures that the type of the returned data is either:
59
+ // - nullable if the provided ref type is nullable
60
+ // - non-nullable if the provided ref type is non-nullable
61
+ // prettier-ignore
62
+ data: $Call<
63
+ & (<TFragmentType>( { +$fragmentSpreads: TFragmentType, ... }) => TData)
64
+ & (<TFragmentType>(?{ +$fragmentSpreads: TFragmentType, ... }) => ?TData),
65
+ TKey,
66
+ >,
67
+ loadNext: LoadMoreFn<TVariables>,
68
+ loadPrevious: LoadMoreFn<TVariables>,
39
69
  hasNext: boolean,
40
70
  hasPrevious: boolean,
41
- refetch: RefetchFnDynamic<TQuery, TKey>,
71
+ refetch: RefetchFn<TVariables, TKey>,
42
72
  };
43
73
 
44
74
  function useBlockingPaginationFragment<
45
- TQuery: OperationType,
46
- TKey: ?{+$data?: mixed, +$fragmentSpreads: FragmentType, ...},
75
+ TFragmentType: FragmentType,
76
+ TVariables: Variables,
77
+ TData,
78
+ TKey: ?{+$fragmentSpreads: TFragmentType, ...},
47
79
  >(
48
- fragmentInput: GraphQLTaggedNode,
80
+ fragmentInput: RefetchableFragment<TFragmentType, TData, TVariables>,
49
81
  parentFragmentRef: TKey,
50
82
  componentDisplayName: string = 'useBlockingPaginationFragment()',
51
- ): ReturnType<
52
- TQuery,
53
- TKey,
54
- // NOTE: This $Call ensures that the type of the returned data is either:
55
- // - nullable if the provided ref type is nullable
56
- // - non-nullable if the provided ref type is non-nullable
57
- // prettier-ignore
58
- $Call<
59
- & (<TFragmentData>( { +$data?: TFragmentData, ... }) => TFragmentData)
60
- & (<TFragmentData>(?{ +$data?: TFragmentData, ... }) => ?TFragmentData),
61
- TKey,
62
- >,
63
- > {
83
+ ): ReturnType<TVariables, TData, TKey> {
64
84
  const fragmentNode = getFragment(fragmentInput);
65
85
  useStaticFragmentNodeWarning(
66
86
  fragmentNode,
@@ -69,7 +89,6 @@ function useBlockingPaginationFragment<
69
89
 
70
90
  const {
71
91
  connectionPathInFragmentData,
72
- identifierField,
73
92
  paginationRequest,
74
93
  paginationMetadata,
75
94
  stream,
@@ -86,33 +105,38 @@ function useBlockingPaginationFragment<
86
105
  refetch,
87
106
  disableStoreUpdates,
88
107
  enableStoreUpdates,
89
- } = useRefetchableFragmentNode<TQuery, TKey>(
90
- fragmentNode,
91
- parentFragmentRef,
92
- componentDisplayName,
93
- );
108
+ } = useRefetchableFragmentNode<
109
+ {
110
+ response: TData,
111
+ variables: TVariables,
112
+ },
113
+ {
114
+ +$data: mixed,
115
+ ...
116
+ },
117
+ >(fragmentNode, parentFragmentRef, componentDisplayName);
94
118
  const fragmentIdentifier = getFragmentIdentifier(fragmentNode, fragmentRef);
95
119
 
96
120
  // Backward pagination
97
- const [loadPrevious, hasPrevious, disposeFetchPrevious] = useLoadMore<TQuery>(
98
- {
99
- componentDisplayName,
100
- connectionPathInFragmentData,
101
- direction: 'backward',
102
- disableStoreUpdates,
103
- enableStoreUpdates,
104
- fragmentData,
105
- fragmentIdentifier,
106
- fragmentNode,
107
- fragmentRef,
108
- identifierField,
109
- paginationMetadata,
110
- paginationRequest,
111
- },
112
- );
121
+ const [loadPrevious, hasPrevious, disposeFetchPrevious] = useLoadMore<
122
+ TVariables,
123
+ TData,
124
+ >({
125
+ componentDisplayName,
126
+ connectionPathInFragmentData,
127
+ direction: 'backward',
128
+ disableStoreUpdates,
129
+ enableStoreUpdates,
130
+ fragmentData,
131
+ fragmentIdentifier,
132
+ fragmentNode,
133
+ fragmentRef,
134
+ paginationMetadata,
135
+ paginationRequest,
136
+ });
113
137
 
114
138
  // Forward pagination
115
- const [loadNext, hasNext, disposeFetchNext] = useLoadMore<TQuery>({
139
+ const [loadNext, hasNext, disposeFetchNext] = useLoadMore<TVariables, TData>({
116
140
  componentDisplayName,
117
141
  connectionPathInFragmentData,
118
142
  direction: 'forward',
@@ -122,22 +146,23 @@ function useBlockingPaginationFragment<
122
146
  fragmentIdentifier,
123
147
  fragmentNode,
124
148
  fragmentRef,
125
- identifierField,
126
149
  paginationMetadata,
127
150
  paginationRequest,
128
151
  });
129
152
 
130
- const refetchPagination: RefetchFnDynamic<TQuery, TKey> = useCallback(
131
- (variables, options) => {
153
+ const refetchPagination: RefetchFn<TVariables, TKey> = useCallback(
154
+ (variables: TVariables, options: void | Options) => {
132
155
  disposeFetchNext();
133
156
  disposeFetchPrevious();
157
+ // $FlowFixMe[incompatible-variance]
134
158
  return refetch(variables, {...options, __environment: undefined});
135
159
  },
136
160
  [disposeFetchNext, disposeFetchPrevious, refetch],
137
161
  );
138
162
 
139
163
  return {
140
- data: fragmentData,
164
+ // $FlowFixMe[incompatible-cast]
165
+ data: (fragmentData: TData),
141
166
  loadNext,
142
167
  loadPrevious,
143
168
  hasNext,
@@ -146,7 +171,7 @@ function useBlockingPaginationFragment<
146
171
  };
147
172
  }
148
173
 
149
- function useLoadMore<TQuery: OperationType>(args: {
174
+ function useLoadMore<TVariables: Variables>(args: {
150
175
  disableStoreUpdates: () => void,
151
176
  enableStoreUpdates: () => void,
152
177
  ...$Exact<
@@ -159,11 +184,13 @@ function useLoadMore<TQuery: OperationType>(args: {
159
184
  },
160
185
  >,
161
186
  >,
162
- }): [LoadMoreFn<TQuery>, boolean, () => void] {
187
+ }): [LoadMoreFn<TVariables>, boolean, () => void] {
163
188
  const {disableStoreUpdates, enableStoreUpdates, ...loadMoreArgs} = args;
164
- const [requestPromise, setRequestPromise] = useState(null);
165
- const requestPromiseRef = useRef(null);
166
- const promiseResolveRef = useRef(null);
189
+ const [requestPromise, setRequestPromise] = useState<null | Promise<mixed>>(
190
+ null,
191
+ );
192
+ const requestPromiseRef = useRef<null | Promise<mixed>>(null);
193
+ const promiseResolveRef = useRef<null | (() => void)>(null);
167
194
 
168
195
  const promiseResolve = () => {
169
196
  if (promiseResolveRef.current != null) {
@@ -208,7 +235,7 @@ function useLoadMore<TQuery: OperationType>(args: {
208
235
  // and blow away the whole list of items.
209
236
  error: promiseResolve,
210
237
  };
211
- const [loadMore, hasMore, disposeFetch] = useLoadMoreFunction<TQuery>({
238
+ const [loadMore, hasMore, disposeFetch] = useLoadMoreFunction<TVariables>({
212
239
  ...loadMoreArgs,
213
240
  observer,
214
241
  onReset: handleReset,
@@ -4,9 +4,9 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @emails oncall+relay
8
7
  * @flow strict-local
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -20,8 +20,8 @@ const useLazyLoadQuery = require('./useLazyLoadQuery');
20
20
  * These queries are consist of queries for client-only data,
21
21
  * schematized via local schema extensions and/or Relay resolvers.
22
22
  */
23
- function useClientQuery<TVariables: Variables, TData>(
24
- gqlQuery: ClientQuery<TVariables, TData>,
23
+ function useClientQuery<TVariables: Variables, TData, TRawResponse>(
24
+ gqlQuery: ClientQuery<TVariables, TData, TRawResponse>,
25
25
  variables: TVariables,
26
26
  options?: {
27
27
  UNSTABLE_renderPolicy?: RenderPolicy,
@@ -4,9 +4,9 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @emails oncall+relay
8
7
  * @flow strict-local
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -134,11 +134,15 @@ function useLoadEntryPoint<
134
134
  const entryPointLoaderCallback = useCallback(
135
135
  (params: TEntryPointParams) => {
136
136
  if (isMountedRef.current) {
137
- const updatedEntryPointReference = loadEntryPoint(
138
- environmentProvider,
139
- entryPoint,
140
- params,
141
- );
137
+ const updatedEntryPointReference = loadEntryPoint<
138
+ TEntryPointParams,
139
+ TPreloadedQueries,
140
+ TPreloadedEntryPoints,
141
+ TRuntimeProps,
142
+ TExtraProps,
143
+ TEntryPointComponent,
144
+ TEntryPoint,
145
+ >(environmentProvider, entryPoint, params);
142
146
  undisposedEntryPointReferencesRef.current.add(
143
147
  updatedEntryPointReference,
144
148
  );
@@ -4,16 +4,17 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @emails oncall+relay
8
7
  * @flow strict-local
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
13
13
 
14
14
  import type {Subscription} from 'relay-runtime';
15
15
 
16
- const {useCallback, useEffect, useRef} = require('react');
16
+ const useUnsafeRef_DEPRECATED = require('./useUnsafeRef_DEPRECATED');
17
+ const {useCallback, useEffect} = require('react');
17
18
 
18
19
  /**
19
20
  * This hook returns a mutable React ref that holds the value of whether a
@@ -33,8 +34,8 @@ function useFetchTrackingRef(): {
33
34
  disposeFetch: () => void,
34
35
  completeFetch: () => void,
35
36
  } {
36
- const subscriptionRef = useRef<?Subscription>(null);
37
- const isFetchingRef = useRef<?boolean>(false);
37
+ const subscriptionRef = useUnsafeRef_DEPRECATED<?Subscription>(null);
38
+ const isFetchingRef = useUnsafeRef_DEPRECATED<?boolean>(false);
38
39
 
39
40
  const disposeFetch = useCallback(() => {
40
41
  if (subscriptionRef.current != null) {
@@ -4,9 +4,9 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @emails oncall+relay
8
7
  * @flow strict-local
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -50,7 +50,7 @@ function useFragment_LEGACY(fragment: GraphQLTaggedNode, key: mixed): mixed {
50
50
 
51
51
  const fragmentNode = getFragment(fragment);
52
52
  useStaticFragmentNodeWarning(fragmentNode, 'first argument of useFragment()');
53
- const {data} = useFragmentNode<_>(fragmentNode, key, 'useFragment()');
53
+ const {data} = useFragmentNode<mixed>(fragmentNode, key, 'useFragment()');
54
54
  if (__DEV__) {
55
55
  // eslint-disable-next-line react-hooks/rules-of-hooks
56
56
  useDebugValue({fragment: fragmentNode.name, data});
@@ -4,9 +4,9 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @emails oncall+relay
8
7
  * @flow strict-local
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -15,8 +15,9 @@ import type {ReaderFragment} from 'relay-runtime';
15
15
 
16
16
  const {getFragmentResourceForEnvironment} = require('./FragmentResource');
17
17
  const useRelayEnvironment = require('./useRelayEnvironment');
18
- const {useEffect, useRef, useState} = require('react');
19
- const {getFragmentIdentifier} = require('relay-runtime');
18
+ const useUnsafeRef_DEPRECATED = require('./useUnsafeRef_DEPRECATED');
19
+ const {useEffect, useState} = require('react');
20
+ const {RelayFeatureFlags, getFragmentIdentifier} = require('relay-runtime');
20
21
  const warning = require('warning');
21
22
 
22
23
  type ReturnType<TFragmentData: mixed> = {
@@ -33,7 +34,7 @@ function useFragmentNode<TFragmentData: mixed>(
33
34
  const environment = useRelayEnvironment();
34
35
  const FragmentResource = getFragmentResourceForEnvironment(environment);
35
36
 
36
- const isMountedRef = useRef(false);
37
+ const isMountedRef = useUnsafeRef_DEPRECATED(false);
37
38
  const [, forceUpdate] = useState(0);
38
39
  const fragmentIdentifier = getFragmentIdentifier(fragmentNode, fragmentRef);
39
40
 
@@ -45,7 +46,7 @@ function useFragmentNode<TFragmentData: mixed>(
45
46
  componentDisplayName,
46
47
  );
47
48
 
48
- const isListeningForUpdatesRef = useRef(true);
49
+ const isListeningForUpdatesRef = useUnsafeRef_DEPRECATED(true);
49
50
  function enableStoreUpdates() {
50
51
  isListeningForUpdatesRef.current = true;
51
52
  const didMissUpdates =
@@ -98,7 +99,7 @@ function useFragmentNode<TFragmentData: mixed>(
98
99
  // eslint-disable-next-line react-hooks/exhaustive-deps
99
100
  }, [environment, fragmentIdentifier]);
100
101
 
101
- if (__DEV__) {
102
+ if (RelayFeatureFlags.LOG_MISSING_RECORDS_IN_PROD || __DEV__) {
102
103
  if (
103
104
  fragmentRef != null &&
104
105
  (fragmentResult.data === undefined ||
@@ -4,9 +4,9 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @emails oncall+relay
8
7
  * @flow strict-local
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -4,9 +4,9 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @emails oncall+relay
8
7
  * @flow strict-local
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -4,9 +4,9 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @emails oncall+relay
8
7
  * @flow strict-local
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -4,9 +4,9 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @emails oncall+relay
8
7
  * @flow strict-local
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -64,7 +64,7 @@ function useLazyLoadQuery<TVariables: Variables, TData>(
64
64
  ? options.networkCacheConfig
65
65
  : {force: true},
66
66
  );
67
- const data = useLazyLoadQueryNode({
67
+ const data = useLazyLoadQueryNode<$FlowFixMe>({
68
68
  componentDisplayName: 'useLazyLoadQuery()',
69
69
  fetchKey: options?.fetchKey,
70
70
  fetchObservable: fetchQuery(environment, query),
@@ -4,9 +4,9 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @emails oncall+relay
8
7
  * @flow strict-local
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -125,7 +125,7 @@ function useLazyLoadQueryNode<TQuery: OperationType>({
125
125
  });
126
126
 
127
127
  const {fragmentNode, fragmentRef} = preparedQueryResult;
128
- const {data} = useFragmentNode(
128
+ const {data} = useFragmentNode<$FlowFixMe>(
129
129
  fragmentNode,
130
130
  fragmentRef,
131
131
  componentDisplayName,
@@ -4,9 +4,9 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @emails oncall+relay
8
7
  * @flow strict-local
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -17,10 +17,9 @@ import type {
17
17
  Disposable,
18
18
  GraphQLResponse,
19
19
  Observer,
20
- OperationType,
21
20
  ReaderFragment,
22
21
  ReaderPaginationMetadata,
23
- VariablesOf,
22
+ Variables,
24
23
  } from 'relay-runtime';
25
24
 
26
25
  const useFetchTrackingRef = require('./useFetchTrackingRef');
@@ -30,20 +29,21 @@ const useRelayEnvironment = require('./useRelayEnvironment');
30
29
  const invariant = require('invariant');
31
30
  const {useCallback, useEffect, useState} = require('react');
32
31
  const {
33
- ConnectionInterface,
34
32
  __internal: {fetchQuery},
33
+ ConnectionInterface,
35
34
  createOperationDescriptor,
36
35
  getPaginationVariables,
36
+ getRefetchMetadata,
37
37
  getSelector,
38
38
  getValueAtPath,
39
39
  } = require('relay-runtime');
40
40
  const warning = require('warning');
41
41
 
42
- export type LoadMoreFn<TQuery: OperationType> = (
42
+ export type LoadMoreFn<TVariables: Variables> = (
43
43
  count: number,
44
44
  options?: {
45
45
  onComplete?: (Error | null) => void,
46
- UNSTABLE_extraVariables?: $Shape<VariablesOf<TQuery>>,
46
+ UNSTABLE_extraVariables?: Partial<TVariables>,
47
47
  },
48
48
  ) => Disposable;
49
49
 
@@ -54,7 +54,6 @@ export type UseLoadMoreFunctionArgs = {
54
54
  fragmentIdentifier: string,
55
55
  fragmentData: mixed,
56
56
  connectionPathInFragmentData: $ReadOnlyArray<string | number>,
57
- identifierField: ?string,
58
57
  paginationRequest: ConcreteRequest,
59
58
  paginationMetadata: ReaderPaginationMetadata,
60
59
  componentDisplayName: string,
@@ -62,9 +61,9 @@ export type UseLoadMoreFunctionArgs = {
62
61
  onReset: () => void,
63
62
  };
64
63
 
65
- function useLoadMoreFunction<TQuery: OperationType>(
64
+ function useLoadMoreFunction<TVariables: Variables>(
66
65
  args: UseLoadMoreFunctionArgs,
67
- ): [LoadMoreFn<TQuery>, boolean, () => void] {
66
+ ): [LoadMoreFn<TVariables>, boolean, () => void] {
68
67
  const {
69
68
  direction,
70
69
  fragmentNode,
@@ -77,17 +76,22 @@ function useLoadMoreFunction<TQuery: OperationType>(
77
76
  componentDisplayName,
78
77
  observer,
79
78
  onReset,
80
- identifierField,
81
79
  } = args;
82
80
  const environment = useRelayEnvironment();
83
81
  const {isFetchingRef, startFetch, disposeFetch, completeFetch} =
84
82
  useFetchTrackingRef();
83
+
84
+ const {identifierInfo} = getRefetchMetadata(
85
+ fragmentNode,
86
+ componentDisplayName,
87
+ );
85
88
  const identifierValue =
86
- identifierField != null &&
89
+ identifierInfo?.identifierField != null &&
87
90
  fragmentData != null &&
88
91
  typeof fragmentData === 'object'
89
- ? fragmentData[identifierField]
92
+ ? fragmentData[identifierInfo.identifierField]
90
93
  : null;
94
+
91
95
  const isMountedRef = useIsMountedRef();
92
96
  const [mirroredEnvironment, setMirroredEnvironment] = useState(environment);
93
97
  const [mirroredFragmentIdentifier, setMirroredFragmentIdentifier] =
@@ -123,7 +127,13 @@ function useLoadMoreFunction<TQuery: OperationType>(
123
127
  }, [disposeFetch]);
124
128
 
125
129
  const loadMore = useCallback(
126
- (count, options) => {
130
+ (
131
+ count: number,
132
+ options: void | {
133
+ UNSTABLE_extraVariables?: Partial<TVariables>,
134
+ onComplete?: (Error | null) => void,
135
+ },
136
+ ) => {
127
137
  // TODO(T41131846): Fetch/Caching policies for loadMore
128
138
 
129
139
  const onComplete = options?.onComplete;
@@ -196,7 +206,7 @@ function useLoadMoreFunction<TQuery: OperationType>(
196
206
 
197
207
  // If the query needs an identifier value ('id' or similar) and one
198
208
  // was not explicitly provided, read it from the fragment data.
199
- if (identifierField != null) {
209
+ if (identifierInfo != null) {
200
210
  // @refetchable fragments are guaranteed to have an `id` selection
201
211
  // if the type is Node, implements Node, or is @fetchable. Double-check
202
212
  // that there actually is a value at runtime.
@@ -205,11 +215,12 @@ function useLoadMoreFunction<TQuery: OperationType>(
205
215
  false,
206
216
  'Relay: Expected result to have a string ' +
207
217
  '`%s` in order to refetch, got `%s`.',
208
- identifierField,
218
+ identifierInfo.identifierField,
209
219
  identifierValue,
210
220
  );
211
221
  }
212
- paginationVariables.id = identifierValue;
222
+ paginationVariables[identifierInfo.identifierQueryVariableName] =
223
+ identifierValue;
213
224
  }
214
225
 
215
226
  const paginationQuery = createOperationDescriptor(