react-relay 13.1.1 → 13.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. package/ReactRelayContext.js +1 -1
  2. package/ReactRelayLocalQueryRenderer.js.flow +1 -1
  3. package/ReactRelayQueryRenderer.js.flow +1 -4
  4. package/hooks.js +1 -1
  5. package/index.js +1 -1
  6. package/jest-react/internalAct.js.flow +25 -9
  7. package/legacy.js +1 -1
  8. package/lib/ReactRelayQueryRenderer.js +1 -1
  9. package/lib/jest-react/internalAct.js +24 -4
  10. package/lib/relay-hooks/FragmentResource.js +10 -13
  11. package/lib/relay-hooks/QueryResource.js +2 -165
  12. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +7 -11
  13. package/lib/relay-hooks/react-cache/RelayReactCache.js +37 -0
  14. package/lib/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js +197 -0
  15. package/lib/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js +395 -0
  16. package/lib/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js +45 -0
  17. package/package.json +3 -3
  18. package/react-relay-hooks.js +2 -2
  19. package/react-relay-hooks.min.js +2 -2
  20. package/react-relay-legacy.js +2 -2
  21. package/react-relay-legacy.min.js +2 -2
  22. package/react-relay.js +2 -2
  23. package/react-relay.min.js +2 -2
  24. package/relay-hooks/FragmentResource.js.flow +17 -18
  25. package/relay-hooks/QueryResource.js.flow +4 -201
  26. package/relay-hooks/preloadQuery_DEPRECATED.js.flow +7 -14
  27. package/relay-hooks/react-cache/RelayReactCache.js.flow +42 -0
  28. package/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js.flow +243 -0
  29. package/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js.flow +416 -0
  30. package/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js.flow +66 -0
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v13.1.1
2
+ * Relay v13.2.0
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
@@ -40,7 +40,7 @@ const queryRendererContext: ReactRelayQueryRendererContextType = {
40
40
  rootIsQueryRenderer: true,
41
41
  };
42
42
 
43
- function useDeepCompare<T: interface {}>(value: T): T {
43
+ function useDeepCompare<T: {...}>(value: T): T {
44
44
  const latestValue = React.useRef(value);
45
45
  if (!areEqual(latestValue.current, value)) {
46
46
  if (__DEV__) {
@@ -157,10 +157,7 @@ class ReactRelayQueryRenderer extends React.Component<Props, State> {
157
157
  }
158
158
 
159
159
  componentDidMount() {
160
- if (
161
- RelayFeatureFlags.ENABLE_QUERY_RENDERER_OFFSCREEN_SUPPORT === true &&
162
- this._maybeHiddenOrFastRefresh === true
163
- ) {
160
+ if (this._maybeHiddenOrFastRefresh === true) {
164
161
  // This block only runs if the component has previously "unmounted"
165
162
  // due to it being hidden by the Offscreen API, or during fast refresh.
166
163
  // At this point, the current cached resource will have been disposed
package/hooks.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v13.1.1
2
+ * Relay v13.2.0
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v13.1.1
2
+ * Relay v13.2.0
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
@@ -36,7 +36,7 @@ interface Thenable<+R> {
36
36
 
37
37
  let actingUpdatesScopeDepth = 0;
38
38
 
39
- function act(scope: () => Thenable<mixed> | void) {
39
+ function act<T>(scope: () => Thenable<T> | T): Thenable<T> {
40
40
  if (Scheduler.unstable_flushAllWithoutAsserting === undefined) {
41
41
  throw Error(
42
42
  'This version of `act` requires a special mock build of Scheduler.',
@@ -49,10 +49,19 @@ function act(scope: () => Thenable<mixed> | void) {
49
49
  );
50
50
  }
51
51
 
52
+ const previousIsActEnvironment = global.IS_REACT_ACT_ENVIRONMENT;
52
53
  const previousActingUpdatesScopeDepth = actingUpdatesScopeDepth;
53
54
  actingUpdatesScopeDepth++;
55
+ if (__DEV__ && actingUpdatesScopeDepth === 1) {
56
+ // Because this is not the "real" `act`, we set this to `false` so React
57
+ // knows not to fire `act` warnings.
58
+ global.IS_REACT_ACT_ENVIRONMENT = false;
59
+ }
54
60
 
55
61
  const unwind = () => {
62
+ if (__DEV__ && actingUpdatesScopeDepth === 1) {
63
+ global.IS_REACT_ACT_ENVIRONMENT = previousIsActEnvironment;
64
+ }
56
65
  actingUpdatesScopeDepth--;
57
66
 
58
67
  if (__DEV__) {
@@ -71,20 +80,21 @@ function act(scope: () => Thenable<mixed> | void) {
71
80
  // returned and 2) we could use async/await. Since it's only our used in
72
81
  // our test suite, we should be able to.
73
82
  try {
74
- const thenable = scope();
83
+ const result = scope();
75
84
  if (
76
- typeof thenable === 'object' &&
77
- thenable !== null &&
78
- typeof thenable.then === 'function'
85
+ typeof result === 'object' &&
86
+ result !== null &&
87
+ typeof result.then === 'function'
79
88
  ) {
89
+ const thenableResult: Thenable<T> = (result: any);
80
90
  return {
81
- then(resolve: () => void, reject: (error: mixed) => void) {
82
- thenable.then(
83
- () => {
91
+ then(resolve, reject) {
92
+ thenableResult.then(
93
+ returnValue => {
84
94
  flushActWork(
85
95
  () => {
86
96
  unwind();
87
- resolve();
97
+ resolve(returnValue);
88
98
  },
89
99
  error => {
90
100
  unwind();
@@ -100,6 +110,7 @@ function act(scope: () => Thenable<mixed> | void) {
100
110
  },
101
111
  };
102
112
  } else {
113
+ const returnValue: T = (result: any);
103
114
  try {
104
115
  // TODO: Let's not support non-async scopes at all in our tests. Need to
105
116
  // migrate existing tests.
@@ -107,6 +118,11 @@ function act(scope: () => Thenable<mixed> | void) {
107
118
  do {
108
119
  didFlushWork = Scheduler.unstable_flushAllWithoutAsserting();
109
120
  } while (didFlushWork);
121
+ return {
122
+ then(resolve, reject) {
123
+ resolve(returnValue);
124
+ },
125
+ };
110
126
  } finally {
111
127
  unwind();
112
128
  }
package/legacy.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v13.1.1
2
+ * Relay v13.2.0
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
@@ -132,7 +132,7 @@ var ReactRelayQueryRenderer = /*#__PURE__*/function (_React$Component) {
132
132
  _proto.componentDidMount = function componentDidMount() {
133
133
  var _this2 = this;
134
134
 
135
- if (RelayFeatureFlags.ENABLE_QUERY_RENDERER_OFFSCREEN_SUPPORT === true && this._maybeHiddenOrFastRefresh === true) {
135
+ if (this._maybeHiddenOrFastRefresh === true) {
136
136
  // This block only runs if the component has previously "unmounted"
137
137
  // due to it being hidden by the Offscreen API, or during fast refresh.
138
138
  // At this point, the current cached resource will have been disposed
@@ -36,10 +36,21 @@ function act(scope) {
36
36
  throw Error("This version of `act` requires Jest's timer mocks " + '(i.e. jest.useFakeTimers).');
37
37
  }
38
38
 
39
+ var previousIsActEnvironment = global.IS_REACT_ACT_ENVIRONMENT;
39
40
  var previousActingUpdatesScopeDepth = actingUpdatesScopeDepth;
40
41
  actingUpdatesScopeDepth++;
41
42
 
43
+ if (process.env.NODE_ENV !== "production" && actingUpdatesScopeDepth === 1) {
44
+ // Because this is not the "real" `act`, we set this to `false` so React
45
+ // knows not to fire `act` warnings.
46
+ global.IS_REACT_ACT_ENVIRONMENT = false;
47
+ }
48
+
42
49
  var unwind = function unwind() {
50
+ if (process.env.NODE_ENV !== "production" && actingUpdatesScopeDepth === 1) {
51
+ global.IS_REACT_ACT_ENVIRONMENT = previousIsActEnvironment;
52
+ }
53
+
43
54
  actingUpdatesScopeDepth--;
44
55
 
45
56
  if (process.env.NODE_ENV !== "production") {
@@ -55,15 +66,16 @@ function act(scope) {
55
66
 
56
67
 
57
68
  try {
58
- var thenable = scope();
69
+ var result = scope();
59
70
 
60
- if (typeof thenable === 'object' && thenable !== null && typeof thenable.then === 'function') {
71
+ if (typeof result === 'object' && result !== null && typeof result.then === 'function') {
72
+ var thenableResult = result;
61
73
  return {
62
74
  then: function then(resolve, reject) {
63
- thenable.then(function () {
75
+ thenableResult.then(function (returnValue) {
64
76
  flushActWork(function () {
65
77
  unwind();
66
- resolve();
78
+ resolve(returnValue);
67
79
  }, function (error) {
68
80
  unwind();
69
81
  reject(error);
@@ -75,6 +87,8 @@ function act(scope) {
75
87
  }
76
88
  };
77
89
  } else {
90
+ var returnValue = result;
91
+
78
92
  try {
79
93
  // TODO: Let's not support non-async scopes at all in our tests. Need to
80
94
  // migrate existing tests.
@@ -83,6 +97,12 @@ function act(scope) {
83
97
  do {
84
98
  didFlushWork = Scheduler.unstable_flushAllWithoutAsserting();
85
99
  } while (didFlushWork);
100
+
101
+ return {
102
+ then: function then(resolve, reject) {
103
+ resolve(returnValue);
104
+ }
105
+ };
86
106
  } finally {
87
107
  unwind();
88
108
  }
@@ -38,9 +38,9 @@ var _require2 = require('relay-runtime'),
38
38
  getPendingOperationsForFragment = _require2.getPendingOperationsForFragment,
39
39
  getSelector = _require2.getSelector,
40
40
  getVariablesFromFragment = _require2.getVariablesFromFragment,
41
+ handlePotentialSnapshotErrors = _require2.handlePotentialSnapshotErrors,
41
42
  isPromise = _require2.isPromise,
42
- recycleNodesInto = _require2.recycleNodesInto,
43
- reportMissingRequiredFields = _require2.reportMissingRequiredFields;
43
+ recycleNodesInto = _require2.recycleNodesInto;
44
44
 
45
45
  var WEAKMAP_SUPPORTED = typeof WeakMap === 'function';
46
46
  // TODO: Fix to not rely on LRU. If the number of active fragments exceeds this
@@ -263,7 +263,7 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
263
263
  }
264
264
 
265
265
  if (cachedValue.kind === 'done' && cachedValue.result.snapshot) {
266
- this._reportMissingRequiredFieldsInSnapshot(cachedValue.result.snapshot);
266
+ this._handlePotentialSnapshotErrorsInSnapshot(cachedValue.result.snapshot);
267
267
 
268
268
  return cachedValue.result;
269
269
  }
@@ -279,7 +279,7 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
279
279
  var fragmentResult = getFragmentResult(fragmentIdentifier, snapshot, storeEpoch);
280
280
 
281
281
  if (!fragmentResult.isMissingData) {
282
- this._reportMissingRequiredFieldsInSnapshot(snapshot);
282
+ this._handlePotentialSnapshotErrorsInSnapshot(snapshot);
283
283
 
284
284
  this._cache.set(fragmentIdentifier, {
285
285
  kind: 'done',
@@ -361,7 +361,7 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
361
361
  throw ((_clientEdgePromises2 = clientEdgePromises) === null || _clientEdgePromises2 === void 0 ? void 0 : _clientEdgePromises2.length) ? Promise.all([parentQueryPromiseResultPromise].concat((0, _toConsumableArray2["default"])(clientEdgePromises))) : parentQueryPromiseResultPromise;
362
362
  }
363
363
 
364
- this._reportMissingRequiredFieldsInSnapshot(snapshot);
364
+ this._handlePotentialSnapshotErrorsInSnapshot(snapshot);
365
365
 
366
366
  return getFragmentResult(fragmentIdentifier, snapshot, storeEpoch);
367
367
  };
@@ -383,19 +383,15 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
383
383
  };
384
384
  };
385
385
 
386
- _proto2._reportMissingRequiredFieldsInSnapshot = function _reportMissingRequiredFieldsInSnapshot(snapshot) {
386
+ _proto2._handlePotentialSnapshotErrorsInSnapshot = function _handlePotentialSnapshotErrorsInSnapshot(snapshot) {
387
387
  var _this4 = this;
388
388
 
389
389
  if (Array.isArray(snapshot)) {
390
390
  snapshot.forEach(function (s) {
391
- if (s.missingRequiredFields != null) {
392
- reportMissingRequiredFields(_this4._environment, s.missingRequiredFields);
393
- }
391
+ handlePotentialSnapshotErrors(_this4._environment, s.missingRequiredFields, s.relayResolverErrors);
394
392
  });
395
393
  } else {
396
- if (snapshot.missingRequiredFields != null) {
397
- reportMissingRequiredFields(this._environment, snapshot.missingRequiredFields);
398
- }
394
+ handlePotentialSnapshotErrors(this._environment, snapshot.missingRequiredFields, snapshot.relayResolverErrors);
399
395
  }
400
396
  };
401
397
 
@@ -559,7 +555,8 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
559
555
  missingClientEdges: currentSnapshot.missingClientEdges,
560
556
  seenRecords: currentSnapshot.seenRecords,
561
557
  selector: currentSnapshot.selector,
562
- missingRequiredFields: currentSnapshot.missingRequiredFields
558
+ missingRequiredFields: currentSnapshot.missingRequiredFields,
559
+ relayResolverErrors: currentSnapshot.relayResolverErrors
563
560
  };
564
561
 
565
562
  if (updatedData !== renderData) {
@@ -24,7 +24,6 @@ var SuspenseResource = require('./SuspenseResource');
24
24
  var invariant = require('invariant');
25
25
 
26
26
  var _require = require('relay-runtime'),
27
- RelayFeatureFlags = _require.RelayFeatureFlags,
28
27
  isPromise = _require.isPromise;
29
28
 
30
29
  var warning = require("fbjs/lib/warning");
@@ -66,18 +65,6 @@ function getQueryResult(operation, cacheIdentifier) {
66
65
  var nextID = 200000;
67
66
 
68
67
  function createCacheEntry(cacheIdentifier, operation, operationAvailability, value, networkSubscription, onDispose) {
69
- // There should be no behavior difference between createCacheEntry_new and
70
- // createCacheEntry_old, and it doesn't directly relate to Client Edges.
71
- // It was just a refactoring that was needed for Client Edges but that
72
- // is behind the feature flag just in case there is any accidental breakage.
73
- if (RelayFeatureFlags.REFACTOR_SUSPENSE_RESOURCE) {
74
- return createCacheEntry_new(cacheIdentifier, operation, operationAvailability, value, networkSubscription, onDispose);
75
- } else {
76
- return createCacheEntry_old(cacheIdentifier, operation, operationAvailability, value, networkSubscription, onDispose);
77
- }
78
- }
79
-
80
- function createCacheEntry_new(cacheIdentifier, operation, operationAvailability, value, networkSubscription, onDispose) {
81
68
  var isLiveQuery = operationIsLiveQuery(operation);
82
69
  var currentValue = value;
83
70
  var currentNetworkSubscription = networkSubscription;
@@ -108,12 +95,6 @@ function createCacheEntry_new(cacheIdentifier, operation, operationAvailability,
108
95
  setValue: function setValue(val) {
109
96
  currentValue = val;
110
97
  },
111
- getRetainCount: function getRetainCount() {
112
- return suspenseResource.getRetainCount();
113
- },
114
- getNetworkSubscription: function getNetworkSubscription() {
115
- return currentNetworkSubscription;
116
- },
117
98
  setNetworkSubscription: function setNetworkSubscription(subscription) {
118
99
  if (isLiveQuery && currentNetworkSubscription != null) {
119
100
  currentNetworkSubscription.unsubscribe();
@@ -134,156 +115,12 @@ function createCacheEntry_new(cacheIdentifier, operation, operationAvailability,
134
115
  return cacheEntry;
135
116
  }
136
117
 
137
- var DATA_RETENTION_TIMEOUT = 5 * 60 * 1000;
138
-
139
- function createCacheEntry_old(cacheIdentifier, operation, operationAvailability, value, networkSubscription, onDispose) {
140
- var isLiveQuery = operationIsLiveQuery(operation);
141
- var currentValue = value;
142
- var retainCount = 0;
143
- var retainDisposable = null;
144
- var _releaseTemporaryRetain = null;
145
- var currentNetworkSubscription = networkSubscription;
146
-
147
- var retain = function retain(environment) {
148
- retainCount++;
149
-
150
- if (retainCount === 1) {
151
- retainDisposable = environment.retain(operation);
152
- }
153
-
154
- return {
155
- dispose: function dispose() {
156
- retainCount = Math.max(0, retainCount - 1);
157
-
158
- if (retainCount === 0) {
159
- !(retainDisposable != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected disposable to release query to be defined.' + "If you're seeing this, this is likely a bug in Relay.") : invariant(false) : void 0;
160
- retainDisposable.dispose();
161
- retainDisposable = null;
162
- }
163
-
164
- onDispose(cacheEntry);
165
- }
166
- };
167
- };
168
-
169
- var cacheEntry = {
170
- cacheIdentifier: cacheIdentifier,
171
- id: nextID++,
172
- processedPayloadsCount: 0,
173
- operationAvailability: operationAvailability,
174
- getValue: function getValue() {
175
- return currentValue;
176
- },
177
- setValue: function setValue(val) {
178
- currentValue = val;
179
- },
180
- getRetainCount: function getRetainCount() {
181
- return retainCount;
182
- },
183
- getNetworkSubscription: function getNetworkSubscription() {
184
- return currentNetworkSubscription;
185
- },
186
- setNetworkSubscription: function setNetworkSubscription(subscription) {
187
- if (isLiveQuery && currentNetworkSubscription != null) {
188
- currentNetworkSubscription.unsubscribe();
189
- }
190
-
191
- currentNetworkSubscription = subscription;
192
- },
193
- temporaryRetain: function temporaryRetain(environment) {
194
- // NOTE: If we're executing in a server environment, there's no need
195
- // to create temporary retains, since the component will never commit.
196
- if (environment.isServer()) {
197
- return {
198
- dispose: function dispose() {}
199
- };
200
- } // NOTE: temporaryRetain is called during the render phase. However,
201
- // given that we can't tell if this render will eventually commit or not,
202
- // we create a timer to autodispose of this retain in case the associated
203
- // component never commits.
204
- // If the component /does/ commit, permanentRetain will clear this timeout
205
- // and permanently retain the data.
206
-
207
-
208
- var disposable = retain(environment);
209
- var releaseQueryTimeout = null;
210
-
211
- var localReleaseTemporaryRetain = function localReleaseTemporaryRetain() {
212
- clearTimeout(releaseQueryTimeout);
213
- releaseQueryTimeout = null;
214
- _releaseTemporaryRetain = null;
215
- disposable.dispose(); // Normally if this entry never commits, the request would've ended by the
216
- // time this timeout expires and the temporary retain is released. However,
217
- // we need to do this for live queries which remain open indefinitely.
218
-
219
- if (isLiveQuery && retainCount <= 0 && currentNetworkSubscription != null) {
220
- currentNetworkSubscription.unsubscribe();
221
- }
222
- };
223
-
224
- releaseQueryTimeout = setTimeout(localReleaseTemporaryRetain, DATA_RETENTION_TIMEOUT); // NOTE: Since temporaryRetain can be called multiple times, we release
225
- // the previous temporary retain after we re-establish a new one, since
226
- // we only ever need a single temporary retain until the permanent retain is
227
- // established.
228
- // temporaryRetain may be called multiple times by React during the render
229
- // phase, as well as multiple times by other query components that are
230
- // rendering the same query/variables.
231
-
232
- if (_releaseTemporaryRetain != null) {
233
- _releaseTemporaryRetain();
234
- }
235
-
236
- _releaseTemporaryRetain = localReleaseTemporaryRetain;
237
- return {
238
- dispose: function dispose() {
239
- _releaseTemporaryRetain && _releaseTemporaryRetain();
240
- }
241
- };
242
- },
243
- permanentRetain: function permanentRetain(environment) {
244
- var disposable = retain(environment);
245
-
246
- if (_releaseTemporaryRetain != null) {
247
- _releaseTemporaryRetain();
248
-
249
- _releaseTemporaryRetain = null;
250
- }
251
-
252
- return {
253
- dispose: function dispose() {
254
- disposable.dispose();
255
-
256
- if (isLiveQuery && retainCount <= 0 && currentNetworkSubscription != null) {
257
- currentNetworkSubscription.unsubscribe();
258
- }
259
- }
260
- };
261
- },
262
- releaseTemporaryRetain: function releaseTemporaryRetain() {
263
- if (_releaseTemporaryRetain != null) {
264
- _releaseTemporaryRetain();
265
-
266
- _releaseTemporaryRetain = null;
267
- }
268
- }
269
- };
270
- return cacheEntry;
271
- }
272
-
273
118
  var QueryResourceImpl = /*#__PURE__*/function () {
274
119
  function QueryResourceImpl(environment) {
275
120
  var _this = this;
276
121
 
277
122
  (0, _defineProperty2["default"])(this, "_clearCacheEntry", function (cacheEntry) {
278
- // The new code does this retainCount <= 0 check within SuspenseResource
279
- // before calling _clearCacheEntry, whereas with the old code we do it here.
280
- if (RelayFeatureFlags.REFACTOR_SUSPENSE_RESOURCE) {
281
- _this._cache["delete"](cacheEntry.cacheIdentifier);
282
- } else {
283
- if (cacheEntry.getRetainCount() <= 0) {
284
- _this._cache["delete"](cacheEntry.cacheIdentifier);
285
- }
286
- }
123
+ _this._cache["delete"](cacheEntry.cacheIdentifier);
287
124
  });
288
125
  this._environment = environment;
289
126
  this._cache = LRUCache.create(CACHE_CAPACITY);
@@ -529,7 +366,7 @@ var QueryResourceImpl = /*#__PURE__*/function () {
529
366
  } else {
530
367
  // TODO:T92030819 Remove this warning and actually throw the network error
531
368
  // To complete this task we need to have a way of precisely tracking suspendable points
532
- process.env.NODE_ENV !== "production" ? warning(false, 'QueryResource: An incremental payload for query `%` returned an error: `%`:`%`.', operation.fragment.node.name, _error.message, _error.stack) : void 0;
369
+ process.env.NODE_ENV !== "production" ? warning(false, 'QueryResource: An incremental payload for query `%s` returned an error: `%s`.', operation.fragment.node.name, String(_error.message)) : void 0;
533
370
  }
534
371
 
535
372
  resolveNetworkPromise();
@@ -64,17 +64,13 @@ function preloadQuery(environment, preloadableRequest, variables, options, envir
64
64
  return;
65
65
  }
66
66
 
67
- if (RelayFeatureFlags.DELAY_CLEANUP_OF_PENDING_PRELOAD_QUERIES === true) {
68
- setTimeout(function () {
69
- // Clear the cache entry after the default timeout
70
- // null-check for Flow
71
- if (queryEntry != null) {
72
- cleanup(pendingQueries, queryEntry);
73
- }
74
- }, DEFAULT_PREFETCH_TIMEOUT);
75
- } else {
76
- cleanup(pendingQueries, queryEntry);
77
- }
67
+ setTimeout(function () {
68
+ // Clear the cache entry after the default timeout
69
+ // null-check for Flow
70
+ if (queryEntry != null) {
71
+ cleanup(pendingQueries, queryEntry);
72
+ }
73
+ }, DEFAULT_PREFETCH_TIMEOUT);
78
74
  };
79
75
  }) : null;
80
76
  return {
@@ -0,0 +1,37 @@
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
+ * @emails oncall+relay
9
+ * @format
10
+ */
11
+ // flowlint ambiguous-object-type:error
12
+ 'use strict';
13
+
14
+ var invariant = require('invariant'); // $FlowFixMe[prop-missing] These exist in experimental builds but aren't in React's types yet.
15
+
16
+
17
+ var _require = require('react'),
18
+ unstable_getCacheForType = _require.unstable_getCacheForType,
19
+ unstable_getCacheSignal = _require.unstable_getCacheSignal;
20
+
21
+ var _require2 = require('relay-runtime'),
22
+ RelayFeatureFlags = _require2.RelayFeatureFlags;
23
+
24
+ function getCacheForType(factory) {
25
+ !(typeof unstable_getCacheForType === 'function' && RelayFeatureFlags.USE_REACT_CACHE) ? process.env.NODE_ENV !== "production" ? invariant(false, '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.') : invariant(false) : void 0;
26
+ return unstable_getCacheForType(factory);
27
+ }
28
+
29
+ function getCacheSignal() {
30
+ !(typeof unstable_getCacheSignal === 'function' && RelayFeatureFlags.USE_REACT_CACHE) ? process.env.NODE_ENV !== "production" ? invariant(false, '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.') : invariant(false) : void 0;
31
+ return unstable_getCacheSignal();
32
+ }
33
+
34
+ module.exports = {
35
+ getCacheForType: getCacheForType,
36
+ getCacheSignal: getCacheSignal
37
+ };