react-relay 14.0.0 → 15.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 (194) hide show
  1. package/ReactRelayContainerUtils.js.flow +1 -2
  2. package/ReactRelayContext.js +1 -1
  3. package/ReactRelayContext.js.flow +1 -2
  4. package/ReactRelayFragmentContainer.js.flow +6 -4
  5. package/ReactRelayFragmentMockRenderer.js.flow +1 -2
  6. package/ReactRelayLocalQueryRenderer.js.flow +5 -5
  7. package/ReactRelayPaginationContainer.js.flow +21 -14
  8. package/ReactRelayQueryFetcher.js.flow +28 -16
  9. package/ReactRelayQueryRenderer.js.flow +42 -13
  10. package/ReactRelayQueryRendererContext.js.flow +2 -3
  11. package/ReactRelayRefetchContainer.js.flow +9 -9
  12. package/ReactRelayTestMocker.js.flow +3 -3
  13. package/ReactRelayTypes.js.flow +7 -8
  14. package/RelayContext.js.flow +1 -2
  15. package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +4 -5
  16. package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +4 -5
  17. package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +4 -5
  18. package/__flowtests__/RelayModern-flowtest.js.flow +3 -4
  19. package/__flowtests__/RelayModernFlowtest_badref.graphql.js.flow +3 -4
  20. package/__flowtests__/RelayModernFlowtest_notref.graphql.js.flow +3 -4
  21. package/__flowtests__/RelayModernFlowtest_user.graphql.js.flow +3 -4
  22. package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +3 -4
  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 -2
  34. package/buildReactRelayContainer.js.flow +7 -7
  35. package/getRootVariablesForFragments.js.flow +1 -3
  36. package/hooks.js +1 -1
  37. package/hooks.js.flow +4 -2
  38. package/index.js +1 -1
  39. package/index.js.flow +6 -2
  40. package/isRelayEnvironment.js.flow +1 -2
  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 -2
  46. package/lib/ReactRelayContainerUtils.js +2 -3
  47. package/lib/ReactRelayContext.js +3 -4
  48. package/lib/ReactRelayFragmentContainer.js +47 -73
  49. package/lib/ReactRelayFragmentMockRenderer.js +2 -4
  50. package/lib/ReactRelayLocalQueryRenderer.js +18 -31
  51. package/lib/ReactRelayPaginationContainer.js +74 -164
  52. package/lib/ReactRelayQueryFetcher.js +49 -76
  53. package/lib/ReactRelayQueryRenderer.js +63 -84
  54. package/lib/ReactRelayQueryRendererContext.js +2 -2
  55. package/lib/ReactRelayRefetchContainer.js +58 -108
  56. package/lib/ReactRelayTestMocker.js +33 -68
  57. package/lib/ReactRelayTypes.js +2 -1
  58. package/lib/RelayContext.js +4 -7
  59. package/lib/assertFragmentMap.js +3 -5
  60. package/lib/buildReactRelayContainer.js +11 -27
  61. package/lib/getRootVariablesForFragments.js +6 -10
  62. package/lib/hooks.js +5 -18
  63. package/lib/index.js +7 -24
  64. package/lib/isRelayEnvironment.js +5 -4
  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 -8
  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 -8
  72. package/lib/relay-hooks/EntryPointContainer.react.js +9 -15
  73. package/lib/relay-hooks/EntryPointTypes.flow.js +5 -3
  74. package/lib/relay-hooks/FragmentResource.js +109 -203
  75. package/lib/relay-hooks/HooksImplementation.js +3 -6
  76. package/lib/relay-hooks/InternalLogger.js +2 -3
  77. package/lib/relay-hooks/LRUCache.js +2 -20
  78. package/lib/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js +33 -54
  79. package/lib/relay-hooks/MatchContainer.js +15 -24
  80. package/lib/relay-hooks/ProfilerContext.js +3 -3
  81. package/lib/relay-hooks/QueryResource.js +31 -101
  82. package/lib/relay-hooks/RelayEnvironmentProvider.js +5 -9
  83. package/lib/relay-hooks/SuspenseResource.js +9 -33
  84. package/lib/relay-hooks/loadEntryPoint.js +19 -31
  85. package/lib/relay-hooks/loadQuery.js +42 -78
  86. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +11 -37
  87. package/lib/relay-hooks/prepareEntryPoint_DEPRECATED.js +9 -15
  88. package/lib/relay-hooks/react-cache/RelayReactCache.js +7 -12
  89. package/lib/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js +27 -81
  90. package/lib/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js +206 -0
  91. package/lib/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js +195 -215
  92. package/lib/relay-hooks/react-cache/useFragment_REACT_CACHE.js +5 -15
  93. package/lib/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js +17 -24
  94. package/lib/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js +149 -0
  95. package/lib/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js +24 -39
  96. package/lib/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js +325 -0
  97. package/lib/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js +37 -0
  98. package/lib/relay-hooks/useBlockingPaginationFragment.js +73 -93
  99. package/lib/relay-hooks/useClientQuery.js +30 -0
  100. package/lib/relay-hooks/useEntryPointLoader.js +18 -38
  101. package/lib/relay-hooks/useFetchTrackingRef.js +10 -12
  102. package/lib/relay-hooks/useFragment.js +8 -19
  103. package/lib/relay-hooks/useFragmentNode.js +20 -32
  104. package/lib/relay-hooks/useIsMountedRef.js +4 -6
  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 +7 -24
  108. package/lib/relay-hooks/useLazyLoadQueryNode.js +23 -34
  109. package/lib/relay-hooks/useLoadMoreFunction.js +46 -78
  110. package/lib/relay-hooks/useMemoOperationDescriptor.js +6 -15
  111. package/lib/relay-hooks/useMemoVariables.js +15 -34
  112. package/lib/relay-hooks/useMutation.js +9 -27
  113. package/lib/relay-hooks/usePaginationFragment.js +73 -76
  114. package/lib/relay-hooks/usePreloadedQuery.js +13 -44
  115. package/lib/relay-hooks/useQueryLoader.js +24 -49
  116. package/lib/relay-hooks/useRefetchableFragment.js +19 -17
  117. package/lib/relay-hooks/useRefetchableFragmentNode.js +65 -109
  118. package/lib/relay-hooks/useRelayEnvironment.js +4 -8
  119. package/lib/relay-hooks/useStaticFragmentNodeWarning.js +4 -8
  120. package/lib/relay-hooks/useSubscribeToInvalidationState.js +8 -9
  121. package/lib/relay-hooks/useSubscription.js +5 -10
  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 -4
  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 +3 -5
  134. package/relay-hooks/EntryPointTypes.flow.js.flow +37 -37
  135. package/relay-hooks/FragmentResource.js.flow +43 -19
  136. package/relay-hooks/HooksImplementation.js.flow +7 -9
  137. package/relay-hooks/InternalLogger.js.flow +1 -3
  138. package/relay-hooks/LRUCache.js.flow +1 -3
  139. package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +19 -14
  140. package/relay-hooks/MatchContainer.js.flow +6 -8
  141. package/relay-hooks/ProfilerContext.js.flow +1 -3
  142. package/relay-hooks/QueryResource.js.flow +29 -11
  143. package/relay-hooks/RelayEnvironmentProvider.js.flow +4 -6
  144. package/relay-hooks/SuspenseResource.js.flow +1 -3
  145. package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +6 -4
  146. package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +4 -4
  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 +39 -39
  150. package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +1 -3
  151. package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +37 -38
  152. package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +18 -20
  153. package/relay-hooks/__flowtests__/utils.js.flow +21 -12
  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 +9 -12
  157. package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +13 -10
  158. package/relay-hooks/react-cache/RelayReactCache.js.flow +1 -3
  159. package/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js.flow +26 -20
  160. package/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js.flow +297 -0
  161. package/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js.flow +136 -96
  162. package/relay-hooks/react-cache/useFragment_REACT_CACHE.js.flow +1 -3
  163. package/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js.flow +3 -5
  164. package/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js.flow +190 -0
  165. package/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js.flow +3 -6
  166. package/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js.flow +601 -0
  167. package/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js.flow +65 -0
  168. package/relay-hooks/useBlockingPaginationFragment.js.flow +86 -59
  169. package/relay-hooks/useClientQuery.js.flow +39 -0
  170. package/relay-hooks/useEntryPointLoader.js.flow +16 -14
  171. package/relay-hooks/useFetchTrackingRef.js.flow +7 -8
  172. package/relay-hooks/useFragment.js.flow +2 -4
  173. package/relay-hooks/useFragmentNode.js.flow +7 -8
  174. package/relay-hooks/useIsMountedRef.js.flow +2 -4
  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 +9 -32
  178. package/relay-hooks/useLazyLoadQueryNode.js.flow +4 -6
  179. package/relay-hooks/useLoadMoreFunction.js.flow +20 -17
  180. package/relay-hooks/useMemoOperationDescriptor.js.flow +3 -5
  181. package/relay-hooks/useMemoVariables.js.flow +13 -31
  182. package/relay-hooks/useMutation.js.flow +6 -8
  183. package/relay-hooks/usePaginationFragment.js.flow +75 -43
  184. package/relay-hooks/usePreloadedQuery.js.flow +49 -43
  185. package/relay-hooks/useQueryLoader.js.flow +89 -28
  186. package/relay-hooks/useRefetchableFragment.js.flow +83 -23
  187. package/relay-hooks/useRefetchableFragmentNode.js.flow +26 -22
  188. package/relay-hooks/useRelayEnvironment.js.flow +2 -4
  189. package/relay-hooks/useStaticFragmentNodeWarning.js.flow +3 -5
  190. package/relay-hooks/useSubscribeToInvalidationState.js.flow +2 -4
  191. package/relay-hooks/useSubscription.js.flow +1 -3
  192. package/relay-hooks/useUnsafeRef_DEPRECATED.js.flow +25 -0
  193. package/lib/readContext.js +0 -28
  194. package/readContext.js.flow +0 -31
@@ -4,13 +4,11 @@
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
- // flowlint ambiguous-object-type:error
13
-
14
12
  'use strict';
15
13
 
16
14
  import type {
@@ -19,9 +17,10 @@ import type {
19
17
  PreloadedQuery,
20
18
  } from './EntryPointTypes.flow';
21
19
  import type {
22
- GraphQLTaggedNode,
23
20
  IEnvironment,
24
21
  OperationType,
22
+ Query,
23
+ Variables,
25
24
  } from 'relay-runtime';
26
25
 
27
26
  const {loadQuery, useTrackLoadQueryInRender} = require('./loadQuery');
@@ -35,39 +34,104 @@ export type LoaderFn<TQuery: OperationType> = (
35
34
  options?: UseQueryLoaderLoadQueryOptions,
36
35
  ) => void;
37
36
 
38
- export type UseQueryLoaderLoadQueryOptions = $ReadOnly<{|
37
+ export type UseQueryLoaderLoadQueryOptions = $ReadOnly<{
39
38
  ...LoadQueryOptions,
40
39
  +__environment?: ?IEnvironment,
41
- |}>;
42
-
43
- type UseQueryLoaderHookReturnType<TQuery: OperationType> = [
44
- ?PreloadedQuery<TQuery>,
45
- LoaderFn<TQuery>,
46
- () => void,
47
- ];
40
+ }>;
48
41
 
49
42
  // NullQueryReference needs to implement referential equality,
50
43
  // so that multiple NullQueryReferences can be in the same set
51
44
  // (corresponding to multiple calls to disposeQuery).
52
- type NullQueryReference = {|
45
+ type NullQueryReference = {
53
46
  kind: 'NullQueryReference',
54
- |};
47
+ };
55
48
  const initialNullQueryReferenceState = {kind: 'NullQueryReference'};
56
49
 
57
- function requestIsLiveQuery<TQuery: OperationType>(
58
- preloadableRequest: GraphQLTaggedNode | PreloadableConcreteRequest<TQuery>,
50
+ function requestIsLiveQuery<
51
+ TVariables: Variables,
52
+ TData,
53
+ TRawResponse: ?{...} = void,
54
+ TQuery: OperationType = {
55
+ response: TData,
56
+ variables: TVariables,
57
+ rawResponse?: $NonMaybeType<TRawResponse>,
58
+ },
59
+ >(
60
+ preloadableRequest:
61
+ | Query<TVariables, TData, TRawResponse>
62
+ | PreloadableConcreteRequest<TQuery>,
59
63
  ): boolean {
60
64
  if (preloadableRequest.kind === 'PreloadableConcreteRequest') {
61
- return (preloadableRequest: $FlowFixMe).params.metadata.live !== undefined;
65
+ return preloadableRequest.params.metadata.live !== undefined;
62
66
  }
63
67
  const request = getRequest(preloadableRequest);
64
68
  return request.params.metadata.live !== undefined;
65
69
  }
66
70
 
67
- function useQueryLoader<TQuery: OperationType>(
68
- preloadableRequest: GraphQLTaggedNode | PreloadableConcreteRequest<TQuery>,
71
+ type UseQueryLoaderHookReturnType<
72
+ TVariables: Variables,
73
+ TData,
74
+ TRawResponse: ?{...} = void,
75
+ > = [
76
+ ?PreloadedQuery<{
77
+ response: TData,
78
+ variables: TVariables,
79
+ rawResponse?: $NonMaybeType<TRawResponse>,
80
+ }>,
81
+ (variables: TVariables, options?: UseQueryLoaderLoadQueryOptions) => void,
82
+ () => void,
83
+ ];
84
+
85
+ type ExtractVariablesType = <T>({+variables: T, ...}) => T;
86
+ type ExtractResponseType = <T>({+response: T, ...}) => T;
87
+
88
+ declare function useQueryLoader<
89
+ TVariables: Variables,
90
+ TData,
91
+ TRawResponse: ?{...} = void,
92
+ >(
93
+ preloadableRequest: Query<TVariables, TData, TRawResponse>,
94
+ ): UseQueryLoaderHookReturnType<TVariables, TData>;
95
+
96
+ declare function useQueryLoader<
97
+ TVariables: Variables,
98
+ TData,
99
+ TRawResponse: ?{...} = void,
100
+ >(
101
+ preloadableRequest: Query<TVariables, TData, TRawResponse>,
102
+ initialQueryReference: ?PreloadedQuery<{
103
+ response: TData,
104
+ variables: TVariables,
105
+ rawResponse?: $NonMaybeType<TRawResponse>,
106
+ }>,
107
+ ): UseQueryLoaderHookReturnType<TVariables, TData>;
108
+
109
+ declare function useQueryLoader<TQuery: OperationType>(
110
+ preloadableRequest: PreloadableConcreteRequest<TQuery>,
69
111
  initialQueryReference?: ?PreloadedQuery<TQuery>,
70
- ): UseQueryLoaderHookReturnType<TQuery> {
112
+ ): UseQueryLoaderHookReturnType<
113
+ $Call<ExtractVariablesType, TQuery>,
114
+ $Call<ExtractResponseType, TQuery>,
115
+ >;
116
+
117
+ function useQueryLoader<
118
+ TVariables: Variables,
119
+ TData,
120
+ TRawResponse: ?{...} = void,
121
+ >(
122
+ preloadableRequest: Query<TVariables, TData, TRawResponse>,
123
+ initialQueryReference?: ?PreloadedQuery<{
124
+ response: TData,
125
+ variables: TVariables,
126
+ rawResponse?: $NonMaybeType<TRawResponse>,
127
+ }>,
128
+ ): UseQueryLoaderHookReturnType<TVariables, TData> {
129
+ type QueryType = {
130
+ response: TData,
131
+ variables: TVariables,
132
+ rawResponse?: $NonMaybeType<TRawResponse>,
133
+ };
134
+
71
135
  /**
72
136
  * We want to always call `queryReference.dispose()` for every call to
73
137
  * `setQueryReference(loadQuery(...))` so that no leaks of data in Relay stores
@@ -96,15 +160,15 @@ function useQueryLoader<TQuery: OperationType>(
96
160
 
97
161
  const isMountedRef = useIsMountedRef();
98
162
  const undisposedQueryReferencesRef = useRef<
99
- Set<PreloadedQuery<TQuery> | NullQueryReference>,
163
+ Set<PreloadedQuery<QueryType> | NullQueryReference>,
100
164
  >(new Set([initialQueryReferenceInternal]));
101
165
 
102
166
  const [queryReference, setQueryReference] = useState<
103
- PreloadedQuery<TQuery> | NullQueryReference,
167
+ PreloadedQuery<QueryType> | NullQueryReference,
104
168
  >(() => initialQueryReferenceInternal);
105
169
 
106
170
  const [previousInitialQueryReference, setPreviousInitialQueryReference] =
107
- useState<PreloadedQuery<TQuery> | NullQueryReference>(
171
+ useState<PreloadedQuery<QueryType> | NullQueryReference>(
108
172
  () => initialQueryReferenceInternal,
109
173
  );
110
174
 
@@ -127,10 +191,7 @@ function useQueryLoader<TQuery: OperationType>(
127
191
  }, [isMountedRef]);
128
192
 
129
193
  const queryLoaderCallback = useCallback(
130
- (
131
- variables: TQuery['variables'],
132
- options?: ?UseQueryLoaderLoadQueryOptions,
133
- ) => {
194
+ (variables: TVariables, options?: ?UseQueryLoaderLoadQueryOptions) => {
134
195
  const mergedOptions: ?UseQueryLoaderLoadQueryOptions =
135
196
  options != null && options.hasOwnProperty('__environment')
136
197
  ? {
@@ -140,7 +201,7 @@ function useQueryLoader<TQuery: OperationType>(
140
201
  }
141
202
  : options;
142
203
  if (isMountedRef.current) {
143
- const updatedQueryReference = loadQuery(
204
+ const updatedQueryReference = loadQuery<QueryType>(
144
205
  options?.__environment ?? environment,
145
206
  preloadableRequest,
146
207
  variables,
@@ -4,64 +4,124 @@
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
- // flowlint ambiguous-object-type:error
13
-
14
12
  'use strict';
15
13
 
16
- import type {RefetchFnDynamic} from './useRefetchableFragmentNode';
14
+ import type {Options} from './useRefetchableFragmentNode';
17
15
  import type {
16
+ Disposable,
18
17
  FragmentType,
19
- GraphQLTaggedNode,
20
- OperationType,
18
+ RefetchableFragment,
19
+ Variables,
21
20
  } from 'relay-runtime';
22
21
 
22
+ const HooksImplementation = require('./HooksImplementation');
23
23
  const useRefetchableFragmentNode = require('./useRefetchableFragmentNode');
24
24
  const useStaticFragmentNodeWarning = require('./useStaticFragmentNodeWarning');
25
25
  const {useDebugValue} = require('react');
26
26
  const {getFragment} = require('relay-runtime');
27
27
 
28
- type ReturnType<TQuery: OperationType, TKey: ?{+$data?: mixed, ...}> = [
28
+ type RefetchVariables<TVariables, TKey> =
29
+ // NOTE: This $Call ensures that the type of the returned variables is either:
30
+ // - nullable if the provided ref type is nullable
31
+ // - non-nullable if the provided ref type is non-nullable
32
+ // prettier-ignore
33
+ $Call<
34
+ & (<TFragmentType>( { +$fragmentSpreads: TFragmentType, ... }) => $Shape<TVariables>)
35
+ & (<TFragmentType>(?{ +$fragmentSpreads: TFragmentType, ... }) => TVariables),
36
+ TKey,
37
+ >;
38
+
39
+ type RefetchFnBase<TVars, TOptions> = (
40
+ vars: TVars,
41
+ options?: TOptions,
42
+ ) => Disposable;
43
+
44
+ export type RefetchFn<TVariables, TKey, TOptions = Options> = RefetchFnBase<
45
+ RefetchVariables<TVariables, TKey>,
46
+ TOptions,
47
+ >;
48
+
49
+ type ReturnType<TVariables, TData, TKey> = [
29
50
  // NOTE: This $Call ensures that the type of the returned data is either:
30
51
  // - nullable if the provided ref type is nullable
31
52
  // - non-nullable if the provided ref type is non-nullable
32
53
  // prettier-ignore
33
54
  $Call<
34
- & (<TFragmentData>( { +$data?: TFragmentData, ... }) => TFragmentData)
35
- & (<TFragmentData>(?{ +$data?: TFragmentData, ... }) => ?TFragmentData),
55
+ & (<TFragmentType>( { +$fragmentSpreads: TFragmentType, ... }) => TData)
56
+ & (<TFragmentType>(?{ +$fragmentSpreads: TFragmentType, ... }) => ?TData),
36
57
  TKey,
37
58
  >,
38
- RefetchFnDynamic<TQuery, TKey>,
59
+ RefetchFn<TVariables, TKey>,
39
60
  ];
40
61
 
41
- function useRefetchableFragment<
42
- TQuery: OperationType,
43
- TKey: ?{+$data?: mixed, +$fragmentSpreads: FragmentType, ...},
62
+ export type UseRefetchableFragmentType = <
63
+ TFragmentType: FragmentType,
64
+ TVariables: Variables,
65
+ TData,
66
+ TKey: ?{+$fragmentSpreads: TFragmentType, ...},
44
67
  >(
45
- fragmentInput: GraphQLTaggedNode,
68
+ fragment: RefetchableFragment<TFragmentType, TData, TVariables>,
69
+ key: TKey,
70
+ ) => ReturnType<TVariables, TData, TKey>;
71
+
72
+ function useRefetchableFragment_LEGACY<
73
+ TFragmentType: FragmentType,
74
+ TVariables: Variables,
75
+ TData,
76
+ TKey: ?{+$fragmentSpreads: TFragmentType, ...},
77
+ >(
78
+ fragmentInput: RefetchableFragment<TFragmentType, TData, TVariables>,
46
79
  fragmentRef: TKey,
47
- ): ReturnType<TQuery, TKey> {
80
+ ): ReturnType<TVariables, TData, TKey> {
48
81
  const fragmentNode = getFragment(fragmentInput);
49
82
  useStaticFragmentNodeWarning(
50
83
  fragmentNode,
51
84
  'first argument of useRefetchableFragment()',
52
85
  );
53
- const {fragmentData, refetch} = useRefetchableFragmentNode<TQuery, TKey>(
54
- fragmentNode,
55
- fragmentRef,
56
- 'useRefetchableFragment()',
57
- );
86
+ const {fragmentData, refetch} = useRefetchableFragmentNode<
87
+ {
88
+ response: TData,
89
+ variables: TVariables,
90
+ },
91
+ {
92
+ +$data: mixed,
93
+ ...
94
+ },
95
+ >(fragmentNode, fragmentRef, 'useRefetchableFragment()');
58
96
  if (__DEV__) {
59
97
  // eslint-disable-next-line react-hooks/rules-of-hooks
60
98
  useDebugValue({fragment: fragmentNode.name, data: fragmentData});
61
99
  }
62
- /* $FlowExpectedError[prop-missing] : Exposed options is a subset of internal
63
- * options */
64
- return [fragmentData, (refetch: RefetchFnDynamic<TQuery, TKey>)];
100
+
101
+ // $FlowFixMe[incompatible-return]
102
+ // $FlowFixMe[prop-missing]
103
+ return [fragmentData, refetch];
104
+ }
105
+
106
+ function useRefetchableFragment<
107
+ TFragmentType: FragmentType,
108
+ TVariables: Variables,
109
+ TData,
110
+ TKey: ?{+$fragmentSpreads: TFragmentType, ...},
111
+ >(
112
+ fragmentInput: RefetchableFragment<TFragmentType, TData, TVariables>,
113
+ parentFragmentRef: TKey,
114
+ ): ReturnType<TVariables, TData, TKey> {
115
+ const impl = HooksImplementation.get();
116
+ if (impl) {
117
+ return impl.useRefetchableFragment<TFragmentType, TVariables, TData, TKey>(
118
+ fragmentInput,
119
+ parentFragmentRef,
120
+ );
121
+ } else {
122
+ // eslint-disable-next-line react-hooks/rules-of-hooks
123
+ return useRefetchableFragment_LEGACY(fragmentInput, parentFragmentRef);
124
+ }
65
125
  }
66
126
 
67
127
  module.exports = useRefetchableFragment;
@@ -4,13 +4,11 @@
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
- // flowlint ambiguous-object-type:error
13
-
14
12
  'use strict';
15
13
 
16
14
  import type {LoaderFn} from './useQueryLoader';
@@ -71,24 +69,24 @@ export type ReturnType<
71
69
  TQuery: OperationType,
72
70
  TKey: ?{+$data?: mixed, ...},
73
71
  TOptions = Options,
74
- > = {|
72
+ > = {
75
73
  fragmentData: mixed,
76
74
  fragmentRef: mixed,
77
75
  refetch: RefetchFnDynamic<TQuery, TKey, TOptions>,
78
76
  disableStoreUpdates: () => void,
79
77
  enableStoreUpdates: () => void,
80
- |};
78
+ };
81
79
 
82
- export type Options = {|
80
+ export type Options = {
83
81
  fetchPolicy?: FetchPolicy,
84
82
  onComplete?: (Error | null) => void,
85
83
  UNSTABLE_renderPolicy?: RenderPolicy,
86
- |};
84
+ };
87
85
 
88
- type InternalOptions = {|
86
+ type InternalOptions = {
89
87
  ...Options,
90
88
  __environment?: IEnvironment,
91
- |};
89
+ };
92
90
 
93
91
  type RefetchFnBase<TVars, TOptions> = (
94
92
  vars: TVars,
@@ -105,21 +103,21 @@ type RefetchFnInexact<
105
103
  > = RefetchFnBase<$Shape<VariablesOf<TQuery>>, TOptions>;
106
104
 
107
105
  type Action =
108
- | {|
106
+ | {
109
107
  type: 'reset',
110
108
  environment: IEnvironment,
111
109
  fragmentIdentifier: string,
112
- |}
113
- | {|
110
+ }
111
+ | {
114
112
  type: 'refetch',
115
113
  refetchQuery: OperationDescriptor,
116
114
  fetchPolicy?: FetchPolicy,
117
115
  renderPolicy?: RenderPolicy,
118
116
  onComplete?: (Error | null) => void,
119
117
  refetchEnvironment: ?IEnvironment,
120
- |};
118
+ };
121
119
 
122
- type RefetchState = {|
120
+ type RefetchState = {
123
121
  fetchPolicy: FetchPolicy | void,
124
122
  mirroredEnvironment: IEnvironment,
125
123
  mirroredFragmentIdentifier: string,
@@ -127,7 +125,7 @@ type RefetchState = {|
127
125
  refetchEnvironment?: ?IEnvironment,
128
126
  refetchQuery: OperationDescriptor | null,
129
127
  renderPolicy: RenderPolicy | void,
130
- |};
128
+ };
131
129
 
132
130
  type DebugIDandTypename = {
133
131
  id: string,
@@ -209,8 +207,11 @@ function useRefetchableFragmentNode<
209
207
  const shouldReset =
210
208
  environment !== mirroredEnvironment ||
211
209
  fragmentIdentifier !== mirroredFragmentIdentifier;
212
- const [queryRef, loadQuery, disposeQuery] =
213
- useQueryLoader<TQuery>(refetchableRequest);
210
+ const [queryRef, loadQuery, disposeQuery] = useQueryLoader<
211
+ TQuery['variables'],
212
+ TQuery['response'],
213
+ TQuery['rawResponse'],
214
+ >((refetchableRequest: $FlowFixMe));
214
215
 
215
216
  let fragmentRef = parentFragmentRef;
216
217
  if (shouldReset) {
@@ -361,19 +362,19 @@ function useRefetchableFragmentNode<
361
362
  function useRefetchFunction<TQuery: OperationType>(
362
363
  componentDisplayName: string,
363
364
  dispatch: (
364
- | {|
365
+ | {
365
366
  environment: IEnvironment,
366
367
  fragmentIdentifier: string,
367
368
  type: 'reset',
368
- |}
369
- | {|
369
+ }
370
+ | {
370
371
  fetchPolicy?: FetchPolicy,
371
372
  onComplete?: (Error | null) => void,
372
373
  refetchEnvironment: ?IEnvironment,
373
374
  refetchQuery: OperationDescriptor,
374
375
  renderPolicy?: RenderPolicy,
375
376
  type: 'refetch',
376
- |},
377
+ },
377
378
  ) => void,
378
379
  disposeQuery: () => void,
379
380
  fragmentData: mixed,
@@ -393,7 +394,10 @@ function useRefetchFunction<TQuery: OperationType>(
393
394
  ? fragmentData[identifierField]
394
395
  : null;
395
396
  return useCallback(
396
- (providedRefetchVariables, options) => {
397
+ (
398
+ providedRefetchVariables: VariablesOf<TQuery>,
399
+ options: void | InternalOptions,
400
+ ) => {
397
401
  // Bail out and warn if we're trying to refetch after the component
398
402
  // has unmounted
399
403
  if (isMountedRef.current !== true) {
@@ -4,20 +4,18 @@
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
- // flowlint ambiguous-object-type:error
13
-
14
12
  'use strict';
15
13
 
16
14
  import type {IEnvironment} from 'relay-runtime';
17
15
 
16
+ const ReactRelayContext = require('./../ReactRelayContext');
18
17
  const invariant = require('invariant');
19
18
  const {useContext} = require('react');
20
- const ReactRelayContext = require('react-relay/ReactRelayContext');
21
19
 
22
20
  function useRelayEnvironment(): IEnvironment {
23
21
  const context = useContext(ReactRelayContext);
@@ -4,18 +4,16 @@
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
- // flowlint ambiguous-object-type:error
13
-
14
12
  'use strict';
15
13
 
16
14
  import type {ReaderFragment} from 'relay-runtime';
17
15
 
18
- const {useRef} = require('react');
16
+ const useUnsafeRef_DEPRECATED = require('./useUnsafeRef_DEPRECATED');
19
17
  const warning = require('warning');
20
18
 
21
19
  function useStaticFragmentNodeWarning(
@@ -27,7 +25,7 @@ function useStaticFragmentNodeWarning(
27
25
  // __DEV__ setting which shouldn't change. This allows us to only pay the
28
26
  // cost of `useRef` in development mode to produce the warning.
29
27
  // eslint-disable-next-line react-hooks/rules-of-hooks
30
- const initialPropRef = useRef(fragmentNode.name);
28
+ const initialPropRef = useUnsafeRef_DEPRECATED(fragmentNode.name);
31
29
  warning(
32
30
  initialPropRef.current === fragmentNode.name,
33
31
  'Relay: The %s has to remain the same over the lifetime of a component. ' +
@@ -4,13 +4,11 @@
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
- // flowlint ambiguous-object-type:error
13
-
14
12
  'use strict';
15
13
 
16
14
  import type {DataID, Disposable} from 'relay-runtime';
@@ -32,7 +30,7 @@ function useSubscribeToInvalidationState(
32
30
  callback: () => void,
33
31
  ): Disposable {
34
32
  const environment = useRelayEnvironment();
35
- const disposableRef = useRef(null);
33
+ const disposableRef = useRef<null | Disposable>(null);
36
34
 
37
35
  const stableDataIDs = Array.from(dataIDs).sort().join('');
38
36
  useEffect(() => {
@@ -6,10 +6,9 @@
6
6
  *
7
7
  * @flow
8
8
  * @format
9
+ * @oncall relay
9
10
  */
10
11
 
11
- // flowlint ambiguous-object-type:error
12
-
13
12
  'use strict';
14
13
 
15
14
  import type {
@@ -47,7 +46,6 @@ function useSubscription<TVariables, TData, TRawResponse>(
47
46
  useEffect(() => {
48
47
  // $FlowFixMe[method-unbinding] added when improving typing for this parameters
49
48
  const {dispose} = actualRequestSubscription(environment, config);
50
- // $FlowFixMe[incompatible-call]
51
49
  return dispose;
52
50
  }, [environment, config, actualRequestSubscription]);
53
51
  }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @flow strict-local
8
+ * @format
9
+ * @oncall relay
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ const {useMemo} = require('react');
15
+
16
+ /**
17
+ * Like `useRef`, but does not warn when accessed during render. It's a bad
18
+ * pattern to read or write from a ref during render as it does not trigger
19
+ * a rerender and might result in bugs.
20
+ */
21
+ function useUnsafeRef_DEPRECATED<T>(init: T): {current: T} {
22
+ return useMemo<{current: T}>(() => ({current: init}), []);
23
+ }
24
+
25
+ module.exports = useUnsafeRef_DEPRECATED;
@@ -1,28 +0,0 @@
1
- /**
2
- * Copyright (c) Meta Platforms, Inc. and affiliates.
3
- *
4
- * This source code is licensed under the MIT license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- *
7
- *
8
- * @format
9
- */
10
- // flowlint ambiguous-object-type:error
11
- 'use strict';
12
-
13
- var React = require('react'); // $FlowFixMe[incompatible-use]
14
-
15
-
16
- var _React$__SECRET_INTER =
17
- /* $FlowFixMe[prop-missing] Flow doesn't know about React's internals for
18
- * good reason, but for now, Relay needs the dispatcher to read context. */
19
- React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
20
- ReactCurrentDispatcher = _React$__SECRET_INTER.ReactCurrentDispatcher,
21
- ReactCurrentOwner = _React$__SECRET_INTER.ReactCurrentOwner;
22
-
23
- function readContext(Context) {
24
- var dispatcher = ReactCurrentDispatcher != null ? ReactCurrentDispatcher.current : ReactCurrentOwner.currentDispatcher;
25
- return dispatcher.readContext(Context);
26
- }
27
-
28
- module.exports = readContext;
@@ -1,31 +0,0 @@
1
- /**
2
- * Copyright (c) Meta Platforms, Inc. and affiliates.
3
- *
4
- * This source code is licensed under the MIT license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- *
7
- * @flow strict-local
8
- * @format
9
- */
10
-
11
- // flowlint ambiguous-object-type:error
12
-
13
- 'use strict';
14
-
15
- const React = require('react');
16
-
17
- // $FlowFixMe[incompatible-use]
18
- const {ReactCurrentDispatcher, ReactCurrentOwner} =
19
- /* $FlowFixMe[prop-missing] Flow doesn't know about React's internals for
20
- * good reason, but for now, Relay needs the dispatcher to read context. */
21
- React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
22
-
23
- function readContext<T>(Context: React.Context<T>): T {
24
- const dispatcher =
25
- ReactCurrentDispatcher != null
26
- ? ReactCurrentDispatcher.current
27
- : ReactCurrentOwner.currentDispatcher;
28
- return dispatcher.readContext(Context);
29
- }
30
-
31
- module.exports = readContext;