react-relay 14.1.0 → 15.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (194) 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 +19 -5
  9. package/ReactRelayQueryRenderer.js.flow +32 -1
  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 +1 -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 +7 -5
  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 +2 -2
  47. package/lib/ReactRelayContext.js +3 -3
  48. package/lib/ReactRelayFragmentContainer.js +39 -66
  49. package/lib/ReactRelayFragmentMockRenderer.js +2 -3
  50. package/lib/ReactRelayLocalQueryRenderer.js +18 -30
  51. package/lib/ReactRelayPaginationContainer.js +66 -159
  52. package/lib/ReactRelayQueryFetcher.js +48 -74
  53. package/lib/ReactRelayQueryRenderer.js +62 -82
  54. package/lib/ReactRelayQueryRendererContext.js +2 -1
  55. package/lib/ReactRelayRefetchContainer.js +52 -99
  56. package/lib/ReactRelayTestMocker.js +32 -66
  57. package/lib/ReactRelayTypes.js +2 -0
  58. package/lib/RelayContext.js +4 -6
  59. package/lib/assertFragmentMap.js +3 -4
  60. package/lib/buildReactRelayContainer.js +10 -25
  61. package/lib/getRootVariablesForFragments.js +5 -8
  62. package/lib/hooks.js +5 -17
  63. package/lib/index.js +5 -24
  64. package/lib/isRelayEnvironment.js +5 -3
  65. package/lib/jest-react/enqueueTask.js +5 -9
  66. package/lib/jest-react/index.js +0 -1
  67. package/lib/jest-react/internalAct.js +9 -20
  68. package/lib/legacy.js +2 -7
  69. package/lib/multi-actor/ActorChange.js +2 -5
  70. package/lib/multi-actor/index.js +2 -1
  71. package/lib/multi-actor/useRelayActorEnvironment.js +4 -7
  72. package/lib/relay-hooks/EntryPointContainer.react.js +9 -14
  73. package/lib/relay-hooks/EntryPointTypes.flow.js +5 -2
  74. package/lib/relay-hooks/FragmentResource.js +102 -196
  75. package/lib/relay-hooks/HooksImplementation.js +2 -5
  76. package/lib/relay-hooks/InternalLogger.js +2 -2
  77. package/lib/relay-hooks/LRUCache.js +2 -19
  78. package/lib/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js +33 -53
  79. package/lib/relay-hooks/MatchContainer.js +14 -22
  80. package/lib/relay-hooks/ProfilerContext.js +3 -2
  81. package/lib/relay-hooks/QueryResource.js +30 -99
  82. package/lib/relay-hooks/RelayEnvironmentProvider.js +5 -8
  83. package/lib/relay-hooks/SuspenseResource.js +8 -31
  84. package/lib/relay-hooks/loadEntryPoint.js +19 -31
  85. package/lib/relay-hooks/loadQuery.js +41 -77
  86. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +10 -35
  87. package/lib/relay-hooks/prepareEntryPoint_DEPRECATED.js +9 -14
  88. package/lib/relay-hooks/react-cache/RelayReactCache.js +7 -11
  89. package/lib/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js +24 -78
  90. package/lib/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js +23 -56
  91. package/lib/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js +65 -143
  92. package/lib/relay-hooks/react-cache/useFragment_REACT_CACHE.js +5 -14
  93. package/lib/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js +17 -23
  94. package/lib/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js +73 -74
  95. package/lib/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js +24 -38
  96. package/lib/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js +60 -102
  97. package/lib/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js +7 -15
  98. package/lib/relay-hooks/useBlockingPaginationFragment.js +71 -92
  99. package/lib/relay-hooks/useClientQuery.js +3 -6
  100. package/lib/relay-hooks/useEntryPointLoader.js +17 -36
  101. package/lib/relay-hooks/useFetchTrackingRef.js +10 -11
  102. package/lib/relay-hooks/useFragment.js +8 -18
  103. package/lib/relay-hooks/useFragmentNode.js +20 -31
  104. package/lib/relay-hooks/useIsMountedRef.js +4 -5
  105. package/lib/relay-hooks/useIsOperationNodeActive.js +8 -20
  106. package/lib/relay-hooks/useIsParentQueryActive.js +3 -6
  107. package/lib/relay-hooks/useLazyLoadQuery.js +6 -9
  108. package/lib/relay-hooks/useLazyLoadQueryNode.js +23 -33
  109. package/lib/relay-hooks/useLoadMoreFunction.js +45 -76
  110. package/lib/relay-hooks/useMemoOperationDescriptor.js +6 -14
  111. package/lib/relay-hooks/useMemoVariables.js +15 -33
  112. package/lib/relay-hooks/useMutation.js +8 -25
  113. package/lib/relay-hooks/usePaginationFragment.js +61 -76
  114. package/lib/relay-hooks/usePreloadedQuery.js +12 -29
  115. package/lib/relay-hooks/useQueryLoader.js +23 -47
  116. package/lib/relay-hooks/useRefetchableFragment.js +8 -18
  117. package/lib/relay-hooks/useRefetchableFragmentNode.js +64 -107
  118. package/lib/relay-hooks/useRelayEnvironment.js +4 -7
  119. package/lib/relay-hooks/useStaticFragmentNodeWarning.js +4 -7
  120. package/lib/relay-hooks/useSubscribeToInvalidationState.js +8 -8
  121. package/lib/relay-hooks/useSubscription.js +5 -9
  122. package/lib/relay-hooks/useUnsafeRef_DEPRECATED.js +29 -0
  123. package/multi-actor/ActorChange.js.flow +1 -1
  124. package/multi-actor/index.js.flow +1 -1
  125. package/multi-actor/useRelayActorEnvironment.js.flow +2 -2
  126. package/package.json +2 -2
  127. package/react-relay-hooks.js +2 -2
  128. package/react-relay-hooks.min.js +2 -2
  129. package/react-relay-legacy.js +2 -2
  130. package/react-relay-legacy.min.js +2 -2
  131. package/react-relay.js +2 -2
  132. package/react-relay.min.js +2 -2
  133. package/relay-hooks/EntryPointContainer.react.js.flow +1 -1
  134. package/relay-hooks/EntryPointTypes.flow.js.flow +7 -5
  135. package/relay-hooks/FragmentResource.js.flow +34 -8
  136. package/relay-hooks/HooksImplementation.js.flow +1 -1
  137. package/relay-hooks/InternalLogger.js.flow +1 -1
  138. package/relay-hooks/LRUCache.js.flow +1 -1
  139. package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +15 -8
  140. package/relay-hooks/MatchContainer.js.flow +1 -1
  141. package/relay-hooks/ProfilerContext.js.flow +1 -1
  142. package/relay-hooks/QueryResource.js.flow +25 -5
  143. package/relay-hooks/RelayEnvironmentProvider.js.flow +2 -2
  144. package/relay-hooks/SuspenseResource.js.flow +1 -1
  145. package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +3 -1
  146. package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +2 -2
  147. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +3 -1
  148. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +3 -1
  149. package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +35 -33
  150. package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +1 -1
  151. package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +33 -32
  152. package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +18 -18
  153. package/relay-hooks/__flowtests__/utils.js.flow +13 -2
  154. package/relay-hooks/loadEntryPoint.js.flow +11 -6
  155. package/relay-hooks/loadQuery.js.flow +11 -7
  156. package/relay-hooks/preloadQuery_DEPRECATED.js.flow +5 -6
  157. package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +13 -8
  158. package/relay-hooks/react-cache/RelayReactCache.js.flow +1 -1
  159. package/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js.flow +4 -4
  160. package/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js.flow +3 -3
  161. package/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js.flow +4 -4
  162. package/relay-hooks/react-cache/useFragment_REACT_CACHE.js.flow +1 -1
  163. package/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js.flow +1 -1
  164. package/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js.flow +41 -22
  165. package/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js.flow +1 -2
  166. package/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js.flow +11 -5
  167. package/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js.flow +2 -2
  168. package/relay-hooks/useBlockingPaginationFragment.js.flow +85 -56
  169. package/relay-hooks/useClientQuery.js.flow +1 -1
  170. package/relay-hooks/useEntryPointLoader.js.flow +10 -6
  171. package/relay-hooks/useFetchTrackingRef.js.flow +5 -4
  172. package/relay-hooks/useFragment.js.flow +2 -2
  173. package/relay-hooks/useFragmentNode.js.flow +5 -4
  174. package/relay-hooks/useIsMountedRef.js.flow +1 -1
  175. package/relay-hooks/useIsOperationNodeActive.js.flow +1 -1
  176. package/relay-hooks/useIsParentQueryActive.js.flow +1 -1
  177. package/relay-hooks/useLazyLoadQuery.js.flow +2 -2
  178. package/relay-hooks/useLazyLoadQueryNode.js.flow +2 -2
  179. package/relay-hooks/useLoadMoreFunction.js.flow +14 -9
  180. package/relay-hooks/useMemoOperationDescriptor.js.flow +3 -3
  181. package/relay-hooks/useMemoVariables.js.flow +13 -29
  182. package/relay-hooks/useMutation.js.flow +4 -4
  183. package/relay-hooks/usePaginationFragment.js.flow +53 -46
  184. package/relay-hooks/usePreloadedQuery.js.flow +47 -22
  185. package/relay-hooks/useQueryLoader.js.flow +85 -22
  186. package/relay-hooks/useRefetchableFragment.js.flow +64 -33
  187. package/relay-hooks/useRefetchableFragmentNode.js.flow +10 -4
  188. package/relay-hooks/useRelayEnvironment.js.flow +2 -2
  189. package/relay-hooks/useStaticFragmentNodeWarning.js.flow +3 -3
  190. package/relay-hooks/useSubscribeToInvalidationState.js.flow +2 -2
  191. package/relay-hooks/useSubscription.js.flow +1 -1
  192. package/relay-hooks/useUnsafeRef_DEPRECATED.js.flow +25 -0
  193. package/lib/readContext.js +0 -27
  194. package/readContext.js.flow +0 -29
@@ -6,12 +6,13 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
- * @emails oncall+relay
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
13
13
 
14
14
  import type {
15
+ EnvironmentProviderOptions,
15
16
  LoadQueryOptions,
16
17
  PreloadableConcreteRequest,
17
18
  PreloadedQueryInner,
@@ -30,11 +31,11 @@ import type {
30
31
  const invariant = require('invariant');
31
32
  const React = require('react');
32
33
  const {
34
+ __internal: {fetchQueryDeduped},
33
35
  Observable,
34
36
  PreloadableQueryRegistry,
35
37
  RelayFeatureFlags,
36
38
  ReplaySubject,
37
- __internal: {fetchQueryDeduped},
38
39
  createOperationDescriptor,
39
40
  getRequest,
40
41
  getRequestIdentifier,
@@ -55,7 +56,10 @@ function useTrackLoadQueryInRender() {
55
56
  }
56
57
  }
57
58
 
58
- function loadQuery<TQuery: OperationType, TEnvironmentProviderOptions>(
59
+ function loadQuery<
60
+ TQuery: OperationType,
61
+ TEnvironmentProviderOptions = EnvironmentProviderOptions,
62
+ >(
59
63
  environment: IEnvironment,
60
64
  preloadableRequest: GraphQLTaggedNode | PreloadableConcreteRequest<TQuery>,
61
65
  variables: TQuery['variables'],
@@ -115,8 +119,8 @@ function loadQuery<TQuery: OperationType, TEnvironmentProviderOptions>(
115
119
  // allows us to capture the events that occur during the eager execution
116
120
  // of the operation, and then replay them to the Observable we
117
121
  // ultimately return.
118
- const executionSubject = new ReplaySubject();
119
- const returnedObservable = Observable.create(sink =>
122
+ const executionSubject = new ReplaySubject<GraphQLResponse>();
123
+ const returnedObservable = Observable.create<GraphQLResponse>(sink =>
120
124
  executionSubject.subscribe(sink),
121
125
  );
122
126
 
@@ -139,7 +143,7 @@ function loadQuery<TQuery: OperationType, TEnvironmentProviderOptions>(
139
143
  didMakeNetworkRequest = true;
140
144
 
141
145
  let observable;
142
- const subject = new ReplaySubject();
146
+ const subject = new ReplaySubject<GraphQLResponse>();
143
147
  if (RelayFeatureFlags.ENABLE_LOAD_QUERY_REQUEST_DEDUPING === true) {
144
148
  // Here, we are calling fetchQueryDeduped at the network layer level,
145
149
  // which ensures that only a single network request is active for a given
@@ -270,7 +274,7 @@ function loadQuery<TQuery: OperationType, TEnvironmentProviderOptions>(
270
274
  };
271
275
 
272
276
  let params;
273
- let cancelOnLoadCallback;
277
+ let cancelOnLoadCallback: () => void;
274
278
  let queryId;
275
279
  if (preloadableRequest.kind === 'PreloadableConcreteRequest') {
276
280
  const preloadableConcreteRequest: PreloadableConcreteRequest<TQuery> =
@@ -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';
@@ -31,7 +31,6 @@ import type {
31
31
  const {
32
32
  Observable,
33
33
  PreloadableQueryRegistry,
34
- RelayFeatureFlags,
35
34
  ReplaySubject,
36
35
  createOperationDescriptor,
37
36
  getRequest,
@@ -45,8 +44,8 @@ const WEAKMAP_SUPPORTED = typeof WeakMap === 'function';
45
44
  const STORE_OR_NETWORK_DEFAULT: PreloadFetchPolicy = 'store-or-network';
46
45
 
47
46
  const pendingQueriesByEnvironment = WEAKMAP_SUPPORTED
48
- ? new WeakMap()
49
- : new Map();
47
+ ? new WeakMap<IEnvironment, Map<string, PendingQueryEntry>>()
48
+ : new Map<IEnvironment, Map<string, PendingQueryEntry>>();
50
49
 
51
50
  type PendingQueryEntry =
52
51
  | $ReadOnly<{
@@ -92,7 +91,7 @@ function preloadQuery<TQuery: OperationType, TEnvironmentProviderOptions>(
92
91
  );
93
92
  const source =
94
93
  queryEntry.kind === 'network'
95
- ? Observable.create(sink => {
94
+ ? Observable.create<GraphQLResponse>(sink => {
96
95
  let subscription;
97
96
  if (pendingQueries.get(queryEntry.cacheKey) == null) {
98
97
  const newQueryEntry = preloadQueryDeduped(
@@ -205,7 +204,7 @@ function preloadQueryDeduped<TQuery: OperationType>(
205
204
  } else if (prevQueryEntry == null || prevQueryEntry.kind !== 'network') {
206
205
  // Should fetch but we're not already fetching: fetch!
207
206
  const source = network.execute(params, variables, networkCacheConfig, null);
208
- const subject = new ReplaySubject();
207
+ const subject = new ReplaySubject<GraphQLResponse>();
209
208
  nextQueryEntry = {
210
209
  cacheKey,
211
210
  fetchKey,
@@ -4,13 +4,13 @@
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
+ import type {OperationType} from '../../relay-runtime/util/RelayRuntimeTypes';
14
14
  import type {
15
15
  EntryPoint,
16
16
  EntryPointComponent,
@@ -40,6 +40,7 @@ function prepareEntryPoint<
40
40
  ): void {
41
41
  // Start loading the code for the entrypoint
42
42
  if (entryPoint.root.getModuleIfRequired() == null) {
43
+ // $FlowFixMe[unused-promise]
43
44
  entryPoint.root.load();
44
45
  }
45
46
  const preloadProps = entryPoint.getPreloadProps(entryPointParams);
@@ -56,7 +57,7 @@ function prepareEntryPoint<
56
57
  environmentProviderOptions,
57
58
  );
58
59
 
59
- preloadedQueries[queryPropName] = preloadQuery(
60
+ preloadedQueries[queryPropName] = preloadQuery<OperationType, mixed>(
60
61
  environment,
61
62
  parameters,
62
63
  variables,
@@ -75,11 +76,15 @@ function prepareEntryPoint<
75
76
  }
76
77
  const {entryPoint: nestedEntryPoint, entryPointParams: nestedParams} =
77
78
  entryPointDescription;
78
- preloadedEntryPoints[entryPointPropName] = prepareEntryPoint(
79
- environmentProvider,
80
- nestedEntryPoint,
81
- nestedParams,
82
- );
79
+ preloadedEntryPoints[entryPointPropName] = prepareEntryPoint<
80
+ TEntryPointParams,
81
+ TPreloadedQueries,
82
+ TPreloadedEntryPoints,
83
+ TRuntimeProps,
84
+ TExtraProps,
85
+ TEntryPointComponent,
86
+ TEntryPoint,
87
+ >(environmentProvider, nestedEntryPoint, nestedParams);
83
88
  });
84
89
  }
85
90
  }
@@ -5,8 +5,8 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
7
  * @flow strict-local
8
- * @emails oncall+relay
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -5,8 +5,8 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
7
  * @flow strict-local
8
- * @emails oncall+relay
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -25,8 +25,8 @@ const SuspenseResource = require('../SuspenseResource');
25
25
  const {getCacheForType, getCacheSignal} = require('./RelayReactCache');
26
26
  const invariant = require('invariant');
27
27
  const {
28
- RelayFeatureFlags,
29
28
  __internal: {fetchQuery: fetchQueryInternal},
29
+ RelayFeatureFlags,
30
30
  } = require('relay-runtime');
31
31
  const warning = require('warning');
32
32
 
@@ -127,7 +127,7 @@ const noopOnCommit = () => {
127
127
  return () => undefined;
128
128
  };
129
129
 
130
- const noopPromise = new Promise(() => {});
130
+ const noopPromise = new Promise<void>(() => {});
131
131
 
132
132
  function getQueryCacheKey(
133
133
  operation: OperationDescriptor,
@@ -375,7 +375,7 @@ function executeOperationAndKeepUpToDate(
375
375
  customFetchObservable?: Observable<GraphQLResponse>,
376
376
  ) {
377
377
  let resolvePromise;
378
- const promise = new Promise(r => {
378
+ const promise = new Promise<void>(r => {
379
379
  resolvePromise = r;
380
380
  });
381
381
  // $FlowExpectedError[prop-missing] Expando to annotate Promises.
@@ -5,8 +5,8 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
7
  * @flow strict-local
8
- * @emails oncall+relay
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -64,7 +64,7 @@ function getMissingClientEdges(
64
64
  } else if (state.kind === 'singular') {
65
65
  return state.snapshot.missingClientEdges ?? null;
66
66
  } else {
67
- let edges = null;
67
+ let edges: null | Array<MissingClientEdgeRequestInfo> = null;
68
68
  for (const snapshot of state.snapshots) {
69
69
  if (snapshot.missingClientEdges) {
70
70
  edges = edges ?? [];
@@ -223,7 +223,7 @@ function readFragmentInternal_REACT_CACHE(
223
223
  if (fragmentNode.metadata?.hasClientEdges === true) {
224
224
  const missingClientEdges = getMissingClientEdges(state);
225
225
  if (missingClientEdges?.length) {
226
- clientEdgeQueries = [];
226
+ clientEdgeQueries = ([]: Array<QueryResult>);
227
227
  for (const edge of missingClientEdges) {
228
228
  clientEdgeQueries.push(
229
229
  handleMissingClientEdge(
@@ -5,8 +5,8 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
7
  * @flow strict-local
8
- * @emails oncall+relay
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -73,7 +73,7 @@ function getMissingClientEdges(
73
73
  } else if (state.kind === 'singular') {
74
74
  return state.snapshot.missingClientEdges ?? null;
75
75
  } else {
76
- let edges = null;
76
+ let edges: null | Array<MissingClientEdgeRequestInfo> = null;
77
77
  for (const snapshot of state.snapshots) {
78
78
  if (snapshot.missingClientEdges) {
79
79
  edges = edges ?? [];
@@ -94,7 +94,7 @@ function getSuspendingLiveResolver(
94
94
  } else if (state.kind === 'singular') {
95
95
  return state.snapshot.missingLiveResolverFields ?? null;
96
96
  } else {
97
- let missingFields = null;
97
+ let missingFields: null | Array<MissingLiveResolverField> = null;
98
98
  for (const snapshot of state.snapshots) {
99
99
  if (snapshot.missingLiveResolverFields) {
100
100
  missingFields = missingFields ?? [];
@@ -438,7 +438,7 @@ function useFragmentInternal_REACT_CACHE(
438
438
  // eslint-disable-next-line no-shadow
439
439
  let clientEdgeQueries;
440
440
  if (missingClientEdges?.length) {
441
- clientEdgeQueries = [];
441
+ clientEdgeQueries = ([]: Array<QueryResult>);
442
442
  for (const edge of missingClientEdges) {
443
443
  clientEdgeQueries.push(
444
444
  handleMissingClientEdge(
@@ -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';
@@ -5,8 +5,8 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
7
  * @flow strict-local
8
- * @emails oncall+relay
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -4,14 +4,15 @@
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 {LoadMoreFn, UseLoadMoreFunctionArgs} from '../useLoadMoreFunction';
15
+ import type {Options} from './useRefetchableFragmentInternal_REACT_CACHE';
15
16
  import type {RefetchFnDynamic} from './useRefetchableFragmentInternal_REACT_CACHE';
16
17
  import type {
17
18
  FragmentType,
@@ -19,9 +20,12 @@ import type {
19
20
  GraphQLTaggedNode,
20
21
  Observer,
21
22
  OperationType,
23
+ Variables,
22
24
  } from 'relay-runtime';
25
+ import type {VariablesOf} from 'relay-runtime/util/RelayRuntimeTypes';
23
26
 
24
27
  const useLoadMoreFunction = require('../useLoadMoreFunction');
28
+ const useRelayEnvironment = require('../useRelayEnvironment');
25
29
  const useStaticFragmentNodeWarning = require('../useStaticFragmentNodeWarning');
26
30
  const useRefetchableFragmentInternal = require('./useRefetchableFragmentInternal_REACT_CACHE');
27
31
  const {useCallback, useDebugValue, useState} = require('react');
@@ -33,8 +37,8 @@ const {
33
37
 
34
38
  export type ReturnType<TQuery: OperationType, TKey, TFragmentData> = {
35
39
  data: TFragmentData,
36
- loadNext: LoadMoreFn<TQuery>,
37
- loadPrevious: LoadMoreFn<TQuery>,
40
+ loadNext: LoadMoreFn<TQuery['variables']>,
41
+ loadPrevious: LoadMoreFn<TQuery['variables']>,
38
42
  hasNext: boolean,
39
43
  hasPrevious: boolean,
40
44
  isLoadingNext: boolean,
@@ -83,7 +87,7 @@ function usePaginationFragment<
83
87
 
84
88
  // Backward pagination
85
89
  const [loadPrevious, hasPrevious, isLoadingPrevious, disposeFetchPrevious] =
86
- useLoadMore<TQuery>({
90
+ useLoadMore<TQuery['variables']>({
87
91
  componentDisplayName,
88
92
  connectionPathInFragmentData,
89
93
  direction: 'backward',
@@ -97,22 +101,23 @@ function usePaginationFragment<
97
101
  });
98
102
 
99
103
  // Forward pagination
100
- const [loadNext, hasNext, isLoadingNext, disposeFetchNext] =
101
- useLoadMore<TQuery>({
102
- componentDisplayName,
103
- connectionPathInFragmentData,
104
- direction: 'forward',
105
- fragmentData,
106
- fragmentIdentifier,
107
- fragmentNode,
108
- fragmentRef,
109
- identifierField,
110
- paginationMetadata,
111
- paginationRequest,
112
- });
104
+ const [loadNext, hasNext, isLoadingNext, disposeFetchNext] = useLoadMore<
105
+ TQuery['variables'],
106
+ >({
107
+ componentDisplayName,
108
+ connectionPathInFragmentData,
109
+ direction: 'forward',
110
+ fragmentData,
111
+ fragmentIdentifier,
112
+ fragmentNode,
113
+ fragmentRef,
114
+ identifierField,
115
+ paginationMetadata,
116
+ paginationRequest,
117
+ });
113
118
 
114
119
  const refetchPagination: RefetchFnDynamic<TQuery, TKey> = useCallback(
115
- (variables, options) => {
120
+ (variables: VariablesOf<TQuery>, options: void | Options) => {
116
121
  disposeFetchNext();
117
122
  disposeFetchPrevious();
118
123
  return refetch(variables, {...options, __environment: undefined});
@@ -143,7 +148,7 @@ function usePaginationFragment<
143
148
  };
144
149
  }
145
150
 
146
- function useLoadMore<TQuery: OperationType>(
151
+ function useLoadMore<TVariables: Variables>(
147
152
  args: $Diff<
148
153
  UseLoadMoreFunctionArgs,
149
154
  {
@@ -152,15 +157,29 @@ function useLoadMore<TQuery: OperationType>(
152
157
  ...
153
158
  },
154
159
  >,
155
- ): [LoadMoreFn<TQuery>, boolean, boolean, () => void] {
156
- const [isLoadingMore, setIsLoadingMore] = useState(false);
160
+ ): [LoadMoreFn<TVariables>, boolean, boolean, () => void] {
161
+ const environment = useRelayEnvironment();
162
+ const [isLoadingMore, reallySetIsLoadingMore] = useState(false);
163
+ // Schedule this update since it must be observed by components at the same
164
+ // batch as when hasNext changes. hasNext is read from the store and store
165
+ // updates are scheduled, so this must be scheduled too.
166
+ const setIsLoadingMore = (value: boolean) => {
167
+ const schedule = environment.getScheduler()?.schedule;
168
+ if (schedule) {
169
+ schedule(() => {
170
+ reallySetIsLoadingMore(value);
171
+ });
172
+ } else {
173
+ reallySetIsLoadingMore(value);
174
+ }
175
+ };
157
176
  const observer = {
158
177
  start: () => setIsLoadingMore(true),
159
178
  complete: () => setIsLoadingMore(false),
160
179
  error: () => setIsLoadingMore(false),
161
180
  };
162
181
  const handleReset = () => setIsLoadingMore(false);
163
- const [loadMore, hasMore, disposeFetch] = useLoadMoreFunction({
182
+ const [loadMore, hasMore, disposeFetch] = useLoadMoreFunction<TVariables>({
164
183
  ...args,
165
184
  observer,
166
185
  onReset: handleReset,
@@ -5,8 +5,8 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
7
  * @flow strict-local
8
- * @emails oncall+relay
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
11
 
12
12
  'use strict';
@@ -122,7 +122,6 @@ function usePreloadedQuery_REACT_CACHE<TQuery: OperationType>(
122
122
 
123
123
  // Read the query's root fragment -- this may suspend.
124
124
  const {fragmentNode, fragmentRef} = queryResult;
125
- // $FlowExpectedError[incompatible-return] Is this a fixable incompatible-return?
126
125
  const data = useFragmentInternal(
127
126
  fragmentNode,
128
127
  fragmentRef,
@@ -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';
@@ -98,7 +98,7 @@ type RefetchFnExact<TQuery: OperationType, TOptions = Options> = RefetchFnBase<
98
98
  type RefetchFnInexact<
99
99
  TQuery: OperationType,
100
100
  TOptions = Options,
101
- > = RefetchFnBase<$Shape<VariablesOf<TQuery>>, TOptions>;
101
+ > = RefetchFnBase<Partial<VariablesOf<TQuery>>, TOptions>;
102
102
 
103
103
  type Action =
104
104
  | {
@@ -204,8 +204,11 @@ function useRefetchableFragmentNode<
204
204
  const shouldReset =
205
205
  environment !== mirroredEnvironment ||
206
206
  fragmentIdentifier !== mirroredFragmentIdentifier;
207
- const [queryRef, loadQuery, disposeQuery] =
208
- useQueryLoader<TQuery>(refetchableRequest);
207
+ const [queryRef, loadQuery, disposeQuery] = useQueryLoader<
208
+ TQuery['variables'],
209
+ TQuery['response'],
210
+ TQuery['rawResponse'],
211
+ >((refetchableRequest: $FlowFixMe));
209
212
 
210
213
  let fragmentRef = parentFragmentRef;
211
214
  if (shouldReset) {
@@ -387,7 +390,10 @@ function useRefetchFunction<TQuery: OperationType>(
387
390
  ? fragmentData[identifierField]
388
391
  : null;
389
392
  return useCallback(
390
- (providedRefetchVariables, options) => {
393
+ (
394
+ providedRefetchVariables: VariablesOf<TQuery>,
395
+ options: void | InternalOptions,
396
+ ) => {
391
397
  // Bail out and warn if we're trying to refetch after the component
392
398
  // has unmounted
393
399
  if (isMountedRef.current !== true) {
@@ -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';
@@ -18,8 +18,8 @@ import type {
18
18
  OperationType,
19
19
  } from 'relay-runtime';
20
20
 
21
- const useRefetchableFragmentInternal = require('./useRefetchableFragmentInternal_REACT_CACHE');
22
21
  const useStaticFragmentNodeWarning = require('../useStaticFragmentNodeWarning');
22
+ const useRefetchableFragmentInternal = require('./useRefetchableFragmentInternal_REACT_CACHE');
23
23
  const {useDebugValue} = require('react');
24
24
  const {getFragment} = require('relay-runtime');
25
25