react-relay 16.2.0 → 18.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,
|