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
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v14.1.0
2
+ * Relay v16.0.0
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -6,10 +6,11 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
12
- import type {GeneratedNodeMap, RelayProp, $RelayProps} from './ReactRelayTypes';
13
+ import type {$RelayProps, GeneratedNodeMap, RelayProp} from './ReactRelayTypes';
13
14
  import type {
14
15
  FragmentMap,
15
16
  FragmentSpecResolver,
@@ -55,6 +56,7 @@ function createContainerWithFragments<
55
56
  const containerName = getContainerName(Component);
56
57
 
57
58
  return class extends React.Component<ContainerProps, ContainerState> {
59
+ // $FlowFixMe[missing-local-annot]
58
60
  static displayName = containerName;
59
61
  constructor(props: $FlowFixMe) {
60
62
  super(props);
@@ -88,7 +90,7 @@ function createContainerWithFragments<
88
90
  static getDerivedStateFromProps(
89
91
  nextProps: ContainerProps,
90
92
  prevState: ContainerState,
91
- ): $Shape<ContainerState> | null {
93
+ ): Partial<ContainerState> | null {
92
94
  // Any props change could impact the query, so we mirror props in state.
93
95
  // This is an unusual pattern, but necessary for this container usecase.
94
96
  const {prevProps} = prevState;
@@ -235,7 +237,9 @@ function createContainerWithFragments<
235
237
  }
236
238
  }
237
239
 
240
+ // $FlowFixMe[missing-local-annot]
238
241
  render() {
242
+ // eslint-disable-next-line no-unused-vars
239
243
  const {componentRef, __relayContext, __rootIsQueryRenderer, ...props} =
240
244
  this.props;
241
245
  return React.createElement(Component, {
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -6,12 +6,14 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
12
13
 
13
14
  import type {ReactRelayQueryRendererContext as ReactRelayQueryRendererContextType} from './ReactRelayQueryRendererContext';
14
15
  import type {GraphQLTaggedNode, IEnvironment, Variables} from 'relay-runtime';
16
+ import type {SelectorData} from 'relay-runtime/store/RelayStoreTypes';
15
17
 
16
18
  const ReactRelayContext = require('./ReactRelayContext');
17
19
  const ReactRelayQueryRendererContext = require('./ReactRelayQueryRendererContext');
@@ -61,9 +63,9 @@ function ReactRelayLocalQueryRenderer(props: Props): React.Node {
61
63
 
62
64
  // Use a ref to prevent rendering twice when data changes
63
65
  // because of props change
64
- const dataRef = useRef(null);
65
- const [, forceUpdate] = useState(null);
66
- const cleanupFnRef = useRef(null);
66
+ const dataRef = useRef<?SelectorData>(null);
67
+ const [, forceUpdate] = useState<?SelectorData>(null);
68
+ const cleanupFnRef = useRef<null | (() => void)>(null);
67
69
 
68
70
  const snapshot = useMemo(() => {
69
71
  environment.check(operation);
@@ -6,16 +6,18 @@
6
6
  *
7
7
  * @flow
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
12
13
 
14
+ import type {Sink} from '../relay-runtime/network/RelayObservable';
13
15
  import type {
16
+ $RelayProps,
14
17
  GeneratedNodeMap,
15
18
  ObserverOrCallback,
16
19
  RefetchOptions,
17
20
  RelayPaginationProp,
18
- $RelayProps,
19
21
  } from './ReactRelayTypes';
20
22
  import type {
21
23
  CacheConfig,
@@ -254,9 +256,9 @@ function createGetFragmentVariables(
254
256
  'ReactRelayPaginationContainer: Unable to synthesize a ' +
255
257
  'getFragmentVariables function.',
256
258
  );
257
- return (prevVars: Variables, totalCount: number) => ({
259
+ return (prevVars: Variables, totalCount: number): Variables => ({
258
260
  ...prevVars,
259
- [countVariable]: totalCount,
261
+ [(countVariable: string)]: totalCount,
260
262
  });
261
263
  }
262
264
 
@@ -346,6 +348,7 @@ function createContainerWithFragments<
346
348
  createGetFragmentVariables(metadata);
347
349
 
348
350
  return class extends React.Component<$FlowFixMeProps, ContainerState> {
351
+ // $FlowFixMe[missing-local-annot]
349
352
  static displayName = containerName;
350
353
 
351
354
  _isARequestInFlight: boolean;
@@ -564,6 +567,7 @@ function createContainerWithFragments<
564
567
  ...
565
568
  } {
566
569
  // Extract connection data and verify there are more edges to fetch
570
+ // eslint-disable-next-line no-unused-vars
567
571
  const {componentRef: _, ...restProps} = this.props;
568
572
  const props = {
569
573
  ...restProps,
@@ -694,7 +698,7 @@ function createContainerWithFragments<
694
698
  const observer = toObserver(observerOrCallback);
695
699
  const connectionData = this._getConnectionData();
696
700
  if (!connectionData) {
697
- Observable.create(sink => sink.complete()).subscribe(observer);
701
+ Observable.create<empty>(sink => sink.complete()).subscribe(observer);
698
702
  return null;
699
703
  }
700
704
  const totalCount = connectionData.edgeCount + pageSize;
@@ -755,8 +759,11 @@ function createContainerWithFragments<
755
759
  ): Subscription {
756
760
  const {environment} = assertRelayContext(this.props.__relayContext);
757
761
  const {
762
+ // eslint-disable-next-line no-unused-vars
758
763
  componentRef: _,
764
+ // eslint-disable-next-line no-unused-vars
759
765
  __relayContext,
766
+ // eslint-disable-next-line no-unused-vars
760
767
  __rootIsQueryRenderer,
761
768
  ...restProps
762
769
  } = this.props;
@@ -764,7 +771,7 @@ function createContainerWithFragments<
764
771
  ...restProps,
765
772
  ...this.state.data,
766
773
  };
767
- let fragmentVariables;
774
+ let fragmentVariables: Variables;
768
775
  const rootVariables = getRootVariablesForFragments(fragments, restProps);
769
776
  fragmentVariables = getVariablesFromObject(fragments, restProps);
770
777
  fragmentVariables = {
@@ -772,7 +779,7 @@ function createContainerWithFragments<
772
779
  ...fragmentVariables,
773
780
  ...this._refetchVariables,
774
781
  };
775
- let fetchVariables = connectionConfig.getVariables(
782
+ let fetchVariables: Variables = connectionConfig.getVariables(
776
783
  props,
777
784
  {
778
785
  count: paginatingVariables.count,
@@ -787,14 +794,14 @@ function createContainerWithFragments<
787
794
  fetchVariables,
788
795
  componentName,
789
796
  );
790
- fetchVariables = {
797
+ fetchVariables = ({
791
798
  ...fetchVariables,
792
799
  ...this._refetchVariables,
793
- };
794
- fragmentVariables = {
800
+ }: Variables);
801
+ fragmentVariables = ({
795
802
  ...fetchVariables,
796
803
  ...fragmentVariables,
797
- };
804
+ }: Variables);
798
805
 
799
806
  const cacheConfig: ?CacheConfig = options
800
807
  ? {force: !!options.force}
@@ -865,8 +872,8 @@ function createContainerWithFragments<
865
872
  operation,
866
873
  preservePreviousReferences: true,
867
874
  })
868
- .mergeMap(payload =>
869
- Observable.create(sink => {
875
+ .mergeMap<void>(payload =>
876
+ Observable.create<void>((sink: Sink<void>) => {
870
877
  onNext(payload, () => {
871
878
  sink.next(); // pass void to public observer's `next`
872
879
  sink.complete();
@@ -902,7 +909,9 @@ function createContainerWithFragments<
902
909
  }
903
910
  }
904
911
 
912
+ // $FlowFixMe[missing-local-annot]
905
913
  render() {
914
+ // eslint-disable-next-line no-unused-vars
906
915
  const {componentRef, __relayContext, __rootIsQueryRenderer, ...props} =
907
916
  this.props;
908
917
  return (
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -26,11 +27,7 @@ const {
26
27
  isRelayModernEnvironment,
27
28
  } = require('relay-runtime');
28
29
 
29
- type OnDataChange = ({
30
- error?: Error,
31
- snapshot?: Snapshot,
32
- ...
33
- }) => void;
30
+ type OnDataChange = ({error?: Error, snapshot?: Snapshot, ...}) => void;
34
31
 
35
32
  /** The external API of 'fetch' **/
36
33
  export type FetchOptions = {
@@ -62,7 +59,7 @@ class ReactRelayQueryFetcher {
62
59
  _snapshot: ?Snapshot; // results of the root fragment;
63
60
  _error: ?Error; // fetch error
64
61
  _cacheSelectionReference: ?Disposable;
65
- _callOnDataChangeWhenSet: boolean = false;
62
+ _didFetchFinish: boolean = false;
66
63
 
67
64
  constructor(args?: {
68
65
  cacheSelectionReference: ?Disposable,
@@ -102,6 +99,19 @@ class ReactRelayQueryFetcher {
102
99
  return null;
103
100
  }
104
101
 
102
+ getFetchResult(): ?{error?: Error, snapshot?: Snapshot} {
103
+ if (this._didFetchFinish) {
104
+ // We don't reset '_didFetchFinish' because another callback may be set
105
+ if (this._error != null) {
106
+ return {error: this._error};
107
+ } else if (this._snapshot != null) {
108
+ return {snapshot: this._snapshot};
109
+ }
110
+ } else {
111
+ return null;
112
+ }
113
+ }
114
+
105
115
  execute({
106
116
  environment,
107
117
  operation,
@@ -151,8 +161,8 @@ class ReactRelayQueryFetcher {
151
161
  this._fetchOptions.onDataChangeCallbacks || [];
152
162
  this._fetchOptions.onDataChangeCallbacks.push(onDataChange);
153
163
 
154
- if (this._callOnDataChangeWhenSet) {
155
- // We don't reset '_callOnDataChangeWhenSet' because another callback may be set
164
+ if (this._didFetchFinish) {
165
+ // We don't reset '_didFetchFinish' because another callback may be set
156
166
  if (this._error != null) {
157
167
  onDataChange({error: this._error});
158
168
  } else if (this._snapshot != null) {
@@ -215,7 +225,7 @@ class ReactRelayQueryFetcher {
215
225
  next: () => {
216
226
  // If we received a response,
217
227
  // Make a note that to notify the callback when it's later added.
218
- this._callOnDataChangeWhenSet = true;
228
+ this._didFetchFinish = true;
219
229
  this._error = null;
220
230
 
221
231
  // Only notify of the first result if `next` is being called **asynchronously**
@@ -225,7 +235,7 @@ class ReactRelayQueryFetcher {
225
235
  error: err => {
226
236
  // If we received a response when we didn't have a change callback,
227
237
  // Make a note that to notify the callback when it's later added.
228
- this._callOnDataChangeWhenSet = true;
238
+ this._didFetchFinish = true;
229
239
  this._error = err;
230
240
  this._snapshot = null;
231
241
 
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -35,11 +36,7 @@ const {
35
36
  type RetryCallbacks = {
36
37
  handleDataChange:
37
38
  | null
38
- | (({
39
- error?: Error,
40
- snapshot?: Snapshot,
41
- ...
42
- }) => void),
39
+ | (({error?: Error, snapshot?: Snapshot, ...}) => void),
43
40
  handleRetryAfterError: null | ((error: Error) => void),
44
41
  };
45
42
 
@@ -64,14 +61,14 @@ const queryRendererContext: ReactRelayQueryRendererContextType = {
64
61
  rootIsQueryRenderer: true,
65
62
  };
66
63
 
67
- export type Props = {
64
+ export type Props = $ReadOnly<{
68
65
  cacheConfig?: ?CacheConfig,
69
66
  fetchPolicy?: 'store-and-network' | 'network-only',
70
67
  environment: IEnvironment,
71
68
  query: ?GraphQLTaggedNode,
72
69
  render: (renderProps: RenderProps<Object>) => React.Node,
73
70
  variables: Variables,
74
- };
71
+ }>;
75
72
 
76
73
  type State = {
77
74
  error: Error | null,
@@ -129,6 +126,7 @@ class ReactRelayQueryRenderer extends React.Component<Props, State> {
129
126
 
130
127
  this._maybeHiddenOrFastRefresh = false;
131
128
 
129
+ // $FlowFixMe[incompatible-type]
132
130
  this.state = {
133
131
  prevPropsEnvironment: props.environment,
134
132
  prevPropsVariables: props.variables,
@@ -147,7 +145,7 @@ class ReactRelayQueryRenderer extends React.Component<Props, State> {
147
145
  static getDerivedStateFromProps(
148
146
  nextProps: Props,
149
147
  prevState: State,
150
- ): $Shape<State> | null {
148
+ ): Partial<State> | null {
151
149
  if (
152
150
  prevState.prevQuery !== nextProps.query ||
153
151
  prevState.prevPropsEnvironment !== nextProps.environment ||
@@ -169,7 +167,13 @@ class ReactRelayQueryRenderer extends React.Component<Props, State> {
169
167
  this._maybeHiddenOrFastRefresh = false;
170
168
  // eslint-disable-next-line react/no-did-mount-set-state
171
169
  this.setState(prevState => {
172
- return resetQueryStateForUpdate(this.props, prevState);
170
+ const newState = resetQueryStateForUpdate(this.props, prevState);
171
+ const {requestCacheKey, queryFetcher} = newState;
172
+ if (requestCacheKey != null && requestCache[requestCacheKey] != null) {
173
+ // $FlowFixMe[incompatible-use]
174
+ queryFetcher.setOnDataChange(this._handleDataChange);
175
+ }
176
+ return newState;
173
177
  });
174
178
  return;
175
179
  }
@@ -335,7 +339,7 @@ function getRequestCacheKey(
335
339
  function resetQueryStateForUpdate(
336
340
  props: Props,
337
341
  prevState: State,
338
- ): $Shape<State> {
342
+ ): Partial<State> {
339
343
  const {query} = props;
340
344
 
341
345
  const prevSelectionReferences =
@@ -372,7 +376,7 @@ function fetchQueryAndComputeStateFromProps(
372
376
  queryFetcher: ReactRelayQueryFetcher,
373
377
  retryCallbacks: RetryCallbacks,
374
378
  requestCacheKey: ?string,
375
- ): $Shape<State> {
379
+ ): Partial<State> {
376
380
  const {environment, query, variables, cacheConfig} = props;
377
381
  const genericEnvironment = (environment: IEnvironment);
378
382
  if (query) {
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -6,16 +6,17 @@
6
6
  *
7
7
  * @flow
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
12
13
 
13
14
  import type {
15
+ $RelayProps,
14
16
  GeneratedNodeMap,
15
17
  ObserverOrCallback,
16
18
  RefetchOptions,
17
19
  RelayRefetchProp,
18
- $RelayProps,
19
20
  } from './ReactRelayTypes';
20
21
  import type {
21
22
  CacheConfig,
@@ -79,6 +80,7 @@ function createContainerWithFragments<
79
80
  const containerName = getContainerName(Component);
80
81
 
81
82
  return class extends React.Component<ContainerProps, ContainerState> {
83
+ // $FlowFixMe[missing-local-annot]
82
84
  static displayName = containerName;
83
85
 
84
86
  _refetchSubscription: ?Subscription;
@@ -142,7 +144,7 @@ function createContainerWithFragments<
142
144
  static getDerivedStateFromProps(
143
145
  nextProps: ContainerProps,
144
146
  prevState: ContainerState,
145
- ): $Shape<ContainerState> | null {
147
+ ): Partial<ContainerState> | null {
146
148
  // Any props change could impact the query, so we mirror props in state.
147
149
  // This is an unusual pattern, but necessary for this container usecase.
148
150
  const {prevProps} = prevState;
@@ -369,7 +371,7 @@ function createContainerWithFragments<
369
371
 
370
372
  // Declare refetchSubscription before assigning it in .start(), since
371
373
  // synchronous completion may call callbacks .subscribe() returns.
372
- let refetchSubscription;
374
+ let refetchSubscription: Subscription;
373
375
 
374
376
  const storeSnapshot = this._getQueryFetcher().lookupInStore(
375
377
  environment,
@@ -405,12 +407,12 @@ function createContainerWithFragments<
405
407
  // TODO (T26430099): Cleanup old references
406
408
  preservePreviousReferences: true,
407
409
  })
408
- .mergeMap(response => {
410
+ .mergeMap<void>(response => {
409
411
  this.state.resolver.setVariables(
410
412
  fragmentVariables,
411
413
  operation.request.node,
412
414
  );
413
- return Observable.create(sink =>
415
+ return Observable.create<void>(sink =>
414
416
  this.setState(
415
417
  latestState => ({
416
418
  data: latestState.resolver.resolve(),
@@ -447,7 +449,9 @@ function createContainerWithFragments<
447
449
  };
448
450
  };
449
451
 
452
+ // $FlowFixMe[missing-local-annot]
450
453
  render() {
454
+ // eslint-disable-next-line no-unused-vars
451
455
  const {componentRef, __relayContext, __rootIsQueryRenderer, ...props} =
452
456
  this.props;
453
457
  const {relayProp, contextForChildren} = this.state;
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -13,6 +14,7 @@
13
14
  import type {
14
15
  CacheConfig,
15
16
  ConcreteRequest,
17
+ GraphQLResponse,
16
18
  GraphQLSingularResponse,
17
19
  IEnvironment,
18
20
  PayloadError,
@@ -145,7 +147,7 @@ class ReactRelayTestMocker {
145
147
  ) => {
146
148
  let resolve;
147
149
  let reject;
148
- const promise = new Promise((res, rej) => {
150
+ const promise = new Promise<GraphQLResponse>((res, rej) => {
149
151
  resolve = res;
150
152
  reject = rej;
151
153
  });
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -101,6 +102,7 @@ export type $FragmentRef<T> = {
101
102
  * `props.relay` and returns the props of the container.
102
103
  */
103
104
  // prettier-ignore
105
+ // $FlowFixMe[extra-type-arg] xplat redux flow type error
104
106
  export type $RelayProps<Props, RelayPropT = RelayProp> = $ObjMap<
105
107
  $Diff<Props, { relay: RelayPropT | void, ... }>,
106
108
  & (<T: { +$fragmentType: empty, ... }>( T) => T)
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -139,7 +140,7 @@ module.exports = {
139
140
  render(): React.Element<typeof Bar> {
140
141
  return (
141
142
  <Bar
142
- componentRef={ref => {
143
+ componentRef={(ref: empty) => {
143
144
  this._barRef = (ref: empty);
144
145
  }}
145
146
  requiredProp="bar"
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @flow strict-local
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
12
  'use strict';
@@ -4,7 +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
- * @generated SignedSource<<23bcef30afc22a42d79dd52e0cfe899c>>
7
+ * @oncall relay
8
+ *
9
+ * @generated SignedSource<<97ebbfa87de00690617b84f5dc0b3dd7>>
8
10
  * @flow
9
11
  * @lightSyntaxTransform
10
12
  * @nogrep
@@ -4,7 +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
- * @generated SignedSource<<af6c4570779066ea564051c9c71c494f>>
7
+ * @oncall relay
8
+ *
9
+ * @generated SignedSource<<493af2df808158f1c08ec6aafda2e783>>
8
10
  * @flow
9
11
  * @lightSyntaxTransform
10
12
  * @nogrep
@@ -4,7 +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
- * @generated SignedSource<<6d173a357c286b417fdc586a839384d4>>
7
+ * @oncall relay
8
+ *
9
+ * @generated SignedSource<<073d1d174775daaac06d462623886192>>
8
10
  * @flow
9
11
  * @lightSyntaxTransform
10
12
  * @nogrep
@@ -16,7 +18,7 @@
16
18
 
17
19
  /*::
18
20
  import type { ConcreteRequest, Query } from 'relay-runtime';
19
- type ReactRelayPaginationContainerFlowtest_viewer$fragmentType = any;
21
+ import type { ReactRelayPaginationContainerFlowtest_viewer$fragmentType } from "./ReactRelayPaginationContainerFlowtest_viewer.graphql";
20
22
  export type ReactRelayPaginationContainerFlowtestQuery$variables = {|
21
23
  count: number,
22
24
  cursor?: ?string,
@@ -4,7 +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
- * @generated SignedSource<<b3cddee250d0ff22e89a7f0331e85df6>>
7
+ * @oncall relay
8
+ *
9
+ * @generated SignedSource<<03cbc84be1e0fb9c3986ea29a3e335db>>
8
10
  * @flow
9
11
  * @lightSyntaxTransform
10
12
  * @nogrep
@@ -4,7 +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
- * @generated SignedSource<<3b1b16b5d5ec1c94783d6161ae61bc3d>>
7
+ * @oncall relay
8
+ *
9
+ * @generated SignedSource<<909036439f4d2e9e2d5728ade52035dc>>
8
10
  * @flow
9
11
  * @lightSyntaxTransform
10
12
  * @nogrep
@@ -16,7 +18,7 @@
16
18
 
17
19
  /*::
18
20
  import type { ConcreteRequest, Query } from 'relay-runtime';
19
- type ReactRelayRefetchContainerFlowtest_viewer$fragmentType = any;
21
+ import type { ReactRelayRefetchContainerFlowtest_viewer$fragmentType } from "./ReactRelayRefetchContainerFlowtest_viewer.graphql";
20
22
  export type ReactRelayRefetchContainerFlowtestQuery$variables = {|
21
23
  count: number,
22
24
  cursor?: ?string,