react-relay 20.1.1 → 21.0.1

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 (154) hide show
  1. package/ReactRelayContext.js +1 -1
  2. package/ReactRelayContext.js.flow +2 -2
  3. package/ReactRelayFragmentContainer.js.flow +8 -9
  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 +17 -14
  11. package/ReactRelayTestMocker.js.flow +10 -10
  12. package/ReactRelayTypes.d.ts +377 -0
  13. package/ReactRelayTypes.js.flow +47 -43
  14. package/RelayContext.js.flow +3 -3
  15. package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +11 -11
  16. package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +5 -5
  17. package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +5 -5
  18. package/__flowtests__/RelayModern-flowtest.js.flow +32 -32
  19. package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +1 -1
  20. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +3 -4
  21. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +3 -4
  22. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +9 -10
  23. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +4 -5
  24. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +9 -10
  25. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +4 -5
  26. package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +3 -4
  27. package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +3 -4
  28. package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +3 -4
  29. package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +5 -6
  30. package/buildReactRelayContainer.js.flow +5 -5
  31. package/getRootVariablesForFragments.js.flow +1 -1
  32. package/hooks.d.ts +89 -0
  33. package/hooks.js +1 -1
  34. package/hooks.js.flow +23 -8
  35. package/index.d.ts +9 -0
  36. package/index.js +1 -1
  37. package/index.js.flow +40 -14
  38. package/isRelayEnvironment.js.flow +1 -1
  39. package/jest-react/internalAct.js.flow +1 -1
  40. package/legacy.d.ts +143 -0
  41. package/legacy.js +1 -1
  42. package/legacy.js.flow +32 -13
  43. package/lib/ReactRelayFragmentContainer.js +1 -1
  44. package/lib/ReactRelayPaginationContainer.js +8 -8
  45. package/lib/ReactRelayRefetchContainer.js +8 -8
  46. package/lib/ReactRelayTestMocker.js +5 -5
  47. package/lib/hooks.js +18 -8
  48. package/lib/index.js +30 -14
  49. package/lib/legacy.js +26 -13
  50. package/lib/relay-hooks/legacy/useBlockingPaginationFragment.js +5 -5
  51. package/lib/relay-hooks/legacy/useRefetchableFragmentNode.js +34 -34
  52. package/lib/relay-hooks/loadEntryPoint.js +2 -2
  53. package/lib/relay-hooks/loadQuery.js +14 -14
  54. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +10 -10
  55. package/lib/relay-hooks/readFragmentInternal.js +6 -6
  56. package/lib/relay-hooks/rsc/serverFetchQuery.js +20 -0
  57. package/lib/relay-hooks/rsc/serverPreloadQuery.js +31 -0
  58. package/lib/relay-hooks/rsc/serverReadFragment.js +15 -0
  59. package/lib/relay-hooks/rsc/useQueryFromServer.js +62 -0
  60. package/lib/relay-hooks/useFragmentInternal_CURRENT.js +49 -25
  61. package/lib/relay-hooks/useFragmentInternal_EXPERIMENTAL.js +81 -44
  62. package/lib/relay-hooks/useLazyLoadQueryNode.js +32 -19
  63. package/lib/relay-hooks/useMutation.js +6 -14
  64. package/lib/relay-hooks/useMutationAction_EXPERIMENTAL.js +26 -0
  65. package/lib/relay-hooks/usePreloadedQuery.js +52 -47
  66. package/lib/relay-hooks/useQueryLoader.js +2 -2
  67. package/lib/relay-hooks/useQueryLoader_EXPERIMENTAL.js +2 -2
  68. package/lib/relay-hooks/useRefetchableFragmentInternal.js +31 -31
  69. package/lib/rsc-client_EXPERIMENTAL.js +7 -0
  70. package/lib/rsc_EXPERIMENTAL.js +43 -0
  71. package/multi-actor/ActorChange.js.flow +1 -1
  72. package/package.json +3 -2
  73. package/relay-hooks/EntryPointContainer.react.d.ts +22 -0
  74. package/relay-hooks/EntryPointContainer.react.js.flow +6 -6
  75. package/relay-hooks/EntryPointTypes.flow.js.flow +106 -108
  76. package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +23 -21
  77. package/relay-hooks/MatchContainer.d.ts +95 -0
  78. package/relay-hooks/MatchContainer.js.flow +17 -11
  79. package/relay-hooks/NestedRelayEntryPointBuilderUtils.js.flow +3 -9
  80. package/relay-hooks/ProfilerContext.d.ts +18 -0
  81. package/relay-hooks/QueryResource.js.flow +9 -9
  82. package/relay-hooks/RelayEnvironmentProvider.d.ts +16 -0
  83. package/relay-hooks/RelayEnvironmentProvider.js.flow +2 -2
  84. package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +6 -6
  85. package/relay-hooks/__flowtests__/EntryPointTypes/ExtractQueryTypes-flowtest.js.flow +50 -3
  86. package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +9 -9
  87. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +3 -4
  88. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +5 -6
  89. package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +27 -32
  90. package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +25 -25
  91. package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +26 -32
  92. package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +23 -30
  93. package/relay-hooks/__flowtests__/utils.js.flow +17 -17
  94. package/relay-hooks/getConnectionState.js.flow +2 -2
  95. package/relay-hooks/legacy/FragmentResource.js.flow +13 -13
  96. package/relay-hooks/legacy/useBlockingPaginationFragment.js.flow +28 -25
  97. package/relay-hooks/legacy/useFragmentNode.js.flow +4 -4
  98. package/relay-hooks/legacy/useRefetchableFragmentNode.js.flow +79 -81
  99. package/relay-hooks/loadEntryPoint.d.ts +14 -0
  100. package/relay-hooks/loadEntryPoint.js.flow +15 -13
  101. package/relay-hooks/loadQuery.d.ts +20 -0
  102. package/relay-hooks/loadQuery.js.flow +19 -19
  103. package/relay-hooks/preloadQuery_DEPRECATED.js.flow +16 -13
  104. package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +7 -7
  105. package/relay-hooks/readFragmentInternal.js.flow +11 -11
  106. package/relay-hooks/rsc/serverFetchQuery.js.flow +31 -0
  107. package/relay-hooks/rsc/serverPreloadQuery.js.flow +69 -0
  108. package/relay-hooks/rsc/serverReadFragment.js.flow +33 -0
  109. package/relay-hooks/rsc/useQueryFromServer.js.flow +135 -0
  110. package/relay-hooks/useClientQuery.d.ts +16 -0
  111. package/relay-hooks/useClientQuery.js.flow +2 -2
  112. package/relay-hooks/useEntryPointLoader.d.ts +21 -0
  113. package/relay-hooks/useEntryPointLoader.js.flow +11 -11
  114. package/relay-hooks/useFragment.d.ts +36 -0
  115. package/relay-hooks/useFragment.js.flow +8 -8
  116. package/relay-hooks/useFragmentInternal.js.flow +1 -1
  117. package/relay-hooks/useFragmentInternal_CURRENT.js.flow +54 -22
  118. package/relay-hooks/useFragmentInternal_EXPERIMENTAL.js.flow +95 -46
  119. package/relay-hooks/useIsOperationNodeActive.js.flow +1 -1
  120. package/relay-hooks/useIsParentQueryActive.js.flow +5 -1
  121. package/relay-hooks/useLazyLoadQuery.d.ts +19 -0
  122. package/relay-hooks/useLazyLoadQuery.js.flow +14 -7
  123. package/relay-hooks/useLazyLoadQueryNode.js.flow +67 -28
  124. package/relay-hooks/useLoadMoreFunction.d.ts +56 -0
  125. package/relay-hooks/useLoadMoreFunction.js.flow +7 -6
  126. package/relay-hooks/useLoadMoreFunction_EXPERIMENTAL.js.flow +5 -5
  127. package/relay-hooks/useMemoVariables.js.flow +1 -1
  128. package/relay-hooks/useMutation.d.ts +36 -0
  129. package/relay-hooks/useMutation.js.flow +9 -17
  130. package/relay-hooks/useMutationAction_EXPERIMENTAL.js.flow +68 -0
  131. package/relay-hooks/usePaginationFragment.d.ts +33 -0
  132. package/relay-hooks/usePaginationFragment.js.flow +19 -11
  133. package/relay-hooks/usePrefetchableForwardPaginationFragment.js.flow +23 -18
  134. package/relay-hooks/usePrefetchableForwardPaginationFragment_EXPERIMENTAL.js.flow +23 -18
  135. package/relay-hooks/usePreloadedQuery.d.ts +17 -0
  136. package/relay-hooks/usePreloadedQuery.js.flow +119 -85
  137. package/relay-hooks/useQueryLoader.d.ts +33 -0
  138. package/relay-hooks/useQueryLoader.js.flow +28 -24
  139. package/relay-hooks/useQueryLoader_EXPERIMENTAL.js.flow +10 -10
  140. package/relay-hooks/useRefetchableFragment.d.ts +23 -0
  141. package/relay-hooks/useRefetchableFragment.js.flow +20 -11
  142. package/relay-hooks/useRefetchableFragmentInternal.js.flow +77 -79
  143. package/relay-hooks/useRelayEnvironment.d.ts +10 -0
  144. package/relay-hooks/useRelayLoggingContext.js.flow +1 -1
  145. package/relay-hooks/useSubscribeToInvalidationState.d.ts +19 -0
  146. package/relay-hooks/useSubscribeToInvalidationState.js.flow +1 -1
  147. package/relay-hooks/useSubscription.d.ts +14 -0
  148. package/relay-hooks/useSubscription.js.flow +1 -1
  149. package/rsc-client_EXPERIMENTAL.d.ts +17 -0
  150. package/rsc-client_EXPERIMENTAL.js +10 -0
  151. package/rsc-client_EXPERIMENTAL.js.flow +23 -0
  152. package/rsc_EXPERIMENTAL.d.ts +48 -0
  153. package/rsc_EXPERIMENTAL.js +10 -0
  154. package/rsc_EXPERIMENTAL.js.flow +90 -0
@@ -43,7 +43,7 @@ const {
43
43
  getValueAtPath,
44
44
  } = require('relay-runtime');
45
45
 
46
- type LoadMoreFn<TVariables: Variables> = (
46
+ type LoadMoreFn<TVariables extends Variables> = (
47
47
  count: number,
48
48
  options?: {
49
49
  onComplete?: (Error | null) => void,
@@ -55,7 +55,9 @@ export type ReturnType<TVariables, TData, TEdgeData, TKey> = {
55
55
  // NOTE: This type ensures that the type of the returned data is either:
56
56
  // - nullable if the provided ref type is nullable
57
57
  // - non-nullable if the provided ref type is non-nullable
58
- data: [+key: TKey] extends [+key: {+$fragmentSpreads: mixed, ...}]
58
+ data: [readonly key: TKey] extends [
59
+ readonly key: {readonly $fragmentSpreads: unknown, ...},
60
+ ]
59
61
  ? TData
60
62
  : ?TData,
61
63
  loadNext: LoadMoreFn<TVariables>,
@@ -72,18 +74,20 @@ type LoadMoreOptions<TVariables> = {
72
74
 
73
75
  export type GetExtraVariablesFn<TEdgeData, TData, TVariables, TKey> = ({
74
76
  hasNext: boolean,
75
- data: [+key: TKey] extends [+key: {+$fragmentSpreads: mixed, ...}]
77
+ data: [readonly key: TKey] extends [
78
+ readonly key: {readonly $fragmentSpreads: unknown, ...},
79
+ ]
76
80
  ? TData
77
81
  : ?TData,
78
82
  getServerEdges: () => TEdgeData,
79
83
  }) => Partial<TVariables>;
80
84
 
81
85
  hook usePrefetchableForwardPaginationFragment<
82
- TFragmentType: FragmentType,
83
- TVariables: Variables,
86
+ TFragmentType extends FragmentType,
87
+ TVariables extends Variables,
84
88
  TData,
85
89
  TEdgeData,
86
- TKey: ?{+$fragmentSpreads: TFragmentType, ...},
90
+ TKey extends ?{readonly $fragmentSpreads: TFragmentType, ...},
87
91
  >(
88
92
  fragmentInput: PrefetchableRefetchableFragment<
89
93
  TFragmentType,
@@ -257,26 +261,26 @@ hook usePrefetchableForwardPaginationFragment<
257
261
  onComplete: prefetchingOnComplete,
258
262
  UNSTABLE_extraVariables:
259
263
  typeof prefetchingUNSTABLE_extraVariables === 'function'
260
- ? // $FlowFixMe[incompatible-call]
264
+ ? // $FlowFixMe[incompatible-type]
261
265
  prefetchingUNSTABLE_extraVariables({
262
266
  hasNext,
263
- // $FlowFixMe[incompatible-call]
267
+ // $FlowFixMe[incompatible-type]
264
268
  data: fragmentData,
265
269
  getServerEdges: () => {
266
270
  const selector = getSelector(
267
- // $FlowFixMe[incompatible-call]
271
+ // $FlowFixMe[incompatible-type]
268
272
  edgesFragment,
269
273
  edgeKeys,
270
274
  );
271
275
  if (selector == null) {
272
- // $FlowFixMe[incompatible-call]
276
+ // $FlowFixMe[incompatible-type]
273
277
  return [];
274
278
  }
275
279
  invariant(
276
280
  selector.kind === 'PluralReaderSelector',
277
281
  'Expected a plural selector',
278
282
  );
279
- // $FlowFixMe[incompatible-call]
283
+ // $FlowFixMe[incompatible-type]
280
284
  return selector.selectors.map(
281
285
  sel => environment.lookup(sel).data,
282
286
  );
@@ -332,22 +336,22 @@ hook usePrefetchableForwardPaginationFragment<
332
336
  onComplete,
333
337
  UNSTABLE_extraVariables:
334
338
  typeof prefetchingUNSTABLE_extraVariables === 'function'
335
- ? // $FlowFixMe[incompatible-call]
339
+ ? // $FlowFixMe[incompatible-type]
336
340
  prefetchingUNSTABLE_extraVariables({
337
341
  hasNext,
338
- // $FlowFixMe[incompatible-call]
342
+ // $FlowFixMe[incompatible-type]
339
343
  data: fragmentData,
340
344
  getServerEdges: () => {
341
345
  const selector = getSelector(edgesFragment, edgeKeys);
342
346
  if (selector == null) {
343
- // $FlowFixMe[incompatible-call]
347
+ // $FlowFixMe[incompatible-type]
344
348
  return [];
345
349
  }
346
350
  invariant(
347
351
  selector.kind === 'PluralReaderSelector',
348
352
  'Expected a plural selector',
349
353
  );
350
- // $FlowFixMe[incompatible-call]
354
+ // $FlowFixMe[incompatible-type]
351
355
  return selector.selectors.map(
352
356
  sel => environment.lookup(sel).data,
353
357
  );
@@ -375,12 +379,12 @@ hook usePrefetchableForwardPaginationFragment<
375
379
 
376
380
  const realNumInUse = Math.min(numInUse, sourceSize);
377
381
 
378
- const derivedEdgeKeys: $ReadOnlyArray<mixed> = useMemo(
382
+ const derivedEdgeKeys: ReadonlyArray<unknown> = useMemo(
379
383
  () => edgeKeys?.slice(0, realNumInUse) ?? [],
380
384
  [edgeKeys, realNumInUse],
381
385
  );
382
386
 
383
- // $FlowExpectedError[incompatible-call] - we know derivedEdgeKeys are the correct keys
387
+ // $FlowExpectedError[incompatible-type] - we know derivedEdgeKeys are the correct keys
384
388
  const edges: TEdgeData = useFragment(edgesFragment, derivedEdgeKeys);
385
389
 
386
390
  const refetchPagination = useCallback(
@@ -422,13 +426,14 @@ hook usePrefetchableForwardPaginationFragment<
422
426
 
423
427
  return {
424
428
  edges,
425
- // $FlowFixMe[incompatible-return]
429
+ // $FlowFixMe[incompatible-type]
426
430
  data: fragmentData,
427
431
  loadNext: showMore,
428
432
  hasNext: hasNext || sourceSize > numInUse,
429
433
  // Only reflect `isLoadingMore` if the product depends on it, do not refelect
430
434
  // `isLoaindgMore` state if it is for fufilling the buffer
431
435
  isLoadingNext: isLoadingMore && numInUse > sourceSize,
436
+ // $FlowFixMe[incompatible-type]
432
437
  refetch: refetchPagination,
433
438
  };
434
439
  }
@@ -43,7 +43,7 @@ const {
43
43
  getValueAtPath,
44
44
  } = require('relay-runtime');
45
45
 
46
- type LoadMoreFn<TVariables: Variables> = (
46
+ type LoadMoreFn<TVariables extends Variables> = (
47
47
  count: number,
48
48
  options?: {
49
49
  onComplete?: (Error | null) => void,
@@ -55,7 +55,9 @@ export type ReturnType<TVariables, TData, TEdgeData, TKey> = {
55
55
  // NOTE: This type ensures that the type of the returned data is either:
56
56
  // - nullable if the provided ref type is nullable
57
57
  // - non-nullable if the provided ref type is non-nullable
58
- data: [+key: TKey] extends [+key: {+$fragmentSpreads: mixed, ...}]
58
+ data: [readonly key: TKey] extends [
59
+ readonly key: {readonly $fragmentSpreads: unknown, ...},
60
+ ]
59
61
  ? TData
60
62
  : ?TData,
61
63
  loadNext: LoadMoreFn<TVariables>,
@@ -72,18 +74,20 @@ type LoadMoreOptions<TVariables> = {
72
74
 
73
75
  export type GetExtraVariablesFn<TEdgeData, TData, TVariables, TKey> = ({
74
76
  hasNext: boolean,
75
- data: [+key: TKey] extends [+key: {+$fragmentSpreads: mixed, ...}]
77
+ data: [readonly key: TKey] extends [
78
+ readonly key: {readonly $fragmentSpreads: unknown, ...},
79
+ ]
76
80
  ? TData
77
81
  : ?TData,
78
82
  getServerEdges: () => TEdgeData,
79
83
  }) => Partial<TVariables>;
80
84
 
81
85
  hook usePrefetchableForwardPaginationFragment_EXPERIMENTAL<
82
- TFragmentType: FragmentType,
83
- TVariables: Variables,
86
+ TFragmentType extends FragmentType,
87
+ TVariables extends Variables,
84
88
  TData,
85
89
  TEdgeData,
86
- TKey: ?{+$fragmentSpreads: TFragmentType, ...},
90
+ TKey extends ?{readonly $fragmentSpreads: TFragmentType, ...},
87
91
  >(
88
92
  fragmentInput: PrefetchableRefetchableFragment<
89
93
  TFragmentType,
@@ -257,26 +261,26 @@ hook usePrefetchableForwardPaginationFragment_EXPERIMENTAL<
257
261
  onComplete: prefetchingOnComplete,
258
262
  UNSTABLE_extraVariables:
259
263
  typeof prefetchingUNSTABLE_extraVariables === 'function'
260
- ? // $FlowFixMe[incompatible-call]
264
+ ? // $FlowFixMe[incompatible-type]
261
265
  prefetchingUNSTABLE_extraVariables({
262
266
  hasNext,
263
- // $FlowFixMe[incompatible-call]
267
+ // $FlowFixMe[incompatible-type]
264
268
  data: fragmentData,
265
269
  getServerEdges: () => {
266
270
  const selector = getSelector(
267
- // $FlowFixMe[incompatible-call]
271
+ // $FlowFixMe[incompatible-type]
268
272
  edgesFragment,
269
273
  edgeKeys,
270
274
  );
271
275
  if (selector == null) {
272
- // $FlowFixMe[incompatible-call]
276
+ // $FlowFixMe[incompatible-type]
273
277
  return [];
274
278
  }
275
279
  invariant(
276
280
  selector.kind === 'PluralReaderSelector',
277
281
  'Expected a plural selector',
278
282
  );
279
- // $FlowFixMe[incompatible-call]
283
+ // $FlowFixMe[incompatible-type]
280
284
  return selector.selectors.map(
281
285
  sel => environment.lookup(sel).data,
282
286
  );
@@ -331,22 +335,22 @@ hook usePrefetchableForwardPaginationFragment_EXPERIMENTAL<
331
335
  onComplete,
332
336
  UNSTABLE_extraVariables:
333
337
  typeof prefetchingUNSTABLE_extraVariables === 'function'
334
- ? // $FlowFixMe[incompatible-call]
338
+ ? // $FlowFixMe[incompatible-type]
335
339
  prefetchingUNSTABLE_extraVariables({
336
340
  hasNext,
337
- // $FlowFixMe[incompatible-call]
341
+ // $FlowFixMe[incompatible-type]
338
342
  data: fragmentData,
339
343
  getServerEdges: () => {
340
344
  const selector = getSelector(edgesFragment, edgeKeys);
341
345
  if (selector == null) {
342
- // $FlowFixMe[incompatible-call]
346
+ // $FlowFixMe[incompatible-type]
343
347
  return [];
344
348
  }
345
349
  invariant(
346
350
  selector.kind === 'PluralReaderSelector',
347
351
  'Expected a plural selector',
348
352
  );
349
- // $FlowFixMe[incompatible-call]
353
+ // $FlowFixMe[incompatible-type]
350
354
  return selector.selectors.map(
351
355
  sel => environment.lookup(sel).data,
352
356
  );
@@ -374,12 +378,12 @@ hook usePrefetchableForwardPaginationFragment_EXPERIMENTAL<
374
378
 
375
379
  const realNumInUse = Math.min(numInUse, sourceSize);
376
380
 
377
- const derivedEdgeKeys: $ReadOnlyArray<mixed> = useMemo(
381
+ const derivedEdgeKeys: ReadonlyArray<unknown> = useMemo(
378
382
  () => edgeKeys?.slice(0, realNumInUse) ?? [],
379
383
  [edgeKeys, realNumInUse],
380
384
  );
381
385
 
382
- // $FlowExpectedError[incompatible-call] - we know derivedEdgeKeys are the correct keys
386
+ // $FlowExpectedError[incompatible-type] - we know derivedEdgeKeys are the correct keys
383
387
  const edges: TEdgeData = useFragment(edgesFragment, derivedEdgeKeys);
384
388
 
385
389
  const refetchPagination = useCallback(
@@ -421,13 +425,14 @@ hook usePrefetchableForwardPaginationFragment_EXPERIMENTAL<
421
425
 
422
426
  return {
423
427
  edges,
424
- // $FlowFixMe[incompatible-return]
428
+ // $FlowFixMe[incompatible-type]
425
429
  data: fragmentData,
426
430
  loadNext: showMore,
427
431
  hasNext: hasNext || sourceSize > numInUse,
428
432
  // Only reflect `isLoadingMore` if the product depends on it, do not refelect
429
433
  // `isLoaindgMore` state if it is for fufilling the buffer
430
434
  isLoadingNext: isLoadingMore && numInUse > sourceSize,
435
+ // $FlowFixMe[incompatible-type]
431
436
  refetch: refetchPagination,
432
437
  };
433
438
  }
@@ -0,0 +1,17 @@
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
+ import { PreloadedQuery } from '../ReactRelayTypes';
9
+ import {GraphQLTaggedNode, OperationType, RenderPolicy} from 'relay-runtime';
10
+
11
+ export function usePreloadedQuery<TQuery extends OperationType>(
12
+ gqlQuery: GraphQLTaggedNode,
13
+ preloadedQuery: PreloadedQuery<TQuery>,
14
+ options?: {
15
+ UNSTABLE_renderPolicy?: RenderPolicy | undefined;
16
+ },
17
+ ): TQuery['response'];
@@ -29,7 +29,7 @@ const {
29
29
  const warning = require('warning');
30
30
 
31
31
  type PreloadedQuery<
32
- TVariables: Variables,
32
+ TVariables extends Variables,
33
33
  TData,
34
34
  TRawResponse,
35
35
  TEnvironmentProviderOptions = EnvironmentProviderOptions,
@@ -51,114 +51,147 @@ type PreloadedQuery<
51
51
  TEnvironmentProviderOptions,
52
52
  >;
53
53
 
54
- hook usePreloadedQuery<
55
- TVariables: Variables,
54
+ declare hook usePreloadedQuery<
55
+ TVariables extends Variables,
56
+ TData,
57
+ TRawResponse extends ?{...} = void,
58
+ >(
59
+ gqlQuery:
60
+ | Query<TVariables, TData, TRawResponse>
61
+ | ClientQuery<TVariables, TData, TRawResponse>,
62
+ preloadedQuery: PreloadedQuery<TVariables, TData, NonNullable<TRawResponse>>,
63
+ options?: {
64
+ UNSTABLE_renderPolicy?: RenderPolicy,
65
+ },
66
+ ): TData;
67
+
68
+ declare hook usePreloadedQuery<
69
+ TVariables extends Variables,
56
70
  TData,
57
- TRawResponse: ?{...} = void,
71
+ TRawResponse extends ?{...} = void,
58
72
  >(
59
73
  gqlQuery:
60
74
  | Query<TVariables, TData, TRawResponse>
61
75
  | ClientQuery<TVariables, TData, TRawResponse>,
62
- preloadedQuery: PreloadedQuery<
76
+ preloadedQuery: ?PreloadedQuery<TVariables, TData, NonNullable<TRawResponse>>,
77
+ options?: {
78
+ UNSTABLE_renderPolicy?: RenderPolicy,
79
+ },
80
+ ): ?TData;
81
+
82
+ hook usePreloadedQuery<
83
+ TVariables extends Variables,
84
+ TData,
85
+ TRawResponse extends ?{...} = void,
86
+ TPreloadedQuery extends ?PreloadedQuery<
63
87
  TVariables,
64
88
  TData,
65
- $NonMaybeType<TRawResponse>,
66
- >,
89
+ NonNullable<TRawResponse>,
90
+ > = PreloadedQuery<TVariables, TData, NonNullable<TRawResponse>>,
91
+ >(
92
+ gqlQuery:
93
+ | Query<TVariables, TData, TRawResponse>
94
+ | ClientQuery<TVariables, TData, TRawResponse>,
95
+ preloadedQuery: TPreloadedQuery,
67
96
  options?: {
68
97
  UNSTABLE_renderPolicy?: RenderPolicy,
69
98
  },
70
- ): TData {
99
+ ): ?TData {
71
100
  const environment = useRelayEnvironment();
72
- const {fetchKey, fetchPolicy, source, variables, networkCacheConfig} =
73
- preloadedQuery;
74
101
  const operation = useMemoOperationDescriptor(
75
102
  gqlQuery,
76
- variables,
77
- networkCacheConfig,
103
+ preloadedQuery != null ? preloadedQuery.variables : {},
104
+ preloadedQuery != null ? preloadedQuery.networkCacheConfig : undefined,
78
105
  );
79
106
 
80
107
  let useLazyLoadQueryNodeParams;
81
- if (preloadedQuery.kind === 'PreloadedQuery_DEPRECATED') {
82
- invariant(
83
- operation.request.node.params.name === preloadedQuery.name,
84
- 'usePreloadedQuery(): Expected data to be prefetched for query `%s`, ' +
85
- 'got prefetch results for query `%s`.',
86
- operation.request.node.params.name,
87
- preloadedQuery.name,
88
- );
89
-
90
- useLazyLoadQueryNodeParams = {
91
- componentDisplayName: 'usePreloadedQuery()',
92
- fetchKey,
93
- fetchObservable: fetchQueryDeduped(
94
- environment,
95
- operation.request.identifier,
96
- () => {
97
- if (environment === preloadedQuery.environment && source != null) {
98
- return environment.executeWithSource({operation, source});
99
- } else {
100
- return environment.execute({operation});
101
- }
102
- },
103
- ),
104
- fetchPolicy,
105
- query: operation,
106
- renderPolicy: options?.UNSTABLE_renderPolicy,
107
- };
108
- } else {
109
- warning(
110
- preloadedQuery.isDisposed === false,
111
- 'usePreloadedQuery(): Expected preloadedQuery to not be disposed yet. ' +
112
- 'This is because disposing the query marks it for future garbage ' +
113
- 'collection, and as such query results may no longer be present in the Relay ' +
114
- 'store. In the future, this will become a hard error.',
115
- );
108
+ if (preloadedQuery != null) {
109
+ const {fetchKey, fetchPolicy, source} = preloadedQuery;
110
+ if (preloadedQuery.kind === 'PreloadedQuery_DEPRECATED') {
111
+ invariant(
112
+ operation.request.node.params.name === preloadedQuery.name,
113
+ 'usePreloadedQuery(): Expected data to be prefetched for query `%s`, ' +
114
+ 'got prefetch results for query `%s`.',
115
+ operation.request.node.params.name,
116
+ preloadedQuery.name,
117
+ );
116
118
 
117
- const fallbackFetchObservable = fetchQuery(environment, operation);
118
- let fetchObservable;
119
- if (source != null && environment === preloadedQuery.environment) {
120
- // If the source observable exists and the environments match, reuse
121
- // the source observable.
122
- // If the source observable happens to be empty, we need to fall back
123
- // and re-execute and de-dupe the query (at render time).
124
- fetchObservable = source.ifEmpty(fallbackFetchObservable);
125
- } else if (environment !== preloadedQuery.environment) {
126
- // If a call to loadQuery is made with a particular environment, and that
127
- // preloaded query is passed to usePreloadedQuery in a different environment
128
- // context, we cannot re-use the existing preloaded query.
129
- // Instead, we need to fall back and re-execute and de-dupe the query with
130
- // the new environment (at render time).
131
- // TODO T68036756 track occurrences of this warning and turn it into a hard error
119
+ useLazyLoadQueryNodeParams = {
120
+ componentDisplayName: 'usePreloadedQuery()',
121
+ fetchKey,
122
+ fetchObservable: fetchQueryDeduped(
123
+ environment,
124
+ operation.request.identifier,
125
+ () => {
126
+ if (environment === preloadedQuery.environment && source != null) {
127
+ return environment.executeWithSource({operation, source});
128
+ } else {
129
+ return environment.execute({operation});
130
+ }
131
+ },
132
+ ),
133
+ fetchPolicy,
134
+ query: operation,
135
+ renderPolicy: options?.UNSTABLE_renderPolicy,
136
+ };
137
+ } else {
132
138
  warning(
133
- false,
134
- 'usePreloadedQuery(): usePreloadedQuery was passed a preloaded query ' +
135
- 'that was created with a different environment than the one that is currently ' +
136
- 'in context. In the future, this will become a hard error.',
139
+ preloadedQuery.isDisposed === false,
140
+ 'usePreloadedQuery(): Expected preloadedQuery to not be disposed yet. ' +
141
+ 'This is because disposing the query marks it for future garbage ' +
142
+ 'collection, and as such query results may no longer be present in the Relay ' +
143
+ 'store. In the future, this will become a hard error.',
137
144
  );
138
- fetchObservable = fallbackFetchObservable;
139
- } else {
140
- // if (source == null)
141
- // If the source observable does not exist, we need to
142
- // fall back and re-execute and de-dupe the query (at render time).
143
- fetchObservable = fallbackFetchObservable;
144
- }
145
145
 
146
+ const fallbackFetchObservable = fetchQuery(environment, operation);
147
+ let fetchObservable;
148
+ if (source != null && environment === preloadedQuery.environment) {
149
+ // If the source observable exists and the environments match, reuse
150
+ // the source observable.
151
+ // If the source observable happens to be empty, we need to fall back
152
+ // and re-execute and de-dupe the query (at render time).
153
+ fetchObservable = source.ifEmpty(fallbackFetchObservable);
154
+ } else if (environment !== preloadedQuery.environment) {
155
+ // If a call to loadQuery is made with a particular environment, and that
156
+ // preloaded query is passed to usePreloadedQuery in a different environment
157
+ // context, we cannot re-use the existing preloaded query.
158
+ // Instead, we need to fall back and re-execute and de-dupe the query with
159
+ // the new environment (at render time).
160
+ // TODO T68036756 track occurrences of this warning and turn it into a hard error
161
+ warning(
162
+ false,
163
+ 'usePreloadedQuery(): usePreloadedQuery was passed a preloaded query ' +
164
+ 'that was created with a different environment than the one that is currently ' +
165
+ 'in context. In the future, this will become a hard error.',
166
+ );
167
+ fetchObservable = fallbackFetchObservable;
168
+ } else {
169
+ // if (source == null)
170
+ // If the source observable does not exist, we need to
171
+ // fall back and re-execute and de-dupe the query (at render time).
172
+ fetchObservable = fallbackFetchObservable;
173
+ }
174
+
175
+ useLazyLoadQueryNodeParams = {
176
+ componentDisplayName: 'usePreloadedQuery()',
177
+ fetchKey,
178
+ fetchObservable,
179
+ fetchPolicy,
180
+ query: operation,
181
+ renderPolicy: options?.UNSTABLE_renderPolicy,
182
+ };
183
+ }
184
+ } else {
146
185
  useLazyLoadQueryNodeParams = {
147
186
  componentDisplayName: 'usePreloadedQuery()',
148
- fetchObservable,
149
- fetchKey,
150
- fetchPolicy,
151
- query: operation,
152
- renderPolicy: options?.UNSTABLE_renderPolicy,
187
+ fragmentNode: gqlQuery.fragment,
153
188
  };
154
189
  }
155
190
 
156
191
  const data = useLazyLoadQueryNode<{
157
192
  variables: TVariables,
158
193
  response: TData,
159
- rawResponse?: $NonMaybeType<TRawResponse>,
160
- /* $FlowFixMe[incompatible-call] Natural Inference rollout. See
161
- * https://fburl.com/gdoc/y8dn025u */
194
+ rawResponse?: NonNullable<TRawResponse>,
162
195
  }>(useLazyLoadQueryNodeParams);
163
196
 
164
197
  if (__DEV__) {
@@ -166,14 +199,15 @@ hook usePreloadedQuery<
166
199
  // $FlowFixMe[react-rule-hook]
167
200
  // $FlowFixMe[react-rule-hook-conditional]
168
201
  useDebugValue({
169
- query: preloadedQuery.name,
170
- variables: preloadedQuery.variables,
171
202
  data,
172
- fetchKey,
173
- fetchPolicy,
203
+ fetchKey: preloadedQuery?.fetchKey,
204
+ fetchPolicy: preloadedQuery?.fetchPolicy,
205
+ query: preloadedQuery?.name,
174
206
  renderPolicy: options?.UNSTABLE_renderPolicy,
207
+ variables: preloadedQuery?.variables,
175
208
  });
176
209
  }
210
+
177
211
  return data;
178
212
  }
179
213
 
@@ -0,0 +1,33 @@
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
+ import {LoadQueryOptions, PreloadedQuery} from '../ReactRelayTypes';
9
+ import {
10
+ DisposeFn,
11
+ GraphQLTaggedNode,
12
+ IEnvironment,
13
+ OperationType,
14
+ PreloadableConcreteRequest,
15
+ VariablesOf,
16
+ } from 'relay-runtime';
17
+
18
+ export type useQueryLoaderHookType<TQuery extends OperationType> = [
19
+ PreloadedQuery<TQuery> | null | undefined,
20
+ (variables: VariablesOf<TQuery>, options?: UseQueryLoaderLoadQueryOptions) => void,
21
+ DisposeFn,
22
+ ];
23
+
24
+ export type UseQueryLoaderLoadQueryOptions =
25
+ & LoadQueryOptions
26
+ & Readonly<{
27
+ __environment?: IEnvironment | null | undefined;
28
+ }>;
29
+
30
+ export function useQueryLoader<TQuery extends OperationType>(
31
+ preloadableRequest: GraphQLTaggedNode | PreloadableConcreteRequest<TQuery>,
32
+ initialQueryReference?: PreloadedQuery<TQuery> | null,
33
+ ): useQueryLoaderHookType<TQuery>;