react-relay 14.0.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 -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;