react-relay 16.1.0 → 17.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/ReactRelayContext.js +1 -1
- package/ReactRelayFragmentContainer.js.flow +8 -6
- package/ReactRelayLocalQueryRenderer.js.flow +4 -1
- package/ReactRelayPaginationContainer.js.flow +2 -0
- package/ReactRelayQueryRenderer.js.flow +1 -1
- package/ReactRelayTypes.js.flow +1 -0
- package/buildReactRelayContainer.js.flow +5 -3
- package/getRootVariablesForFragments.js.flow +1 -0
- package/hooks.js +1 -1
- package/hooks.js.flow +1 -1
- package/index.js +1 -1
- package/index.js.flow +1 -1
- package/legacy.js +1 -1
- package/lib/ReactRelayFragmentContainer.js +2 -2
- package/lib/buildReactRelayContainer.js +3 -3
- package/lib/relay-hooks/SuspenseResource.js +7 -4
- package/lib/relay-hooks/{FragmentResource.js → legacy/FragmentResource.js} +19 -20
- package/lib/relay-hooks/{useBlockingPaginationFragment.js → legacy/useBlockingPaginationFragment.js} +2 -2
- package/lib/relay-hooks/{useFragmentNode.js → legacy/useFragmentNode.js} +2 -2
- package/lib/relay-hooks/{useRefetchableFragmentNode.js → legacy/useRefetchableFragmentNode.js} +8 -8
- package/lib/relay-hooks/{experimental/readFragmentInternal_EXPERIMENTAL.js → readFragmentInternal.js} +7 -5
- package/lib/relay-hooks/useFragment.js +3 -13
- package/lib/relay-hooks/{experimental/useFragmentInternal_EXPERIMENTAL.js → useFragmentInternal.js} +67 -31
- package/lib/relay-hooks/useLazyLoadQueryNode.js +2 -13
- package/lib/relay-hooks/usePaginationFragment.js +17 -13
- package/lib/relay-hooks/useRefetchableFragment.js +3 -12
- package/lib/relay-hooks/{experimental/useRefetchableFragmentInternal_EXPERIMENTAL.js → useRefetchableFragmentInternal.js} +7 -7
- package/multi-actor/useRelayActorEnvironment.js.flow +1 -1
- package/package.json +2 -2
- 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 +22 -27
- package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +14 -1
- package/relay-hooks/NestedRelayEntryPointBuilderUtils.js.flow +5 -11
- package/relay-hooks/SuspenseResource.js.flow +11 -8
- package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +22 -1
- package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +19 -0
- package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +22 -0
- package/relay-hooks/{FragmentResource.js.flow → legacy/FragmentResource.js.flow} +21 -21
- package/relay-hooks/{useBlockingPaginationFragment.js.flow → legacy/useBlockingPaginationFragment.js.flow} +6 -6
- package/relay-hooks/{useFragmentNode.js.flow → legacy/useFragmentNode.js.flow} +3 -3
- package/relay-hooks/{useRefetchableFragmentNode.js.flow → legacy/useRefetchableFragmentNode.js.flow} +9 -9
- package/relay-hooks/loadQuery.js.flow +9 -8
- package/relay-hooks/{experimental/readFragmentInternal_EXPERIMENTAL.js.flow → readFragmentInternal.js.flow} +8 -4
- package/relay-hooks/useClientQuery.js.flow +1 -1
- package/relay-hooks/useEntryPointLoader.js.flow +1 -1
- package/relay-hooks/useFetchTrackingRef.js.flow +1 -1
- package/relay-hooks/useFragment.js.flow +16 -22
- package/relay-hooks/{experimental/useFragmentInternal_EXPERIMENTAL.js.flow → useFragmentInternal.js.flow} +71 -19
- 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 -2
- 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 -1
- package/relay-hooks/useQueryLoader.js.flow +2 -5
- 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 -66
- package/relay-hooks/experimental/usePaginationFragment_EXPERIMENTAL.js.flow +0 -161
- package/relay-hooks/experimental/useRefetchableFragment_EXPERIMENTAL.js.flow +0 -49
@@ -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,
|
@@ -11,8 +11,8 @@
|
|
11
11
|
|
12
12
|
'use strict';
|
13
13
|
|
14
|
-
import type {Cache} from '
|
15
|
-
import type {QueryResource, QueryResult} from '
|
14
|
+
import type {Cache} from '../LRUCache';
|
15
|
+
import type {QueryResource, QueryResult} from '../QueryResource';
|
16
16
|
import type {
|
17
17
|
ConcreteRequest,
|
18
18
|
DataID,
|
@@ -24,9 +24,9 @@ import type {
|
|
24
24
|
} from 'relay-runtime';
|
25
25
|
import type {MissingLiveResolverField} from 'relay-runtime/store/RelayStoreTypes';
|
26
26
|
|
27
|
-
const LRUCache = require('
|
28
|
-
const {getQueryResourceForEnvironment} = require('
|
29
|
-
const SuspenseResource = require('
|
27
|
+
const LRUCache = require('../LRUCache');
|
28
|
+
const {getQueryResourceForEnvironment} = require('../QueryResource');
|
29
|
+
const SuspenseResource = require('../SuspenseResource');
|
30
30
|
const invariant = require('invariant');
|
31
31
|
const {
|
32
32
|
__internal: {fetchQuery, getPromiseForActiveRequest},
|
@@ -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);
|
@@ -566,6 +563,8 @@ class FragmentResourceImpl {
|
|
566
563
|
this._environment,
|
567
564
|
s.missingRequiredFields,
|
568
565
|
s.relayResolverErrors,
|
566
|
+
s.errorResponseFields,
|
567
|
+
s.selector.node.metadata?.throwOnFieldError ?? false,
|
569
568
|
);
|
570
569
|
});
|
571
570
|
} else {
|
@@ -573,6 +572,8 @@ class FragmentResourceImpl {
|
|
573
572
|
this._environment,
|
574
573
|
snapshot.missingRequiredFields,
|
575
574
|
snapshot.relayResolverErrors,
|
575
|
+
snapshot.errorResponseFields,
|
576
|
+
snapshot.selector.node.metadata?.throwOnFieldError ?? false,
|
576
577
|
);
|
577
578
|
}
|
578
579
|
}
|
@@ -670,15 +671,13 @@ class FragmentResourceImpl {
|
|
670
671
|
);
|
671
672
|
}
|
672
673
|
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
});
|
681
|
-
}
|
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
|
+
});
|
682
681
|
}
|
683
682
|
|
684
683
|
return {
|
@@ -776,6 +775,7 @@ class FragmentResourceImpl {
|
|
776
775
|
selector: currentSnapshot.selector,
|
777
776
|
missingRequiredFields: currentSnapshot.missingRequiredFields,
|
778
777
|
relayResolverErrors: currentSnapshot.relayResolverErrors,
|
778
|
+
errorResponseFields: currentSnapshot.errorResponseFields,
|
779
779
|
};
|
780
780
|
if (updatedData !== renderData) {
|
781
781
|
const result = getFragmentResult(
|
@@ -11,9 +11,9 @@
|
|
11
11
|
|
12
12
|
'use strict';
|
13
13
|
|
14
|
-
import type {
|
15
|
-
import type {LoadMoreFn, UseLoadMoreFunctionArgs} from './useLoadMoreFunction';
|
14
|
+
import type {LoadMoreFn, UseLoadMoreFunctionArgs} from '../useLoadMoreFunction';
|
16
15
|
import type {Options} from './useRefetchableFragmentNode';
|
16
|
+
import type {RefetchableFragment} from 'relay-runtime';
|
17
17
|
import type {
|
18
18
|
Disposable,
|
19
19
|
FragmentType,
|
@@ -22,9 +22,9 @@ import type {
|
|
22
22
|
Variables,
|
23
23
|
} from 'relay-runtime';
|
24
24
|
|
25
|
-
const useLoadMoreFunction = require('
|
25
|
+
const useLoadMoreFunction = require('../useLoadMoreFunction');
|
26
|
+
const useStaticFragmentNodeWarning = require('../useStaticFragmentNodeWarning');
|
26
27
|
const useRefetchableFragmentNode = require('./useRefetchableFragmentNode');
|
27
|
-
const useStaticFragmentNodeWarning = require('./useStaticFragmentNodeWarning');
|
28
28
|
const invariant = require('invariant');
|
29
29
|
const {useCallback, useEffect, useRef, useState} = require('react');
|
30
30
|
const {
|
@@ -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<
|
@@ -13,9 +13,9 @@
|
|
13
13
|
|
14
14
|
import type {ReaderFragment} from 'relay-runtime';
|
15
15
|
|
16
|
+
const useRelayEnvironment = require('../useRelayEnvironment');
|
17
|
+
const useUnsafeRef_DEPRECATED = require('../useUnsafeRef_DEPRECATED');
|
16
18
|
const {getFragmentResourceForEnvironment} = require('./FragmentResource');
|
17
|
-
const useRelayEnvironment = require('./useRelayEnvironment');
|
18
|
-
const useUnsafeRef_DEPRECATED = require('./useUnsafeRef_DEPRECATED');
|
19
19
|
const {useEffect, useState} = require('react');
|
20
20
|
const {RelayFeatureFlags, getFragmentIdentifier} = require('relay-runtime');
|
21
21
|
const warning = require('warning');
|
@@ -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,
|
package/relay-hooks/{useRefetchableFragmentNode.js.flow → legacy/useRefetchableFragmentNode.js.flow}
RENAMED
@@ -11,8 +11,8 @@
|
|
11
11
|
|
12
12
|
'use strict';
|
13
13
|
|
14
|
-
import type {
|
15
|
-
import type {
|
14
|
+
import type {LoaderFn} from '../useQueryLoader';
|
15
|
+
import type {RefetchableIdentifierInfo} from 'relay-runtime';
|
16
16
|
import type {
|
17
17
|
ConcreteRequest,
|
18
18
|
Disposable,
|
@@ -26,13 +26,13 @@ import type {
|
|
26
26
|
VariablesOf,
|
27
27
|
} from 'relay-runtime';
|
28
28
|
|
29
|
+
const ProfilerContext = require('../ProfilerContext');
|
30
|
+
const {getQueryResourceForEnvironment} = require('../QueryResource');
|
31
|
+
const useIsMountedRef = require('../useIsMountedRef');
|
32
|
+
const useQueryLoader = require('../useQueryLoader');
|
33
|
+
const useRelayEnvironment = require('../useRelayEnvironment');
|
29
34
|
const {getFragmentResourceForEnvironment} = require('./FragmentResource');
|
30
|
-
const ProfilerContext = require('./ProfilerContext');
|
31
|
-
const {getQueryResourceForEnvironment} = require('./QueryResource');
|
32
35
|
const useFragmentNode = require('./useFragmentNode');
|
33
|
-
const useIsMountedRef = require('./useIsMountedRef');
|
34
|
-
const useQueryLoader = require('./useQueryLoader');
|
35
|
-
const useRelayEnvironment = require('./useRelayEnvironment');
|
36
36
|
const invariant = require('invariant');
|
37
37
|
const {useCallback, useContext, useReducer} = require('react');
|
38
38
|
const {
|
@@ -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
|
| {
|
@@ -46,7 +46,7 @@ const warning = require('warning');
|
|
46
46
|
let RenderDispatcher = null;
|
47
47
|
let fetchKey = 100001;
|
48
48
|
|
49
|
-
|
49
|
+
hook useTrackLoadQueryInRender() {
|
50
50
|
if (RenderDispatcher === null) {
|
51
51
|
// Flow does not know of React internals (rightly so), but we need to
|
52
52
|
// ensure here that this function isn't called inside render.
|
@@ -57,13 +57,14 @@ function useTrackLoadQueryInRender() {
|
|
57
57
|
}
|
58
58
|
}
|
59
59
|
|
60
|
-
type QueryType<T> =
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
60
|
+
type QueryType<T> =
|
61
|
+
T extends Query<infer V, infer D, infer RR>
|
62
|
+
? {
|
63
|
+
variables: V,
|
64
|
+
response: D,
|
65
|
+
rawResponse?: $NonMaybeType<RR>,
|
66
|
+
} // $FlowFixMe[deprecated-type]
|
67
|
+
: $Call<<T>(PreloadableConcreteRequest<T>) => T, T>;
|
67
68
|
|
68
69
|
declare function loadQuery<
|
69
70
|
T,
|
@@ -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},
|
@@ -87,6 +87,8 @@ function handlePotentialSnapshotErrorsForState(
|
|
87
87
|
environment,
|
88
88
|
state.snapshot.missingRequiredFields,
|
89
89
|
state.snapshot.relayResolverErrors,
|
90
|
+
state.snapshot.errorResponseFields,
|
91
|
+
state.snapshot.selector.node.metadata?.throwOnFieldError ?? false,
|
90
92
|
);
|
91
93
|
} else if (state.kind === 'plural') {
|
92
94
|
for (const snapshot of state.snapshots) {
|
@@ -94,6 +96,8 @@ function handlePotentialSnapshotErrorsForState(
|
|
94
96
|
environment,
|
95
97
|
snapshot.missingRequiredFields,
|
96
98
|
snapshot.relayResolverErrors,
|
99
|
+
snapshot.errorResponseFields,
|
100
|
+
snapshot.selector.node.metadata?.throwOnFieldError ?? false,
|
97
101
|
);
|
98
102
|
}
|
99
103
|
}
|
@@ -157,7 +161,7 @@ function getFragmentState(
|
|
157
161
|
}
|
158
162
|
|
159
163
|
// fragmentNode cannot change during the lifetime of the component, though fragmentRef may change.
|
160
|
-
function
|
164
|
+
function readFragmentInternal(
|
161
165
|
environment: IEnvironment,
|
162
166
|
fragmentNode: ReaderFragment,
|
163
167
|
fragmentRef: mixed,
|
@@ -295,4 +299,4 @@ function readFragmentInternal_EXPERIMENTAL(
|
|
295
299
|
return {data, clientEdgeQueries};
|
296
300
|
}
|
297
301
|
|
298
|
-
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?: {
|
@@ -50,7 +50,7 @@ type NullEntryPointReference = {
|
|
50
50
|
};
|
51
51
|
const initialNullEntryPointReferenceState = {kind: 'NullEntryPointReference'};
|
52
52
|
|
53
|
-
|
53
|
+
hook useLoadEntryPoint<
|
54
54
|
TEntryPointParams: {...},
|
55
55
|
TPreloadedQueries: {...},
|
56
56
|
TPreloadedEntryPoints: {...},
|
@@ -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,
|
@@ -13,9 +13,8 @@
|
|
13
13
|
|
14
14
|
import type {Fragment, FragmentType, GraphQLTaggedNode} from 'relay-runtime';
|
15
15
|
|
16
|
-
const HooksImplementation = require('./HooksImplementation');
|
17
16
|
const {useTrackLoadQueryInRender} = require('./loadQuery');
|
18
|
-
const
|
17
|
+
const useFragmentInternal = require('./useFragmentInternal');
|
19
18
|
const useStaticFragmentNodeWarning = require('./useStaticFragmentNodeWarning');
|
20
19
|
const {useDebugValue} = require('react');
|
21
20
|
const {getFragment} = require('relay-runtime');
|
@@ -26,48 +25,43 @@ type HasSpread<TFragmentType> = {
|
|
26
25
|
};
|
27
26
|
|
28
27
|
// if the key is non-nullable, return non-nullable value
|
29
|
-
declare
|
28
|
+
declare hook useFragment<TFragmentType: FragmentType, TData>(
|
30
29
|
fragment: Fragment<TFragmentType, TData>,
|
31
30
|
key: HasSpread<TFragmentType>,
|
32
31
|
): TData;
|
33
32
|
|
33
|
+
// if the key is nullable, return nullable value
|
34
|
+
declare hook useFragment<TFragmentType: FragmentType, TData>(
|
35
|
+
fragment: Fragment<TFragmentType, TData>,
|
36
|
+
key: ?HasSpread<TFragmentType>,
|
37
|
+
): ?TData;
|
38
|
+
|
34
39
|
// if the key is a non-nullable array of keys, return non-nullable array
|
35
|
-
declare
|
40
|
+
declare hook useFragment<TFragmentType: FragmentType, TData>(
|
36
41
|
fragment: Fragment<TFragmentType, TData>,
|
37
42
|
key: $ReadOnlyArray<HasSpread<TFragmentType>>,
|
38
43
|
): TData;
|
39
44
|
|
40
|
-
// if the key is
|
41
|
-
declare
|
45
|
+
// if the key is a nullable array of keys, return nullable array
|
46
|
+
declare hook useFragment<TFragmentType: FragmentType, TData>(
|
42
47
|
fragment: Fragment<TFragmentType, TData>,
|
43
|
-
key:
|
44
|
-
):
|
48
|
+
key: ?$ReadOnlyArray<HasSpread<TFragmentType>>,
|
49
|
+
): ?TData;
|
45
50
|
|
46
|
-
|
51
|
+
hook useFragment(fragment: GraphQLTaggedNode, key: mixed): mixed {
|
47
52
|
// We need to use this hook in order to be able to track if
|
48
53
|
// loadQuery was called during render
|
49
54
|
useTrackLoadQueryInRender();
|
50
55
|
|
51
56
|
const fragmentNode = getFragment(fragment);
|
52
57
|
useStaticFragmentNodeWarning(fragmentNode, 'first argument of useFragment()');
|
53
|
-
const
|
58
|
+
const data = useFragmentInternal(fragmentNode, key, 'useFragment()');
|
54
59
|
if (__DEV__) {
|
55
60
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
61
|
+
// $FlowFixMe[react-rule-hook]
|
56
62
|
useDebugValue({fragment: fragmentNode.name, data});
|
57
63
|
}
|
58
64
|
return data;
|
59
65
|
}
|
60
66
|
|
61
|
-
function useFragment(fragment: GraphQLTaggedNode, key: mixed): mixed {
|
62
|
-
const impl = HooksImplementation.get();
|
63
|
-
if (impl) {
|
64
|
-
// $FlowFixMe This is safe because impl.useFragment has the type of useFragment...
|
65
|
-
return impl.useFragment(fragment, key);
|
66
|
-
// (i.e. type declared above, but not the supertype used in this function definition)
|
67
|
-
} else {
|
68
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
69
|
-
return useFragment_LEGACY(fragment, key);
|
70
|
-
}
|
71
|
-
}
|
72
|
-
|
73
67
|
module.exports = useFragment;
|