react-relay 16.2.0 → 18.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/ReactRelayContainerUtils.js.flow +2 -2
- package/ReactRelayContext.js +1 -1
- package/ReactRelayContext.js.flow +1 -1
- package/ReactRelayFragmentContainer.js.flow +10 -8
- package/ReactRelayLocalQueryRenderer.js.flow +4 -1
- package/ReactRelayPaginationContainer.js.flow +4 -2
- package/ReactRelayQueryRenderer.js.flow +2 -2
- package/ReactRelayQueryRendererContext.js.flow +1 -1
- package/ReactRelayRefetchContainer.js.flow +2 -2
- package/ReactRelayTypes.js.flow +45 -18
- package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +2 -2
- package/buildReactRelayContainer.js.flow +10 -8
- package/getRootVariablesForFragments.js.flow +1 -0
- package/hooks.js +1 -1
- package/index.js +1 -1
- package/legacy.js +1 -1
- package/lib/ReactRelayFragmentContainer.js +2 -2
- package/lib/buildReactRelayContainer.js +3 -3
- package/lib/relay-hooks/legacy/FragmentResource.js +14 -16
- package/lib/relay-hooks/loadEntryPoint.js +8 -5
- package/lib/relay-hooks/loadQuery.js +2 -14
- package/lib/relay-hooks/{experimental/readFragmentInternal_EXPERIMENTAL.js → readFragmentInternal.js} +7 -5
- package/lib/relay-hooks/useEntryPointLoader.js +5 -8
- package/lib/relay-hooks/useFragment.js +7 -20
- package/lib/relay-hooks/useFragmentInternal.js +13 -0
- package/lib/relay-hooks/{experimental/useFragmentInternal_EXPERIMENTAL.js → useFragmentInternal_CURRENT.js} +12 -18
- package/lib/relay-hooks/useFragmentInternal_EXPERIMENTAL.js +520 -0
- package/lib/relay-hooks/useLazyLoadQuery.js +2 -5
- package/lib/relay-hooks/useLazyLoadQueryNode.js +2 -13
- package/lib/relay-hooks/usePaginationFragment.js +17 -13
- package/lib/relay-hooks/usePreloadedQuery.js +6 -9
- package/lib/relay-hooks/useQueryLoader.js +1 -3
- package/lib/relay-hooks/useRefetchableFragment.js +3 -12
- package/lib/relay-hooks/{experimental/useRefetchableFragmentInternal_EXPERIMENTAL.js → useRefetchableFragmentInternal.js} +7 -7
- package/multi-actor/ActorChange.js.flow +1 -1
- package/multi-actor/useRelayActorEnvironment.js.flow +1 -1
- package/package.json +3 -3
- package/react-relay-hooks.js +2 -2
- package/react-relay-hooks.min.js +2 -2
- package/react-relay-legacy.js +2 -2
- package/react-relay-legacy.min.js +2 -2
- package/react-relay.js +2 -2
- package/react-relay.min.js +2 -2
- package/relay-hooks/EntryPointTypes.flow.js.flow +49 -25
- package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +22 -5
- package/relay-hooks/MatchContainer.js.flow +1 -1
- package/relay-hooks/ProfilerContext.js.flow +1 -1
- package/relay-hooks/__flowtests__/EntryPointTypes/ExtractQueryTypes-flowtest.js.flow +43 -0
- package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +21 -0
- package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +19 -0
- package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +22 -0
- package/relay-hooks/legacy/FragmentResource.js.flow +13 -16
- package/relay-hooks/legacy/useBlockingPaginationFragment.js.flow +2 -2
- package/relay-hooks/legacy/useFragmentNode.js.flow +1 -1
- package/relay-hooks/legacy/useRefetchableFragmentNode.js.flow +2 -2
- package/relay-hooks/loadEntryPoint.js.flow +10 -4
- package/relay-hooks/loadQuery.js.flow +10 -33
- package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +4 -1
- package/relay-hooks/{experimental/readFragmentInternal_EXPERIMENTAL.js.flow → readFragmentInternal.js.flow} +6 -4
- package/relay-hooks/useClientQuery.js.flow +1 -1
- package/relay-hooks/useEntryPointLoader.js.flow +4 -5
- package/relay-hooks/useFetchTrackingRef.js.flow +1 -1
- package/relay-hooks/useFragment.js.flow +8 -25
- package/relay-hooks/useFragmentInternal.js.flow +45 -0
- package/relay-hooks/{experimental/useFragmentInternal_EXPERIMENTAL.js.flow → useFragmentInternal_CURRENT.js.flow} +14 -5
- package/relay-hooks/useFragmentInternal_EXPERIMENTAL.js.flow +764 -0
- package/relay-hooks/useIsMountedRef.js.flow +1 -1
- package/relay-hooks/useIsOperationNodeActive.js.flow +1 -1
- package/relay-hooks/useIsParentQueryActive.js.flow +5 -2
- package/relay-hooks/useLazyLoadQuery.js.flow +3 -7
- package/relay-hooks/useLazyLoadQueryNode.js.flow +3 -19
- package/relay-hooks/useLoadMoreFunction.js.flow +1 -1
- package/relay-hooks/useMemoOperationDescriptor.js.flow +1 -1
- package/relay-hooks/useMemoVariables.js.flow +1 -1
- package/relay-hooks/useMutation.js.flow +1 -1
- package/relay-hooks/usePaginationFragment.js.flow +62 -50
- package/relay-hooks/usePreloadedQuery.js.flow +2 -6
- package/relay-hooks/useQueryLoader.js.flow +3 -7
- package/relay-hooks/useRefetchableFragment.js.flow +7 -37
- package/relay-hooks/{experimental/useRefetchableFragmentInternal_EXPERIMENTAL.js.flow → useRefetchableFragmentInternal.js.flow} +11 -11
- package/relay-hooks/useRelayEnvironment.js.flow +1 -1
- package/relay-hooks/useStaticFragmentNodeWarning.js.flow +3 -1
- package/relay-hooks/useSubscribeToInvalidationState.js.flow +1 -1
- package/relay-hooks/useSubscription.js.flow +1 -1
- package/relay-hooks/useUnsafeRef_DEPRECATED.js.flow +1 -1
- package/lib/relay-hooks/HooksImplementation.js +0 -15
- package/lib/relay-hooks/experimental/useFragment_EXPERIMENTAL.js +0 -26
- package/lib/relay-hooks/experimental/usePaginationFragment_EXPERIMENTAL.js +0 -127
- package/lib/relay-hooks/experimental/useRefetchableFragment_EXPERIMENTAL.js +0 -23
- package/relay-hooks/HooksImplementation.js.flow +0 -45
- package/relay-hooks/experimental/useFragment_EXPERIMENTAL.js.flow +0 -72
- package/relay-hooks/experimental/usePaginationFragment_EXPERIMENTAL.js.flow +0 -161
- package/relay-hooks/experimental/useRefetchableFragment_EXPERIMENTAL.js.flow +0 -49
@@ -0,0 +1,43 @@
|
|
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
|
+
* @flow strict-local
|
8
|
+
* @format
|
9
|
+
* @oncall relay
|
10
|
+
*/
|
11
|
+
|
12
|
+
'use strict';
|
13
|
+
|
14
|
+
import type {
|
15
|
+
EnvironmentProviderOptions,
|
16
|
+
ExtractQueryTypes,
|
17
|
+
PreloadedQuery,
|
18
|
+
} from '../../EntryPointTypes.flow';
|
19
|
+
|
20
|
+
type Query = {
|
21
|
+
+variables: {foo: string, bar: number},
|
22
|
+
+response: mixed,
|
23
|
+
+rawResponse?: {...},
|
24
|
+
};
|
25
|
+
|
26
|
+
const _good: ExtractQueryTypes<
|
27
|
+
EnvironmentProviderOptions,
|
28
|
+
{root: PreloadedQuery<Query>},
|
29
|
+
>['root']['variables'] = {
|
30
|
+
foo: 'bar',
|
31
|
+
bar: 3,
|
32
|
+
};
|
33
|
+
|
34
|
+
const _bad: ExtractQueryTypes<
|
35
|
+
EnvironmentProviderOptions,
|
36
|
+
{root: PreloadedQuery<Query>},
|
37
|
+
// $FlowExpectedError[prop-missing]
|
38
|
+
>['root']['variables'] = {
|
39
|
+
memebers_are_checked: true,
|
40
|
+
// $FlowExpectedError[incompatible-type]
|
41
|
+
foo: 1,
|
42
|
+
bar: 3,
|
43
|
+
};
|
@@ -47,23 +47,32 @@ type ExpectedReturnType<
|
|
47
47
|
// Nullability of returned data type is correct
|
48
48
|
// $FlowFixMe[prop-missing]
|
49
49
|
// $FlowFixMe[incompatible-cast]
|
50
|
+
// $FlowFixMe[incompatible-exact]
|
51
|
+
// $FlowFixMe[react-rule-hook]
|
50
52
|
(useBlockingPaginationFragment(
|
51
53
|
refetchableFragmentInput,
|
52
54
|
keyNonNullable,
|
53
55
|
): ExpectedReturnType<QueryVariablesSubset, QueryVariables, NonNullableData>);
|
54
56
|
|
57
|
+
// $FlowFixMe[react-rule-hook]
|
55
58
|
(useBlockingPaginationFragment(
|
56
59
|
refetchableFragmentInput,
|
57
60
|
keyNullable,
|
58
61
|
): ExpectedReturnType<QueryVariables, QueryVariables, NullableData>);
|
59
62
|
|
60
63
|
// $FlowExpectedError: can't cast nullable to non-nullable
|
64
|
+
// $FlowFixMe[react-rule-hook]
|
65
|
+
// $FlowFixMe[incompatible-cast]
|
61
66
|
(useBlockingPaginationFragment(
|
62
67
|
refetchableFragmentInput,
|
63
68
|
keyNullable,
|
64
69
|
): ExpectedReturnType<QueryVariables, QueryVariables, NonNullableData>);
|
65
70
|
|
66
71
|
// $FlowExpectedError: actual type of returned data is correct
|
72
|
+
// $FlowFixMe[react-rule-hook]
|
73
|
+
// $FlowFixMe[incompatible-exact]
|
74
|
+
// $FlowFixMe[prop-missing]
|
75
|
+
// $FlowFixMe[incompatible-cast]
|
67
76
|
(useBlockingPaginationFragment(
|
68
77
|
refetchableFragmentInput,
|
69
78
|
// $FlowExpectedError[incompatible-call]
|
@@ -71,6 +80,7 @@ type ExpectedReturnType<
|
|
71
80
|
): ExpectedReturnType<QueryVariables, QueryVariablesSubset, NonNullableData>);
|
72
81
|
|
73
82
|
// $FlowExpectedError[incompatible-call] `Example_user$fragmentType` is incompatible with `FragmentType`
|
83
|
+
// $FlowFixMe[react-rule-hook]
|
74
84
|
(useBlockingPaginationFragment(
|
75
85
|
refetchableFragmentInput,
|
76
86
|
// $FlowExpectedError[incompatible-call]
|
@@ -78,18 +88,28 @@ type ExpectedReturnType<
|
|
78
88
|
): ExpectedReturnType<QueryVariables, QueryVariables, NullableData>);
|
79
89
|
|
80
90
|
// $FlowExpectedError: Key should not be a user provided object
|
91
|
+
// $FlowFixMe[react-rule-hook]
|
92
|
+
// $FlowFixMe[prop-missing]
|
93
|
+
// $FlowFixMe[cannot-resolve-name]
|
81
94
|
useBlockingPaginationFragment(fragmentInput, {abc: 123});
|
82
95
|
|
83
96
|
// $FlowExpectedError: Key should not be an empty object
|
97
|
+
// $FlowFixMe[react-rule-hook]
|
98
|
+
// $FlowFixMe[prop-missing]
|
99
|
+
// $FlowFixMe[cannot-resolve-name]
|
84
100
|
useBlockingPaginationFragment(fragmentInput, {});
|
85
101
|
|
86
102
|
// $FlowExpectedError: Key should be the `<name>$key` type from generated flow
|
103
|
+
// $FlowFixMe[react-rule-hook]
|
104
|
+
// $FlowFixMe[prop-missing]
|
105
|
+
// $FlowFixMe[cannot-resolve-name]
|
87
106
|
useBlockingPaginationFragment(fragmentInput, fragmentData);
|
88
107
|
|
89
108
|
// Refetch function options:
|
90
109
|
declare var variables: QueryVariables;
|
91
110
|
declare var environment: IEnvironment;
|
92
111
|
|
112
|
+
// $FlowFixMe[react-rule-hook]
|
93
113
|
const {refetch} = useBlockingPaginationFragment(
|
94
114
|
refetchableFragmentInput,
|
95
115
|
keyNonNullable,
|
@@ -108,6 +128,7 @@ refetch(variables, {
|
|
108
128
|
declare var extraVariables: {nickname: string};
|
109
129
|
declare var invalidVariables: {foo: string};
|
110
130
|
|
131
|
+
// $FlowFixMe[react-rule-hook]
|
111
132
|
const {loadNext} = useBlockingPaginationFragment(
|
112
133
|
refetchableFragmentInput,
|
113
134
|
keyNonNullable,
|
@@ -49,29 +49,40 @@ type ExpectedReturnType<
|
|
49
49
|
// Nullability of returned data type is correct
|
50
50
|
// $FlowFixMe[prop-missing]
|
51
51
|
// $FlowFixMe[incompatible-cast]
|
52
|
+
// $FlowFixMe[incompatible-exact]
|
53
|
+
// $FlowFixMe[react-rule-hook]
|
52
54
|
(usePaginationFragment(
|
53
55
|
refetchableFragmentInput,
|
54
56
|
keyNonNullable,
|
55
57
|
): ExpectedReturnType<QueryVariablesSubset, QueryVariables, NonNullableData>);
|
56
58
|
|
59
|
+
// $FlowFixMe[react-rule-hook]
|
57
60
|
(usePaginationFragment(
|
58
61
|
refetchableFragmentInput,
|
59
62
|
keyNullable,
|
60
63
|
): ExpectedReturnType<QueryVariables, QueryVariables, NullableData>);
|
61
64
|
|
62
65
|
// $FlowExpectedError: can't cast nullable to non-nullable
|
66
|
+
// $FlowFixMe[react-rule-hook]
|
67
|
+
// $FlowFixMe[incompatible-cast]
|
63
68
|
(usePaginationFragment(
|
64
69
|
refetchableFragmentInput,
|
65
70
|
keyNullable,
|
66
71
|
): ExpectedReturnType<QueryVariables, QueryVariables, NonNullableData>);
|
67
72
|
|
68
73
|
// $FlowExpectedError: actual type of returned data is correct
|
74
|
+
// $FlowFixMe[react-rule-hook]
|
75
|
+
// $FlowFixMe[incompatible-exact]
|
76
|
+
// $FlowFixMe[prop-missing]
|
77
|
+
// $FlowFixMe[incompatible-cast]
|
69
78
|
(usePaginationFragment(
|
70
79
|
refetchableFragmentInput,
|
71
80
|
// $FlowFixMe[incompatible-call]
|
72
81
|
keyAnotherNonNullable,
|
73
82
|
): ExpectedReturnType<QueryVariables, QueryVariablesSubset, NonNullableData>);
|
74
83
|
// $FlowExpectedError
|
84
|
+
// $FlowFixMe[react-rule-hook]
|
85
|
+
// $FlowFixMe[incompatible-cast]
|
75
86
|
(usePaginationFragment(
|
76
87
|
refetchableFragmentInput,
|
77
88
|
// $FlowFixMe[incompatible-call]
|
@@ -79,18 +90,25 @@ type ExpectedReturnType<
|
|
79
90
|
): ExpectedReturnType<QueryVariables, QueryVariables, NonNullableData>);
|
80
91
|
|
81
92
|
// $FlowExpectedError: Key should not be a user provided object
|
93
|
+
// $FlowFixMe[react-rule-hook]
|
94
|
+
// $FlowFixMe[prop-missing]
|
82
95
|
usePaginationFragment(refetchableFragmentInput, {abc: 123});
|
83
96
|
|
84
97
|
// $FlowExpectedError: Key should not be an empty object
|
98
|
+
// $FlowFixMe[react-rule-hook]
|
99
|
+
// $FlowFixMe[prop-missing]
|
85
100
|
usePaginationFragment(refetchableFragmentInput, {});
|
86
101
|
|
87
102
|
// $FlowExpectedError: Key should be the `<name>$key` type from generated flow
|
103
|
+
// $FlowFixMe[react-rule-hook]
|
104
|
+
// $FlowFixMe[prop-missing]
|
88
105
|
usePaginationFragment(refetchableFragmentInput, fragmentData);
|
89
106
|
|
90
107
|
// Refetch function options:
|
91
108
|
declare var variables: QueryVariables;
|
92
109
|
declare var environment: IEnvironment;
|
93
110
|
|
111
|
+
// $FlowFixMe[react-rule-hook]
|
94
112
|
const {refetch} = usePaginationFragment(
|
95
113
|
refetchableFragmentInput,
|
96
114
|
keyNonNullable,
|
@@ -109,6 +127,7 @@ refetch(variables, {
|
|
109
127
|
declare var extraVariables: {nickname: string};
|
110
128
|
declare var invalidVariables: {foo: string};
|
111
129
|
|
130
|
+
// $FlowFixMe[react-rule-hook]
|
112
131
|
const {loadNext} = usePaginationFragment(
|
113
132
|
refetchableFragmentInput,
|
114
133
|
keyNonNullable,
|
@@ -33,53 +33,75 @@ import {
|
|
33
33
|
// Nullability of returned data type is correct
|
34
34
|
// $FlowFixMe[prop-missing]
|
35
35
|
// $FlowFixMe[incompatible-cast]
|
36
|
+
// $FlowFixMe[incompatible-exact]
|
37
|
+
// $FlowFixMe[react-rule-hook]
|
36
38
|
(useRefetchableFragment(refetchableFragmentInput, keyNonNullable): [
|
37
39
|
NonNullableData,
|
38
40
|
FetchFn<QueryVariablesSubset>,
|
39
41
|
]);
|
40
42
|
|
43
|
+
// $FlowFixMe[react-rule-hook]
|
41
44
|
(useRefetchableFragment(refetchableFragmentInput, keyNullable): [
|
42
45
|
NullableData,
|
43
46
|
FetchFn<QueryVariables>,
|
44
47
|
]);
|
45
48
|
|
46
49
|
// $FlowExpectedError: can't cast nullable to non-nullable
|
50
|
+
// $FlowFixMe[react-rule-hook]
|
51
|
+
// $FlowFixMe[incompatible-cast]
|
47
52
|
(useRefetchableFragment(refetchableFragmentInput, keyNullable): [
|
48
53
|
NonNullableData,
|
49
54
|
FetchFn<QueryVariables>,
|
50
55
|
]);
|
51
56
|
|
52
57
|
// $FlowExpectedError: refetch requires exact type if key is nullable
|
58
|
+
// $FlowFixMe[react-rule-hook]
|
59
|
+
// $FlowFixMe[incompatible-exact]
|
60
|
+
// $FlowFixMe[prop-missing]
|
53
61
|
(useRefetchableFragment(refetchableFragmentInput, keyNullable): [
|
54
62
|
NullableData,
|
55
63
|
FetchFn<QueryVariablesSubset>,
|
56
64
|
]);
|
57
65
|
|
58
66
|
// $FlowExpectedError: actual type of returned data is correct
|
67
|
+
// $FlowFixMe[react-rule-hook]
|
68
|
+
// $FlowFixMe[incompatible-call]
|
69
|
+
// $FlowFixMe[incompatible-exact]
|
70
|
+
// $FlowFixMe[prop-missing]
|
71
|
+
// $FlowFixMe[incompatible-cast]
|
59
72
|
(useRefetchableFragment(refetchableFragmentInput, keyAnotherNonNullable): [
|
60
73
|
NonNullableData,
|
61
74
|
FetchFn<QueryVariablesSubset>,
|
62
75
|
]);
|
63
76
|
|
64
77
|
// $FlowExpectedError - incompatible key types
|
78
|
+
// $FlowFixMe[react-rule-hook]
|
79
|
+
// $FlowFixMe[incompatible-call]
|
65
80
|
(useRefetchableFragment(refetchableFragmentInput, keyAnotherNullable): [
|
66
81
|
NullableData,
|
67
82
|
FetchFn<QueryVariables>,
|
68
83
|
]);
|
69
84
|
|
70
85
|
// $FlowExpectedError: Key should not be a user provided object
|
86
|
+
// $FlowFixMe[react-rule-hook]
|
87
|
+
// $FlowFixMe[prop-missing]
|
71
88
|
useRefetchableFragment(refetchableFragmentInput, {abc: 123});
|
72
89
|
|
73
90
|
// $FlowExpectedError: Key should not be an empty object
|
91
|
+
// $FlowFixMe[react-rule-hook]
|
92
|
+
// $FlowFixMe[prop-missing]
|
74
93
|
useRefetchableFragment(refetchableFragmentInput, {});
|
75
94
|
|
76
95
|
// $FlowExpectedError: Key should be the `<name>$key` type from generated flow
|
96
|
+
// $FlowFixMe[react-rule-hook]
|
97
|
+
// $FlowFixMe[prop-missing]
|
77
98
|
useRefetchableFragment(refetchableFragmentInput, fragmentData);
|
78
99
|
|
79
100
|
// Refetch function options:
|
80
101
|
declare var variables: QueryVariables;
|
81
102
|
declare var environment: IEnvironment;
|
82
103
|
|
104
|
+
// $FlowFixMe[react-rule-hook]
|
83
105
|
const [, refetch] = useRefetchableFragment(
|
84
106
|
refetchableFragmentInput,
|
85
107
|
keyNonNullable,
|
@@ -206,11 +206,9 @@ class FragmentResourceImpl {
|
|
206
206
|
constructor(environment: IEnvironment) {
|
207
207
|
this._environment = environment;
|
208
208
|
this._cache = LRUCache.create(CACHE_CAPACITY);
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
);
|
213
|
-
}
|
209
|
+
this._clientEdgeQueryResultsCache = new ClientEdgeQueryResultsCache(
|
210
|
+
environment,
|
211
|
+
);
|
214
212
|
}
|
215
213
|
|
216
214
|
/**
|
@@ -397,7 +395,6 @@ class FragmentResourceImpl {
|
|
397
395
|
// First, initiate a query for any client edges that were missing data:
|
398
396
|
let clientEdgeRequests: ?Array<RequestDescriptor> = null;
|
399
397
|
if (
|
400
|
-
RelayFeatureFlags.ENABLE_CLIENT_EDGES &&
|
401
398
|
fragmentNode.metadata?.hasClientEdges === true &&
|
402
399
|
hasMissingClientEdges(snapshot)
|
403
400
|
) {
|
@@ -432,7 +429,7 @@ class FragmentResourceImpl {
|
|
432
429
|
);
|
433
430
|
}
|
434
431
|
let clientEdgePromises: Array<Promise<void>> = [];
|
435
|
-
if (
|
432
|
+
if (clientEdgeRequests) {
|
436
433
|
clientEdgePromises = clientEdgeRequests
|
437
434
|
.map(request => getPromiseForActiveRequest(this._environment, request))
|
438
435
|
.filter(Boolean);
|
@@ -567,6 +564,7 @@ class FragmentResourceImpl {
|
|
567
564
|
s.missingRequiredFields,
|
568
565
|
s.relayResolverErrors,
|
569
566
|
s.errorResponseFields,
|
567
|
+
s.selector.node.metadata?.throwOnFieldError ?? false,
|
570
568
|
);
|
571
569
|
});
|
572
570
|
} else {
|
@@ -575,6 +573,7 @@ class FragmentResourceImpl {
|
|
575
573
|
snapshot.missingRequiredFields,
|
576
574
|
snapshot.relayResolverErrors,
|
577
575
|
snapshot.errorResponseFields,
|
576
|
+
snapshot.selector.node.metadata?.throwOnFieldError ?? false,
|
578
577
|
);
|
579
578
|
}
|
580
579
|
}
|
@@ -672,15 +671,13 @@ class FragmentResourceImpl {
|
|
672
671
|
);
|
673
672
|
}
|
674
673
|
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
});
|
683
|
-
}
|
674
|
+
const clientEdgeQueryResults =
|
675
|
+
this._clientEdgeQueryResultsCache?.get(cacheKey) ?? undefined;
|
676
|
+
if (clientEdgeQueryResults?.length) {
|
677
|
+
const queryResource = getQueryResourceForEnvironment(this._environment);
|
678
|
+
clientEdgeQueryResults.forEach(queryResult => {
|
679
|
+
disposables.push(queryResource.retain(queryResult));
|
680
|
+
});
|
684
681
|
}
|
685
682
|
|
686
683
|
return {
|
@@ -65,7 +65,7 @@ type ReturnType<TVariables, TData, TKey> = {
|
|
65
65
|
refetch: RefetchFn<TVariables, TKey>,
|
66
66
|
};
|
67
67
|
|
68
|
-
|
68
|
+
hook useBlockingPaginationFragment<
|
69
69
|
TFragmentType: FragmentType,
|
70
70
|
TVariables: Variables,
|
71
71
|
TData,
|
@@ -166,7 +166,7 @@ function useBlockingPaginationFragment<
|
|
166
166
|
};
|
167
167
|
}
|
168
168
|
|
169
|
-
|
169
|
+
hook useLoadMore<TVariables: Variables>(args: {
|
170
170
|
disableStoreUpdates: () => void,
|
171
171
|
enableStoreUpdates: () => void,
|
172
172
|
...$Exact<
|
@@ -26,7 +26,7 @@ type ReturnType<TFragmentData: mixed> = {
|
|
26
26
|
enableStoreUpdates: () => void,
|
27
27
|
};
|
28
28
|
|
29
|
-
|
29
|
+
hook useFragmentNode<TFragmentData: mixed>(
|
30
30
|
fragmentNode: ReaderFragment,
|
31
31
|
fragmentRef: mixed,
|
32
32
|
componentDisplayName: string,
|
@@ -162,7 +162,7 @@ function reducer(state: RefetchState, action: Action): RefetchState {
|
|
162
162
|
}
|
163
163
|
}
|
164
164
|
|
165
|
-
|
165
|
+
hook useRefetchableFragmentNode<
|
166
166
|
TQuery: OperationType,
|
167
167
|
TKey: ?{+$data?: mixed, ...},
|
168
168
|
>(
|
@@ -367,7 +367,7 @@ function useRefetchableFragmentNode<
|
|
367
367
|
};
|
368
368
|
}
|
369
369
|
|
370
|
-
|
370
|
+
hook useRefetchFunction<TQuery: OperationType>(
|
371
371
|
componentDisplayName: string,
|
372
372
|
dispatch: (
|
373
373
|
| {
|
@@ -17,13 +17,15 @@ import type {
|
|
17
17
|
EnvironmentProviderOptions,
|
18
18
|
IEnvironmentProvider,
|
19
19
|
PreloadedEntryPoint,
|
20
|
+
PreloadedQuery,
|
20
21
|
} from './EntryPointTypes.flow';
|
21
22
|
|
22
23
|
const {loadQuery} = require('./loadQuery');
|
23
24
|
|
24
25
|
function loadEntryPoint<
|
25
26
|
TEntryPointParams: {...},
|
26
|
-
|
27
|
+
// $FlowExpectedError[unclear-type] Need any to make it supertype of all PreloadedQuery
|
28
|
+
TPreloadedQueries: {+[string]: PreloadedQuery<any>},
|
27
29
|
TPreloadedEntryPoints: {...},
|
28
30
|
TRuntimeProps: {...},
|
29
31
|
TExtraProps,
|
@@ -53,8 +55,12 @@ function loadEntryPoint<
|
|
53
55
|
if (queries != null) {
|
54
56
|
const queriesPropNames = Object.keys(queries);
|
55
57
|
queriesPropNames.forEach(queryPropName => {
|
58
|
+
const query = queries[queryPropName];
|
59
|
+
if (query == null) {
|
60
|
+
return;
|
61
|
+
}
|
56
62
|
const {environmentProviderOptions, options, parameters, variables} =
|
57
|
-
|
63
|
+
query;
|
58
64
|
|
59
65
|
const environment = environmentProvider.getEnvironment(
|
60
66
|
environmentProviderOptions,
|
@@ -86,11 +92,11 @@ function loadEntryPoint<
|
|
86
92
|
entryPointDescription;
|
87
93
|
preloadedEntryPoints[entryPointPropName] = loadEntryPoint<
|
88
94
|
_,
|
89
|
-
{
|
95
|
+
{},
|
90
96
|
{...},
|
91
97
|
{...},
|
92
98
|
mixed,
|
93
|
-
EntryPointComponent<{
|
99
|
+
EntryPointComponent<{}, {...}, {...}, mixed>,
|
94
100
|
_,
|
95
101
|
>(environmentProvider, nestedEntryPoint, nestedParams);
|
96
102
|
});
|
@@ -30,7 +30,6 @@ import type {
|
|
30
30
|
} from 'relay-runtime';
|
31
31
|
|
32
32
|
const invariant = require('invariant');
|
33
|
-
const React = require('react');
|
34
33
|
const {
|
35
34
|
__internal: {fetchQueryDeduped},
|
36
35
|
Observable,
|
@@ -41,29 +40,19 @@ const {
|
|
41
40
|
getRequest,
|
42
41
|
getRequestIdentifier,
|
43
42
|
} = require('relay-runtime');
|
44
|
-
const warning = require('warning');
|
45
43
|
|
46
|
-
let RenderDispatcher = null;
|
47
44
|
let fetchKey = 100001;
|
48
45
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
type QueryType<T> = T extends Query<infer V, infer D, infer RR>
|
61
|
-
? {
|
62
|
-
variables: V,
|
63
|
-
response: D,
|
64
|
-
rawResponse?: $NonMaybeType<RR>,
|
65
|
-
} // $FlowFixMe[deprecated-type]
|
66
|
-
: $Call<<T>(PreloadableConcreteRequest<T>) => T, T>;
|
46
|
+
type QueryType<T> =
|
47
|
+
T extends Query<infer V, infer D, infer RR>
|
48
|
+
? {
|
49
|
+
variables: V,
|
50
|
+
response: D,
|
51
|
+
rawResponse?: $NonMaybeType<RR>,
|
52
|
+
}
|
53
|
+
: [+t: T] extends [+t: PreloadableConcreteRequest<infer V>]
|
54
|
+
? V
|
55
|
+
: empty;
|
67
56
|
|
68
57
|
declare function loadQuery<
|
69
58
|
T,
|
@@ -86,17 +75,6 @@ function loadQuery<
|
|
86
75
|
options?: ?LoadQueryOptions,
|
87
76
|
environmentProviderOptions?: ?TEnvironmentProviderOptions,
|
88
77
|
): PreloadedQueryInner<TQuery, TEnvironmentProviderOptions> {
|
89
|
-
// This code ensures that we don't call loadQuery during render.
|
90
|
-
const CurrentDispatcher =
|
91
|
-
// $FlowFixMe[prop-missing]
|
92
|
-
React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED
|
93
|
-
?.ReactCurrentDispatcher?.current;
|
94
|
-
warning(
|
95
|
-
RenderDispatcher == null || CurrentDispatcher !== RenderDispatcher,
|
96
|
-
'Relay: `%s` should not be called inside a React render function.',
|
97
|
-
options?.__nameForWarning ?? 'loadQuery',
|
98
|
-
);
|
99
|
-
|
100
78
|
// Every time you call loadQuery, we will generate a new fetchKey.
|
101
79
|
// This will ensure that every query reference that is created and
|
102
80
|
// passed to usePreloadedQuery is independently evaluated,
|
@@ -406,5 +384,4 @@ function loadQuery<
|
|
406
384
|
|
407
385
|
module.exports = {
|
408
386
|
loadQuery,
|
409
|
-
useTrackLoadQueryInRender,
|
410
387
|
};
|
@@ -16,13 +16,15 @@ import type {
|
|
16
16
|
EntryPointComponent,
|
17
17
|
EnvironmentProviderOptions,
|
18
18
|
IEnvironmentProvider,
|
19
|
+
PreloadedQuery,
|
19
20
|
} from './EntryPointTypes.flow';
|
20
21
|
|
21
22
|
const preloadQuery = require('./preloadQuery_DEPRECATED');
|
22
23
|
|
23
24
|
function prepareEntryPoint<
|
24
25
|
TEntryPointParams: {...},
|
25
|
-
|
26
|
+
// $FlowExpectedError[unclear-type] Need any to make it supertype of all PreloadedQuery
|
27
|
+
TPreloadedQueries: {+[string]: PreloadedQuery<any>},
|
26
28
|
TPreloadedEntryPoints: {...},
|
27
29
|
TRuntimeProps: {...},
|
28
30
|
TExtraProps,
|
@@ -59,6 +61,7 @@ function prepareEntryPoint<
|
|
59
61
|
environmentProviderOptions,
|
60
62
|
);
|
61
63
|
|
64
|
+
// $FlowFixMe[incompatible-type]
|
62
65
|
preloadedQueries[queryPropName] = preloadQuery<OperationType, mixed>(
|
63
66
|
environment,
|
64
67
|
parameters,
|
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
'use strict';
|
13
13
|
|
14
|
-
import type {QueryResult} from '
|
14
|
+
import type {QueryResult} from './QueryResource';
|
15
15
|
import type {
|
16
16
|
CacheConfig,
|
17
17
|
FetchPolicy,
|
@@ -23,7 +23,7 @@ import type {
|
|
23
23
|
} from 'relay-runtime';
|
24
24
|
import type {MissingClientEdgeRequestInfo} from 'relay-runtime/store/RelayStoreTypes';
|
25
25
|
|
26
|
-
const {getQueryResourceForEnvironment} = require('
|
26
|
+
const {getQueryResourceForEnvironment} = require('./QueryResource');
|
27
27
|
const invariant = require('invariant');
|
28
28
|
const {
|
29
29
|
__internal: {fetchQuery: fetchQueryInternal},
|
@@ -88,6 +88,7 @@ function handlePotentialSnapshotErrorsForState(
|
|
88
88
|
state.snapshot.missingRequiredFields,
|
89
89
|
state.snapshot.relayResolverErrors,
|
90
90
|
state.snapshot.errorResponseFields,
|
91
|
+
state.snapshot.selector.node.metadata?.throwOnFieldError ?? false,
|
91
92
|
);
|
92
93
|
} else if (state.kind === 'plural') {
|
93
94
|
for (const snapshot of state.snapshots) {
|
@@ -96,6 +97,7 @@ function handlePotentialSnapshotErrorsForState(
|
|
96
97
|
snapshot.missingRequiredFields,
|
97
98
|
snapshot.relayResolverErrors,
|
98
99
|
snapshot.errorResponseFields,
|
100
|
+
snapshot.selector.node.metadata?.throwOnFieldError ?? false,
|
99
101
|
);
|
100
102
|
}
|
101
103
|
}
|
@@ -159,7 +161,7 @@ function getFragmentState(
|
|
159
161
|
}
|
160
162
|
|
161
163
|
// fragmentNode cannot change during the lifetime of the component, though fragmentRef may change.
|
162
|
-
function
|
164
|
+
function readFragmentInternal(
|
163
165
|
environment: IEnvironment,
|
164
166
|
fragmentNode: ReaderFragment,
|
165
167
|
fragmentRef: mixed,
|
@@ -297,4 +299,4 @@ function readFragmentInternal_EXPERIMENTAL(
|
|
297
299
|
return {data, clientEdgeQueries};
|
298
300
|
}
|
299
301
|
|
300
|
-
module.exports =
|
302
|
+
module.exports = readFragmentInternal;
|
@@ -20,7 +20,7 @@ const useLazyLoadQuery = require('./useLazyLoadQuery');
|
|
20
20
|
* These queries are consist of queries for client-only data,
|
21
21
|
* schematized via local schema extensions and/or Relay resolvers.
|
22
22
|
*/
|
23
|
-
|
23
|
+
hook useClientQuery<TVariables: Variables, TData, TRawResponse>(
|
24
24
|
gqlQuery: ClientQuery<TVariables, TData, TRawResponse>,
|
25
25
|
variables: TVariables,
|
26
26
|
options?: {
|
@@ -17,10 +17,10 @@ import type {
|
|
17
17
|
EnvironmentProviderOptions,
|
18
18
|
IEnvironmentProvider,
|
19
19
|
PreloadedEntryPoint,
|
20
|
+
PreloadedQuery,
|
20
21
|
} from './EntryPointTypes.flow';
|
21
22
|
|
22
23
|
const loadEntryPoint = require('./loadEntryPoint');
|
23
|
-
const {useTrackLoadQueryInRender} = require('./loadQuery');
|
24
24
|
const useIsMountedRef = require('./useIsMountedRef');
|
25
25
|
const {useCallback, useEffect, useRef, useState} = require('react');
|
26
26
|
|
@@ -50,9 +50,10 @@ type NullEntryPointReference = {
|
|
50
50
|
};
|
51
51
|
const initialNullEntryPointReferenceState = {kind: 'NullEntryPointReference'};
|
52
52
|
|
53
|
-
|
53
|
+
hook useLoadEntryPoint<
|
54
54
|
TEntryPointParams: {...},
|
55
|
-
|
55
|
+
// $FlowExpectedError[unclear-type] Need any to make it supertype of all PreloadedQuery
|
56
|
+
TPreloadedQueries: {+[string]: PreloadedQuery<any>},
|
56
57
|
TPreloadedEntryPoints: {...},
|
57
58
|
TRuntimeProps: {...},
|
58
59
|
TExtraProps,
|
@@ -102,8 +103,6 @@ function useLoadEntryPoint<
|
|
102
103
|
* entry point references.
|
103
104
|
*/
|
104
105
|
|
105
|
-
useTrackLoadQueryInRender();
|
106
|
-
|
107
106
|
const initialEntryPointReferenceInternal =
|
108
107
|
options?.TEST_ONLY__initialEntryPointData?.entryPointReference ??
|
109
108
|
initialNullEntryPointReferenceState;
|
@@ -28,7 +28,7 @@ const {useCallback, useEffect} = require('react');
|
|
28
28
|
* The additional functions returned by this Hook can be used to mutate
|
29
29
|
* the ref.
|
30
30
|
*/
|
31
|
-
|
31
|
+
hook useFetchTrackingRef(): {
|
32
32
|
isFetchingRef: {current: ?boolean, ...},
|
33
33
|
startFetch: Subscription => void,
|
34
34
|
disposeFetch: () => void,
|