react-relay 13.1.1 → 14.1.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 (178) hide show
  1. package/ReactRelayContainerUtils.js.flow +0 -2
  2. package/ReactRelayContext.js +1 -1
  3. package/ReactRelayContext.js.flow +0 -2
  4. package/ReactRelayFragmentContainer.js.flow +7 -6
  5. package/ReactRelayFragmentMockRenderer.js.flow +0 -2
  6. package/ReactRelayLocalQueryRenderer.js.flow +1 -3
  7. package/ReactRelayPaginationContainer.js.flow +13 -10
  8. package/ReactRelayQueryFetcher.js.flow +10 -11
  9. package/ReactRelayQueryRenderer.js.flow +15 -16
  10. package/ReactRelayQueryRendererContext.js.flow +1 -3
  11. package/ReactRelayRefetchContainer.js.flow +10 -7
  12. package/ReactRelayTestMocker.js.flow +0 -2
  13. package/ReactRelayTypes.js.flow +6 -8
  14. package/RelayContext.js.flow +0 -2
  15. package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +2 -4
  16. package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +3 -5
  17. package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +3 -5
  18. package/__flowtests__/RelayModern-flowtest.js.flow +2 -4
  19. package/__flowtests__/RelayModernFlowtest_badref.graphql.js.flow +2 -4
  20. package/__flowtests__/RelayModernFlowtest_notref.graphql.js.flow +2 -4
  21. package/__flowtests__/RelayModernFlowtest_user.graphql.js.flow +2 -4
  22. package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +2 -4
  23. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +2 -2
  24. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +2 -2
  25. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +3 -3
  26. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +3 -3
  27. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +3 -3
  28. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +3 -3
  29. package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +2 -2
  30. package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +2 -2
  31. package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +2 -2
  32. package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +2 -2
  33. package/assertFragmentMap.js.flow +0 -2
  34. package/buildReactRelayContainer.js.flow +2 -4
  35. package/getRootVariablesForFragments.js.flow +0 -2
  36. package/hooks.js +1 -1
  37. package/hooks.js.flow +0 -2
  38. package/index.js +1 -1
  39. package/index.js.flow +2 -2
  40. package/isRelayEnvironment.js.flow +0 -2
  41. package/jest-react/internalAct.js.flow +25 -9
  42. package/legacy.js +1 -1
  43. package/legacy.js.flow +0 -2
  44. package/lib/ReactRelayContainerUtils.js +0 -1
  45. package/lib/ReactRelayContext.js +0 -1
  46. package/lib/ReactRelayFragmentContainer.js +10 -9
  47. package/lib/ReactRelayFragmentMockRenderer.js +0 -1
  48. package/lib/ReactRelayLocalQueryRenderer.js +0 -1
  49. package/lib/ReactRelayPaginationContainer.js +14 -11
  50. package/lib/ReactRelayQueryFetcher.js +2 -2
  51. package/lib/ReactRelayQueryRenderer.js +2 -4
  52. package/lib/ReactRelayQueryRendererContext.js +0 -1
  53. package/lib/ReactRelayRefetchContainer.js +11 -14
  54. package/lib/ReactRelayTestMocker.js +1 -2
  55. package/lib/ReactRelayTypes.js +0 -1
  56. package/lib/RelayContext.js +0 -1
  57. package/lib/assertFragmentMap.js +0 -1
  58. package/lib/buildReactRelayContainer.js +1 -2
  59. package/lib/getRootVariablesForFragments.js +1 -2
  60. package/lib/hooks.js +0 -1
  61. package/lib/index.js +3 -1
  62. package/lib/isRelayEnvironment.js +0 -1
  63. package/lib/jest-react/internalAct.js +24 -4
  64. package/lib/legacy.js +0 -1
  65. package/lib/multi-actor/useRelayActorEnvironment.js +0 -1
  66. package/lib/readContext.js +2 -2
  67. package/lib/relay-hooks/EntryPointContainer.react.js +0 -1
  68. package/lib/relay-hooks/EntryPointTypes.flow.js +0 -1
  69. package/lib/relay-hooks/FragmentResource.js +68 -29
  70. package/lib/relay-hooks/HooksImplementation.js +29 -0
  71. package/lib/relay-hooks/InternalLogger.js +0 -1
  72. package/lib/relay-hooks/LRUCache.js +0 -1
  73. package/lib/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js +0 -1
  74. package/lib/relay-hooks/MatchContainer.js +2 -2
  75. package/lib/relay-hooks/ProfilerContext.js +0 -1
  76. package/lib/relay-hooks/QueryResource.js +5 -168
  77. package/lib/relay-hooks/RelayEnvironmentProvider.js +0 -1
  78. package/lib/relay-hooks/SuspenseResource.js +1 -2
  79. package/lib/relay-hooks/loadQuery.js +1 -1
  80. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +8 -13
  81. package/lib/relay-hooks/prepareEntryPoint_DEPRECATED.js +0 -1
  82. package/lib/relay-hooks/react-cache/RelayReactCache.js +36 -0
  83. package/lib/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js +344 -0
  84. package/lib/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js +239 -0
  85. package/lib/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js +598 -0
  86. package/lib/relay-hooks/react-cache/useFragment_REACT_CACHE.js +50 -0
  87. package/lib/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js +55 -0
  88. package/lib/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js +150 -0
  89. package/lib/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js +124 -0
  90. package/lib/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js +367 -0
  91. package/lib/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js +45 -0
  92. package/lib/relay-hooks/useBlockingPaginationFragment.js +4 -3
  93. package/lib/relay-hooks/useClientQuery.js +33 -0
  94. package/lib/relay-hooks/useEntryPointLoader.js +1 -2
  95. package/lib/relay-hooks/useFetchTrackingRef.js +0 -1
  96. package/lib/relay-hooks/useFragment.js +15 -2
  97. package/lib/relay-hooks/useFragmentNode.js +0 -1
  98. package/lib/relay-hooks/useIsMountedRef.js +0 -1
  99. package/lib/relay-hooks/useLazyLoadQuery.js +4 -2
  100. package/lib/relay-hooks/useLazyLoadQueryNode.js +0 -1
  101. package/lib/relay-hooks/useLoadMoreFunction.js +1 -2
  102. package/lib/relay-hooks/useMemoOperationDescriptor.js +0 -1
  103. package/lib/relay-hooks/useMemoVariables.js +0 -1
  104. package/lib/relay-hooks/useMutation.js +5 -7
  105. package/lib/relay-hooks/usePaginationFragment.js +15 -3
  106. package/lib/relay-hooks/usePreloadedQuery.js +4 -2
  107. package/lib/relay-hooks/useQueryLoader.js +1 -2
  108. package/lib/relay-hooks/useRefetchableFragment.js +14 -2
  109. package/lib/relay-hooks/useRefetchableFragmentNode.js +1 -2
  110. package/lib/relay-hooks/useRelayEnvironment.js +0 -1
  111. package/lib/relay-hooks/useStaticFragmentNodeWarning.js +0 -1
  112. package/lib/relay-hooks/useSubscribeToInvalidationState.js +0 -1
  113. package/lib/relay-hooks/useSubscription.js +0 -1
  114. package/multi-actor/useRelayActorEnvironment.js.flow +0 -2
  115. package/package.json +3 -3
  116. package/react-relay-hooks.js +2 -2
  117. package/react-relay-hooks.min.js +2 -2
  118. package/react-relay-legacy.js +2 -2
  119. package/react-relay-legacy.min.js +2 -2
  120. package/react-relay.js +2 -2
  121. package/react-relay.min.js +2 -2
  122. package/readContext.js.flow +1 -2
  123. package/relay-hooks/EntryPointContainer.react.js.flow +2 -4
  124. package/relay-hooks/EntryPointTypes.flow.js.flow +30 -32
  125. package/relay-hooks/FragmentResource.js.flow +80 -37
  126. package/relay-hooks/HooksImplementation.js.flow +43 -0
  127. package/relay-hooks/InternalLogger.js.flow +0 -2
  128. package/relay-hooks/LRUCache.js.flow +0 -2
  129. package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +4 -6
  130. package/relay-hooks/MatchContainer.js.flow +11 -6
  131. package/relay-hooks/ProfilerContext.js.flow +0 -2
  132. package/relay-hooks/QueryResource.js.flow +12 -209
  133. package/relay-hooks/RelayEnvironmentProvider.js.flow +2 -4
  134. package/relay-hooks/SuspenseResource.js.flow +0 -2
  135. package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +3 -3
  136. package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +2 -2
  137. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +2 -2
  138. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +2 -2
  139. package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +4 -6
  140. package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +0 -2
  141. package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +4 -6
  142. package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +0 -2
  143. package/relay-hooks/__flowtests__/utils.js.flow +8 -10
  144. package/relay-hooks/loadQuery.js.flow +2 -1
  145. package/relay-hooks/preloadQuery_DEPRECATED.js.flow +11 -20
  146. package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +0 -2
  147. package/relay-hooks/react-cache/RelayReactCache.js.flow +40 -0
  148. package/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js.flow +430 -0
  149. package/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js.flow +297 -0
  150. package/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js.flow +599 -0
  151. package/relay-hooks/react-cache/useFragment_REACT_CACHE.js.flow +72 -0
  152. package/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js.flow +70 -0
  153. package/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js.flow +171 -0
  154. package/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js.flow +151 -0
  155. package/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js.flow +595 -0
  156. package/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js.flow +65 -0
  157. package/relay-hooks/useBlockingPaginationFragment.js.flow +4 -6
  158. package/relay-hooks/useClientQuery.js.flow +39 -0
  159. package/relay-hooks/useEntryPointLoader.js.flow +6 -8
  160. package/relay-hooks/useFetchTrackingRef.js.flow +2 -4
  161. package/relay-hooks/useFragment.js.flow +17 -12
  162. package/relay-hooks/useFragmentNode.js.flow +2 -4
  163. package/relay-hooks/useIsMountedRef.js.flow +1 -3
  164. package/relay-hooks/useLazyLoadQuery.js.flow +17 -5
  165. package/relay-hooks/useLazyLoadQueryNode.js.flow +2 -4
  166. package/relay-hooks/useLoadMoreFunction.js.flow +6 -8
  167. package/relay-hooks/useMemoOperationDescriptor.js.flow +0 -2
  168. package/relay-hooks/useMemoVariables.js.flow +0 -2
  169. package/relay-hooks/useMutation.js.flow +5 -7
  170. package/relay-hooks/usePaginationFragment.js.flow +44 -19
  171. package/relay-hooks/usePreloadedQuery.js.flow +14 -5
  172. package/relay-hooks/useQueryLoader.js.flow +4 -6
  173. package/relay-hooks/useRefetchableFragment.js.flow +32 -3
  174. package/relay-hooks/useRefetchableFragmentNode.js.flow +38 -25
  175. package/relay-hooks/useRelayEnvironment.js.flow +0 -2
  176. package/relay-hooks/useStaticFragmentNodeWarning.js.flow +0 -2
  177. package/relay-hooks/useSubscribeToInvalidationState.js.flow +0 -2
  178. package/relay-hooks/useSubscription.js.flow +14 -10
@@ -9,8 +9,6 @@
9
9
  * @format
10
10
  */
11
11
 
12
- // flowlint ambiguous-object-type:error
13
-
14
12
  'use strict';
15
13
 
16
14
  import type {Cache} from './LRUCache';
@@ -32,7 +30,7 @@ import type {
32
30
  const LRUCache = require('./LRUCache');
33
31
  const SuspenseResource = require('./SuspenseResource');
34
32
  const invariant = require('invariant');
35
- const {RelayFeatureFlags, isPromise} = require('relay-runtime');
33
+ const {isPromise} = require('relay-runtime');
36
34
  const warning = require('warning');
37
35
 
38
36
  const CACHE_CAPACITY = 1000;
@@ -41,7 +39,7 @@ const DEFAULT_FETCH_POLICY = 'store-or-network';
41
39
  export type QueryResource = QueryResourceImpl;
42
40
 
43
41
  type QueryResourceCache = Cache<QueryResourceCacheEntry>;
44
- type QueryResourceCacheEntry = {|
42
+ type QueryResourceCacheEntry = {
45
43
  +id: number,
46
44
  +cacheIdentifier: string,
47
45
  +operationAvailability: ?OperationAvailability,
@@ -50,25 +48,23 @@ type QueryResourceCacheEntry = {|
50
48
  // from the incremental responses, so later we can choose how to handle errors
51
49
  // in the incremental payloads.
52
50
  processedPayloadsCount: number,
53
- getRetainCount(): number,
54
- getNetworkSubscription(): ?Subscription,
55
51
  setNetworkSubscription(?Subscription): void,
56
52
  getValue(): Error | Promise<void> | QueryResult,
57
53
  setValue(Error | Promise<void> | QueryResult): void,
58
54
  temporaryRetain(environment: IEnvironment): Disposable,
59
55
  permanentRetain(environment: IEnvironment): Disposable,
60
56
  releaseTemporaryRetain(): void,
61
- |};
57
+ };
62
58
  export opaque type QueryResult: {
63
59
  fragmentNode: ReaderFragment,
64
60
  fragmentRef: mixed,
65
61
  ...
66
- } = {|
62
+ } = {
67
63
  cacheIdentifier: string,
68
64
  fragmentNode: ReaderFragment,
69
65
  fragmentRef: mixed,
70
66
  operation: OperationDescriptor,
71
- |};
67
+ };
72
68
 
73
69
  const WEAKMAP_SUPPORTED = typeof WeakMap === 'function';
74
70
  interface IMap<K, V> {
@@ -125,39 +121,6 @@ function createCacheEntry(
125
121
  value: Error | Promise<void> | QueryResult,
126
122
  networkSubscription: ?Subscription,
127
123
  onDispose: QueryResourceCacheEntry => void,
128
- ): QueryResourceCacheEntry {
129
- // There should be no behavior difference between createCacheEntry_new and
130
- // createCacheEntry_old, and it doesn't directly relate to Client Edges.
131
- // It was just a refactoring that was needed for Client Edges but that
132
- // is behind the feature flag just in case there is any accidental breakage.
133
- if (RelayFeatureFlags.REFACTOR_SUSPENSE_RESOURCE) {
134
- return createCacheEntry_new(
135
- cacheIdentifier,
136
- operation,
137
- operationAvailability,
138
- value,
139
- networkSubscription,
140
- onDispose,
141
- );
142
- } else {
143
- return createCacheEntry_old(
144
- cacheIdentifier,
145
- operation,
146
- operationAvailability,
147
- value,
148
- networkSubscription,
149
- onDispose,
150
- );
151
- }
152
- }
153
-
154
- function createCacheEntry_new(
155
- cacheIdentifier: string,
156
- operation: OperationDescriptor,
157
- operationAvailability: ?OperationAvailability,
158
- value: Error | Promise<void> | QueryResult,
159
- networkSubscription: ?Subscription,
160
- onDispose: QueryResourceCacheEntry => void,
161
124
  ): QueryResourceCacheEntry {
162
125
  const isLiveQuery = operationIsLiveQuery(operation);
163
126
 
@@ -191,12 +154,6 @@ function createCacheEntry_new(
191
154
  setValue(val: QueryResult | Promise<void> | Error) {
192
155
  currentValue = val;
193
156
  },
194
- getRetainCount() {
195
- return suspenseResource.getRetainCount();
196
- },
197
- getNetworkSubscription() {
198
- return currentNetworkSubscription;
199
- },
200
157
  setNetworkSubscription(subscription: ?Subscription) {
201
158
  if (isLiveQuery && currentNetworkSubscription != null) {
202
159
  currentNetworkSubscription.unsubscribe();
@@ -217,153 +174,6 @@ function createCacheEntry_new(
217
174
  return cacheEntry;
218
175
  }
219
176
 
220
- const DATA_RETENTION_TIMEOUT = 5 * 60 * 1000;
221
- function createCacheEntry_old(
222
- cacheIdentifier: string,
223
- operation: OperationDescriptor,
224
- operationAvailability: ?OperationAvailability,
225
- value: Error | Promise<void> | QueryResult,
226
- networkSubscription: ?Subscription,
227
- onDispose: QueryResourceCacheEntry => void,
228
- ): QueryResourceCacheEntry {
229
- const isLiveQuery = operationIsLiveQuery(operation);
230
-
231
- let currentValue: Error | Promise<void> | QueryResult = value;
232
- let retainCount = 0;
233
- let retainDisposable: ?Disposable = null;
234
- let releaseTemporaryRetain: ?() => void = null;
235
- let currentNetworkSubscription: ?Subscription = networkSubscription;
236
-
237
- const retain = (environment: IEnvironment) => {
238
- retainCount++;
239
- if (retainCount === 1) {
240
- retainDisposable = environment.retain(operation);
241
- }
242
- return {
243
- dispose: () => {
244
- retainCount = Math.max(0, retainCount - 1);
245
- if (retainCount === 0) {
246
- invariant(
247
- retainDisposable != null,
248
- 'Relay: Expected disposable to release query to be defined.' +
249
- "If you're seeing this, this is likely a bug in Relay.",
250
- );
251
- retainDisposable.dispose();
252
- retainDisposable = null;
253
- }
254
- onDispose(cacheEntry);
255
- },
256
- };
257
- };
258
-
259
- const cacheEntry = {
260
- cacheIdentifier,
261
- id: nextID++,
262
- processedPayloadsCount: 0,
263
- operationAvailability,
264
- getValue() {
265
- return currentValue;
266
- },
267
- setValue(val: QueryResult | Promise<void> | Error) {
268
- currentValue = val;
269
- },
270
- getRetainCount() {
271
- return retainCount;
272
- },
273
- getNetworkSubscription() {
274
- return currentNetworkSubscription;
275
- },
276
- setNetworkSubscription(subscription: ?Subscription) {
277
- if (isLiveQuery && currentNetworkSubscription != null) {
278
- currentNetworkSubscription.unsubscribe();
279
- }
280
- currentNetworkSubscription = subscription;
281
- },
282
- temporaryRetain(environment: IEnvironment): Disposable {
283
- // NOTE: If we're executing in a server environment, there's no need
284
- // to create temporary retains, since the component will never commit.
285
- if (environment.isServer()) {
286
- return {dispose: () => {}};
287
- }
288
-
289
- // NOTE: temporaryRetain is called during the render phase. However,
290
- // given that we can't tell if this render will eventually commit or not,
291
- // we create a timer to autodispose of this retain in case the associated
292
- // component never commits.
293
- // If the component /does/ commit, permanentRetain will clear this timeout
294
- // and permanently retain the data.
295
- const disposable = retain(environment);
296
- let releaseQueryTimeout = null;
297
- const localReleaseTemporaryRetain = () => {
298
- clearTimeout(releaseQueryTimeout);
299
- releaseQueryTimeout = null;
300
- releaseTemporaryRetain = null;
301
- disposable.dispose();
302
- // Normally if this entry never commits, the request would've ended by the
303
- // time this timeout expires and the temporary retain is released. However,
304
- // we need to do this for live queries which remain open indefinitely.
305
- if (
306
- isLiveQuery &&
307
- retainCount <= 0 &&
308
- currentNetworkSubscription != null
309
- ) {
310
- currentNetworkSubscription.unsubscribe();
311
- }
312
- };
313
- releaseQueryTimeout = setTimeout(
314
- localReleaseTemporaryRetain,
315
- DATA_RETENTION_TIMEOUT,
316
- );
317
-
318
- // NOTE: Since temporaryRetain can be called multiple times, we release
319
- // the previous temporary retain after we re-establish a new one, since
320
- // we only ever need a single temporary retain until the permanent retain is
321
- // established.
322
- // temporaryRetain may be called multiple times by React during the render
323
- // phase, as well as multiple times by other query components that are
324
- // rendering the same query/variables.
325
- if (releaseTemporaryRetain != null) {
326
- releaseTemporaryRetain();
327
- }
328
- releaseTemporaryRetain = localReleaseTemporaryRetain;
329
-
330
- return {
331
- dispose: () => {
332
- releaseTemporaryRetain && releaseTemporaryRetain();
333
- },
334
- };
335
- },
336
- permanentRetain(environment: IEnvironment): Disposable {
337
- const disposable = retain(environment);
338
- if (releaseTemporaryRetain != null) {
339
- releaseTemporaryRetain();
340
- releaseTemporaryRetain = null;
341
- }
342
-
343
- return {
344
- dispose: () => {
345
- disposable.dispose();
346
- if (
347
- isLiveQuery &&
348
- retainCount <= 0 &&
349
- currentNetworkSubscription != null
350
- ) {
351
- currentNetworkSubscription.unsubscribe();
352
- }
353
- },
354
- };
355
- },
356
- releaseTemporaryRetain() {
357
- if (releaseTemporaryRetain != null) {
358
- releaseTemporaryRetain();
359
- releaseTemporaryRetain = null;
360
- }
361
- },
362
- };
363
-
364
- return cacheEntry;
365
- }
366
-
367
177
  class QueryResourceImpl {
368
178
  _environment: IEnvironment;
369
179
  _cache: QueryResourceCache;
@@ -532,15 +342,7 @@ class QueryResourceImpl {
532
342
  }
533
343
 
534
344
  _clearCacheEntry = (cacheEntry: QueryResourceCacheEntry): void => {
535
- // The new code does this retainCount <= 0 check within SuspenseResource
536
- // before calling _clearCacheEntry, whereas with the old code we do it here.
537
- if (RelayFeatureFlags.REFACTOR_SUSPENSE_RESOURCE) {
538
- this._cache.delete(cacheEntry.cacheIdentifier);
539
- } else {
540
- if (cacheEntry.getRetainCount() <= 0) {
541
- this._cache.delete(cacheEntry.cacheIdentifier);
542
- }
543
- }
345
+ this._cache.delete(cacheEntry.cacheIdentifier);
544
346
  };
545
347
 
546
348
  _getOrCreateCacheEntry(
@@ -588,7 +390,9 @@ class QueryResourceImpl {
588
390
 
589
391
  let shouldFetch;
590
392
  let shouldAllowRender;
591
- let resolveNetworkPromise = () => {};
393
+ // Different definitions for Promise in our repos can cause this variable
394
+ // to cause errors when synced elsewhere
395
+ let resolveNetworkPromise: $FlowFixMe = () => {};
592
396
  switch (fetchPolicy) {
593
397
  case 'store-only': {
594
398
  shouldFetch = false;
@@ -632,7 +436,7 @@ class QueryResourceImpl {
632
436
 
633
437
  if (shouldFetch) {
634
438
  const queryResult = getQueryResult(operation, cacheIdentifier);
635
- let networkSubscription;
439
+ let networkSubscription: ?Subscription;
636
440
  fetchObservable.subscribe({
637
441
  start: subscription => {
638
442
  networkSubscription = subscription;
@@ -693,10 +497,9 @@ class QueryResourceImpl {
693
497
  // To complete this task we need to have a way of precisely tracking suspendable points
694
498
  warning(
695
499
  false,
696
- 'QueryResource: An incremental payload for query `%` returned an error: `%`:`%`.',
500
+ 'QueryResource: An incremental payload for query `%s` returned an error: `%s`.',
697
501
  operation.fragment.node.name,
698
- error.message,
699
- error.stack,
502
+ String(error.message),
700
503
  );
701
504
  }
702
505
  resolveNetworkPromise();
@@ -9,8 +9,6 @@
9
9
  * @format
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';
@@ -24,13 +22,13 @@ const ReactRelayContext = require('react-relay/ReactRelayContext');
24
22
 
25
23
  const {useMemo} = React;
26
24
 
27
- type Props = $ReadOnly<{|
25
+ type Props = $ReadOnly<{
28
26
  children: React.Node,
29
27
  environment: IEnvironment,
30
28
  getEnvironmentForActor?: ?(
31
29
  actorIdentifier: ActorIdentifier,
32
30
  ) => IActorEnvironment,
33
- |}>;
31
+ }>;
34
32
 
35
33
  function RelayEnvironmentProvider(props: Props): React.Node {
36
34
  const {children, environment, getEnvironmentForActor} = props;
@@ -9,8 +9,6 @@
9
9
  * @format
10
10
  */
11
11
 
12
- // flowlint ambiguous-object-type:error
13
-
14
12
  'use strict';
15
13
 
16
14
  import type {Disposable, IEnvironment} from 'relay-runtime';
@@ -17,15 +17,15 @@ import type {
17
17
  EntryPointProps,
18
18
  } from '../../EntryPointTypes.flow';
19
19
 
20
- type MyComponentOtherProps = $ReadOnly<{|
20
+ type MyComponentOtherProps = $ReadOnly<{
21
21
  foo: string,
22
- |}>;
22
+ }>;
23
23
 
24
24
  type MyComponentProps = EntryPointProps<{}, {}, MyComponentOtherProps, {}>;
25
25
 
26
26
  const MyComponent = (_props: MyComponentProps) => null;
27
27
 
28
- type PreloadParams = $ReadOnly<{||}>;
28
+ type PreloadParams = $ReadOnly<{}>;
29
29
 
30
30
  type MyComponentEntryPointType = EntryPoint<PreloadParams, typeof MyComponent>;
31
31
 
@@ -27,9 +27,9 @@ type NestedEntrypointComponentProps = EntryPointProps<{}>;
27
27
  const NestedEntrypointComponent = (_props: NestedEntrypointComponentProps) =>
28
28
  null;
29
29
 
30
- type NestedEntrypointPreloadParams = $ReadOnly<{|
30
+ type NestedEntrypointPreloadParams = $ReadOnly<{
31
31
  subEntrypointPreloadParam: string,
32
- |}>;
32
+ }>;
33
33
 
34
34
  type NestedEntryPointType = EntryPoint<
35
35
  NestedEntrypointPreloadParams,
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * Copyright (c) Meta Platforms, Inc. and affiliates.
3
- *
3
+ *
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<<6bdf42be355b40305d9006059aa56d70>>
7
+ * @generated SignedSource<<8a8e68a3fde4da3f77546ac4952f2635>>
8
8
  * @flow
9
9
  * @lightSyntaxTransform
10
10
  * @nogrep
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * Copyright (c) Meta Platforms, Inc. and affiliates.
3
- *
3
+ *
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<<22f34b875909574b411e656fc3e592db>>
7
+ * @generated SignedSource<<0b4a6e76a104111de9ddd4dd9abe667c>>
8
8
  * @flow
9
9
  * @lightSyntaxTransform
10
10
  * @nogrep
@@ -9,8 +9,6 @@
9
9
  * @format
10
10
  */
11
11
 
12
- // flowlint ambiguous-object-type:error
13
-
14
12
  import type {LoadMoreFn} from '../useLoadMoreFunction';
15
13
  import type {
16
14
  FetchFn,
@@ -36,14 +34,14 @@ type ExpectedReturnType<
36
34
  TQuery: OperationType,
37
35
  TQueryVariables,
38
36
  TFragmentData,
39
- > = {|
37
+ > = {
40
38
  data: TFragmentData,
41
39
  loadNext: LoadMoreFn<TQuery>,
42
40
  loadPrevious: LoadMoreFn<TQuery>,
43
41
  hasNext: boolean,
44
42
  hasPrevious: boolean,
45
43
  refetch: FetchFn<TQueryVariables>,
46
- |};
44
+ };
47
45
 
48
46
  /* eslint-disable react-hooks/rules-of-hooks */
49
47
 
@@ -103,8 +101,8 @@ refetch(variables, {
103
101
  });
104
102
 
105
103
  // LoadMore options
106
- declare var extraVariables: {|nickname: string|};
107
- declare var invalidVariables: {|foo: string|};
104
+ declare var extraVariables: {nickname: string};
105
+ declare var invalidVariables: {foo: string};
108
106
 
109
107
  const {loadNext} = useBlockingPaginationFragment<QueryOperation, _>(
110
108
  fragmentInput,
@@ -9,8 +9,6 @@
9
9
  * @format
10
10
  */
11
11
 
12
- // flowlint ambiguous-object-type:error
13
-
14
12
  import type {
15
13
  useFragmentFlowtest_user$data,
16
14
  useFragmentFlowtest_user$key,
@@ -9,8 +9,6 @@
9
9
  * @format
10
10
  */
11
11
 
12
- // flowlint ambiguous-object-type:error
13
-
14
12
  import type {LoadMoreFn} from '../useLoadMoreFunction';
15
13
  import type {
16
14
  FetchFn,
@@ -36,7 +34,7 @@ type ExpectedReturnType<
36
34
  TQuery: OperationType,
37
35
  TQueryVariables,
38
36
  TFragmentData,
39
- > = {|
37
+ > = {
40
38
  data: TFragmentData,
41
39
  loadNext: LoadMoreFn<TQuery>,
42
40
  loadPrevious: LoadMoreFn<TQuery>,
@@ -45,7 +43,7 @@ type ExpectedReturnType<
45
43
  isLoadingNext: boolean,
46
44
  isLoadingPrevious: boolean,
47
45
  refetch: FetchFn<TQueryVariables>,
48
- |};
46
+ };
49
47
 
50
48
  /* eslint-disable react-hooks/rules-of-hooks */
51
49
 
@@ -105,8 +103,8 @@ refetch(variables, {
105
103
  });
106
104
 
107
105
  // LoadMore options
108
- declare var extraVariables: {|nickname: string|};
109
- declare var invalidVariables: {|foo: string|};
106
+ declare var extraVariables: {nickname: string};
107
+ declare var invalidVariables: {foo: string};
110
108
 
111
109
  const {loadNext} = usePaginationFragment<QueryOperation, _>(
112
110
  fragmentInput,
@@ -9,8 +9,6 @@
9
9
  * @format
10
10
  */
11
11
 
12
- // flowlint ambiguous-object-type:error
13
-
14
12
  import type {
15
13
  FetchFn,
16
14
  NonNullableData,
@@ -9,8 +9,6 @@
9
9
  * @format
10
10
  */
11
11
 
12
- // flowlint ambiguous-object-type:error
13
-
14
12
  'use strict';
15
13
 
16
14
  import type {Disposable, Fragment, FragmentType} from 'relay-runtime';
@@ -28,18 +26,18 @@ export type Example_user$key = {
28
26
  ...
29
27
  };
30
28
 
31
- export type NonNullableData = {|
29
+ export type NonNullableData = {
32
30
  +id: string,
33
31
  +count: number,
34
- |};
32
+ };
35
33
  export type NullableData = ?NonNullableData;
36
34
  export type NonNullablePluralData = $ReadOnlyArray<NonNullableData>;
37
35
  export type NullablePluralData = ?$ReadOnlyArray<NonNullableData>;
38
36
 
39
- export type AnotherNonNullableData = {|
37
+ export type AnotherNonNullableData = {
40
38
  +name: ?string,
41
39
  +friends: ?number,
42
- |};
40
+ };
43
41
 
44
42
  declare export var keyNonNullable: Example_user$key;
45
43
 
@@ -66,16 +64,16 @@ declare export var fragmentData: {
66
64
  ...
67
65
  };
68
66
 
69
- export type QueryOperation = {|
67
+ export type QueryOperation = {
70
68
  +variables: QueryVariables,
71
69
  +response: {...},
72
- |};
70
+ };
73
71
 
74
- export type QueryVariables = {|
72
+ export type QueryVariables = {
75
73
  id: string,
76
74
  nickname: ?string,
77
75
  name: string,
78
- |};
76
+ };
79
77
 
80
78
  export type QueryVariablesSubset = {
81
79
  id: string,
@@ -17,6 +17,7 @@ import type {
17
17
  PreloadedQueryInner,
18
18
  } from './EntryPointTypes.flow';
19
19
  import type {
20
+ ConcreteRequest,
20
21
  GraphQLResponse,
21
22
  GraphQLTaggedNode,
22
23
  IEnvironment,
@@ -236,7 +237,7 @@ function loadQuery<TQuery: OperationType, TEnvironmentProviderOptions>(
236
237
  }));
237
238
  };
238
239
 
239
- const checkAvailabilityAndExecute = concreteRequest => {
240
+ const checkAvailabilityAndExecute = (concreteRequest: ConcreteRequest) => {
240
241
  const operation = createOperationDescriptor(
241
242
  concreteRequest,
242
243
  variables,
@@ -9,8 +9,6 @@
9
9
  * @format
10
10
  */
11
11
 
12
- // flowlint ambiguous-object-type:error
13
-
14
12
  'use strict';
15
13
 
16
14
  import type {
@@ -51,7 +49,7 @@ const pendingQueriesByEnvironment = WEAKMAP_SUPPORTED
51
49
  : new Map();
52
50
 
53
51
  type PendingQueryEntry =
54
- | $ReadOnly<{|
52
+ | $ReadOnly<{
55
53
  cacheKey: string,
56
54
  fetchKey: ?string | ?number,
57
55
  fetchPolicy: PreloadFetchPolicy,
@@ -61,8 +59,8 @@ type PendingQueryEntry =
61
59
  status: PreloadQueryStatus,
62
60
  subject: ReplaySubject<GraphQLResponse>,
63
61
  subscription: Subscription,
64
- |}>
65
- | $ReadOnly<{|
62
+ }>
63
+ | $ReadOnly<{
66
64
  cacheKey: string,
67
65
  fetchKey: ?string | ?number,
68
66
  fetchPolicy: PreloadFetchPolicy,
@@ -70,7 +68,7 @@ type PendingQueryEntry =
70
68
  id: ?string,
71
69
  name: string,
72
70
  status: PreloadQueryStatus,
73
- |}>;
71
+ }>;
74
72
 
75
73
  function preloadQuery<TQuery: OperationType, TEnvironmentProviderOptions>(
76
74
  environment: IEnvironment,
@@ -115,20 +113,13 @@ function preloadQuery<TQuery: OperationType, TEnvironmentProviderOptions>(
115
113
  if (environment.isServer()) {
116
114
  return;
117
115
  }
118
- if (
119
- RelayFeatureFlags.DELAY_CLEANUP_OF_PENDING_PRELOAD_QUERIES ===
120
- true
121
- ) {
122
- setTimeout(() => {
123
- // Clear the cache entry after the default timeout
124
- // null-check for Flow
125
- if (queryEntry != null) {
126
- cleanup(pendingQueries, queryEntry);
127
- }
128
- }, DEFAULT_PREFETCH_TIMEOUT);
129
- } else {
130
- cleanup(pendingQueries, queryEntry);
131
- }
116
+ setTimeout(() => {
117
+ // Clear the cache entry after the default timeout
118
+ // null-check for Flow
119
+ if (queryEntry != null) {
120
+ cleanup(pendingQueries, queryEntry);
121
+ }
122
+ }, DEFAULT_PREFETCH_TIMEOUT);
132
123
  };
133
124
  })
134
125
  : null;
@@ -9,8 +9,6 @@
9
9
  * @format
10
10
  */
11
11
 
12
- // flowlint ambiguous-object-type:error
13
-
14
12
  'use strict';
15
13
 
16
14
  import type {
@@ -0,0 +1,40 @@
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
+ * @emails oncall+relay
9
+ * @format
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ const invariant = require('invariant');
15
+ // $FlowFixMe[prop-missing] These exist in experimental builds but aren't in React's types yet.
16
+ const {unstable_getCacheForType, unstable_getCacheSignal} = require('react');
17
+ const {RelayFeatureFlags} = require('relay-runtime');
18
+
19
+ function getCacheForType<T>(factory: () => T): T {
20
+ invariant(
21
+ typeof unstable_getCacheForType === 'function' &&
22
+ RelayFeatureFlags.USE_REACT_CACHE,
23
+ 'RelayReactCache.getCacheForType should only be called when the USE_REACT_CACHE feature flag is enabled and when on an experimental React build that supports it.',
24
+ );
25
+ return unstable_getCacheForType(factory);
26
+ }
27
+
28
+ function getCacheSignal(): AbortSignal {
29
+ invariant(
30
+ typeof unstable_getCacheSignal === 'function' &&
31
+ RelayFeatureFlags.USE_REACT_CACHE,
32
+ 'RelayReactCache.getCacheSignal should only be called when the USE_REACT_CACHE feature flag is enabled and when on an experimental React build that supports it.',
33
+ );
34
+ return unstable_getCacheSignal();
35
+ }
36
+
37
+ module.exports = {
38
+ getCacheForType,
39
+ getCacheSignal,
40
+ };