react-relay 18.2.0 → 19.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/ReactRelayFragmentContainer.js.flow +5 -7
- package/ReactRelayLoggingContext.js.flow +21 -0
- package/ReactRelayPaginationContainer.js.flow +8 -8
- package/ReactRelayRefetchContainer.js.flow +8 -8
- package/ReactRelayTypes.js.flow +18 -11
- package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +1 -8
- package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +2 -5
- package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +2 -5
- package/buildReactRelayContainer.js.flow +3 -3
- package/hooks.js +1 -1
- package/index.js +1 -1
- package/index.js.flow +3 -3
- package/legacy.js +1 -1
- package/lib/ReactRelayLoggingContext.js +6 -0
- package/lib/index.js +2 -2
- package/lib/relay-hooks/legacy/FragmentResource.js +3 -3
- package/lib/relay-hooks/legacy/useRefetchableFragmentNode.js +1 -1
- package/lib/relay-hooks/loadEntryPoint.js +3 -0
- package/lib/relay-hooks/loadQuery.js +5 -3
- package/lib/relay-hooks/preloadQuery_DEPRECATED.js +7 -2
- package/lib/relay-hooks/readFragmentInternal.js +2 -2
- package/lib/relay-hooks/useFragmentInternal_CURRENT.js +11 -6
- package/lib/relay-hooks/useFragmentInternal_EXPERIMENTAL.js +11 -6
- package/lib/relay-hooks/useLoadMoreFunction.js +3 -2
- package/lib/relay-hooks/useLoadMoreFunction_EXPERIMENTAL.js +3 -2
- package/lib/relay-hooks/usePaginationFragment.js +5 -1
- package/lib/relay-hooks/usePrefetchableForwardPaginationFragment.js +228 -0
- package/lib/relay-hooks/usePrefetchableForwardPaginationFragment_EXPERIMENTAL.js +8 -8
- package/lib/relay-hooks/useRefetchableFragmentInternal.js +3 -3
- package/lib/relay-hooks/useRelayLoggingContext.js +9 -0
- package/package.json +3 -3
- package/relay-hooks/EntryPointContainer.react.js.flow +13 -17
- package/relay-hooks/EntryPointTypes.flow.js.flow +6 -4
- package/relay-hooks/MatchContainer.js.flow +1 -1
- package/relay-hooks/legacy/FragmentResource.js.flow +3 -6
- package/relay-hooks/legacy/useBlockingPaginationFragment.js.flow +2 -17
- package/relay-hooks/legacy/useRefetchableFragmentNode.js.flow +1 -1
- package/relay-hooks/loadEntryPoint.js.flow +6 -0
- package/relay-hooks/loadQuery.js.flow +18 -2
- package/relay-hooks/preloadQuery_DEPRECATED.js.flow +18 -3
- package/relay-hooks/readFragmentInternal.js.flow +2 -5
- package/relay-hooks/useEntryPointLoader.js.flow +4 -2
- package/relay-hooks/useFragment.js.flow +1 -0
- package/relay-hooks/useFragmentInternal.js.flow +2 -0
- package/relay-hooks/useFragmentInternal_CURRENT.js.flow +22 -5
- package/relay-hooks/useFragmentInternal_EXPERIMENTAL.js.flow +24 -5
- package/relay-hooks/useLazyLoadQuery.js.flow +4 -4
- package/relay-hooks/useLoadMoreFunction.js.flow +7 -7
- package/relay-hooks/useLoadMoreFunction_EXPERIMENTAL.js.flow +5 -7
- package/relay-hooks/usePaginationFragment.js.flow +6 -10
- package/relay-hooks/usePrefetchableForwardPaginationFragment.js.flow +436 -0
- package/relay-hooks/usePrefetchableForwardPaginationFragment_EXPERIMENTAL.js.flow +15 -13
- package/relay-hooks/usePreloadedQuery.js.flow +1 -0
- package/relay-hooks/useQueryLoader.js.flow +5 -1
- package/relay-hooks/useQueryLoader_EXPERIMENTAL.js.flow +3 -1
- package/relay-hooks/useRefetchableFragment.js.flow +1 -0
- package/relay-hooks/useRefetchableFragmentInternal.js.flow +3 -3
- package/relay-hooks/useRelayLoggingContext.js.flow +21 -0
- package/relay-hooks/useStaticFragmentNodeWarning.js.flow +1 -0
- package/react-relay-hooks.js +0 -4
- package/react-relay-hooks.min.js +0 -9
- package/react-relay-legacy.js +0 -4
- package/react-relay-legacy.min.js +0 -9
- package/react-relay.js +0 -4
- package/react-relay.min.js +0 -9
@@ -11,11 +11,11 @@
|
|
11
11
|
|
12
12
|
'use strict';
|
13
13
|
|
14
|
-
function getComponentName(component:
|
14
|
+
function getComponentName(component: component(...empty)): string {
|
15
15
|
return component.displayName || component.name || 'Component';
|
16
16
|
}
|
17
17
|
|
18
|
-
function getContainerName(Component:
|
18
|
+
function getContainerName(Component: component(...empty)): string {
|
19
19
|
return 'Relay(' + getComponentName(Component) + ')';
|
20
20
|
}
|
21
21
|
|
package/ReactRelayContext.js
CHANGED
@@ -46,13 +46,11 @@ type ContainerState = {
|
|
46
46
|
*/
|
47
47
|
function createContainerWithFragments<
|
48
48
|
Props: {...},
|
49
|
-
TComponent:
|
49
|
+
TComponent: component(...Props),
|
50
50
|
>(
|
51
51
|
Component: TComponent,
|
52
52
|
fragments: FragmentMap,
|
53
|
-
): React.
|
54
|
-
$RelayProps<React.ElementConfig<TComponent>, RelayProp>,
|
55
|
-
> {
|
53
|
+
): component(...$RelayProps<React.ElementConfig<TComponent>, RelayProp>) {
|
56
54
|
const containerName = getContainerName(Component);
|
57
55
|
|
58
56
|
return class extends React.Component<ContainerProps, ContainerState> {
|
@@ -269,12 +267,12 @@ function getRelayProp(environment: IEnvironment) {
|
|
269
267
|
*/
|
270
268
|
function createContainer<
|
271
269
|
Props: {...},
|
272
|
-
|
273
|
-
TComponent: component(ref:
|
270
|
+
Ref,
|
271
|
+
TComponent: component(ref: Ref, ...Props),
|
274
272
|
>(
|
275
273
|
Component: TComponent,
|
276
274
|
fragmentSpec: GeneratedNodeMap,
|
277
|
-
): component(ref:
|
275
|
+
): component(ref: Ref, ...$RelayProps<Props, RelayProp>) {
|
278
276
|
// $FlowFixMe[incompatible-return]
|
279
277
|
return buildReactRelayContainer(
|
280
278
|
Component,
|
@@ -0,0 +1,21 @@
|
|
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
|
+
const React = require('react');
|
15
|
+
const {
|
16
|
+
__internal: {createRelayLoggingContext},
|
17
|
+
} = require('relay-runtime');
|
18
|
+
|
19
|
+
module.exports = (createRelayLoggingContext(React): React.Context<
|
20
|
+
mixed | null,
|
21
|
+
>);
|
@@ -319,14 +319,14 @@ function toObserver(observerOrCallback: ?ObserverOrCallback): Observer<void> {
|
|
319
319
|
|
320
320
|
function createContainerWithFragments<
|
321
321
|
Props: {...},
|
322
|
-
TComponent:
|
322
|
+
TComponent: component(...Props),
|
323
323
|
>(
|
324
324
|
Component: TComponent,
|
325
325
|
fragments: FragmentMap,
|
326
326
|
connectionConfig: ConnectionConfig,
|
327
|
-
):
|
328
|
-
|
329
|
-
|
327
|
+
): component(
|
328
|
+
...$RelayProps<React.ElementConfig<TComponent>, RelayPaginationProp>
|
329
|
+
) {
|
330
330
|
const componentName = getComponentName(Component);
|
331
331
|
const containerName = getContainerName(Component);
|
332
332
|
|
@@ -937,13 +937,13 @@ function createContainerWithFragments<
|
|
937
937
|
* `fragmentSpec` is memoized once per environment, rather than once per
|
938
938
|
* instance of the container constructed/rendered.
|
939
939
|
*/
|
940
|
-
function createContainer<Props: {...}, TComponent:
|
940
|
+
function createContainer<Props: {...}, TComponent: component(...Props)>(
|
941
941
|
Component: TComponent,
|
942
942
|
fragmentSpec: GeneratedNodeMap,
|
943
943
|
connectionConfig: ConnectionConfig,
|
944
|
-
):
|
945
|
-
|
946
|
-
|
944
|
+
): component(
|
945
|
+
...$RelayProps<React.ElementConfig<TComponent>, RelayPaginationProp>
|
946
|
+
) {
|
947
947
|
// $FlowFixMe[incompatible-return]
|
948
948
|
return buildReactRelayContainer(
|
949
949
|
Component,
|
@@ -69,14 +69,14 @@ type ContainerState = {
|
|
69
69
|
*/
|
70
70
|
function createContainerWithFragments<
|
71
71
|
Props: {...},
|
72
|
-
TComponent:
|
72
|
+
TComponent: component(...Props),
|
73
73
|
>(
|
74
74
|
Component: TComponent,
|
75
75
|
fragments: FragmentMap,
|
76
76
|
taggedNode: GraphQLTaggedNode,
|
77
|
-
):
|
78
|
-
|
79
|
-
|
77
|
+
): component(
|
78
|
+
...$RelayProps<React.ElementConfig<TComponent>, RelayRefetchProp>
|
79
|
+
) {
|
80
80
|
const containerName = getContainerName(Component);
|
81
81
|
|
82
82
|
return class extends React.Component<ContainerProps, ContainerState> {
|
@@ -486,13 +486,13 @@ function getRelayProp(
|
|
486
486
|
* `fragmentSpec` is memoized once per environment, rather than once per
|
487
487
|
* instance of the container constructed/rendered.
|
488
488
|
*/
|
489
|
-
function createContainer<Props: {...}, TComponent:
|
489
|
+
function createContainer<Props: {...}, TComponent: component(...Props)>(
|
490
490
|
Component: TComponent,
|
491
491
|
fragmentSpec: GeneratedNodeMap,
|
492
492
|
taggedNode: GraphQLTaggedNode,
|
493
|
-
):
|
494
|
-
|
495
|
-
|
493
|
+
): component(
|
494
|
+
...$RelayProps<React.ElementConfig<TComponent>, RelayRefetchProp>
|
495
|
+
) {
|
496
496
|
// $FlowFixMe[incompatible-return]
|
497
497
|
return buildReactRelayContainer(
|
498
498
|
Component,
|
package/ReactRelayTypes.js.flow
CHANGED
@@ -97,14 +97,20 @@ export type $FragmentRef<T> = {
|
|
97
97
|
...
|
98
98
|
};
|
99
99
|
|
100
|
+
/* $FlowExpectedError[unclear-type]: Intentional so that it won't fail,
|
101
|
+
* even if the type we want to exclude doesn't exist in Props */
|
102
|
+
type LooseOmitRelayProps<Props, K: $Keys<any>> = Pick<
|
103
|
+
Props,
|
104
|
+
Exclude<$Keys<Props>, K>,
|
105
|
+
>;
|
100
106
|
/**
|
101
107
|
* A utility type that takes the Props of a component and the type of
|
102
108
|
* `props.relay` and returns the props of the container.
|
103
109
|
*/
|
104
110
|
// prettier-ignore
|
105
111
|
// $FlowFixMe[extra-type-arg] xplat redux flow type error
|
106
|
-
export type $RelayProps<Props,
|
107
|
-
|
112
|
+
export type $RelayProps<Props, _RelayPropT = RelayProp> = MapRelayProps<
|
113
|
+
LooseOmitRelayProps<Props, 'relay'>,
|
108
114
|
>;
|
109
115
|
|
110
116
|
type MapRelayProps<Props> = {[K in keyof Props]: MapRelayProp<Props[K]>};
|
@@ -144,14 +150,15 @@ type MapRelayProp<T> = [+t: T] extends [+t: {+$fragmentType: empty, ...}]
|
|
144
150
|
? ?$ReadOnlyArray<?$FragmentRef<$NonMaybeType<V>>>
|
145
151
|
: T;
|
146
152
|
|
147
|
-
export type RelayFragmentContainer<TComponent> =
|
148
|
-
|
149
|
-
|
153
|
+
export type RelayFragmentContainer<TComponent: component(...empty)> = component(
|
154
|
+
...$RelayProps<React.ElementConfig<TComponent>, RelayProp>
|
155
|
+
);
|
150
156
|
|
151
|
-
export type RelayPaginationContainer<TComponent> =
|
152
|
-
|
153
|
-
|
157
|
+
export type RelayPaginationContainer<TComponent: component(...empty)> =
|
158
|
+
component(
|
159
|
+
...$RelayProps<React.ElementConfig<TComponent>, RelayPaginationProp>
|
160
|
+
);
|
154
161
|
|
155
|
-
export type RelayRefetchContainer<TComponent> =
|
156
|
-
|
157
|
-
|
162
|
+
export type RelayRefetchContainer<TComponent: component(...empty)> = component(
|
163
|
+
...$RelayProps<React.ElementConfig<TComponent>, RelayRefetchProp>
|
164
|
+
);
|
@@ -138,14 +138,7 @@ module.exports = {
|
|
138
138
|
return bad ? 'not good' : ok;
|
139
139
|
}
|
140
140
|
render(): React.MixedElement {
|
141
|
-
return
|
142
|
-
<Bar
|
143
|
-
componentRef={(ref: empty) => {
|
144
|
-
this._barRef = (ref: empty);
|
145
|
-
}}
|
146
|
-
requiredProp="bar"
|
147
|
-
/>
|
148
|
-
);
|
141
|
+
return <Bar requiredProp="bar" />;
|
149
142
|
}
|
150
143
|
}
|
151
144
|
return <ProxyChecker />;
|
@@ -22,10 +22,7 @@ const {graphql} = require('relay-runtime');
|
|
22
22
|
* type-checked correctly on Relay components.
|
23
23
|
*/
|
24
24
|
|
25
|
-
|
26
|
-
* when upgrading Flow's support for React. Common errors found when upgrading
|
27
|
-
* Flow's React support are documented at https://fburl.com/eq7bs81w */
|
28
|
-
class FooComponent extends React.Component {
|
25
|
+
class FooComponent extends React.Component<$FlowFixMe> {
|
29
26
|
props: {
|
30
27
|
optionalProp?: {foo: number, ...},
|
31
28
|
defaultProp: string,
|
@@ -56,7 +53,7 @@ class FooComponent extends React.Component {
|
|
56
53
|
}
|
57
54
|
// Note that we must reassign to a new identifier to make sure flow doesn't propogate types without
|
58
55
|
// the relay type definition doing the work.
|
59
|
-
const Foo = createPaginationContainer(
|
56
|
+
const Foo = createPaginationContainer<$FlowFixMe, _>(
|
60
57
|
FooComponent,
|
61
58
|
{
|
62
59
|
viewer: graphql`
|
@@ -21,10 +21,7 @@ const {graphql} = require('relay-runtime');
|
|
21
21
|
* Verifies that normal prop type checking works correctly on Relay components.
|
22
22
|
*/
|
23
23
|
|
24
|
-
|
25
|
-
* when upgrading Flow's support for React. Common errors found when upgrading
|
26
|
-
* Flow's React support are documented at https://fburl.com/eq7bs81w */
|
27
|
-
class FooComponent extends React.Component {
|
24
|
+
class FooComponent extends React.Component<$FlowFixMe> {
|
28
25
|
props: {
|
29
26
|
optionalProp?: {foo: number, ...},
|
30
27
|
defaultProp: string,
|
@@ -55,7 +52,7 @@ class FooComponent extends React.Component {
|
|
55
52
|
}
|
56
53
|
// Note that we must reassign to a new identifier to make sure flow doesn't propogate types without
|
57
54
|
// the relay type definition doing the work.
|
58
|
-
const Foo = createRefetchContainer(
|
55
|
+
const Foo = createRefetchContainer<$FlowFixMe, _>(
|
59
56
|
FooComponent,
|
60
57
|
{
|
61
58
|
viewer: graphql`
|
@@ -28,15 +28,15 @@ const {getFragment} = require('relay-runtime');
|
|
28
28
|
const {useContext} = React;
|
29
29
|
|
30
30
|
type ContainerCreator = (
|
31
|
-
Component:
|
31
|
+
Component: component(...any),
|
32
32
|
fragments: FragmentMap,
|
33
|
-
) =>
|
33
|
+
) => component(...any);
|
34
34
|
|
35
35
|
/**
|
36
36
|
* Helper to create the Relay HOCs with ref forwarding, setting the displayName
|
37
37
|
* and reading the React context.
|
38
38
|
*/
|
39
|
-
function buildReactRelayContainer<TBase:
|
39
|
+
function buildReactRelayContainer<TBase: component(...empty)>(
|
40
40
|
ComponentClass: TBase,
|
41
41
|
fragmentSpec: GeneratedNodeMap,
|
42
42
|
createContainerWithFragments: ContainerCreator,
|
package/hooks.js
CHANGED
package/index.js
CHANGED
package/index.js.flow
CHANGED
@@ -28,7 +28,7 @@ const useFragment = require('./relay-hooks/useFragment');
|
|
28
28
|
const useLazyLoadQuery = require('./relay-hooks/useLazyLoadQuery');
|
29
29
|
const useMutation = require('./relay-hooks/useMutation');
|
30
30
|
const usePaginationFragment = require('./relay-hooks/usePaginationFragment');
|
31
|
-
const
|
31
|
+
const usePrefetchableForwardPaginationFragment = require('./relay-hooks/usePrefetchableForwardPaginationFragment');
|
32
32
|
const usePreloadedQuery = require('./relay-hooks/usePreloadedQuery');
|
33
33
|
const useQueryLoader = require('./relay-hooks/useQueryLoader');
|
34
34
|
const useRefetchableFragment = require('./relay-hooks/useRefetchableFragment');
|
@@ -126,8 +126,8 @@ module.exports = {
|
|
126
126
|
usePaginationFragment: usePaginationFragment,
|
127
127
|
usePreloadedQuery: usePreloadedQuery,
|
128
128
|
useRefetchableFragment: useRefetchableFragment,
|
129
|
-
|
130
|
-
|
129
|
+
usePrefetchableForwardPaginationFragment:
|
130
|
+
usePrefetchableForwardPaginationFragment,
|
131
131
|
useRelayEnvironment: useRelayEnvironment,
|
132
132
|
useSubscribeToInvalidationState: useSubscribeToInvalidationState,
|
133
133
|
useSubscription: useSubscription,
|
package/legacy.js
CHANGED
package/lib/index.js
CHANGED
@@ -18,7 +18,7 @@ var useFragment = require('./relay-hooks/useFragment');
|
|
18
18
|
var useLazyLoadQuery = require('./relay-hooks/useLazyLoadQuery');
|
19
19
|
var useMutation = require('./relay-hooks/useMutation');
|
20
20
|
var usePaginationFragment = require('./relay-hooks/usePaginationFragment');
|
21
|
-
var
|
21
|
+
var usePrefetchableForwardPaginationFragment = require('./relay-hooks/usePrefetchableForwardPaginationFragment');
|
22
22
|
var usePreloadedQuery = require('./relay-hooks/usePreloadedQuery');
|
23
23
|
var useQueryLoader = require('./relay-hooks/useQueryLoader');
|
24
24
|
var useRefetchableFragment = require('./relay-hooks/useRefetchableFragment');
|
@@ -58,7 +58,7 @@ module.exports = {
|
|
58
58
|
usePaginationFragment: usePaginationFragment,
|
59
59
|
usePreloadedQuery: usePreloadedQuery,
|
60
60
|
useRefetchableFragment: useRefetchableFragment,
|
61
|
-
|
61
|
+
usePrefetchableForwardPaginationFragment: usePrefetchableForwardPaginationFragment,
|
62
62
|
useRelayEnvironment: useRelayEnvironment,
|
63
63
|
useSubscribeToInvalidationState: useSubscribeToInvalidationState,
|
64
64
|
useSubscription: useSubscription
|
@@ -308,10 +308,10 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
308
308
|
var _this4 = this;
|
309
309
|
if (Array.isArray(snapshot)) {
|
310
310
|
snapshot.forEach(function (s) {
|
311
|
-
handlePotentialSnapshotErrors(_this4._environment, s.
|
311
|
+
handlePotentialSnapshotErrors(_this4._environment, s.fieldErrors);
|
312
312
|
});
|
313
313
|
} else {
|
314
|
-
handlePotentialSnapshotErrors(this._environment, snapshot.
|
314
|
+
handlePotentialSnapshotErrors(this._environment, snapshot.fieldErrors);
|
315
315
|
}
|
316
316
|
};
|
317
317
|
_proto2.readSpec = function readSpec(fragmentNodes, fragmentRefs, componentDisplayName) {
|
@@ -453,7 +453,7 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
453
453
|
missingLiveResolverFields: currentSnapshot.missingLiveResolverFields,
|
454
454
|
seenRecords: currentSnapshot.seenRecords,
|
455
455
|
selector: currentSnapshot.selector,
|
456
|
-
|
456
|
+
fieldErrors: currentSnapshot.fieldErrors
|
457
457
|
};
|
458
458
|
if (updatedData !== renderData) {
|
459
459
|
var _result = getFragmentResult(cacheKey, updatedCurrentSnapshot, storeEpoch);
|
@@ -234,7 +234,7 @@ if (process.env.NODE_ENV !== "production") {
|
|
234
234
|
}
|
235
235
|
},
|
236
236
|
checkSameIDAfterRefetch: function checkSameIDAfterRefetch(previousIDAndTypename, refetchedFragmentRef, fragmentNode, componentDisplayName) {
|
237
|
-
if (previousIDAndTypename == null) {
|
237
|
+
if (previousIDAndTypename == null || refetchedFragmentRef == null) {
|
238
238
|
return;
|
239
239
|
}
|
240
240
|
var _require7 = require('relay-runtime'),
|
@@ -24,6 +24,9 @@ function loadEntryPoint(environmentProvider, entryPoint, entryPointParams) {
|
|
24
24
|
options = query.options,
|
25
25
|
parameters = query.parameters,
|
26
26
|
variables = query.variables;
|
27
|
+
if ((options === null || options === void 0 ? void 0 : options.includeIf) === false) {
|
28
|
+
return;
|
29
|
+
}
|
27
30
|
var environment = environmentProvider.getEnvironment(environmentProviderOptions);
|
28
31
|
preloadedQueries[queryPropName] = loadQuery(environment, parameters, variables, {
|
29
32
|
fetchPolicy: options === null || options === void 0 ? void 0 : options.fetchPolicy,
|
@@ -35,13 +35,13 @@ function loadQuery(environment, preloadableRequest, variables, options, environm
|
|
35
35
|
var unsubscribeFromNetworkRequest;
|
36
36
|
var networkError = null;
|
37
37
|
var didMakeNetworkRequest = false;
|
38
|
-
var makeNetworkRequest = function makeNetworkRequest(params) {
|
38
|
+
var makeNetworkRequest = function makeNetworkRequest(params, checkOperation) {
|
39
39
|
didMakeNetworkRequest = true;
|
40
40
|
var subject = new ReplaySubject();
|
41
41
|
var identifier = 'raw-network-request-' + getRequestIdentifier(params, variables);
|
42
42
|
var observable = fetchQueryDeduped(environment, identifier, function () {
|
43
43
|
var network = environment.getNetwork();
|
44
|
-
return network.execute(params, variables, networkCacheConfig);
|
44
|
+
return network.execute(params, variables, networkCacheConfig, undefined, undefined, undefined, undefined, checkOperation);
|
45
45
|
});
|
46
46
|
var _observable$subscribe = observable.subscribe({
|
47
47
|
error: function error(err) {
|
@@ -90,7 +90,9 @@ function loadQuery(environment, preloadableRequest, variables, options, environm
|
|
90
90
|
var shouldFetch = fetchPolicy !== 'store-or-network' || environment.check(operation).status !== 'available';
|
91
91
|
if (shouldFetch) {
|
92
92
|
executeDeduped(operation, function () {
|
93
|
-
var networkObservable = makeNetworkRequest(concreteRequest.params)
|
93
|
+
var networkObservable = makeNetworkRequest(concreteRequest.params, function () {
|
94
|
+
return environment.check(operation);
|
95
|
+
});
|
94
96
|
var executeObservable = executeWithNetworkSource(operation, networkObservable);
|
95
97
|
return executeObservable;
|
96
98
|
});
|
@@ -78,7 +78,12 @@ function preloadQueryDeduped(environment, pendingQueries, preloadableRequest, va
|
|
78
78
|
}, options === null || options === void 0 ? void 0 : options.networkCacheConfig);
|
79
79
|
var cacheKey = "".concat(getRequestIdentifier(params, variables)).concat(fetchKey != null ? "-".concat(fetchKey) : '');
|
80
80
|
var prevQueryEntry = pendingQueries.get(cacheKey);
|
81
|
-
|
81
|
+
function checkOperation() {
|
82
|
+
return query != null ? environment.check(createOperationDescriptor(query, variables, networkCacheConfig)) : {
|
83
|
+
status: 'missing'
|
84
|
+
};
|
85
|
+
}
|
86
|
+
var availability = fetchPolicy === STORE_OR_NETWORK_DEFAULT ? checkOperation() : {
|
82
87
|
status: 'missing'
|
83
88
|
};
|
84
89
|
var nextQueryEntry;
|
@@ -105,7 +110,7 @@ function preloadQueryDeduped(environment, pendingQueries, preloadableRequest, va
|
|
105
110
|
}, DEFAULT_PREFETCH_TIMEOUT);
|
106
111
|
}
|
107
112
|
} else if (prevQueryEntry == null || prevQueryEntry.kind !== 'network') {
|
108
|
-
var source = network.execute(params, variables, networkCacheConfig, null);
|
113
|
+
var source = network.execute(params, variables, networkCacheConfig, null, undefined, undefined, undefined, checkOperation);
|
109
114
|
var subject = new ReplaySubject();
|
110
115
|
nextQueryEntry = {
|
111
116
|
cacheKey: cacheKey,
|
@@ -66,14 +66,14 @@ function getMissingClientEdges(state) {
|
|
66
66
|
}
|
67
67
|
function handlePotentialSnapshotErrorsForState(environment, state) {
|
68
68
|
if (state.kind === 'singular') {
|
69
|
-
handlePotentialSnapshotErrors(environment, state.snapshot.
|
69
|
+
handlePotentialSnapshotErrors(environment, state.snapshot.fieldErrors);
|
70
70
|
} else if (state.kind === 'plural') {
|
71
71
|
var _iterator3 = (0, _createForOfIteratorHelper2["default"])(state.snapshots),
|
72
72
|
_step3;
|
73
73
|
try {
|
74
74
|
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
75
75
|
var snapshot = _step3.value;
|
76
|
-
handlePotentialSnapshotErrors(environment, snapshot.
|
76
|
+
handlePotentialSnapshotErrors(environment, snapshot.fieldErrors);
|
77
77
|
}
|
78
78
|
} catch (err) {
|
79
79
|
_iterator3.e(err);
|
@@ -7,6 +7,7 @@ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers
|
|
7
7
|
var _require = require('./QueryResource'),
|
8
8
|
getQueryResourceForEnvironment = _require.getQueryResourceForEnvironment;
|
9
9
|
var useRelayEnvironment = require('./useRelayEnvironment');
|
10
|
+
var useRelayLoggingContext = require('./useRelayLoggingContext');
|
10
11
|
var invariant = require('invariant');
|
11
12
|
var _require2 = require('react'),
|
12
13
|
useDebugValue = _require2.useDebugValue,
|
@@ -114,16 +115,16 @@ function getSuspendingLiveResolver(state) {
|
|
114
115
|
return missingFields;
|
115
116
|
}
|
116
117
|
}
|
117
|
-
function handlePotentialSnapshotErrorsForState(environment, state) {
|
118
|
+
function handlePotentialSnapshotErrorsForState(environment, state, loggingContext) {
|
118
119
|
if (state.kind === 'singular') {
|
119
|
-
handlePotentialSnapshotErrors(environment, state.snapshot.
|
120
|
+
handlePotentialSnapshotErrors(environment, state.snapshot.fieldErrors, loggingContext);
|
120
121
|
} else if (state.kind === 'plural') {
|
121
122
|
var _iterator5 = (0, _createForOfIteratorHelper2["default"])(state.snapshots),
|
122
123
|
_step5;
|
123
124
|
try {
|
124
125
|
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
125
126
|
var snapshot = _step5.value;
|
126
|
-
handlePotentialSnapshotErrors(environment, snapshot.
|
127
|
+
handlePotentialSnapshotErrors(environment, snapshot.fieldErrors, loggingContext);
|
127
128
|
}
|
128
129
|
} catch (err) {
|
129
130
|
_iterator5.e(err);
|
@@ -150,7 +151,7 @@ function handleMissedUpdates(environment, state) {
|
|
150
151
|
missingLiveResolverFields: currentSnapshot.missingLiveResolverFields,
|
151
152
|
seenRecords: currentSnapshot.seenRecords,
|
152
153
|
selector: currentSnapshot.selector,
|
153
|
-
|
154
|
+
fieldErrors: currentSnapshot.fieldErrors
|
154
155
|
};
|
155
156
|
return [updatedData !== state.snapshot.data, {
|
156
157
|
kind: 'singular',
|
@@ -171,7 +172,7 @@ function handleMissedUpdates(environment, state) {
|
|
171
172
|
missingLiveResolverFields: _currentSnapshot.missingLiveResolverFields,
|
172
173
|
seenRecords: _currentSnapshot.seenRecords,
|
173
174
|
selector: _currentSnapshot.selector,
|
174
|
-
|
175
|
+
fieldErrors: _currentSnapshot.fieldErrors
|
175
176
|
};
|
176
177
|
if (_updatedData !== snapshot.data) {
|
177
178
|
didMissUpdates = true;
|
@@ -309,6 +310,10 @@ function useFragmentInternal(fragmentNode, fragmentRef, hookDisplayName, queryOp
|
|
309
310
|
}
|
310
311
|
!(fragmentRef == null || isPlural && Array.isArray(fragmentRef) && fragmentRef.length === 0 || fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected to receive an object where `...%s` was spread, ' + 'but the fragment reference was not found`. This is most ' + 'likely the result of:\n' + "- Forgetting to spread `%s` in `%s`'s parent's fragment.\n" + '- Conditionally fetching `%s` but unconditionally passing %s prop ' + 'to `%s`. If the parent fragment only fetches the fragment conditionally ' + '- with e.g. `@include`, `@skip`, or inside a `... on SomeType { }` ' + 'spread - then the fragment reference will not exist. ' + 'In this case, pass `null` if the conditions for evaluating the ' + 'fragment are not met (e.g. if the `@include(if)` value is false.)', fragmentNode.name, fragmentNode.name, hookDisplayName, fragmentNode.name, hookDisplayName) : invariant(false) : void 0;
|
311
312
|
var environment = useRelayEnvironment();
|
313
|
+
var loggerContext;
|
314
|
+
if (RelayFeatureFlags.ENABLE_UI_CONTEXT_ON_RELAY_LOGGER) {
|
315
|
+
loggerContext = useRelayLoggingContext();
|
316
|
+
}
|
312
317
|
var _useState = useState(function () {
|
313
318
|
return getFragmentState(environment, fragmentSelector);
|
314
319
|
}),
|
@@ -412,7 +417,7 @@ function useFragmentInternal(fragmentNode, fragmentRef, hookDisplayName, queryOp
|
|
412
417
|
}
|
413
418
|
}
|
414
419
|
}
|
415
|
-
handlePotentialSnapshotErrorsForState(environment, state);
|
420
|
+
handlePotentialSnapshotErrorsForState(environment, state, loggerContext);
|
416
421
|
var hasPendingStateChanges = useRef(false);
|
417
422
|
useEffect(function () {
|
418
423
|
var currentState = subscribedState;
|
@@ -7,6 +7,7 @@ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers
|
|
7
7
|
var _require = require('./QueryResource'),
|
8
8
|
getQueryResourceForEnvironment = _require.getQueryResourceForEnvironment;
|
9
9
|
var useRelayEnvironment = require('./useRelayEnvironment');
|
10
|
+
var useRelayLoggingContext = require('./useRelayLoggingContext');
|
10
11
|
var invariant = require('invariant');
|
11
12
|
var _require2 = require('react'),
|
12
13
|
useDebugValue = _require2.useDebugValue,
|
@@ -114,16 +115,16 @@ function getSuspendingLiveResolver(state) {
|
|
114
115
|
return missingFields;
|
115
116
|
}
|
116
117
|
}
|
117
|
-
function handlePotentialSnapshotErrorsForState(environment, state) {
|
118
|
+
function handlePotentialSnapshotErrorsForState(environment, state, loggingContext) {
|
118
119
|
if (state.kind === 'singular') {
|
119
|
-
handlePotentialSnapshotErrors(environment, state.snapshot.
|
120
|
+
handlePotentialSnapshotErrors(environment, state.snapshot.fieldErrors, loggingContext);
|
120
121
|
} else if (state.kind === 'plural') {
|
121
122
|
var _iterator5 = (0, _createForOfIteratorHelper2["default"])(state.snapshots),
|
122
123
|
_step5;
|
123
124
|
try {
|
124
125
|
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
125
126
|
var snapshot = _step5.value;
|
126
|
-
handlePotentialSnapshotErrors(environment, snapshot.
|
127
|
+
handlePotentialSnapshotErrors(environment, snapshot.fieldErrors, loggingContext);
|
127
128
|
}
|
128
129
|
} catch (err) {
|
129
130
|
_iterator5.e(err);
|
@@ -150,7 +151,7 @@ function handleMissedUpdates(environment, state) {
|
|
150
151
|
missingLiveResolverFields: currentSnapshot.missingLiveResolverFields,
|
151
152
|
seenRecords: currentSnapshot.seenRecords,
|
152
153
|
selector: currentSnapshot.selector,
|
153
|
-
|
154
|
+
fieldErrors: currentSnapshot.fieldErrors
|
154
155
|
};
|
155
156
|
return [updatedData !== state.snapshot.data, {
|
156
157
|
kind: 'singular',
|
@@ -173,7 +174,7 @@ function handleMissedUpdates(environment, state) {
|
|
173
174
|
missingLiveResolverFields: _currentSnapshot.missingLiveResolverFields,
|
174
175
|
seenRecords: _currentSnapshot.seenRecords,
|
175
176
|
selector: _currentSnapshot.selector,
|
176
|
-
|
177
|
+
fieldErrors: _currentSnapshot.fieldErrors
|
177
178
|
};
|
178
179
|
if (_updatedData !== snapshot.data) {
|
179
180
|
didMissUpdates = true;
|
@@ -324,6 +325,10 @@ function useFragmentInternal_EXPERIMENTAL(fragmentNode, fragmentRef, hookDisplay
|
|
324
325
|
}
|
325
326
|
!(fragmentRef == null || isPlural && Array.isArray(fragmentRef) && fragmentRef.length === 0 || fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected to receive an object where `...%s` was spread, ' + 'but the fragment reference was not found`. This is most ' + 'likely the result of:\n' + "- Forgetting to spread `%s` in `%s`'s parent's fragment.\n" + '- Conditionally fetching `%s` but unconditionally passing %s prop ' + 'to `%s`. If the parent fragment only fetches the fragment conditionally ' + '- with e.g. `@include`, `@skip`, or inside a `... on SomeType { }` ' + 'spread - then the fragment reference will not exist. ' + 'In this case, pass `null` if the conditions for evaluating the ' + 'fragment are not met (e.g. if the `@include(if)` value is false.)', fragmentNode.name, fragmentNode.name, hookDisplayName, fragmentNode.name, hookDisplayName) : invariant(false) : void 0;
|
326
327
|
var environment = useRelayEnvironment();
|
328
|
+
var loggerContext;
|
329
|
+
if (RelayFeatureFlags.ENABLE_UI_CONTEXT_ON_RELAY_LOGGER) {
|
330
|
+
loggerContext = useRelayLoggingContext();
|
331
|
+
}
|
327
332
|
var _useState = useState(function () {
|
328
333
|
return getFragmentState(environment, fragmentSelector);
|
329
334
|
}),
|
@@ -414,7 +419,7 @@ function useFragmentInternal_EXPERIMENTAL(fragmentNode, fragmentRef, hookDisplay
|
|
414
419
|
}
|
415
420
|
}
|
416
421
|
}
|
417
|
-
handlePotentialSnapshotErrorsForState(environment, state);
|
422
|
+
handlePotentialSnapshotErrorsForState(environment, state, loggerContext);
|
418
423
|
var storeSubscriptionRef = useRef(null);
|
419
424
|
useEffect(function () {
|
420
425
|
var storeSubscription = storeSubscriptionRef.current;
|
@@ -71,6 +71,7 @@ function useLoadMoreFunction_CURRENT(args) {
|
|
71
71
|
disposeFetch();
|
72
72
|
};
|
73
73
|
}, [disposeFetch]);
|
74
|
+
var isRequestInvalid = fragmentData == null || isParentQueryActive;
|
74
75
|
var loadMore = useCallback(function (count, options) {
|
75
76
|
var onComplete = options === null || options === void 0 ? void 0 : options.onComplete;
|
76
77
|
if (isMountedRef.current !== true) {
|
@@ -80,7 +81,7 @@ function useLoadMoreFunction_CURRENT(args) {
|
|
80
81
|
};
|
81
82
|
}
|
82
83
|
var fragmentSelector = getSelector(fragmentNode, fragmentRef);
|
83
|
-
if (isFetchingRef.current === true ||
|
84
|
+
if (isFetchingRef.current === true || isRequestInvalid) {
|
84
85
|
if (fragmentSelector == null) {
|
85
86
|
process.env.NODE_ENV !== "production" ? warning(false, 'Relay: Unexpected fetch while using a null fragment ref ' + 'for fragment `%s` in `%s`. When fetching more items, we expect ' + "initial fragment data to be non-null. Please make sure you're " + 'passing a valid fragment ref to `%s` before paginating.', fragmentNode.name, componentDisplayName, componentDisplayName) : void 0;
|
86
87
|
}
|
@@ -125,7 +126,7 @@ function useLoadMoreFunction_CURRENT(args) {
|
|
125
126
|
return {
|
126
127
|
dispose: disposeFetch
|
127
128
|
};
|
128
|
-
}, [environment, identifierValue, direction, cursor, startFetch, disposeFetch, completeFetch, isFetchingRef,
|
129
|
+
}, [environment, identifierValue, direction, cursor, startFetch, disposeFetch, completeFetch, isFetchingRef, isRequestInvalid, fragmentNode.name, fragmentRef, componentDisplayName]);
|
129
130
|
return [loadMore, hasMore, disposeFetch];
|
130
131
|
}
|
131
132
|
module.exports = useLoadMoreFunction;
|