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
@@ -32,69 +32,62 @@ import {
32
32
 
33
33
  // Nullability of returned data type is correct
34
34
  // $FlowFixMe[prop-missing]
35
- // $FlowFixMe[incompatible-cast]
35
+ // $FlowFixMe[incompatible-type]
36
36
  // $FlowFixMe[incompatible-exact]
37
37
  // $FlowFixMe[react-rule-hook]
38
- (useRefetchableFragment(refetchableFragmentInput, keyNonNullable): [
38
+ useRefetchableFragment(refetchableFragmentInput, keyNonNullable) as [
39
39
  NonNullableData,
40
40
  FetchFn<QueryVariablesSubset>,
41
- ]);
41
+ ];
42
42
 
43
43
  // $FlowFixMe[react-rule-hook]
44
- (useRefetchableFragment(refetchableFragmentInput, keyNullable): [
44
+ useRefetchableFragment(refetchableFragmentInput, keyNullable) as [
45
45
  NullableData,
46
46
  FetchFn<QueryVariables>,
47
- ]);
47
+ ];
48
48
 
49
- // $FlowExpectedError: can't cast nullable to non-nullable
50
49
  // $FlowFixMe[react-rule-hook]
51
- // $FlowFixMe[incompatible-cast]
52
- (useRefetchableFragment(refetchableFragmentInput, keyNullable): [
50
+ // $FlowFixMe[incompatible-type] can't cast nullable to non-nullable
51
+ useRefetchableFragment(refetchableFragmentInput, keyNullable) as [
53
52
  NonNullableData,
54
53
  FetchFn<QueryVariables>,
55
- ]);
54
+ ];
56
55
 
57
- // $FlowExpectedError: refetch requires exact type if key is nullable
58
56
  // $FlowFixMe[react-rule-hook]
59
57
  // $FlowFixMe[incompatible-exact]
60
- // $FlowFixMe[prop-missing]
61
- (useRefetchableFragment(refetchableFragmentInput, keyNullable): [
58
+ // $FlowFixMe[incompatible-type] refetch requires exact type if key is nullable
59
+ useRefetchableFragment(refetchableFragmentInput, keyNullable) as [
62
60
  NullableData,
63
61
  FetchFn<QueryVariablesSubset>,
64
- ]);
62
+ ];
65
63
 
66
- // $FlowExpectedError: actual type of returned data is correct
67
64
  // $FlowFixMe[react-rule-hook]
68
- // $FlowFixMe[incompatible-call]
65
+ // $FlowFixMe[incompatible-type]
69
66
  // $FlowFixMe[incompatible-exact]
70
67
  // $FlowFixMe[prop-missing]
71
- // $FlowFixMe[incompatible-cast]
72
- (useRefetchableFragment(refetchableFragmentInput, keyAnotherNonNullable): [
68
+ // $FlowFixMe[incompatible-type] actual type of returned data is correct
69
+ useRefetchableFragment(refetchableFragmentInput, keyAnotherNonNullable) as [
73
70
  NonNullableData,
74
71
  FetchFn<QueryVariablesSubset>,
75
- ]);
72
+ ];
76
73
 
77
- // $FlowExpectedError - incompatible key types
78
74
  // $FlowFixMe[react-rule-hook]
79
- // $FlowFixMe[incompatible-call]
80
- (useRefetchableFragment(refetchableFragmentInput, keyAnotherNullable): [
75
+ // $FlowFixMe[incompatible-type]: incompatible key types
76
+ useRefetchableFragment(refetchableFragmentInput, keyAnotherNullable) as [
81
77
  NullableData,
82
78
  FetchFn<QueryVariables>,
83
- ]);
79
+ ];
84
80
 
85
- // $FlowExpectedError: Key should not be a user provided object
86
81
  // $FlowFixMe[react-rule-hook]
87
- // $FlowFixMe[prop-missing]
82
+ // $FlowFixMe[incompatible-type] Key should not be a user provided object
88
83
  useRefetchableFragment(refetchableFragmentInput, {abc: 123});
89
84
 
90
- // $FlowExpectedError: Key should not be an empty object
91
85
  // $FlowFixMe[react-rule-hook]
92
- // $FlowFixMe[prop-missing]
86
+ // $FlowFixMe[incompatible-type] Key should not be an empty object
93
87
  useRefetchableFragment(refetchableFragmentInput, {});
94
88
 
95
- // $FlowExpectedError: Key should be the `<name>$key` type from generated flow
96
89
  // $FlowFixMe[react-rule-hook]
97
- // $FlowFixMe[prop-missing]
90
+ // $FlowFixMe[incompatible-type] Key should be the `<name>$key` type from generated flow
98
91
  useRefetchableFragment(refetchableFragmentInput, fragmentData);
99
92
 
100
93
  // Refetch function options:
@@ -106,12 +99,12 @@ const [, refetch] = useRefetchableFragment(
106
99
  refetchableFragmentInput,
107
100
  keyNonNullable,
108
101
  );
109
- // $FlowExpectedError: internal option
102
+ // $FlowExpectedError[incompatible-type] : internal option
110
103
  refetch(variables, {
111
104
  __environment: environment,
112
105
  });
113
106
 
114
- // $FlowExpectedError: doesn't exist
107
+ // $FlowExpectedError[incompatible-type] : doesn't exist
115
108
  refetch(variables, {
116
109
  NON_EXIST: 'NON_EXIST',
117
110
  });
@@ -32,52 +32,52 @@ declare export var refetchableFragmentInput: RefetchableFragment<
32
32
  declare export opaque type Example_user$fragmentType: FragmentType;
33
33
  export type Example_user$data = NonNullableData;
34
34
  export type Example_user$key = {
35
- +$data?: Example_user$data,
36
- +$fragmentSpreads: Example_user$fragmentType,
35
+ readonly $data?: Example_user$data,
36
+ readonly $fragmentSpreads: Example_user$fragmentType,
37
37
  ...
38
38
  };
39
39
 
40
40
  export type NonNullableData = {
41
- +id: string,
42
- +count: number,
41
+ readonly id: string,
42
+ readonly count: number,
43
43
  };
44
44
  export type NullableData = ?NonNullableData;
45
- export type NonNullablePluralData = $ReadOnlyArray<NonNullableData>;
46
- export type NullablePluralData = ?$ReadOnlyArray<NonNullableData>;
45
+ export type NonNullablePluralData = ReadonlyArray<NonNullableData>;
46
+ export type NullablePluralData = ?ReadonlyArray<NonNullableData>;
47
47
 
48
48
  export type AnotherNonNullableData = {
49
- +name: ?string,
50
- +friends: ?number,
49
+ readonly name: ?string,
50
+ readonly friends: ?number,
51
51
  };
52
52
 
53
53
  declare export var keyNonNullable: Example_user$key;
54
54
 
55
- declare export var keyNonNullablePlural: $ReadOnlyArray<Example_user$key>;
55
+ declare export var keyNonNullablePlural: ReadonlyArray<Example_user$key>;
56
56
 
57
- declare export var keyNullablePlural: ?$ReadOnlyArray<Example_user$key>;
57
+ declare export var keyNullablePlural: ?ReadonlyArray<Example_user$key>;
58
58
 
59
59
  declare export var keyNullable: ?Example_user$key;
60
60
 
61
61
  declare export var keyAnotherNonNullable: {
62
- +$data: AnotherNonNullableData,
63
- +$fragmentSpreads: FragmentType,
62
+ readonly $data: AnotherNonNullableData,
63
+ readonly $fragmentSpreads: FragmentType,
64
64
  ...
65
65
  };
66
66
 
67
67
  declare export var keyAnotherNullable: ?{
68
- +$data: AnotherNonNullableData,
69
- +$fragmentSpreads: FragmentType,
68
+ readonly $data: AnotherNonNullableData,
69
+ readonly $fragmentSpreads: FragmentType,
70
70
  ...
71
71
  };
72
72
 
73
73
  declare export var fragmentData: {
74
- +$fragmentType: FragmentType,
74
+ readonly $fragmentType: FragmentType,
75
75
  ...
76
76
  };
77
77
 
78
78
  export type QueryOperation = {
79
- +variables: QueryVariables,
80
- +response: {...},
79
+ readonly variables: QueryVariables,
80
+ readonly response: {...},
81
81
  };
82
82
 
83
83
  export type QueryVariables = {
@@ -19,8 +19,8 @@ const {ConnectionInterface, getValueAtPath} = require('relay-runtime');
19
19
  function getConnectionState(
20
20
  direction: Direction,
21
21
  fragmentNode: ReaderFragment,
22
- fragmentData: mixed,
23
- connectionPathInFragmentData: $ReadOnlyArray<string | number>,
22
+ fragmentData: unknown,
23
+ connectionPathInFragmentData: ReadonlyArray<string | number>,
24
24
  ): {
25
25
  cursor: ?string,
26
26
  hasMore: boolean,
@@ -45,8 +45,8 @@ export type FragmentResource = FragmentResourceImpl;
45
45
  type FragmentResourceCache = Cache<
46
46
  | {
47
47
  kind: 'pending',
48
- pendingOperations: $ReadOnlyArray<RequestDescriptor>,
49
- promise: Promise<mixed>,
48
+ pendingOperations: ReadonlyArray<RequestDescriptor>,
49
+ promise: Promise<unknown>,
50
50
  result: FragmentResult,
51
51
  }
52
52
  | {kind: 'done', result: FragmentResult}
@@ -63,11 +63,11 @@ interface IMap<K, V> {
63
63
  set(key: K, value: V): IMap<K, V>;
64
64
  }
65
65
 
66
- type SingularOrPluralSnapshot = Snapshot | $ReadOnlyArray<Snapshot>;
66
+ type SingularOrPluralSnapshot = Snapshot | ReadonlyArray<Snapshot>;
67
67
 
68
- opaque type FragmentResult: {data: mixed, ...} = {
68
+ opaque type FragmentResult: {data: unknown, ...} = {
69
69
  cacheKey: string,
70
- data: mixed,
70
+ data: unknown,
71
71
  isMissingData: boolean,
72
72
  snapshot: SingularOrPluralSnapshot | null,
73
73
  storeEpoch: number,
@@ -97,7 +97,7 @@ function hasMissingClientEdges(snapshot: SingularOrPluralSnapshot): boolean {
97
97
 
98
98
  function missingLiveResolverFields(
99
99
  snapshot: SingularOrPluralSnapshot,
100
- ): ?$ReadOnlyArray<DataID> {
100
+ ): ?ReadonlyArray<DataID> {
101
101
  if (Array.isArray(snapshot)) {
102
102
  return snapshot
103
103
  .map(s => s.missingLiveResolverFields)
@@ -217,7 +217,7 @@ class FragmentResourceImpl {
217
217
  */
218
218
  read(
219
219
  fragmentNode: ReaderFragment,
220
- fragmentRef: mixed,
220
+ fragmentRef: unknown,
221
221
  componentDisplayName: string,
222
222
  fragmentKey?: string,
223
223
  ): FragmentResult {
@@ -237,7 +237,7 @@ class FragmentResourceImpl {
237
237
  */
238
238
  readWithIdentifier(
239
239
  fragmentNode: ReaderFragment,
240
- fragmentRef: mixed,
240
+ fragmentRef: unknown,
241
241
  fragmentIdentifier: string,
242
242
  componentDisplayName: string,
243
243
  fragmentKey?: ?string,
@@ -307,7 +307,7 @@ class FragmentResourceImpl {
307
307
  !missingLiveResolverFields(cachedValue.result.snapshot)?.length
308
308
  ) {
309
309
  this._throwOrLogErrorsInSnapshot(
310
- // $FlowFixMe[incompatible-call]
310
+ // $FlowFixMe[incompatible-type]
311
311
  cachedValue.result.snapshot,
312
312
  );
313
313
 
@@ -527,7 +527,7 @@ class FragmentResourceImpl {
527
527
  _performClientEdgeQuery(
528
528
  queryResource: QueryResource,
529
529
  fragmentNode: ReaderFragment,
530
- fragmentRef: mixed,
530
+ fragmentRef: unknown,
531
531
  request: ConcreteRequest,
532
532
  clientEdgeDestinationID: DataID,
533
533
  ): {queryResult: QueryResult, requestDescriptor: RequestDescriptor} {
@@ -568,7 +568,7 @@ class FragmentResourceImpl {
568
568
 
569
569
  readSpec(
570
570
  fragmentNodes: {[string]: ReaderFragment, ...},
571
- fragmentRefs: {[string]: mixed, ...},
571
+ fragmentRefs: {[string]: unknown, ...},
572
572
  componentDisplayName: string,
573
573
  ): {[string]: FragmentResult, ...} {
574
574
  const result: {[string]: FragmentResult} = {};
@@ -804,7 +804,7 @@ class FragmentResourceImpl {
804
804
  fragmentResult: FragmentResult,
805
805
  ): {
806
806
  promise: Promise<void>,
807
- pendingOperations: $ReadOnlyArray<RequestDescriptor>,
807
+ pendingOperations: ReadonlyArray<RequestDescriptor>,
808
808
  } | null {
809
809
  const pendingOperationsResult = getPendingOperationsForFragment(
810
810
  this._environment,
@@ -840,7 +840,7 @@ class FragmentResourceImpl {
840
840
 
841
841
  _updatePluralSnapshot(
842
842
  cacheKey: string,
843
- baseSnapshots: $ReadOnlyArray<Snapshot>,
843
+ baseSnapshots: ReadonlyArray<Snapshot>,
844
844
  latestSnapshot: Snapshot,
845
845
  idx: number,
846
846
  storeEpoch: number,
@@ -31,7 +31,9 @@ type RefetchVariables<TVariables, TKey> =
31
31
  // NOTE: This type ensures that the type of the variables is either:
32
32
  // - nullable if the provided ref type is non-nullable
33
33
  // - non-nullable if the provided ref type is nullable, and the caller need to provide the full set of variables
34
- [+key: TKey] extends [+key: {+$fragmentSpreads: mixed, ...}]
34
+ [readonly key: TKey] extends [
35
+ readonly key: {readonly $fragmentSpreads: unknown, ...},
36
+ ]
35
37
  ? Partial<TVariables>
36
38
  : TVariables;
37
39
 
@@ -49,7 +51,9 @@ type ReturnType<TVariables, TData, TKey> = {
49
51
  // NOTE: This rtpw ensures that the type of the returned data is either:
50
52
  // - nullable if the provided ref type is nullable
51
53
  // - non-nullable if the provided ref type is non-nullable
52
- data: [+key: TKey] extends [+key: {+$fragmentSpreads: mixed, ...}]
54
+ data: [readonly key: TKey] extends [
55
+ readonly key: {readonly $fragmentSpreads: unknown, ...},
56
+ ]
53
57
  ? TData
54
58
  : ?TData,
55
59
  loadNext: LoadMoreFn<TVariables>,
@@ -60,10 +64,10 @@ type ReturnType<TVariables, TData, TKey> = {
60
64
  };
61
65
 
62
66
  hook useBlockingPaginationFragment<
63
- TFragmentType: FragmentType,
64
- TVariables: Variables,
67
+ TFragmentType extends FragmentType,
68
+ TVariables extends Variables,
65
69
  TData,
66
- TKey: ?{+$fragmentSpreads: TFragmentType, ...},
70
+ TKey extends ?{readonly $fragmentSpreads: TFragmentType, ...},
67
71
  >(
68
72
  fragmentInput: RefetchableFragment<TFragmentType, TData, TVariables>,
69
73
  parentFragmentRef: TKey,
@@ -99,7 +103,7 @@ hook useBlockingPaginationFragment<
99
103
  variables: TVariables,
100
104
  },
101
105
  {
102
- +$data: mixed,
106
+ readonly $data: unknown,
103
107
  ...
104
108
  },
105
109
  >(fragmentNode, parentFragmentRef, componentDisplayName);
@@ -143,33 +147,34 @@ hook useBlockingPaginationFragment<
143
147
  disposeFetchNext();
144
148
  disposeFetchPrevious();
145
149
  // $FlowFixMe[incompatible-variance]
150
+ // $FlowFixMe[incompatible-type]
146
151
  return refetch(variables, {...options, __environment: undefined});
147
152
  },
148
153
  [disposeFetchNext, disposeFetchPrevious, refetch],
149
154
  );
150
155
 
151
156
  return {
152
- // $FlowFixMe[incompatible-cast]
153
- // $FlowFixMe[incompatible-return]
154
- data: (fragmentData: TData),
155
- loadNext,
156
- loadPrevious,
157
+ // $FlowFixMe[incompatible-type]
158
+ // $FlowFixMe[incompatible-type]
159
+ data: fragmentData as TData,
157
160
  hasNext,
158
161
  hasPrevious,
162
+ loadNext,
163
+ loadPrevious,
159
164
  refetch: refetchPagination,
160
165
  };
161
166
  }
162
167
 
163
- hook useLoadMore<TVariables: Variables>(args: {
168
+ hook useLoadMore<TVariables extends Variables>(args: {
164
169
  disableStoreUpdates: () => void,
165
170
  enableStoreUpdates: () => void,
166
171
  ...$Exact<Omit<UseLoadMoreFunctionArgs, 'observer' | 'onReset'>>,
167
172
  }): [LoadMoreFn<TVariables>, boolean, () => void] {
168
173
  const {disableStoreUpdates, enableStoreUpdates, ...loadMoreArgs} = args;
169
- const [requestPromise, setRequestPromise] = useState<null | Promise<mixed>>(
174
+ const [requestPromise, setRequestPromise] = useState<null | Promise<unknown>>(
170
175
  null,
171
176
  );
172
- const requestPromiseRef = useRef<null | Promise<mixed>>(null);
177
+ const requestPromiseRef = useRef<null | Promise<unknown>>(null);
173
178
  const promiseResolveRef = useRef<null | (() => void)>(null);
174
179
 
175
180
  const promiseResolve = () => {
@@ -185,6 +190,15 @@ hook useLoadMore<TVariables: Variables>(args: {
185
190
 
186
191
  const observer = {
187
192
  complete: promiseResolve,
193
+ // TODO: Handle error; we probably don't want to throw an error
194
+ // and blow away the whole list of items.
195
+ error: promiseResolve,
196
+ // NOTE: Since streaming is disallowed with this hook, this means that the
197
+ // first payload will always contain the entire next page of items,
198
+ // while subsequent paylaods will contain @defer'd payloads.
199
+ // This allows us to unsuspend here, on the first payload, and allow
200
+ // descendant components to suspend on their respective @defer payloads
201
+ next: promiseResolve,
188
202
  // NOTE: loadMore is a no-op if a request is already in flight, so we
189
203
  // can safely assume that `start` will only be called once while a
190
204
  // request is in flight.
@@ -203,17 +217,6 @@ hook useLoadMore<TVariables: Variables>(args: {
203
217
  requestPromiseRef.current = promise;
204
218
  setRequestPromise(promise);
205
219
  },
206
-
207
- // NOTE: Since streaming is disallowed with this hook, this means that the
208
- // first payload will always contain the entire next page of items,
209
- // while subsequent paylaods will contain @defer'd payloads.
210
- // This allows us to unsuspend here, on the first payload, and allow
211
- // descendant components to suspend on their respective @defer payloads
212
- next: promiseResolve,
213
-
214
- // TODO: Handle error; we probably don't want to throw an error
215
- // and blow away the whole list of items.
216
- error: promiseResolve,
217
220
  };
218
221
  const [loadMore, hasMore, disposeFetch] = useLoadMoreFunction<TVariables>({
219
222
  ...loadMoreArgs,
@@ -20,15 +20,15 @@ const {useEffect, useState} = require('react');
20
20
  const {RelayFeatureFlags, getFragmentIdentifier} = require('relay-runtime');
21
21
  const warning = require('warning');
22
22
 
23
- type ReturnType<TFragmentData: mixed> = {
23
+ type ReturnType<TFragmentData extends unknown> = {
24
24
  data: TFragmentData,
25
25
  disableStoreUpdates: () => void,
26
26
  enableStoreUpdates: () => void,
27
27
  };
28
28
 
29
- hook useFragmentNode<TFragmentData: mixed>(
29
+ hook useFragmentNode<TFragmentData extends unknown>(
30
30
  fragmentNode: ReaderFragment,
31
- fragmentRef: mixed,
31
+ fragmentRef: unknown,
32
32
  componentDisplayName: string,
33
33
  ): ReturnType<TFragmentData> {
34
34
  const environment = useRelayEnvironment();
@@ -123,7 +123,7 @@ hook useFragmentNode<TFragmentData: mixed>(
123
123
  }
124
124
 
125
125
  return {
126
- // $FlowFixMe[incompatible-return]
126
+ // $FlowFixMe[incompatible-type]
127
127
  data: fragmentResult.data,
128
128
  disableStoreUpdates,
129
129
  enableStoreUpdates,