react-relay 13.1.0 → 14.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. package/ReactRelayContext.js +1 -1
  2. package/ReactRelayFragmentContainer.js.flow +7 -4
  3. package/ReactRelayLocalQueryRenderer.js.flow +1 -1
  4. package/ReactRelayPaginationContainer.js.flow +13 -8
  5. package/ReactRelayQueryFetcher.js.flow +1 -0
  6. package/ReactRelayQueryRenderer.js.flow +7 -6
  7. package/ReactRelayRefetchContainer.js.flow +10 -3
  8. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +2 -2
  9. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +2 -2
  10. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +3 -3
  11. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +3 -3
  12. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +3 -3
  13. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +3 -3
  14. package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +2 -2
  15. package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +2 -2
  16. package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +2 -2
  17. package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +2 -2
  18. package/buildReactRelayContainer.js.flow +2 -2
  19. package/hooks.js +1 -1
  20. package/index.js +1 -1
  21. package/jest-react/internalAct.js.flow +25 -9
  22. package/legacy.js +1 -1
  23. package/lib/ReactRelayQueryFetcher.js +1 -0
  24. package/lib/ReactRelayQueryRenderer.js +1 -2
  25. package/lib/jest-react/internalAct.js +24 -4
  26. package/lib/readContext.js +2 -1
  27. package/lib/relay-hooks/FragmentResource.js +62 -23
  28. package/lib/relay-hooks/HooksImplementation.js +29 -0
  29. package/lib/relay-hooks/MatchContainer.js +1 -0
  30. package/lib/relay-hooks/QueryResource.js +4 -166
  31. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +7 -11
  32. package/lib/relay-hooks/react-cache/RelayReactCache.js +37 -0
  33. package/lib/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js +344 -0
  34. package/lib/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js +540 -0
  35. package/lib/relay-hooks/react-cache/useFragment_REACT_CACHE.js +51 -0
  36. package/lib/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js +56 -0
  37. package/lib/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js +125 -0
  38. package/lib/relay-hooks/useFragment.js +15 -1
  39. package/lib/relay-hooks/useLazyLoadQuery.js +18 -2
  40. package/lib/relay-hooks/useMutation.js +4 -5
  41. package/lib/relay-hooks/usePreloadedQuery.js +18 -2
  42. package/package.json +3 -3
  43. package/react-relay-hooks.js +2 -2
  44. package/react-relay-hooks.min.js +2 -2
  45. package/react-relay-legacy.js +2 -2
  46. package/react-relay-legacy.min.js +2 -2
  47. package/react-relay.js +2 -2
  48. package/react-relay.min.js +2 -2
  49. package/readContext.js.flow +1 -0
  50. package/relay-hooks/FragmentResource.js.flow +72 -27
  51. package/relay-hooks/HooksImplementation.js.flow +45 -0
  52. package/relay-hooks/MatchContainer.js.flow +8 -1
  53. package/relay-hooks/QueryResource.js.flow +8 -203
  54. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +2 -2
  55. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +2 -2
  56. package/relay-hooks/loadQuery.js.flow +2 -1
  57. package/relay-hooks/preloadQuery_DEPRECATED.js.flow +7 -14
  58. package/relay-hooks/react-cache/RelayReactCache.js.flow +42 -0
  59. package/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js.flow +424 -0
  60. package/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js.flow +559 -0
  61. package/relay-hooks/react-cache/useFragment_REACT_CACHE.js.flow +74 -0
  62. package/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js.flow +72 -0
  63. package/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js.flow +153 -0
  64. package/relay-hooks/useFragment.js.flow +17 -10
  65. package/relay-hooks/useLazyLoadQuery.js.flow +38 -3
  66. package/relay-hooks/useMutation.js.flow +3 -3
  67. package/relay-hooks/usePreloadedQuery.js.flow +30 -2
  68. package/relay-hooks/useRefetchableFragmentNode.js.flow +26 -11
  69. package/relay-hooks/useSubscription.js.flow +14 -8
@@ -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
@@ -74,6 +74,16 @@ function hasMissingClientEdges(snapshot) {
74
74
  return ((_snapshot$missingClie = (_snapshot$missingClie2 = snapshot.missingClientEdges) === null || _snapshot$missingClie2 === void 0 ? void 0 : _snapshot$missingClie2.length) !== null && _snapshot$missingClie !== void 0 ? _snapshot$missingClie : 0) > 0;
75
75
  }
76
76
 
77
+ function missingLiveResolverFields(snapshot) {
78
+ if (Array.isArray(snapshot)) {
79
+ return snapshot.map(function (s) {
80
+ return s.missingLiveResolverFields;
81
+ }).filter(Boolean).flat();
82
+ }
83
+
84
+ return snapshot.missingLiveResolverFields;
85
+ }
86
+
77
87
  function singularOrPluralForEach(snapshot, f) {
78
88
  if (Array.isArray(snapshot)) {
79
89
  snapshot.forEach(f);
@@ -210,7 +220,7 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
210
220
  _proto2.readWithIdentifier = function readWithIdentifier(fragmentNode, fragmentRef, fragmentIdentifier, componentDisplayName, fragmentKey) {
211
221
  var _this3 = this;
212
222
 
213
- var _fragmentNode$metadat, _clientEdgePromises;
223
+ var _fragmentNode$metadat, _fragmentNode$metadat2, _missingLiveResolverF2, _missingLiveResolverF3;
214
224
 
215
225
  var environment = this._environment; // If fragmentRef is null or undefined, pass it directly through.
216
226
  // This is a convenience when consuming fragments via a HOC API, when the
@@ -248,6 +258,8 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
248
258
  var cachedValue = this._cache.get(fragmentIdentifier);
249
259
 
250
260
  if (cachedValue != null) {
261
+ var _missingLiveResolverF;
262
+
251
263
  if (cachedValue.kind === 'pending' && isPromise(cachedValue.promise)) {
252
264
  environment.__log({
253
265
  name: 'suspense.fragment',
@@ -262,8 +274,8 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
262
274
  throw cachedValue.promise;
263
275
  }
264
276
 
265
- if (cachedValue.kind === 'done' && cachedValue.result.snapshot) {
266
- this._reportMissingRequiredFieldsInSnapshot(cachedValue.result.snapshot);
277
+ if (cachedValue.kind === 'done' && cachedValue.result.snapshot && !((_missingLiveResolverF = missingLiveResolverFields(cachedValue.result.snapshot)) === null || _missingLiveResolverF === void 0 ? void 0 : _missingLiveResolverF.length)) {
278
+ this._handlePotentialSnapshotErrorsInSnapshot(cachedValue.result.snapshot);
267
279
 
268
280
  return cachedValue.result;
269
281
  }
@@ -279,7 +291,7 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
279
291
  var fragmentResult = getFragmentResult(fragmentIdentifier, snapshot, storeEpoch);
280
292
 
281
293
  if (!fragmentResult.isMissingData) {
282
- this._reportMissingRequiredFieldsInSnapshot(snapshot);
294
+ this._handlePotentialSnapshotErrorsInSnapshot(snapshot);
283
295
 
284
296
  this._cache.set(fragmentIdentifier, {
285
297
  kind: 'done',
@@ -300,7 +312,7 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
300
312
 
301
313
  var clientEdgeRequests = null;
302
314
 
303
- if (RelayFeatureFlags.ENABLE_CLIENT_EDGES && hasMissingClientEdges(snapshot)) {
315
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES && ((_fragmentNode$metadat2 = fragmentNode.metadata) === null || _fragmentNode$metadat2 === void 0 ? void 0 : _fragmentNode$metadat2.hasClientEdges) === true && hasMissingClientEdges(snapshot)) {
304
316
  clientEdgeRequests = [];
305
317
  var queryResource = getQueryResourceForEnvironment(this._environment);
306
318
  var queryResults = [];
@@ -328,14 +340,12 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
328
340
  this._clientEdgeQueryResultsCache.recordQueryResults(fragmentIdentifier, queryResults);
329
341
  }
330
342
 
331
- var clientEdgePromises = null;
343
+ var clientEdgePromises = [];
332
344
 
333
345
  if (RelayFeatureFlags.ENABLE_CLIENT_EDGES && clientEdgeRequests) {
334
346
  clientEdgePromises = clientEdgeRequests.map(function (request) {
335
347
  return getPromiseForActiveRequest(_this3._environment, request);
336
- }).filter(function (p) {
337
- return p != null;
338
- });
348
+ }).filter(Boolean);
339
349
  } // Finally look for operations in flight for our parent query:
340
350
 
341
351
 
@@ -345,8 +355,15 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
345
355
 
346
356
  var parentQueryPromiseResultPromise = parentQueryPromiseResult === null || parentQueryPromiseResult === void 0 ? void 0 : parentQueryPromiseResult.promise; // for refinement
347
357
 
348
- if (((_clientEdgePromises = clientEdgePromises) === null || _clientEdgePromises === void 0 ? void 0 : _clientEdgePromises.length) || isPromise(parentQueryPromiseResultPromise)) {
349
- var _parentQueryPromiseRe, _clientEdgeRequests2, _clientEdgePromises2;
358
+ var missingResolverFieldPromises = (_missingLiveResolverF2 = (_missingLiveResolverF3 = missingLiveResolverFields(snapshot)) === null || _missingLiveResolverF3 === void 0 ? void 0 : _missingLiveResolverF3.map(function (_ref2) {
359
+ var liveStateID = _ref2.liveStateID;
360
+ var store = environment.getStore(); // $FlowFixMe[prop-missing] This is expected to be a LiveResolverStore
361
+
362
+ return store.getLiveResolverPromise(liveStateID);
363
+ })) !== null && _missingLiveResolverF2 !== void 0 ? _missingLiveResolverF2 : [];
364
+
365
+ if (clientEdgePromises.length || missingResolverFieldPromises.length || isPromise(parentQueryPromiseResultPromise)) {
366
+ var _parentQueryPromiseRe, _clientEdgeRequests2;
350
367
 
351
368
  environment.__log({
352
369
  name: 'suspense.fragment',
@@ -355,13 +372,37 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
355
372
  isRelayHooks: true,
356
373
  isPromiseCached: false,
357
374
  isMissingData: fragmentResult.isMissingData,
375
+ // TODO! Attach information here about missing live resolver fields
358
376
  pendingOperations: [].concat((0, _toConsumableArray2["default"])((_parentQueryPromiseRe = parentQueryPromiseResult === null || parentQueryPromiseResult === void 0 ? void 0 : parentQueryPromiseResult.pendingOperations) !== null && _parentQueryPromiseRe !== void 0 ? _parentQueryPromiseRe : []), (0, _toConsumableArray2["default"])((_clientEdgeRequests2 = clientEdgeRequests) !== null && _clientEdgeRequests2 !== void 0 ? _clientEdgeRequests2 : []))
359
377
  });
360
378
 
361
- throw ((_clientEdgePromises2 = clientEdgePromises) === null || _clientEdgePromises2 === void 0 ? void 0 : _clientEdgePromises2.length) ? Promise.all([parentQueryPromiseResultPromise].concat((0, _toConsumableArray2["default"])(clientEdgePromises))) : parentQueryPromiseResultPromise;
379
+ var promises = [];
380
+
381
+ if (clientEdgePromises.length > 0) {
382
+ promises = promises.concat(clientEdgePromises);
383
+ }
384
+
385
+ if (missingResolverFieldPromises.length > 0) {
386
+ promises = promises.concat(missingResolverFieldPromises);
387
+ }
388
+
389
+ if (promises.length > 0) {
390
+ if (parentQueryPromiseResultPromise) {
391
+ promises.push(parentQueryPromiseResultPromise);
392
+ }
393
+
394
+ throw Promise.all(promises);
395
+ } // Note: we are re-throwing the `parentQueryPromiseResultPromise` here,
396
+ // because some of our suspense-related code is relying on the instance equality
397
+ // of thrown promises. See FragmentResource-test.js
398
+
399
+
400
+ if (parentQueryPromiseResultPromise) {
401
+ throw parentQueryPromiseResultPromise;
402
+ }
362
403
  }
363
404
 
364
- this._reportMissingRequiredFieldsInSnapshot(snapshot);
405
+ this._handlePotentialSnapshotErrorsInSnapshot(snapshot);
365
406
 
366
407
  return getFragmentResult(fragmentIdentifier, snapshot, storeEpoch);
367
408
  };
@@ -383,19 +424,15 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
383
424
  };
384
425
  };
385
426
 
386
- _proto2._reportMissingRequiredFieldsInSnapshot = function _reportMissingRequiredFieldsInSnapshot(snapshot) {
427
+ _proto2._handlePotentialSnapshotErrorsInSnapshot = function _handlePotentialSnapshotErrorsInSnapshot(snapshot) {
387
428
  var _this4 = this;
388
429
 
389
430
  if (Array.isArray(snapshot)) {
390
431
  snapshot.forEach(function (s) {
391
- if (s.missingRequiredFields != null) {
392
- reportMissingRequiredFields(_this4._environment, s.missingRequiredFields);
393
- }
432
+ handlePotentialSnapshotErrors(_this4._environment, s.missingRequiredFields, s.relayResolverErrors);
394
433
  });
395
434
  } else {
396
- if (snapshot.missingRequiredFields != null) {
397
- reportMissingRequiredFields(this._environment, snapshot.missingRequiredFields);
398
- }
435
+ handlePotentialSnapshotErrors(this._environment, snapshot.missingRequiredFields, snapshot.relayResolverErrors);
399
436
  }
400
437
  };
401
438
 
@@ -557,9 +594,11 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
557
594
  data: updatedData,
558
595
  isMissingData: currentSnapshot.isMissingData,
559
596
  missingClientEdges: currentSnapshot.missingClientEdges,
597
+ missingLiveResolverFields: currentSnapshot.missingLiveResolverFields,
560
598
  seenRecords: currentSnapshot.seenRecords,
561
599
  selector: currentSnapshot.selector,
562
- missingRequiredFields: currentSnapshot.missingRequiredFields
600
+ missingRequiredFields: currentSnapshot.missingRequiredFields,
601
+ relayResolverErrors: currentSnapshot.relayResolverErrors
563
602
  };
564
603
 
565
604
  if (updatedData !== renderData) {
@@ -0,0 +1,29 @@
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
+ * @emails oncall+relay
8
+ *
9
+ * @format
10
+ */
11
+ 'use strict'; // flowlint ambiguous-object-type:error
12
+
13
+ var warning = require("fbjs/lib/warning");
14
+
15
+ var implementation = null;
16
+
17
+ function inject(impl) {
18
+ process.env.NODE_ENV !== "production" ? warning(implementation !== null, 'Relay HooksImplementation was injected twice.') : void 0;
19
+ implementation = impl;
20
+ }
21
+
22
+ function get() {
23
+ return implementation;
24
+ }
25
+
26
+ module.exports = {
27
+ inject: inject,
28
+ get: get
29
+ };
@@ -137,6 +137,7 @@ function MatchContainer(_ref2) {
137
137
 
138
138
  if (LoadedContainer != null && fragmentProps != null) {
139
139
  // $FlowFixMe[incompatible-type]
140
+ // $FlowFixMe[cannot-spread-indexer]
140
141
  return /*#__PURE__*/React.createElement(LoadedContainer, (0, _extends2["default"])({}, props, fragmentProps));
141
142
  } else {
142
143
  return fallback !== null && fallback !== void 0 ? fallback : null;
@@ -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);
@@ -429,7 +266,8 @@ var QueryResourceImpl = /*#__PURE__*/function () {
429
266
  var hasFullQuery = queryStatus === 'available';
430
267
  var canPartialRender = hasFullQuery || renderPolicy === 'partial' && queryStatus !== 'stale';
431
268
  var shouldFetch;
432
- var shouldAllowRender;
269
+ var shouldAllowRender; // Different definitions for Promise in our repos can cause this variable
270
+ // to cause errors when synced elsewhere
433
271
 
434
272
  var resolveNetworkPromise = function resolveNetworkPromise() {};
435
273
 
@@ -529,7 +367,7 @@ var QueryResourceImpl = /*#__PURE__*/function () {
529
367
  } else {
530
368
  // TODO:T92030819 Remove this warning and actually throw the network error
531
369
  // 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;
370
+ 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
371
  }
534
372
 
535
373
  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
+ };