react-relay 20.1.0 → 21.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/ReactRelayContext.js +1 -1
  2. package/ReactRelayContext.js.flow +2 -2
  3. package/ReactRelayFragmentContainer.js.flow +9 -10
  4. package/ReactRelayLocalQueryRenderer.js.flow +11 -3
  5. package/ReactRelayLoggingContext.js.flow +3 -3
  6. package/ReactRelayPaginationContainer.js.flow +32 -25
  7. package/ReactRelayQueryFetcher.js.flow +1 -1
  8. package/ReactRelayQueryRenderer.js.flow +2 -2
  9. package/ReactRelayQueryRendererContext.js.flow +2 -2
  10. package/ReactRelayRefetchContainer.js.flow +18 -15
  11. package/ReactRelayTestMocker.js.flow +10 -10
  12. package/ReactRelayTypes.js.flow +18 -20
  13. package/RelayContext.js.flow +3 -3
  14. package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +11 -11
  15. package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +5 -5
  16. package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +5 -5
  17. package/__flowtests__/RelayModern-flowtest.js.flow +24 -27
  18. package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +1 -1
  19. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +3 -4
  20. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +3 -4
  21. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +9 -10
  22. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +4 -5
  23. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +9 -10
  24. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +4 -5
  25. package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +3 -4
  26. package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +3 -4
  27. package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +3 -4
  28. package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +5 -6
  29. package/buildReactRelayContainer.js.flow +4 -4
  30. package/getRootVariablesForFragments.js.flow +3 -3
  31. package/hooks.js +1 -1
  32. package/hooks.js.flow +23 -8
  33. package/index.js +1 -1
  34. package/index.js.flow +40 -14
  35. package/isRelayEnvironment.js.flow +1 -1
  36. package/jest-react/internalAct.js.flow +1 -1
  37. package/legacy.js +1 -1
  38. package/legacy.js.flow +32 -13
  39. package/lib/ReactRelayFragmentContainer.js +1 -1
  40. package/lib/ReactRelayPaginationContainer.js +8 -8
  41. package/lib/ReactRelayRefetchContainer.js +8 -8
  42. package/lib/ReactRelayTestMocker.js +5 -5
  43. package/lib/hooks.js +18 -8
  44. package/lib/index.js +30 -14
  45. package/lib/legacy.js +26 -13
  46. package/lib/relay-hooks/legacy/useBlockingPaginationFragment.js +5 -5
  47. package/lib/relay-hooks/legacy/useRefetchableFragmentNode.js +34 -34
  48. package/lib/relay-hooks/loadEntryPoint.js +2 -2
  49. package/lib/relay-hooks/loadQuery.js +14 -14
  50. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +10 -10
  51. package/lib/relay-hooks/readFragmentInternal.js +6 -6
  52. package/lib/relay-hooks/rsc/serverFetchQuery.js +20 -0
  53. package/lib/relay-hooks/rsc/serverPreloadQuery.js +31 -0
  54. package/lib/relay-hooks/rsc/serverReadFragment.js +15 -0
  55. package/lib/relay-hooks/rsc/useQueryFromServer.js +62 -0
  56. package/lib/relay-hooks/useFragmentInternal_CURRENT.js +49 -25
  57. package/lib/relay-hooks/useFragmentInternal_EXPERIMENTAL.js +81 -44
  58. package/lib/relay-hooks/useLazyLoadQueryNode.js +32 -19
  59. package/lib/relay-hooks/useMutation.js +6 -14
  60. package/lib/relay-hooks/useMutationAction_EXPERIMENTAL.js +26 -0
  61. package/lib/relay-hooks/usePreloadedQuery.js +52 -47
  62. package/lib/relay-hooks/useQueryLoader.js +2 -2
  63. package/lib/relay-hooks/useQueryLoader_EXPERIMENTAL.js +2 -2
  64. package/lib/relay-hooks/useRefetchableFragmentInternal.js +31 -31
  65. package/lib/rsc-client_EXPERIMENTAL.js +7 -0
  66. package/lib/rsc_EXPERIMENTAL.js +43 -0
  67. package/multi-actor/ActorChange.js.flow +1 -1
  68. package/package.json +3 -2
  69. package/relay-hooks/EntryPointContainer.react.js.flow +6 -6
  70. package/relay-hooks/EntryPointTypes.flow.js.flow +61 -67
  71. package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +23 -21
  72. package/relay-hooks/MatchContainer.js.flow +12 -6
  73. package/relay-hooks/NestedRelayEntryPointBuilderUtils.js.flow +3 -9
  74. package/relay-hooks/QueryResource.js.flow +6 -6
  75. package/relay-hooks/RelayEnvironmentProvider.js.flow +2 -2
  76. package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +6 -6
  77. package/relay-hooks/__flowtests__/EntryPointTypes/ExtractQueryTypes-flowtest.js.flow +48 -1
  78. package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +9 -9
  79. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +3 -4
  80. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +5 -6
  81. package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +27 -32
  82. package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +25 -25
  83. package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +26 -32
  84. package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +23 -30
  85. package/relay-hooks/__flowtests__/utils.js.flow +4 -4
  86. package/relay-hooks/getConnectionState.js.flow +4 -4
  87. package/relay-hooks/legacy/FragmentResource.js.flow +13 -13
  88. package/relay-hooks/legacy/useBlockingPaginationFragment.js.flow +24 -25
  89. package/relay-hooks/legacy/useFragmentNode.js.flow +4 -4
  90. package/relay-hooks/legacy/useRefetchableFragmentNode.js.flow +79 -81
  91. package/relay-hooks/loadEntryPoint.js.flow +16 -14
  92. package/relay-hooks/loadQuery.js.flow +18 -18
  93. package/relay-hooks/preloadQuery_DEPRECATED.js.flow +16 -13
  94. package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +7 -7
  95. package/relay-hooks/readFragmentInternal.js.flow +9 -9
  96. package/relay-hooks/rsc/serverFetchQuery.js.flow +31 -0
  97. package/relay-hooks/rsc/serverPreloadQuery.js.flow +69 -0
  98. package/relay-hooks/rsc/serverReadFragment.js.flow +33 -0
  99. package/relay-hooks/rsc/useQueryFromServer.js.flow +135 -0
  100. package/relay-hooks/useClientQuery.js.flow +2 -2
  101. package/relay-hooks/useEntryPointLoader.js.flow +11 -11
  102. package/relay-hooks/useFragment.js.flow +7 -7
  103. package/relay-hooks/useFragmentInternal.js.flow +1 -1
  104. package/relay-hooks/useFragmentInternal_CURRENT.js.flow +54 -22
  105. package/relay-hooks/useFragmentInternal_EXPERIMENTAL.js.flow +95 -46
  106. package/relay-hooks/useIsOperationNodeActive.js.flow +1 -1
  107. package/relay-hooks/useIsParentQueryActive.js.flow +1 -1
  108. package/relay-hooks/useLazyLoadQuery.js.flow +10 -3
  109. package/relay-hooks/useLazyLoadQueryNode.js.flow +67 -28
  110. package/relay-hooks/useLoadMoreFunction.js.flow +7 -6
  111. package/relay-hooks/useLoadMoreFunction_EXPERIMENTAL.js.flow +5 -5
  112. package/relay-hooks/useMemoVariables.js.flow +1 -1
  113. package/relay-hooks/useMutation.js.flow +8 -16
  114. package/relay-hooks/useMutationAction_EXPERIMENTAL.js.flow +68 -0
  115. package/relay-hooks/usePaginationFragment.js.flow +15 -11
  116. package/relay-hooks/usePrefetchableForwardPaginationFragment.js.flow +19 -18
  117. package/relay-hooks/usePrefetchableForwardPaginationFragment_EXPERIMENTAL.js.flow +19 -18
  118. package/relay-hooks/usePreloadedQuery.js.flow +119 -85
  119. package/relay-hooks/useQueryLoader.js.flow +27 -23
  120. package/relay-hooks/useQueryLoader_EXPERIMENTAL.js.flow +10 -10
  121. package/relay-hooks/useRefetchableFragment.js.flow +16 -11
  122. package/relay-hooks/useRefetchableFragmentInternal.js.flow +77 -79
  123. package/relay-hooks/useRelayLoggingContext.js.flow +1 -1
  124. package/relay-hooks/useSubscribeToInvalidationState.js.flow +1 -1
  125. package/relay-hooks/useSubscription.js.flow +1 -1
  126. package/rsc-client_EXPERIMENTAL.js +10 -0
  127. package/rsc-client_EXPERIMENTAL.js.flow +23 -0
  128. package/rsc_EXPERIMENTAL.js +10 -0
  129. package/rsc_EXPERIMENTAL.js.flow +90 -0
@@ -146,17 +146,17 @@ function handleMissedUpdates(environment, state) {
146
146
  var updatedData = recycleNodesInto(state.snapshot.data, currentSnapshot.data);
147
147
  var updatedCurrentSnapshot = {
148
148
  data: updatedData,
149
+ fieldErrors: currentSnapshot.fieldErrors,
149
150
  isMissingData: currentSnapshot.isMissingData,
150
151
  missingClientEdges: currentSnapshot.missingClientEdges,
151
152
  missingLiveResolverFields: currentSnapshot.missingLiveResolverFields,
152
153
  seenRecords: currentSnapshot.seenRecords,
153
- selector: currentSnapshot.selector,
154
- fieldErrors: currentSnapshot.fieldErrors
154
+ selector: currentSnapshot.selector
155
155
  };
156
156
  return [updatedData !== state.snapshot.data, {
157
+ epoch: currentEpoch,
157
158
  kind: 'singular',
158
- snapshot: updatedCurrentSnapshot,
159
- epoch: currentEpoch
159
+ snapshot: updatedCurrentSnapshot
160
160
  }];
161
161
  } else {
162
162
  var didMissUpdates = false;
@@ -167,12 +167,12 @@ function handleMissedUpdates(environment, state) {
167
167
  var _updatedData = recycleNodesInto(snapshot.data, _currentSnapshot.data);
168
168
  var _updatedCurrentSnapshot = {
169
169
  data: _updatedData,
170
+ fieldErrors: _currentSnapshot.fieldErrors,
170
171
  isMissingData: _currentSnapshot.isMissingData,
171
172
  missingClientEdges: _currentSnapshot.missingClientEdges,
172
173
  missingLiveResolverFields: _currentSnapshot.missingLiveResolverFields,
173
174
  seenRecords: _currentSnapshot.seenRecords,
174
- selector: _currentSnapshot.selector,
175
- fieldErrors: _currentSnapshot.fieldErrors
175
+ selector: _currentSnapshot.selector
176
176
  };
177
177
  if (_updatedData !== snapshot.data) {
178
178
  didMissUpdates = true;
@@ -181,9 +181,9 @@ function handleMissedUpdates(environment, state) {
181
181
  }
182
182
  !(currentSnapshots.length === state.snapshots.length) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected same number of snapshots') : invariant(false) : void 0;
183
183
  return [didMissUpdates, {
184
+ epoch: currentEpoch,
184
185
  kind: 'plural',
185
- snapshots: currentSnapshots,
186
- epoch: currentEpoch
186
+ snapshots: currentSnapshots
187
187
  }];
188
188
  }
189
189
  }
@@ -209,8 +209,8 @@ function subscribeToSnapshot(environment, state, setState, hasPendingStateChange
209
209
  var dataChanged = updates[0],
210
210
  nextState = updates[1];
211
211
  environment.__log({
212
- name: 'useFragment.subscription.missedUpdates',
213
- hasDataChanges: dataChanged
212
+ hasDataChanges: dataChanged,
213
+ name: 'useFragment.subscription.missedUpdates'
214
214
  });
215
215
  hasPendingStateChanges.current = dataChanged;
216
216
  return dataChanged ? nextState : prevState;
@@ -220,9 +220,9 @@ function subscribeToSnapshot(environment, state, setState, hasPendingStateChange
220
220
  }
221
221
  hasPendingStateChanges.current = true;
222
222
  return {
223
+ epoch: environment.getStore().getEpoch(),
223
224
  kind: 'singular',
224
- snapshot: latestSnapshot,
225
- epoch: environment.getStore().getEpoch()
225
+ snapshot: latestSnapshot
226
226
  };
227
227
  });
228
228
  });
@@ -240,8 +240,8 @@ function subscribeToSnapshot(environment, state, setState, hasPendingStateChange
240
240
  var dataChanged = updates[0],
241
241
  nextState = updates[1];
242
242
  environment.__log({
243
- name: 'useFragment.subscription.missedUpdates',
244
- hasDataChanges: dataChanged
243
+ hasDataChanges: dataChanged,
244
+ name: 'useFragment.subscription.missedUpdates'
245
245
  });
246
246
  hasPendingStateChanges.current = hasPendingStateChanges.current || dataChanged;
247
247
  return dataChanged ? nextState : prevState;
@@ -253,9 +253,9 @@ function subscribeToSnapshot(environment, state, setState, hasPendingStateChange
253
253
  updated[index] = latestSnapshot;
254
254
  hasPendingStateChanges.current = true;
255
255
  return {
256
+ epoch: environment.getStore().getEpoch(),
256
257
  kind: 'plural',
257
- snapshots: updated,
258
- epoch: environment.getStore().getEpoch()
258
+ snapshots: updated
259
259
  };
260
260
  });
261
261
  });
@@ -283,17 +283,17 @@ function getFragmentState(environment, fragmentSelector) {
283
283
  };
284
284
  } else if (fragmentSelector.kind === 'PluralReaderSelector') {
285
285
  return {
286
+ epoch: environment.getStore().getEpoch(),
286
287
  kind: 'plural',
287
288
  snapshots: fragmentSelector.selectors.map(function (s) {
288
289
  return environment.lookup(s);
289
- }),
290
- epoch: environment.getStore().getEpoch()
290
+ })
291
291
  };
292
292
  } else {
293
293
  return {
294
+ epoch: environment.getStore().getEpoch(),
294
295
  kind: 'singular',
295
- snapshot: environment.lookup(fragmentSelector),
296
- epoch: environment.getStore().getEpoch()
296
+ snapshot: environment.lookup(fragmentSelector)
297
297
  };
298
298
  }
299
299
  }
@@ -374,6 +374,14 @@ function useFragmentInternal(fragmentNode, fragmentRef, hookDisplayName, queryOp
374
374
  clientEdgeQueries = _useMemo[0],
375
375
  activeRequestPromises = _useMemo[1];
376
376
  if (activeRequestPromises.length) {
377
+ !(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'refinement, see invariants above') : invariant(false) : void 0;
378
+ var fragmentOwner = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors[0].owner : fragmentSelector.owner;
379
+ environment.__log({
380
+ name: 'suspense.client_edge',
381
+ fragment: fragmentNode,
382
+ fragmentOwner: fragmentOwner,
383
+ isMount: committedFragmentSelectorRef.current === false
384
+ });
377
385
  throw Promise.all(activeRequestPromises);
378
386
  }
379
387
  useEffect(function () {
@@ -404,15 +412,31 @@ function useFragmentInternal(fragmentNode, fragmentRef, hookDisplayName, queryOp
404
412
  if (isMissingData(state)) {
405
413
  var suspendingLiveResolvers = getSuspendingLiveResolver(state);
406
414
  if (suspendingLiveResolvers != null && suspendingLiveResolvers.length > 0) {
415
+ !(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'refinement, see invariants above') : invariant(false) : void 0;
416
+ var _fragmentOwner = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors[0].owner : fragmentSelector.owner;
417
+ environment.__log({
418
+ name: 'suspense.resolver',
419
+ fragment: fragmentNode,
420
+ fragmentOwner: _fragmentOwner,
421
+ isMount: committedFragmentSelectorRef.current === false,
422
+ suspendingLiveResolvers: suspendingLiveResolvers
423
+ });
407
424
  throw Promise.all(suspendingLiveResolvers.map(function (liveStateID) {
408
425
  return environment.getStore().getLiveResolverPromise(liveStateID);
409
426
  }));
410
427
  }
411
- if (RelayFeatureFlags.ENABLE_RELAY_OPERATION_TRACKER_SUSPENSE || environment !== previousEnvironment || !committedFragmentSelectorRef.current || !areEqualSelectors(committedFragmentSelectorRef.current, fragmentSelector)) {
428
+ if (RelayFeatureFlags.ENABLE_RELAY_OPERATION_TRACKER_SUSPENSE || environment !== previousEnvironment || committedFragmentSelectorRef.current === false || !areEqualSelectors(committedFragmentSelectorRef.current, fragmentSelector)) {
412
429
  !(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'refinement, see invariants above') : invariant(false) : void 0;
413
- var fragmentOwner = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors[0].owner : fragmentSelector.owner;
414
- var pendingOperationsResult = getPendingOperationsForFragment(environment, fragmentNode, fragmentOwner);
430
+ var _fragmentOwner2 = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors[0].owner : fragmentSelector.owner;
431
+ var pendingOperationsResult = getPendingOperationsForFragment(environment, fragmentNode, _fragmentOwner2);
415
432
  if (pendingOperationsResult) {
433
+ environment.__log({
434
+ name: 'suspense.missing_data',
435
+ fragment: fragmentNode,
436
+ fragmentOwner: _fragmentOwner2,
437
+ isMount: committedFragmentSelectorRef.current === false,
438
+ pendingOperations: pendingOperationsResult.pendingOperations
439
+ });
416
440
  throw pendingOperationsResult.promise;
417
441
  }
418
442
  }
@@ -472,8 +496,8 @@ function useFragmentInternal(fragmentNode, fragmentRef, hookDisplayName, queryOp
472
496
  }
473
497
  if (process.env.NODE_ENV !== "production") {
474
498
  useDebugValue({
475
- fragment: fragmentNode.name,
476
- data: data
499
+ data: data,
500
+ fragment: fragmentNode.name
477
501
  });
478
502
  }
479
503
  return data;
@@ -146,19 +146,19 @@ function handleMissedUpdates(environment, state) {
146
146
  var updatedData = recycleNodesInto(state.snapshot.data, currentSnapshot.data);
147
147
  var updatedCurrentSnapshot = {
148
148
  data: updatedData,
149
+ fieldErrors: currentSnapshot.fieldErrors,
149
150
  isMissingData: currentSnapshot.isMissingData,
150
151
  missingClientEdges: currentSnapshot.missingClientEdges,
151
152
  missingLiveResolverFields: currentSnapshot.missingLiveResolverFields,
152
153
  seenRecords: currentSnapshot.seenRecords,
153
- selector: currentSnapshot.selector,
154
- fieldErrors: currentSnapshot.fieldErrors
154
+ selector: currentSnapshot.selector
155
155
  };
156
156
  return [updatedData !== state.snapshot.data, {
157
- kind: 'singular',
158
- snapshot: updatedCurrentSnapshot,
157
+ environment: state.environment,
159
158
  epoch: currentEpoch,
159
+ kind: 'singular',
160
160
  selector: state.selector,
161
- environment: state.environment
161
+ snapshot: updatedCurrentSnapshot
162
162
  }];
163
163
  } else {
164
164
  var didMissUpdates = false;
@@ -169,12 +169,12 @@ function handleMissedUpdates(environment, state) {
169
169
  var _updatedData = recycleNodesInto(snapshot.data, _currentSnapshot.data);
170
170
  var _updatedCurrentSnapshot = {
171
171
  data: _updatedData,
172
+ fieldErrors: _currentSnapshot.fieldErrors,
172
173
  isMissingData: _currentSnapshot.isMissingData,
173
174
  missingClientEdges: _currentSnapshot.missingClientEdges,
174
175
  missingLiveResolverFields: _currentSnapshot.missingLiveResolverFields,
175
176
  seenRecords: _currentSnapshot.seenRecords,
176
- selector: _currentSnapshot.selector,
177
- fieldErrors: _currentSnapshot.fieldErrors
177
+ selector: _currentSnapshot.selector
178
178
  };
179
179
  if (_updatedData !== snapshot.data) {
180
180
  didMissUpdates = true;
@@ -183,11 +183,11 @@ function handleMissedUpdates(environment, state) {
183
183
  }
184
184
  !(currentSnapshots.length === state.snapshots.length) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected same number of snapshots') : invariant(false) : void 0;
185
185
  return [didMissUpdates, {
186
- kind: 'plural',
187
- snapshots: currentSnapshots,
186
+ environment: state.environment,
188
187
  epoch: currentEpoch,
188
+ kind: 'plural',
189
189
  selector: state.selector,
190
- environment: state.environment
190
+ snapshots: currentSnapshots
191
191
  }];
192
192
  }
193
193
  }
@@ -218,8 +218,8 @@ function subscribeToSnapshot(environment, state, setState) {
218
218
  var dataChanged = updates[0],
219
219
  updatedState = updates[1];
220
220
  environment.__log({
221
- name: 'useFragment.subscription.missedUpdates',
222
- hasDataChanges: dataChanged
221
+ hasDataChanges: dataChanged,
222
+ name: 'useFragment.subscription.missedUpdates'
223
223
  });
224
224
  nextState = dataChanged ? updatedState : prevState;
225
225
  } else {
@@ -227,11 +227,11 @@ function subscribeToSnapshot(environment, state, setState) {
227
227
  }
228
228
  } else {
229
229
  nextState = {
230
- kind: 'singular',
231
- snapshot: latestSnapshot,
230
+ environment: state.environment,
232
231
  epoch: environment.getStore().getEpoch(),
232
+ kind: 'singular',
233
233
  selector: state.selector,
234
- environment: state.environment
234
+ snapshot: latestSnapshot
235
235
  };
236
236
  }
237
237
  return nextState;
@@ -252,8 +252,8 @@ function subscribeToSnapshot(environment, state, setState) {
252
252
  var dataChanged = updates[0],
253
253
  updatedState = updates[1];
254
254
  environment.__log({
255
- name: 'useFragment.subscription.missedUpdates',
256
- hasDataChanges: dataChanged
255
+ hasDataChanges: dataChanged,
256
+ name: 'useFragment.subscription.missedUpdates'
257
257
  });
258
258
  nextState = dataChanged ? updatedState : prevState;
259
259
  } else {
@@ -263,11 +263,11 @@ function subscribeToSnapshot(environment, state, setState) {
263
263
  var updated = (0, _toConsumableArray2["default"])(prevState.snapshots);
264
264
  updated[index] = latestSnapshot;
265
265
  nextState = {
266
- kind: 'plural',
267
- snapshots: updated,
266
+ environment: state.environment,
268
267
  epoch: environment.getStore().getEpoch(),
268
+ kind: 'plural',
269
269
  selector: state.selector,
270
- environment: state.environment
270
+ snapshots: updated
271
271
  };
272
272
  }
273
273
  return nextState;
@@ -293,26 +293,26 @@ function subscribeToSnapshot(environment, state, setState) {
293
293
  function getFragmentState(environment, fragmentSelector) {
294
294
  if (fragmentSelector == null) {
295
295
  return {
296
- kind: 'bailout',
297
- environment: environment
296
+ environment: environment,
297
+ kind: 'bailout'
298
298
  };
299
299
  } else if (fragmentSelector.kind === 'PluralReaderSelector') {
300
300
  return {
301
+ environment: environment,
302
+ epoch: environment.getStore().getEpoch(),
301
303
  kind: 'plural',
304
+ selector: fragmentSelector,
302
305
  snapshots: fragmentSelector.selectors.map(function (s) {
303
306
  return environment.lookup(s);
304
- }),
305
- epoch: environment.getStore().getEpoch(),
306
- selector: fragmentSelector,
307
- environment: environment
307
+ })
308
308
  };
309
309
  } else {
310
310
  return {
311
- kind: 'singular',
312
- snapshot: environment.lookup(fragmentSelector),
311
+ environment: environment,
313
312
  epoch: environment.getStore().getEpoch(),
313
+ kind: 'singular',
314
314
  selector: fragmentSelector,
315
- environment: environment
315
+ snapshot: environment.lookup(fragmentSelector)
316
316
  };
317
317
  }
318
318
  }
@@ -380,6 +380,14 @@ function useFragmentInternal_EXPERIMENTAL(fragmentNode, fragmentRef, hookDisplay
380
380
  clientEdgeQueries = _useMemo[0],
381
381
  activeRequestPromises = _useMemo[1];
382
382
  if (activeRequestPromises.length) {
383
+ !(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'refinement, see invariants above') : invariant(false) : void 0;
384
+ var fragmentOwner = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors[0].owner : fragmentSelector.owner;
385
+ environment.__log({
386
+ name: 'suspense.client_edge',
387
+ fragment: fragmentNode,
388
+ fragmentOwner: fragmentOwner,
389
+ isMount: committedFragmentSelectorRef.current === false
390
+ });
383
391
  var allPromises = Promise.all(activeRequestPromises);
384
392
  allPromises.displayName = "RelayClientEdge(".concat(activeRequestPromises.map(function (promise) {
385
393
  return promise.displayName;
@@ -414,30 +422,51 @@ function useFragmentInternal_EXPERIMENTAL(fragmentNode, fragmentRef, hookDisplay
414
422
  if (isMissingData(state)) {
415
423
  var suspendingLiveResolvers = getSuspendingLiveResolver(state);
416
424
  if (suspendingLiveResolvers != null && suspendingLiveResolvers.length > 0) {
425
+ !(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'refinement, see invariants above') : invariant(false) : void 0;
426
+ var _fragmentOwner = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors[0].owner : fragmentSelector.owner;
427
+ environment.__log({
428
+ name: 'suspense.resolver',
429
+ fragment: fragmentNode,
430
+ fragmentOwner: _fragmentOwner,
431
+ isMount: committedFragmentSelectorRef.current === false,
432
+ suspendingLiveResolvers: suspendingLiveResolvers
433
+ });
417
434
  var promise = Promise.all(suspendingLiveResolvers.map(function (liveStateID) {
418
435
  return environment.getStore().getLiveResolverPromise(liveStateID);
419
436
  }));
420
437
  promise.displayName = 'RelayLiveResolver(' + fragmentNode.name + ')';
421
438
  throw promise;
422
439
  }
423
- if (RelayFeatureFlags.ENABLE_RELAY_OPERATION_TRACKER_SUSPENSE || environment !== previousEnvironment || !committedFragmentSelectorRef.current || !areEqualSelectors(committedFragmentSelectorRef.current, fragmentSelector)) {
440
+ if (RelayFeatureFlags.ENABLE_RELAY_OPERATION_TRACKER_SUSPENSE || environment !== previousEnvironment || committedFragmentSelectorRef.current === false || !areEqualSelectors(committedFragmentSelectorRef.current, fragmentSelector)) {
424
441
  !(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'refinement, see invariants above') : invariant(false) : void 0;
425
- var fragmentOwner = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors[0].owner : fragmentSelector.owner;
426
- var pendingOperationsResult = getPendingOperationsForFragment(environment, fragmentNode, fragmentOwner);
442
+ var _fragmentOwner2 = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors[0].owner : fragmentSelector.owner;
443
+ var pendingOperationsResult = getPendingOperationsForFragment(environment, fragmentNode, _fragmentOwner2);
427
444
  if (pendingOperationsResult) {
445
+ environment.__log({
446
+ name: 'suspense.missing_data',
447
+ fragment: fragmentNode,
448
+ fragmentOwner: _fragmentOwner2,
449
+ isMount: committedFragmentSelectorRef.current === false,
450
+ pendingOperations: pendingOperationsResult.pendingOperations
451
+ });
428
452
  throw pendingOperationsResult.promise;
429
453
  }
430
454
  }
431
455
  }
432
456
  handlePotentialSnapshotErrorsForState(environment, state, loggerContext);
433
- var storeSubscriptionRef = useRef(null);
457
+ var storeSubscriptionRef = useRef({
458
+ kind: 'uninitialized'
459
+ });
434
460
  useEffect(function () {
435
461
  var storeSubscription = storeSubscriptionRef.current;
436
- if (storeSubscription != null) {
462
+ if (storeSubscription.kind === 'initialized') {
437
463
  if (state.environment === storeSubscription.environment && state.selector === storeSubscription.selector) {
438
464
  return;
439
465
  } else {
440
466
  storeSubscription.dispose();
467
+ storeSubscriptionRef.current = {
468
+ kind: 'uninitialized'
469
+ };
441
470
  }
442
471
  }
443
472
  if (state.kind === 'bailout') {
@@ -450,6 +479,9 @@ function useFragmentInternal_EXPERIMENTAL(fragmentNode, fragmentRef, hookDisplay
450
479
  updatedState = updates[1];
451
480
  if (didMissUpdates) {
452
481
  setState(updatedState);
482
+ storeSubscriptionRef.current = {
483
+ kind: 'missed-updates'
484
+ };
453
485
  return;
454
486
  }
455
487
  stateForSubscription = updatedState;
@@ -457,23 +489,28 @@ function useFragmentInternal_EXPERIMENTAL(fragmentNode, fragmentRef, hookDisplay
457
489
  var dispose = subscribeToSnapshot(state.environment, stateForSubscription, setState);
458
490
  storeSubscriptionRef.current = {
459
491
  dispose: dispose,
460
- selector: state.selector,
461
- environment: state.environment
492
+ environment: state.environment,
493
+ kind: 'initialized',
494
+ selector: state.selector
462
495
  };
463
496
  }, [state]);
464
497
  useEffect(function () {
465
- if (storeSubscriptionRef.current == null && state.kind !== 'bailout') {
498
+ if (storeSubscriptionRef.current.kind === 'uninitialized' && state.kind !== 'bailout') {
466
499
  var dispose = subscribeToSnapshot(state.environment, state, setState);
467
500
  storeSubscriptionRef.current = {
468
501
  dispose: dispose,
469
- selector: state.selector,
470
- environment: state.environment
502
+ environment: state.environment,
503
+ kind: 'initialized',
504
+ selector: state.selector
471
505
  };
472
506
  }
473
507
  return function () {
474
- var _storeSubscriptionRef;
475
- (_storeSubscriptionRef = storeSubscriptionRef.current) === null || _storeSubscriptionRef === void 0 ? void 0 : _storeSubscriptionRef.dispose();
476
- storeSubscriptionRef.current = null;
508
+ if (storeSubscriptionRef.current.kind === 'initialized') {
509
+ storeSubscriptionRef.current.dispose();
510
+ }
511
+ storeSubscriptionRef.current = {
512
+ kind: 'uninitialized'
513
+ };
477
514
  };
478
515
  }, []);
479
516
  var data;
@@ -504,8 +541,8 @@ function useFragmentInternal_EXPERIMENTAL(fragmentNode, fragmentRef, hookDisplay
504
541
  }
505
542
  if (process.env.NODE_ENV !== "production") {
506
543
  useDebugValue({
507
- fragment: fragmentNode.name,
508
- data: data
544
+ data: data,
545
+ fragment: fragmentNode.name
509
546
  });
510
547
  }
511
548
  return data;
@@ -12,13 +12,8 @@ var useContext = React.useContext,
12
12
  useEffect = React.useEffect,
13
13
  useState = React.useState,
14
14
  useRef = React.useRef;
15
- function useLazyLoadQueryNode(_ref) {
16
- var query = _ref.query,
17
- componentDisplayName = _ref.componentDisplayName,
18
- fetchObservable = _ref.fetchObservable,
19
- fetchPolicy = _ref.fetchPolicy,
20
- fetchKey = _ref.fetchKey,
21
- renderPolicy = _ref.renderPolicy;
15
+ function useLazyLoadQueryNode(params) {
16
+ var _preparedQueryResult;
22
17
  var environment = useRelayEnvironment();
23
18
  var profilerContext = useContext(ProfilerContext);
24
19
  var QueryResource = getQueryResourceForEnvironment(environment);
@@ -28,15 +23,29 @@ function useLazyLoadQueryNode(_ref) {
28
23
  var _useFetchTrackingRef = useFetchTrackingRef(),
29
24
  startFetch = _useFetchTrackingRef.startFetch,
30
25
  completeFetch = _useFetchTrackingRef.completeFetch;
31
- var cacheBreaker = "".concat(forceUpdateKey, "-").concat(fetchKey !== null && fetchKey !== void 0 ? fetchKey : '');
32
- var cacheIdentifier = getQueryCacheIdentifier(environment, query, fetchPolicy, renderPolicy, cacheBreaker);
33
- var preparedQueryResult = profilerContext.wrapPrepareQueryResource(function () {
34
- return QueryResource.prepareWithIdentifier(cacheIdentifier, query, fetchObservable, fetchPolicy, renderPolicy, {
35
- start: startFetch,
36
- complete: completeFetch,
37
- error: completeFetch
38
- }, profilerContext);
39
- });
26
+ var cacheIdentifier = null;
27
+ var preparedQueryResult = null;
28
+ var fragmentNode;
29
+ if (params.query != null) {
30
+ var query = params.query,
31
+ fetchObservable = params.fetchObservable,
32
+ fetchPolicy = params.fetchPolicy,
33
+ fetchKey = params.fetchKey,
34
+ renderPolicy = params.renderPolicy;
35
+ var cacheBreaker = "".concat(forceUpdateKey, "-").concat(fetchKey !== null && fetchKey !== void 0 ? fetchKey : '');
36
+ var queryCacheIdentifier = getQueryCacheIdentifier(environment, query, fetchPolicy, renderPolicy, cacheBreaker);
37
+ cacheIdentifier = queryCacheIdentifier;
38
+ preparedQueryResult = profilerContext.wrapPrepareQueryResource(function () {
39
+ return QueryResource.prepareWithIdentifier(queryCacheIdentifier, query, fetchObservable, fetchPolicy, renderPolicy, {
40
+ start: startFetch,
41
+ complete: completeFetch,
42
+ error: completeFetch
43
+ }, profilerContext);
44
+ });
45
+ fragmentNode = preparedQueryResult.fragmentNode;
46
+ } else {
47
+ fragmentNode = params.fragmentNode;
48
+ }
40
49
  var maybeHiddenOrFastRefresh = useRef(false);
41
50
  useEffect(function () {
42
51
  return function () {
@@ -51,17 +60,21 @@ function useLazyLoadQueryNode(_ref) {
51
60
  });
52
61
  return;
53
62
  }
63
+ if (preparedQueryResult == null) {
64
+ return;
65
+ }
54
66
  var disposable = QueryResource.retain(preparedQueryResult, profilerContext);
55
67
  return function () {
56
68
  disposable.dispose();
57
69
  };
58
70
  }, [environment, cacheIdentifier]);
59
71
  useEffect(function () {
72
+ if (preparedQueryResult == null) {
73
+ return;
74
+ }
60
75
  QueryResource.releaseTemporaryRetain(preparedQueryResult);
61
76
  });
62
- var fragmentNode = preparedQueryResult.fragmentNode,
63
- fragmentRef = preparedQueryResult.fragmentRef;
64
- var data = useFragmentInternal(fragmentNode, fragmentRef, componentDisplayName);
77
+ var data = useFragmentInternal(fragmentNode, (_preparedQueryResult = preparedQueryResult) === null || _preparedQueryResult === void 0 ? void 0 : _preparedQueryResult.fragmentRef, params.componentDisplayName);
65
78
  return data;
66
79
  }
67
80
  module.exports = useLazyLoadQueryNode;
@@ -2,7 +2,6 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
4
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
5
- var useIsMountedRef = require('./useIsMountedRef');
6
5
  var useRelayEnvironment = require('./useRelayEnvironment');
7
6
  var React = require('react');
8
7
  var _require = require('relay-runtime'),
@@ -14,7 +13,6 @@ var useState = React.useState,
14
13
  function useMutation(mutation) {
15
14
  var commitMutationFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultCommitMutation;
16
15
  var environment = useRelayEnvironment();
17
- var isMountedRef = useIsMountedRef();
18
16
  var environmentRef = useRef(environment);
19
17
  var mutationRef = useRef(mutation);
20
18
  var inFlightMutationsRef = useRef(new Set());
@@ -24,25 +22,19 @@ function useMutation(mutation) {
24
22
  var cleanup = useCallback(function (disposable) {
25
23
  if (environmentRef.current === environment && mutationRef.current === mutation) {
26
24
  inFlightMutationsRef.current["delete"](disposable);
27
- if (isMountedRef.current) {
28
- setMutationInFlight(inFlightMutationsRef.current.size > 0);
29
- }
25
+ setMutationInFlight(inFlightMutationsRef.current.size > 0);
30
26
  }
31
- }, [environment, isMountedRef, mutation]);
27
+ }, [environment, mutation]);
32
28
  useEffect(function () {
33
29
  if (environmentRef.current !== environment || mutationRef.current !== mutation) {
34
30
  inFlightMutationsRef.current = new Set();
35
- if (isMountedRef.current) {
36
- setMutationInFlight(false);
37
- }
31
+ setMutationInFlight(false);
38
32
  environmentRef.current = environment;
39
33
  mutationRef.current = mutation;
40
34
  }
41
- }, [environment, isMountedRef, mutation]);
35
+ }, [environment, mutation]);
42
36
  var commit = useCallback(function (config) {
43
- if (isMountedRef.current) {
44
- setMutationInFlight(true);
45
- }
37
+ setMutationInFlight(true);
46
38
  var disposable = commitMutationFn(environment, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, config), {}, {
47
39
  mutation: mutation,
48
40
  onCompleted: function onCompleted(response, errors) {
@@ -67,7 +59,7 @@ function useMutation(mutation) {
67
59
  }));
68
60
  inFlightMutationsRef.current.add(disposable);
69
61
  return disposable;
70
- }, [cleanup, commitMutationFn, environment, isMountedRef, mutation]);
62
+ }, [cleanup, commitMutationFn, environment, mutation]);
71
63
  return [commit, isMutationInFlight];
72
64
  }
73
65
  module.exports = useMutation;
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ var useRelayEnvironment = require('./useRelayEnvironment');
4
+ var React = require('react');
5
+ var _require = require('relay-runtime'),
6
+ commitMutation = _require.commitMutation;
7
+ var useCallback = React.useCallback;
8
+ function useMutationAction_EXPERIMENTAL(mutation) {
9
+ var environment = useRelayEnvironment();
10
+ var commitAction = useCallback(function (variables) {
11
+ return new Promise(function (resolve, reject) {
12
+ commitMutation(environment, {
13
+ mutation: mutation,
14
+ variables: variables,
15
+ onCompleted: function onCompleted(response) {
16
+ resolve(response);
17
+ },
18
+ onError: function onError(error) {
19
+ reject(error);
20
+ }
21
+ });
22
+ });
23
+ }, [environment, mutation]);
24
+ return commitAction;
25
+ }
26
+ module.exports = useMutationAction_EXPERIMENTAL;