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.
- package/ReactRelayContext.js +1 -1
- package/ReactRelayContext.js.flow +2 -2
- package/ReactRelayFragmentContainer.js.flow +8 -9
- package/ReactRelayLocalQueryRenderer.js.flow +11 -3
- package/ReactRelayLoggingContext.js.flow +3 -3
- package/ReactRelayPaginationContainer.js.flow +32 -25
- package/ReactRelayQueryFetcher.js.flow +1 -1
- package/ReactRelayQueryRenderer.js.flow +2 -2
- package/ReactRelayQueryRendererContext.js.flow +2 -2
- package/ReactRelayRefetchContainer.js.flow +17 -14
- package/ReactRelayTestMocker.js.flow +10 -10
- package/ReactRelayTypes.d.ts +377 -0
- package/ReactRelayTypes.js.flow +47 -43
- package/RelayContext.js.flow +3 -3
- package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +11 -11
- package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +5 -5
- package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +5 -5
- package/__flowtests__/RelayModern-flowtest.js.flow +32 -32
- package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +1 -1
- package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +3 -4
- package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +3 -4
- package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +9 -10
- package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +4 -5
- package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +9 -10
- package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +4 -5
- package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +3 -4
- package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +3 -4
- package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +3 -4
- package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +5 -6
- package/buildReactRelayContainer.js.flow +5 -5
- package/getRootVariablesForFragments.js.flow +1 -1
- package/hooks.d.ts +89 -0
- package/hooks.js +1 -1
- package/hooks.js.flow +23 -8
- package/index.d.ts +9 -0
- package/index.js +1 -1
- package/index.js.flow +40 -14
- package/isRelayEnvironment.js.flow +1 -1
- package/jest-react/internalAct.js.flow +1 -1
- package/legacy.d.ts +143 -0
- package/legacy.js +1 -1
- package/legacy.js.flow +32 -13
- package/lib/ReactRelayFragmentContainer.js +1 -1
- package/lib/ReactRelayPaginationContainer.js +8 -8
- package/lib/ReactRelayRefetchContainer.js +8 -8
- package/lib/ReactRelayTestMocker.js +5 -5
- package/lib/hooks.js +18 -8
- package/lib/index.js +30 -14
- package/lib/legacy.js +26 -13
- package/lib/relay-hooks/legacy/useBlockingPaginationFragment.js +5 -5
- package/lib/relay-hooks/legacy/useRefetchableFragmentNode.js +34 -34
- package/lib/relay-hooks/loadEntryPoint.js +2 -2
- package/lib/relay-hooks/loadQuery.js +14 -14
- package/lib/relay-hooks/preloadQuery_DEPRECATED.js +10 -10
- package/lib/relay-hooks/readFragmentInternal.js +6 -6
- package/lib/relay-hooks/rsc/serverFetchQuery.js +20 -0
- package/lib/relay-hooks/rsc/serverPreloadQuery.js +31 -0
- package/lib/relay-hooks/rsc/serverReadFragment.js +15 -0
- package/lib/relay-hooks/rsc/useQueryFromServer.js +62 -0
- package/lib/relay-hooks/useFragmentInternal_CURRENT.js +49 -25
- package/lib/relay-hooks/useFragmentInternal_EXPERIMENTAL.js +81 -44
- package/lib/relay-hooks/useLazyLoadQueryNode.js +32 -19
- package/lib/relay-hooks/useMutation.js +6 -14
- package/lib/relay-hooks/useMutationAction_EXPERIMENTAL.js +26 -0
- package/lib/relay-hooks/usePreloadedQuery.js +52 -47
- package/lib/relay-hooks/useQueryLoader.js +2 -2
- package/lib/relay-hooks/useQueryLoader_EXPERIMENTAL.js +2 -2
- package/lib/relay-hooks/useRefetchableFragmentInternal.js +31 -31
- package/lib/rsc-client_EXPERIMENTAL.js +7 -0
- package/lib/rsc_EXPERIMENTAL.js +43 -0
- package/multi-actor/ActorChange.js.flow +1 -1
- package/package.json +3 -2
- package/relay-hooks/EntryPointContainer.react.d.ts +22 -0
- package/relay-hooks/EntryPointContainer.react.js.flow +6 -6
- package/relay-hooks/EntryPointTypes.flow.js.flow +106 -108
- package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +23 -21
- package/relay-hooks/MatchContainer.d.ts +95 -0
- package/relay-hooks/MatchContainer.js.flow +17 -11
- package/relay-hooks/NestedRelayEntryPointBuilderUtils.js.flow +3 -9
- package/relay-hooks/ProfilerContext.d.ts +18 -0
- package/relay-hooks/QueryResource.js.flow +9 -9
- package/relay-hooks/RelayEnvironmentProvider.d.ts +16 -0
- package/relay-hooks/RelayEnvironmentProvider.js.flow +2 -2
- package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +6 -6
- package/relay-hooks/__flowtests__/EntryPointTypes/ExtractQueryTypes-flowtest.js.flow +50 -3
- package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +9 -9
- package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +3 -4
- package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +5 -6
- package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +27 -32
- package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +25 -25
- package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +26 -32
- package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +23 -30
- package/relay-hooks/__flowtests__/utils.js.flow +17 -17
- package/relay-hooks/getConnectionState.js.flow +2 -2
- package/relay-hooks/legacy/FragmentResource.js.flow +13 -13
- package/relay-hooks/legacy/useBlockingPaginationFragment.js.flow +28 -25
- package/relay-hooks/legacy/useFragmentNode.js.flow +4 -4
- package/relay-hooks/legacy/useRefetchableFragmentNode.js.flow +79 -81
- package/relay-hooks/loadEntryPoint.d.ts +14 -0
- package/relay-hooks/loadEntryPoint.js.flow +15 -13
- package/relay-hooks/loadQuery.d.ts +20 -0
- package/relay-hooks/loadQuery.js.flow +19 -19
- package/relay-hooks/preloadQuery_DEPRECATED.js.flow +16 -13
- package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +7 -7
- package/relay-hooks/readFragmentInternal.js.flow +11 -11
- package/relay-hooks/rsc/serverFetchQuery.js.flow +31 -0
- package/relay-hooks/rsc/serverPreloadQuery.js.flow +69 -0
- package/relay-hooks/rsc/serverReadFragment.js.flow +33 -0
- package/relay-hooks/rsc/useQueryFromServer.js.flow +135 -0
- package/relay-hooks/useClientQuery.d.ts +16 -0
- package/relay-hooks/useClientQuery.js.flow +2 -2
- package/relay-hooks/useEntryPointLoader.d.ts +21 -0
- package/relay-hooks/useEntryPointLoader.js.flow +11 -11
- package/relay-hooks/useFragment.d.ts +36 -0
- package/relay-hooks/useFragment.js.flow +8 -8
- package/relay-hooks/useFragmentInternal.js.flow +1 -1
- package/relay-hooks/useFragmentInternal_CURRENT.js.flow +54 -22
- package/relay-hooks/useFragmentInternal_EXPERIMENTAL.js.flow +95 -46
- package/relay-hooks/useIsOperationNodeActive.js.flow +1 -1
- package/relay-hooks/useIsParentQueryActive.js.flow +5 -1
- package/relay-hooks/useLazyLoadQuery.d.ts +19 -0
- package/relay-hooks/useLazyLoadQuery.js.flow +14 -7
- package/relay-hooks/useLazyLoadQueryNode.js.flow +67 -28
- package/relay-hooks/useLoadMoreFunction.d.ts +56 -0
- package/relay-hooks/useLoadMoreFunction.js.flow +7 -6
- package/relay-hooks/useLoadMoreFunction_EXPERIMENTAL.js.flow +5 -5
- package/relay-hooks/useMemoVariables.js.flow +1 -1
- package/relay-hooks/useMutation.d.ts +36 -0
- package/relay-hooks/useMutation.js.flow +9 -17
- package/relay-hooks/useMutationAction_EXPERIMENTAL.js.flow +68 -0
- package/relay-hooks/usePaginationFragment.d.ts +33 -0
- package/relay-hooks/usePaginationFragment.js.flow +19 -11
- package/relay-hooks/usePrefetchableForwardPaginationFragment.js.flow +23 -18
- package/relay-hooks/usePrefetchableForwardPaginationFragment_EXPERIMENTAL.js.flow +23 -18
- package/relay-hooks/usePreloadedQuery.d.ts +17 -0
- package/relay-hooks/usePreloadedQuery.js.flow +119 -85
- package/relay-hooks/useQueryLoader.d.ts +33 -0
- package/relay-hooks/useQueryLoader.js.flow +28 -24
- package/relay-hooks/useQueryLoader_EXPERIMENTAL.js.flow +10 -10
- package/relay-hooks/useRefetchableFragment.d.ts +23 -0
- package/relay-hooks/useRefetchableFragment.js.flow +20 -11
- package/relay-hooks/useRefetchableFragmentInternal.js.flow +77 -79
- package/relay-hooks/useRelayEnvironment.d.ts +10 -0
- package/relay-hooks/useRelayLoggingContext.js.flow +1 -1
- package/relay-hooks/useSubscribeToInvalidationState.d.ts +19 -0
- package/relay-hooks/useSubscribeToInvalidationState.js.flow +1 -1
- package/relay-hooks/useSubscription.d.ts +14 -0
- package/relay-hooks/useSubscription.js.flow +1 -1
- package/rsc-client_EXPERIMENTAL.d.ts +17 -0
- package/rsc-client_EXPERIMENTAL.js +10 -0
- package/rsc-client_EXPERIMENTAL.js.flow +23 -0
- package/rsc_EXPERIMENTAL.d.ts +48 -0
- package/rsc_EXPERIMENTAL.js +10 -0
- 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-
|
|
35
|
+
// $FlowFixMe[incompatible-type]
|
|
36
36
|
// $FlowFixMe[incompatible-exact]
|
|
37
37
|
// $FlowFixMe[react-rule-hook]
|
|
38
|
-
|
|
38
|
+
useRefetchableFragment(refetchableFragmentInput, keyNonNullable) as [
|
|
39
39
|
NonNullableData,
|
|
40
40
|
FetchFn<QueryVariablesSubset>,
|
|
41
|
-
]
|
|
41
|
+
];
|
|
42
42
|
|
|
43
43
|
// $FlowFixMe[react-rule-hook]
|
|
44
|
-
|
|
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
|
-
|
|
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[
|
|
61
|
-
|
|
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-
|
|
65
|
+
// $FlowFixMe[incompatible-type]
|
|
69
66
|
// $FlowFixMe[incompatible-exact]
|
|
70
67
|
// $FlowFixMe[prop-missing]
|
|
71
|
-
// $FlowFixMe[incompatible-
|
|
72
|
-
|
|
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-
|
|
80
|
-
|
|
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[
|
|
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[
|
|
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[
|
|
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
|
-
|
|
36
|
-
|
|
35
|
+
readonly $data?: Example_user$data,
|
|
36
|
+
readonly $fragmentSpreads: Example_user$fragmentType,
|
|
37
37
|
...
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
export type NonNullableData = {
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
readonly id: string,
|
|
42
|
+
readonly count: number,
|
|
43
43
|
};
|
|
44
44
|
export type NullableData = ?NonNullableData;
|
|
45
|
-
export type NonNullablePluralData =
|
|
46
|
-
export type NullablePluralData =
|
|
45
|
+
export type NonNullablePluralData = ReadonlyArray<NonNullableData>;
|
|
46
|
+
export type NullablePluralData = ?ReadonlyArray<NonNullableData>;
|
|
47
47
|
|
|
48
48
|
export type AnotherNonNullableData = {
|
|
49
|
-
|
|
50
|
-
|
|
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:
|
|
55
|
+
declare export var keyNonNullablePlural: ReadonlyArray<Example_user$key>;
|
|
56
56
|
|
|
57
|
-
declare export var keyNullablePlural:
|
|
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
|
-
|
|
63
|
-
|
|
62
|
+
readonly $data: AnotherNonNullableData,
|
|
63
|
+
readonly $fragmentSpreads: FragmentType,
|
|
64
64
|
...
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
declare export var keyAnotherNullable: ?{
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
readonly $data: AnotherNonNullableData,
|
|
69
|
+
readonly $fragmentSpreads: FragmentType,
|
|
70
70
|
...
|
|
71
71
|
};
|
|
72
72
|
|
|
73
73
|
declare export var fragmentData: {
|
|
74
|
-
|
|
74
|
+
readonly $fragmentType: FragmentType,
|
|
75
75
|
...
|
|
76
76
|
};
|
|
77
77
|
|
|
78
78
|
export type QueryOperation = {
|
|
79
|
-
|
|
80
|
-
|
|
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:
|
|
23
|
-
connectionPathInFragmentData:
|
|
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:
|
|
49
|
-
promise: Promise<
|
|
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 |
|
|
66
|
+
type SingularOrPluralSnapshot = Snapshot | ReadonlyArray<Snapshot>;
|
|
67
67
|
|
|
68
|
-
opaque type FragmentResult: {data:
|
|
68
|
+
opaque type FragmentResult: {data: unknown, ...} = {
|
|
69
69
|
cacheKey: string,
|
|
70
|
-
data:
|
|
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
|
-
):
|
|
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:
|
|
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:
|
|
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-
|
|
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:
|
|
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]:
|
|
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:
|
|
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:
|
|
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
|
-
[
|
|
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: [
|
|
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
|
|
64
|
-
TVariables
|
|
67
|
+
TFragmentType extends FragmentType,
|
|
68
|
+
TVariables extends Variables,
|
|
65
69
|
TData,
|
|
66
|
-
TKey
|
|
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
|
-
|
|
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-
|
|
153
|
-
// $FlowFixMe[incompatible-
|
|
154
|
-
data:
|
|
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
|
|
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<
|
|
174
|
+
const [requestPromise, setRequestPromise] = useState<null | Promise<unknown>>(
|
|
170
175
|
null,
|
|
171
176
|
);
|
|
172
|
-
const requestPromiseRef = useRef<null | Promise<
|
|
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
|
|
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
|
|
29
|
+
hook useFragmentNode<TFragmentData extends unknown>(
|
|
30
30
|
fragmentNode: ReaderFragment,
|
|
31
|
-
fragmentRef:
|
|
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-
|
|
126
|
+
// $FlowFixMe[incompatible-type]
|
|
127
127
|
data: fragmentResult.data,
|
|
128
128
|
disableStoreUpdates,
|
|
129
129
|
enableStoreUpdates,
|