react-relay 20.1.1 → 21.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/ReactRelayContext.js +1 -1
- package/ReactRelayContext.js.flow +2 -2
- package/ReactRelayFragmentContainer.js.flow +8 -9
- package/ReactRelayLocalQueryRenderer.js.flow +11 -3
- package/ReactRelayLoggingContext.js.flow +3 -3
- package/ReactRelayPaginationContainer.js.flow +31 -24
- package/ReactRelayQueryFetcher.js.flow +1 -1
- package/ReactRelayQueryRenderer.js.flow +2 -2
- package/ReactRelayQueryRendererContext.js.flow +2 -2
- package/ReactRelayRefetchContainer.js.flow +17 -14
- package/ReactRelayTestMocker.js.flow +10 -10
- package/ReactRelayTypes.js.flow +18 -20
- package/RelayContext.js.flow +3 -3
- package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +11 -11
- package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +5 -5
- package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +5 -5
- package/__flowtests__/RelayModern-flowtest.js.flow +24 -27
- package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +1 -1
- package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +3 -4
- package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +3 -4
- package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +9 -10
- package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +4 -5
- package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +9 -10
- package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +4 -5
- package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +3 -4
- package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +3 -4
- package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +3 -4
- package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +5 -6
- package/buildReactRelayContainer.js.flow +4 -4
- package/getRootVariablesForFragments.js.flow +1 -1
- package/hooks.js +1 -1
- package/hooks.js.flow +23 -8
- package/index.js +1 -1
- package/index.js.flow +40 -14
- package/isRelayEnvironment.js.flow +1 -1
- package/jest-react/internalAct.js.flow +1 -1
- package/legacy.js +1 -1
- package/legacy.js.flow +32 -13
- package/lib/ReactRelayFragmentContainer.js +1 -1
- package/lib/ReactRelayPaginationContainer.js +8 -8
- package/lib/ReactRelayRefetchContainer.js +8 -8
- package/lib/ReactRelayTestMocker.js +5 -5
- package/lib/hooks.js +18 -8
- package/lib/index.js +30 -14
- package/lib/legacy.js +26 -13
- package/lib/relay-hooks/legacy/useBlockingPaginationFragment.js +5 -5
- package/lib/relay-hooks/legacy/useRefetchableFragmentNode.js +34 -34
- package/lib/relay-hooks/loadEntryPoint.js +2 -2
- package/lib/relay-hooks/loadQuery.js +14 -14
- package/lib/relay-hooks/preloadQuery_DEPRECATED.js +10 -10
- package/lib/relay-hooks/readFragmentInternal.js +6 -6
- package/lib/relay-hooks/rsc/serverFetchQuery.js +20 -0
- package/lib/relay-hooks/rsc/serverPreloadQuery.js +31 -0
- package/lib/relay-hooks/rsc/serverReadFragment.js +15 -0
- package/lib/relay-hooks/rsc/useQueryFromServer.js +62 -0
- package/lib/relay-hooks/useFragmentInternal_CURRENT.js +49 -25
- package/lib/relay-hooks/useFragmentInternal_EXPERIMENTAL.js +81 -44
- package/lib/relay-hooks/useLazyLoadQueryNode.js +32 -19
- package/lib/relay-hooks/useMutation.js +6 -14
- package/lib/relay-hooks/useMutationAction_EXPERIMENTAL.js +26 -0
- package/lib/relay-hooks/usePreloadedQuery.js +52 -47
- package/lib/relay-hooks/useQueryLoader.js +2 -2
- package/lib/relay-hooks/useQueryLoader_EXPERIMENTAL.js +2 -2
- package/lib/relay-hooks/useRefetchableFragmentInternal.js +31 -31
- package/lib/rsc-client_EXPERIMENTAL.js +7 -0
- package/lib/rsc_EXPERIMENTAL.js +43 -0
- package/multi-actor/ActorChange.js.flow +1 -1
- package/package.json +3 -2
- package/relay-hooks/EntryPointContainer.react.js.flow +6 -6
- package/relay-hooks/EntryPointTypes.flow.js.flow +61 -67
- package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +23 -21
- package/relay-hooks/MatchContainer.js.flow +12 -6
- package/relay-hooks/NestedRelayEntryPointBuilderUtils.js.flow +3 -9
- package/relay-hooks/QueryResource.js.flow +6 -6
- package/relay-hooks/RelayEnvironmentProvider.js.flow +2 -2
- package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +6 -6
- package/relay-hooks/__flowtests__/EntryPointTypes/ExtractQueryTypes-flowtest.js.flow +48 -1
- package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +9 -9
- package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +3 -4
- package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +5 -6
- package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +27 -32
- package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +25 -25
- package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +26 -32
- package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +23 -30
- package/relay-hooks/__flowtests__/utils.js.flow +4 -4
- package/relay-hooks/getConnectionState.js.flow +2 -2
- package/relay-hooks/legacy/FragmentResource.js.flow +13 -13
- package/relay-hooks/legacy/useBlockingPaginationFragment.js.flow +24 -25
- package/relay-hooks/legacy/useFragmentNode.js.flow +4 -4
- package/relay-hooks/legacy/useRefetchableFragmentNode.js.flow +79 -81
- package/relay-hooks/loadEntryPoint.js.flow +15 -13
- package/relay-hooks/loadQuery.js.flow +18 -18
- package/relay-hooks/preloadQuery_DEPRECATED.js.flow +16 -13
- package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +7 -7
- package/relay-hooks/readFragmentInternal.js.flow +9 -9
- package/relay-hooks/rsc/serverFetchQuery.js.flow +31 -0
- package/relay-hooks/rsc/serverPreloadQuery.js.flow +69 -0
- package/relay-hooks/rsc/serverReadFragment.js.flow +33 -0
- package/relay-hooks/rsc/useQueryFromServer.js.flow +135 -0
- package/relay-hooks/useClientQuery.js.flow +2 -2
- package/relay-hooks/useEntryPointLoader.js.flow +11 -11
- package/relay-hooks/useFragment.js.flow +7 -7
- package/relay-hooks/useFragmentInternal.js.flow +1 -1
- package/relay-hooks/useFragmentInternal_CURRENT.js.flow +54 -22
- package/relay-hooks/useFragmentInternal_EXPERIMENTAL.js.flow +95 -46
- package/relay-hooks/useIsOperationNodeActive.js.flow +1 -1
- package/relay-hooks/useIsParentQueryActive.js.flow +1 -1
- package/relay-hooks/useLazyLoadQuery.js.flow +10 -3
- package/relay-hooks/useLazyLoadQueryNode.js.flow +67 -28
- package/relay-hooks/useLoadMoreFunction.js.flow +7 -6
- package/relay-hooks/useLoadMoreFunction_EXPERIMENTAL.js.flow +5 -5
- package/relay-hooks/useMemoVariables.js.flow +1 -1
- package/relay-hooks/useMutation.js.flow +8 -16
- package/relay-hooks/useMutationAction_EXPERIMENTAL.js.flow +68 -0
- package/relay-hooks/usePaginationFragment.js.flow +15 -11
- package/relay-hooks/usePrefetchableForwardPaginationFragment.js.flow +19 -18
- package/relay-hooks/usePrefetchableForwardPaginationFragment_EXPERIMENTAL.js.flow +19 -18
- package/relay-hooks/usePreloadedQuery.js.flow +119 -85
- package/relay-hooks/useQueryLoader.js.flow +27 -23
- package/relay-hooks/useQueryLoader_EXPERIMENTAL.js.flow +10 -10
- package/relay-hooks/useRefetchableFragment.js.flow +16 -11
- package/relay-hooks/useRefetchableFragmentInternal.js.flow +77 -79
- package/relay-hooks/useRelayLoggingContext.js.flow +1 -1
- package/relay-hooks/useSubscribeToInvalidationState.js.flow +1 -1
- package/relay-hooks/useSubscription.js.flow +1 -1
- package/rsc-client_EXPERIMENTAL.js +10 -0
- package/rsc-client_EXPERIMENTAL.js.flow +23 -0
- package/rsc_EXPERIMENTAL.js +10 -0
- package/rsc_EXPERIMENTAL.js.flow +90 -0
package/ReactRelayContext.js
CHANGED
|
@@ -31,7 +31,7 @@ const {
|
|
|
31
31
|
|
|
32
32
|
type ContainerProps = $FlowFixMe;
|
|
33
33
|
type ContainerState = {
|
|
34
|
-
data: {[key: string]:
|
|
34
|
+
data: {[key: string]: unknown, ...},
|
|
35
35
|
prevProps: ContainerProps,
|
|
36
36
|
prevPropsContext: RelayContext,
|
|
37
37
|
relayProp: RelayProp,
|
|
@@ -45,8 +45,8 @@ type ContainerState = {
|
|
|
45
45
|
* updates.
|
|
46
46
|
*/
|
|
47
47
|
function createContainerWithFragments<
|
|
48
|
-
Props
|
|
49
|
-
TComponent
|
|
48
|
+
Props extends {...},
|
|
49
|
+
TComponent extends component(...Props),
|
|
50
50
|
>(
|
|
51
51
|
Component: TComponent,
|
|
52
52
|
fragments: FragmentMap,
|
|
@@ -121,8 +121,8 @@ function createContainerWithFragments<
|
|
|
121
121
|
|
|
122
122
|
return {
|
|
123
123
|
data: resolver.resolve(),
|
|
124
|
-
prevPropsContext: relayContext,
|
|
125
124
|
prevProps: nextProps,
|
|
125
|
+
prevPropsContext: relayContext,
|
|
126
126
|
relayProp: getRelayProp(relayContext.environment),
|
|
127
127
|
resolver,
|
|
128
128
|
};
|
|
@@ -266,14 +266,13 @@ function getRelayProp(environment: IEnvironment) {
|
|
|
266
266
|
* instance of the container constructed/rendered.
|
|
267
267
|
*/
|
|
268
268
|
function createContainer<
|
|
269
|
-
Props
|
|
270
|
-
|
|
271
|
-
TComponent: component(ref: Ref, ...Props),
|
|
269
|
+
Props extends {...},
|
|
270
|
+
TComponent extends component(...Props),
|
|
272
271
|
>(
|
|
273
272
|
Component: TComponent,
|
|
274
273
|
fragmentSpec: GeneratedNodeMap,
|
|
275
|
-
): component(
|
|
276
|
-
// $FlowFixMe[incompatible-
|
|
274
|
+
): component(...$RelayProps<Props, RelayProp>) {
|
|
275
|
+
// $FlowFixMe[incompatible-type]
|
|
277
276
|
return buildReactRelayContainer(
|
|
278
277
|
Component,
|
|
279
278
|
fragmentSpec,
|
|
@@ -12,7 +12,12 @@
|
|
|
12
12
|
'use strict';
|
|
13
13
|
|
|
14
14
|
import type {ReactRelayQueryRendererContext as ReactRelayQueryRendererContextType} from './ReactRelayQueryRendererContext';
|
|
15
|
-
import type {
|
|
15
|
+
import type {
|
|
16
|
+
GraphQLTaggedNode,
|
|
17
|
+
IEnvironment,
|
|
18
|
+
RelayContext,
|
|
19
|
+
Variables,
|
|
20
|
+
} from 'relay-runtime';
|
|
16
21
|
import type {SelectorData} from 'relay-runtime/store/RelayStoreTypes';
|
|
17
22
|
|
|
18
23
|
const ReactRelayContext = require('./ReactRelayContext');
|
|
@@ -40,7 +45,7 @@ const queryRendererContext: ReactRelayQueryRendererContextType = {
|
|
|
40
45
|
rootIsQueryRenderer: true,
|
|
41
46
|
};
|
|
42
47
|
|
|
43
|
-
hook useDeepCompare<T
|
|
48
|
+
hook useDeepCompare<T extends {...}>(value: T): T {
|
|
44
49
|
const latestValue = React.useRef(value);
|
|
45
50
|
// $FlowFixMe[react-rule-unsafe-ref]
|
|
46
51
|
if (!areEqual(latestValue.current, value)) {
|
|
@@ -62,7 +67,10 @@ function ReactRelayLocalQueryRenderer(props: Props): React.Node {
|
|
|
62
67
|
return createOperationDescriptor(request, latestVariables);
|
|
63
68
|
}, [query, latestVariables]);
|
|
64
69
|
|
|
65
|
-
const relayContext = useMemo(
|
|
70
|
+
const relayContext = useMemo(
|
|
71
|
+
(): RelayContext => ({environment}),
|
|
72
|
+
[environment],
|
|
73
|
+
);
|
|
66
74
|
|
|
67
75
|
// Use a ref to prevent rendering twice when data changes
|
|
68
76
|
// because of props change
|
|
@@ -16,6 +16,6 @@ const {
|
|
|
16
16
|
__internal: {createRelayLoggingContext},
|
|
17
17
|
} = require('relay-runtime');
|
|
18
18
|
|
|
19
|
-
module.exports =
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
module.exports = createRelayLoggingContext(React) as React.Context<
|
|
20
|
+
unknown | null,
|
|
21
|
+
>;
|
|
@@ -59,7 +59,7 @@ const {
|
|
|
59
59
|
const warning = require('warning');
|
|
60
60
|
|
|
61
61
|
type ContainerState = {
|
|
62
|
-
data: {[key: string]:
|
|
62
|
+
data: {[key: string]: unknown, ...},
|
|
63
63
|
relayProp: RelayPaginationProp,
|
|
64
64
|
prevContext: RelayContext,
|
|
65
65
|
contextForChildren: RelayContext,
|
|
@@ -91,7 +91,7 @@ export type ConnectionConfig = {
|
|
|
91
91
|
...
|
|
92
92
|
};
|
|
93
93
|
export type ConnectionData = {
|
|
94
|
-
+edges?:
|
|
94
|
+
+edges?: ?ReadonlyArray<any>,
|
|
95
95
|
+pageInfo?: ?PageInfo,
|
|
96
96
|
...
|
|
97
97
|
};
|
|
@@ -258,7 +258,7 @@ function createGetFragmentVariables(
|
|
|
258
258
|
);
|
|
259
259
|
return (prevVars: Variables, totalCount: number): Variables => ({
|
|
260
260
|
...prevVars,
|
|
261
|
-
[
|
|
261
|
+
[countVariable as string]: totalCount,
|
|
262
262
|
});
|
|
263
263
|
}
|
|
264
264
|
|
|
@@ -272,7 +272,7 @@ function findConnectionMetadata(
|
|
|
272
272
|
for (const fragmentName in fragments) {
|
|
273
273
|
const fragment = fragments[fragmentName];
|
|
274
274
|
const connectionMetadata: ?Array<ConnectionMetadata> = (fragment.metadata &&
|
|
275
|
-
fragment.metadata.connection
|
|
275
|
+
fragment.metadata.connection) as any;
|
|
276
276
|
// HACK: metadata is always set to `undefined` in classic. In modern, even
|
|
277
277
|
// if empty, it is set to null (never undefined). We use that knowlege to
|
|
278
278
|
// check if we're dealing with classic or modern
|
|
@@ -302,24 +302,24 @@ function findConnectionMetadata(
|
|
|
302
302
|
!isRelayModern || foundConnectionMetadata !== null,
|
|
303
303
|
'ReactRelayPaginationContainer: A @connection directive must be present.',
|
|
304
304
|
);
|
|
305
|
-
return foundConnectionMetadata || ({}
|
|
305
|
+
return foundConnectionMetadata || ({} as any);
|
|
306
306
|
}
|
|
307
307
|
|
|
308
308
|
function toObserver(observerOrCallback: ?ObserverOrCallback): Observer<void> {
|
|
309
309
|
return typeof observerOrCallback === 'function'
|
|
310
310
|
? {
|
|
311
|
-
error: observerOrCallback,
|
|
312
311
|
complete: observerOrCallback,
|
|
312
|
+
error: observerOrCallback,
|
|
313
313
|
unsubscribe: (subscription: Subscription) => {
|
|
314
314
|
typeof observerOrCallback === 'function' && observerOrCallback();
|
|
315
315
|
},
|
|
316
316
|
}
|
|
317
|
-
: observerOrCallback || ({}
|
|
317
|
+
: observerOrCallback || ({} as any);
|
|
318
318
|
}
|
|
319
319
|
|
|
320
320
|
function createContainerWithFragments<
|
|
321
|
-
Props
|
|
322
|
-
TComponent
|
|
321
|
+
Props extends {...},
|
|
322
|
+
TComponent extends component(...Props),
|
|
323
323
|
>(
|
|
324
324
|
Component: TComponent,
|
|
325
325
|
fragments: FragmentMap,
|
|
@@ -386,9 +386,9 @@ function createContainerWithFragments<
|
|
|
386
386
|
);
|
|
387
387
|
}
|
|
388
388
|
this.state = {
|
|
389
|
+
contextForChildren: relayContext,
|
|
389
390
|
data: this._resolver.resolve(),
|
|
390
391
|
prevContext: relayContext,
|
|
391
|
-
contextForChildren: relayContext,
|
|
392
392
|
relayProp: this._buildRelayProp(relayContext),
|
|
393
393
|
resolverGeneration: 0,
|
|
394
394
|
};
|
|
@@ -463,8 +463,8 @@ function createContainerWithFragments<
|
|
|
463
463
|
);
|
|
464
464
|
}
|
|
465
465
|
this.setState(prevState => ({
|
|
466
|
-
prevContext: relayContext,
|
|
467
466
|
contextForChildren: relayContext,
|
|
467
|
+
prevContext: relayContext,
|
|
468
468
|
relayProp: this._buildRelayProp(relayContext),
|
|
469
469
|
resolverGeneration: prevState.resolverGeneration + 1,
|
|
470
470
|
}));
|
|
@@ -499,6 +499,8 @@ function createContainerWithFragments<
|
|
|
499
499
|
const keys = Object.keys(nextProps);
|
|
500
500
|
for (let ii = 0; ii < keys.length; ii++) {
|
|
501
501
|
const key = keys[ii];
|
|
502
|
+
/* $FlowFixMe[invalid-compare] Error discovered during Constant
|
|
503
|
+
* Condition roll out. See https://fburl.com/workplace/4oq3zi07. */
|
|
502
504
|
if (key === '__relayContext') {
|
|
503
505
|
if (
|
|
504
506
|
nextState.prevContext.environment !==
|
|
@@ -520,11 +522,11 @@ function createContainerWithFragments<
|
|
|
520
522
|
|
|
521
523
|
_buildRelayProp(relayContext: RelayContext): RelayPaginationProp {
|
|
522
524
|
return {
|
|
525
|
+
environment: relayContext.environment,
|
|
523
526
|
hasMore: this._hasMore,
|
|
524
527
|
isLoading: this._isLoading,
|
|
525
528
|
loadMore: this._loadMore,
|
|
526
529
|
refetchConnection: this._refetchConnection,
|
|
527
|
-
environment: relayContext.environment,
|
|
528
530
|
};
|
|
529
531
|
}
|
|
530
532
|
|
|
@@ -717,7 +719,7 @@ function createContainerWithFragments<
|
|
|
717
719
|
);
|
|
718
720
|
const paginatingVariables = {
|
|
719
721
|
count: pageSize,
|
|
720
|
-
cursor
|
|
722
|
+
cursor,
|
|
721
723
|
totalCount,
|
|
722
724
|
};
|
|
723
725
|
const fetch = this._fetchPage(paginatingVariables, observer, options);
|
|
@@ -750,12 +752,12 @@ function createContainerWithFragments<
|
|
|
750
752
|
}
|
|
751
753
|
|
|
752
754
|
_fetchPage(
|
|
753
|
-
paginatingVariables: {
|
|
755
|
+
paginatingVariables: Readonly<{
|
|
754
756
|
count: number,
|
|
755
757
|
cursor: ?string,
|
|
756
758
|
totalCount: number,
|
|
757
759
|
...
|
|
758
|
-
}
|
|
760
|
+
}>,
|
|
759
761
|
observer: Observer<void>,
|
|
760
762
|
options: ?RefetchOptions,
|
|
761
763
|
): Subscription {
|
|
@@ -790,20 +792,22 @@ function createContainerWithFragments<
|
|
|
790
792
|
fragmentVariables,
|
|
791
793
|
);
|
|
792
794
|
invariant(
|
|
795
|
+
/* $FlowFixMe[invalid-compare] Error discovered during Constant
|
|
796
|
+
* Condition roll out. See https://fburl.com/workplace/5whu3i34. */
|
|
793
797
|
typeof fetchVariables === 'object' && fetchVariables !== null,
|
|
794
798
|
'ReactRelayPaginationContainer: Expected `getVariables()` to ' +
|
|
795
799
|
'return an object, got `%s` in `%s`.',
|
|
796
800
|
fetchVariables,
|
|
797
801
|
componentName,
|
|
798
802
|
);
|
|
799
|
-
fetchVariables =
|
|
803
|
+
fetchVariables = {
|
|
800
804
|
...fetchVariables,
|
|
801
805
|
...this._refetchVariables,
|
|
802
|
-
}
|
|
803
|
-
fragmentVariables =
|
|
806
|
+
} as Variables;
|
|
807
|
+
fragmentVariables = {
|
|
804
808
|
...fetchVariables,
|
|
805
809
|
...fragmentVariables,
|
|
806
|
-
}
|
|
810
|
+
} as Variables;
|
|
807
811
|
|
|
808
812
|
const cacheConfig: ?{...CacheConfig} = options
|
|
809
813
|
? {force: !!options.force}
|
|
@@ -825,7 +829,7 @@ function createContainerWithFragments<
|
|
|
825
829
|
}
|
|
826
830
|
this._hasFetched = true;
|
|
827
831
|
|
|
828
|
-
const onNext = (payload:
|
|
832
|
+
const onNext = (payload: unknown, complete: () => void) => {
|
|
829
833
|
const prevData = this._resolver.resolve();
|
|
830
834
|
this._resolver.setVariables(
|
|
831
835
|
getFragmentVariables(
|
|
@@ -848,10 +852,10 @@ function createContainerWithFragments<
|
|
|
848
852
|
if (!areEqual(prevData, nextData)) {
|
|
849
853
|
this.setState(
|
|
850
854
|
{
|
|
851
|
-
data: nextData,
|
|
852
855
|
contextForChildren: {
|
|
853
856
|
environment: this.props.__relayContext.environment,
|
|
854
857
|
},
|
|
858
|
+
data: nextData,
|
|
855
859
|
},
|
|
856
860
|
complete,
|
|
857
861
|
);
|
|
@@ -884,8 +888,8 @@ function createContainerWithFragments<
|
|
|
884
888
|
)
|
|
885
889
|
// use do instead of finally so that observer's `complete` fires after cleanup
|
|
886
890
|
.do({
|
|
887
|
-
error: cleanup,
|
|
888
891
|
complete: cleanup,
|
|
892
|
+
error: cleanup,
|
|
889
893
|
unsubscribe: cleanup,
|
|
890
894
|
})
|
|
891
895
|
.subscribe(observer || {});
|
|
@@ -937,14 +941,17 @@ function createContainerWithFragments<
|
|
|
937
941
|
* `fragmentSpec` is memoized once per environment, rather than once per
|
|
938
942
|
* instance of the container constructed/rendered.
|
|
939
943
|
*/
|
|
940
|
-
function createContainer<
|
|
944
|
+
function createContainer<
|
|
945
|
+
Props extends {...},
|
|
946
|
+
TComponent extends component(...Props),
|
|
947
|
+
>(
|
|
941
948
|
Component: TComponent,
|
|
942
949
|
fragmentSpec: GeneratedNodeMap,
|
|
943
950
|
connectionConfig: ConnectionConfig,
|
|
944
951
|
): component(
|
|
945
952
|
...$RelayProps<React.ElementConfig<TComponent>, RelayPaginationProp>
|
|
946
953
|
) {
|
|
947
|
-
// $FlowFixMe[incompatible-
|
|
954
|
+
// $FlowFixMe[incompatible-type]
|
|
948
955
|
return buildReactRelayContainer(
|
|
949
956
|
Component,
|
|
950
957
|
fragmentSpec,
|
|
@@ -116,7 +116,7 @@ class ReactRelayQueryFetcher {
|
|
|
116
116
|
environment,
|
|
117
117
|
operation,
|
|
118
118
|
preservePreviousReferences = false,
|
|
119
|
-
}: ExecuteConfig): Observable<
|
|
119
|
+
}: ExecuteConfig): Observable<unknown> {
|
|
120
120
|
const reference = environment.retain(operation);
|
|
121
121
|
const error = () => {
|
|
122
122
|
// We may have partially fulfilled the request, so let the next request
|
|
@@ -61,7 +61,7 @@ const queryRendererContext: ReactRelayQueryRendererContextType = {
|
|
|
61
61
|
rootIsQueryRenderer: true,
|
|
62
62
|
};
|
|
63
63
|
|
|
64
|
-
export type Props =
|
|
64
|
+
export type Props = Readonly<{
|
|
65
65
|
cacheConfig?: ?CacheConfig,
|
|
66
66
|
fetchPolicy?: 'store-and-network' | 'network-only',
|
|
67
67
|
environment: IEnvironment,
|
|
@@ -105,7 +105,7 @@ class ReactRelayQueryRenderer extends React.Component<Props, State> {
|
|
|
105
105
|
// "leak" them before mounting (since we would be unable to clean up). For
|
|
106
106
|
// that reason, we define them as null initially and fill them in after
|
|
107
107
|
// mounting to avoid leaking memory.
|
|
108
|
-
const retryCallbacks = {
|
|
108
|
+
const retryCallbacks: RetryCallbacks = {
|
|
109
109
|
handleDataChange: null,
|
|
110
110
|
handleRetryAfterError: null,
|
|
111
111
|
};
|
|
@@ -14,6 +14,6 @@ const React = require('react');
|
|
|
14
14
|
|
|
15
15
|
export type ReactRelayQueryRendererContext = {rootIsQueryRenderer: boolean};
|
|
16
16
|
|
|
17
|
-
module.exports =
|
|
17
|
+
module.exports = React.createContext({
|
|
18
18
|
rootIsQueryRenderer: false,
|
|
19
|
-
})
|
|
19
|
+
}) as React.Context<ReactRelayQueryRendererContext | null>;
|
|
@@ -52,7 +52,7 @@ const warning = require('warning');
|
|
|
52
52
|
type ContainerProps = $FlowFixMe;
|
|
53
53
|
|
|
54
54
|
type ContainerState = {
|
|
55
|
-
data: {[key: string]:
|
|
55
|
+
data: {[key: string]: unknown, ...},
|
|
56
56
|
prevProps: ContainerProps,
|
|
57
57
|
localVariables: ?Variables,
|
|
58
58
|
prevPropsContext: RelayContext,
|
|
@@ -68,8 +68,8 @@ type ContainerState = {
|
|
|
68
68
|
* updates.
|
|
69
69
|
*/
|
|
70
70
|
function createContainerWithFragments<
|
|
71
|
-
Props
|
|
72
|
-
TComponent
|
|
71
|
+
Props extends {...},
|
|
72
|
+
TComponent extends component(...Props),
|
|
73
73
|
>(
|
|
74
74
|
Component: TComponent,
|
|
75
75
|
fragments: FragmentMap,
|
|
@@ -104,11 +104,11 @@ function createContainerWithFragments<
|
|
|
104
104
|
rootIsQueryRenderer,
|
|
105
105
|
);
|
|
106
106
|
this.state = {
|
|
107
|
+
contextForChildren: relayContext,
|
|
107
108
|
data: resolver.resolve(),
|
|
108
109
|
localVariables: null,
|
|
109
110
|
prevProps: props,
|
|
110
111
|
prevPropsContext: relayContext,
|
|
111
|
-
contextForChildren: relayContext,
|
|
112
112
|
relayProp: getRelayProp(relayContext.environment, this._refetch),
|
|
113
113
|
resolver,
|
|
114
114
|
};
|
|
@@ -146,7 +146,7 @@ function createContainerWithFragments<
|
|
|
146
146
|
prevState: ContainerState,
|
|
147
147
|
): Partial<ContainerState> | null {
|
|
148
148
|
// Any props change could impact the query, so we mirror props in state.
|
|
149
|
-
// This is an unusual pattern, but necessary for this container
|
|
149
|
+
// This is an unusual pattern, but necessary for this container use case.
|
|
150
150
|
const {prevProps} = prevState;
|
|
151
151
|
const relayContext = assertRelayContext(nextProps.__relayContext);
|
|
152
152
|
const rootIsQueryRenderer = nextProps.__rootIsQueryRenderer ?? false;
|
|
@@ -187,11 +187,11 @@ function createContainerWithFragments<
|
|
|
187
187
|
rootIsQueryRenderer,
|
|
188
188
|
);
|
|
189
189
|
return {
|
|
190
|
+
contextForChildren: relayContext,
|
|
190
191
|
data: resolver.resolve(),
|
|
191
192
|
localVariables: null,
|
|
192
193
|
prevProps: nextProps,
|
|
193
194
|
prevPropsContext: relayContext,
|
|
194
|
-
contextForChildren: relayContext,
|
|
195
195
|
relayProp: getRelayProp(
|
|
196
196
|
relayContext.environment,
|
|
197
197
|
prevState.relayProp.refetch,
|
|
@@ -349,12 +349,12 @@ function createContainerWithFragments<
|
|
|
349
349
|
const observer =
|
|
350
350
|
typeof observerOrCallback === 'function'
|
|
351
351
|
? {
|
|
352
|
-
|
|
352
|
+
error: observerOrCallback,
|
|
353
|
+
// callback is not executed on complete or unsubscribe
|
|
353
354
|
// for backward compatibility
|
|
354
355
|
next: observerOrCallback,
|
|
355
|
-
error: observerOrCallback,
|
|
356
356
|
}
|
|
357
|
-
: observerOrCallback || ({}
|
|
357
|
+
: observerOrCallback || ({} as any);
|
|
358
358
|
|
|
359
359
|
const query = getRequest(taggedNode);
|
|
360
360
|
const operation = createOperationDescriptor(
|
|
@@ -385,10 +385,10 @@ function createContainerWithFragments<
|
|
|
385
385
|
);
|
|
386
386
|
this.setState(
|
|
387
387
|
latestState => ({
|
|
388
|
-
data: latestState.resolver.resolve(),
|
|
389
388
|
contextForChildren: {
|
|
390
389
|
environment: this.props.__relayContext.environment,
|
|
391
390
|
},
|
|
391
|
+
data: latestState.resolver.resolve(),
|
|
392
392
|
}),
|
|
393
393
|
() => {
|
|
394
394
|
observer.next && observer.next();
|
|
@@ -415,10 +415,10 @@ function createContainerWithFragments<
|
|
|
415
415
|
return Observable.create<void>(sink =>
|
|
416
416
|
this.setState(
|
|
417
417
|
latestState => ({
|
|
418
|
-
data: latestState.resolver.resolve(),
|
|
419
418
|
contextForChildren: {
|
|
420
419
|
environment: this.props.__relayContext.environment,
|
|
421
420
|
},
|
|
421
|
+
data: latestState.resolver.resolve(),
|
|
422
422
|
}),
|
|
423
423
|
() => {
|
|
424
424
|
sink.next();
|
|
@@ -429,7 +429,7 @@ function createContainerWithFragments<
|
|
|
429
429
|
})
|
|
430
430
|
.finally(() => {
|
|
431
431
|
// Finalizing a refetch should only clear this._refetchSubscription
|
|
432
|
-
// if the
|
|
432
|
+
// if the finalizing subscription is the most recent call.
|
|
433
433
|
if (this._refetchSubscription === refetchSubscription) {
|
|
434
434
|
this._refetchSubscription = null;
|
|
435
435
|
}
|
|
@@ -486,14 +486,17 @@ 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<
|
|
489
|
+
function createContainer<
|
|
490
|
+
Props extends {...},
|
|
491
|
+
TComponent extends component(...Props),
|
|
492
|
+
>(
|
|
490
493
|
Component: TComponent,
|
|
491
494
|
fragmentSpec: GeneratedNodeMap,
|
|
492
495
|
taggedNode: GraphQLTaggedNode,
|
|
493
496
|
): component(
|
|
494
497
|
...$RelayProps<React.ElementConfig<TComponent>, RelayRefetchProp>
|
|
495
498
|
) {
|
|
496
|
-
// $FlowFixMe[incompatible-
|
|
499
|
+
// $FlowFixMe[incompatible-type]
|
|
497
500
|
return buildReactRelayContainer(
|
|
498
501
|
Component,
|
|
499
502
|
fragmentSpec,
|
|
@@ -162,9 +162,9 @@ class ReactRelayTestMocker {
|
|
|
162
162
|
}
|
|
163
163
|
|
|
164
164
|
this._pendingFetches.push({
|
|
165
|
-
ident,
|
|
166
165
|
cacheConfig,
|
|
167
|
-
deferred: {
|
|
166
|
+
deferred: {reject, resolve},
|
|
167
|
+
ident,
|
|
168
168
|
request,
|
|
169
169
|
variables: strippedVars,
|
|
170
170
|
});
|
|
@@ -199,16 +199,16 @@ class ReactRelayTestMocker {
|
|
|
199
199
|
deferred.reject(payload.error);
|
|
200
200
|
};
|
|
201
201
|
|
|
202
|
-
(env
|
|
202
|
+
(env as any).mock = {
|
|
203
|
+
fetch,
|
|
203
204
|
isLoading,
|
|
204
205
|
rejectQuery,
|
|
205
206
|
resolveRawQuery,
|
|
206
|
-
fetch,
|
|
207
207
|
};
|
|
208
208
|
|
|
209
|
-
(env
|
|
209
|
+
(env as any).hasMockedNetwork = true;
|
|
210
210
|
|
|
211
|
-
(env
|
|
211
|
+
(env as any).__setNet(Network.create(fetch));
|
|
212
212
|
return env;
|
|
213
213
|
}
|
|
214
214
|
|
|
@@ -264,7 +264,7 @@ class ReactRelayTestMocker {
|
|
|
264
264
|
*/
|
|
265
265
|
networkWrite(config: NetworkWriteConfig): void {
|
|
266
266
|
invariant(
|
|
267
|
-
(this._environment
|
|
267
|
+
(this._environment as any).hasMockedNetwork,
|
|
268
268
|
'You cannot resolve queries without a mocked environment. Did you mean ' +
|
|
269
269
|
'to use `writeDirect` instead?',
|
|
270
270
|
);
|
|
@@ -315,16 +315,16 @@ class ReactRelayTestMocker {
|
|
|
315
315
|
);
|
|
316
316
|
|
|
317
317
|
const realPayload =
|
|
318
|
-
// $FlowFixMe[incompatible-
|
|
318
|
+
// $FlowFixMe[incompatible-type]
|
|
319
319
|
typeof payload === 'function' ? payload(toResolve.variables) : payload;
|
|
320
320
|
|
|
321
321
|
// if there are errors, reject the query
|
|
322
322
|
if (realPayload.errors != null && realPayload.errors.length > 0) {
|
|
323
|
-
(this._environment
|
|
323
|
+
(this._environment as any).mock.rejectQuery(toResolve, {
|
|
324
324
|
error: realPayload.errors[0],
|
|
325
325
|
});
|
|
326
326
|
} else {
|
|
327
|
-
(this._environment
|
|
327
|
+
(this._environment as any).mock.resolveRawQuery(toResolve, realPayload);
|
|
328
328
|
}
|
|
329
329
|
}
|
|
330
330
|
}
|
package/ReactRelayTypes.js.flow
CHANGED
|
@@ -22,7 +22,7 @@ import type {
|
|
|
22
22
|
|
|
23
23
|
export type GeneratedNodeMap = {[key: string]: GraphQLTaggedNode, ...};
|
|
24
24
|
|
|
25
|
-
export type ObserverOrCallback = Observer<void> | ((error: ?Error) =>
|
|
25
|
+
export type ObserverOrCallback = Observer<void> | ((error: ?Error) => unknown);
|
|
26
26
|
|
|
27
27
|
// NOTE: This is an inexact type in order to allow a RelayPaginationProp or
|
|
28
28
|
// RelayRefetchProp to flow into a RelayProp.
|
|
@@ -57,7 +57,7 @@ export type RelayRefetchProp = {
|
|
|
57
57
|
export type RefetchOptions = {
|
|
58
58
|
+force?: boolean,
|
|
59
59
|
+fetchPolicy?: 'store-or-network' | 'network-only',
|
|
60
|
-
+metadata?: {[key: string]:
|
|
60
|
+
+metadata?: {[key: string]: unknown, ...},
|
|
61
61
|
};
|
|
62
62
|
|
|
63
63
|
/**
|
|
@@ -99,9 +99,9 @@ export type $FragmentRef<T> = {
|
|
|
99
99
|
|
|
100
100
|
/* $FlowExpectedError[unclear-type]: Intentional so that it won't fail,
|
|
101
101
|
* even if the type we want to exclude doesn't exist in Props */
|
|
102
|
-
type LooseOmitRelayProps<Props, K
|
|
102
|
+
type LooseOmitRelayProps<Props, K extends keyof any> = Pick<
|
|
103
103
|
Props,
|
|
104
|
-
Exclude
|
|
104
|
+
Exclude<keyof Props, K>,
|
|
105
105
|
>;
|
|
106
106
|
/**
|
|
107
107
|
* A utility type that takes the Props of a component and the type of
|
|
@@ -121,44 +121,42 @@ type MapRelayProp<T> = [+t: T] extends [+t: {+$fragmentType: empty, ...}]
|
|
|
121
121
|
: [+t: T] extends [+t: {+$fragmentType: FragmentType, ...}]
|
|
122
122
|
? $FragmentRef<T>
|
|
123
123
|
: [+t: T] extends [+t: ?{+$fragmentType: FragmentType, ...}]
|
|
124
|
-
? ?$FragmentRef
|
|
124
|
+
? ?$FragmentRef<NonNullable<T>>
|
|
125
125
|
: [+t: T] extends [
|
|
126
|
-
+t:
|
|
126
|
+
+t: ReadonlyArray<
|
|
127
127
|
infer V extends {+$fragmentType: FragmentType, ...},
|
|
128
128
|
>,
|
|
129
129
|
]
|
|
130
|
-
?
|
|
130
|
+
? ReadonlyArray<$FragmentRef<V>>
|
|
131
131
|
: [+t: T] extends [
|
|
132
|
-
+t:
|
|
132
|
+
+t: ?ReadonlyArray<
|
|
133
133
|
infer V extends {+$fragmentType: FragmentType, ...},
|
|
134
134
|
>,
|
|
135
135
|
]
|
|
136
|
-
?
|
|
136
|
+
? ?ReadonlyArray<$FragmentRef<V>>
|
|
137
137
|
: [+t: T] extends [
|
|
138
|
-
+t:
|
|
138
|
+
+t: ReadonlyArray<?infer V extends {
|
|
139
139
|
+$fragmentType: FragmentType,
|
|
140
140
|
...
|
|
141
141
|
}>,
|
|
142
142
|
]
|
|
143
|
-
?
|
|
143
|
+
? ReadonlyArray<?$FragmentRef<NonNullable<V>>>
|
|
144
144
|
: [+t: T] extends [
|
|
145
|
-
+t:
|
|
145
|
+
+t: ?ReadonlyArray<?infer V extends {
|
|
146
146
|
+$fragmentType: FragmentType,
|
|
147
147
|
...
|
|
148
148
|
}>,
|
|
149
149
|
]
|
|
150
|
-
?
|
|
150
|
+
? ?ReadonlyArray<?$FragmentRef<NonNullable<V>>>
|
|
151
151
|
: T;
|
|
152
152
|
|
|
153
|
-
export type RelayFragmentContainer<TComponent
|
|
154
|
-
...$RelayProps<React.ElementConfig<TComponent>, RelayProp>
|
|
155
|
-
);
|
|
153
|
+
export type RelayFragmentContainer<TComponent extends component(...empty)> =
|
|
154
|
+
component(...$RelayProps<React.ElementConfig<TComponent>, RelayProp>);
|
|
156
155
|
|
|
157
|
-
export type RelayPaginationContainer<TComponent
|
|
156
|
+
export type RelayPaginationContainer<TComponent extends component(...empty)> =
|
|
158
157
|
component(
|
|
159
158
|
...$RelayProps<React.ElementConfig<TComponent>, RelayPaginationProp>
|
|
160
159
|
);
|
|
161
160
|
|
|
162
|
-
export type RelayRefetchContainer<TComponent
|
|
163
|
-
...$RelayProps<React.ElementConfig<TComponent>, RelayRefetchProp>
|
|
164
|
-
);
|
|
161
|
+
export type RelayRefetchContainer<TComponent extends component(...empty)> =
|
|
162
|
+
component(...$RelayProps<React.ElementConfig<TComponent>, RelayRefetchProp>);
|
package/RelayContext.js.flow
CHANGED
|
@@ -20,21 +20,21 @@ const invariant = require('invariant');
|
|
|
20
20
|
* Asserts that the input is a matches the `RelayContext` type defined in
|
|
21
21
|
* `RelayEnvironmentTypes` and returns it as that type.
|
|
22
22
|
*/
|
|
23
|
-
function assertRelayContext(relay:
|
|
23
|
+
function assertRelayContext(relay: unknown): RelayContext {
|
|
24
24
|
invariant(
|
|
25
25
|
isRelayContext(relay),
|
|
26
26
|
'RelayContext: Expected `context.relay` to be an object conforming to ' +
|
|
27
27
|
'the `RelayContext` interface, got `%s`.',
|
|
28
28
|
relay,
|
|
29
29
|
);
|
|
30
|
-
return
|
|
30
|
+
return relay as any;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* Determine if the input is a plain object that matches the `RelayContext`
|
|
35
35
|
* type defined in `RelayEnvironmentTypes`.
|
|
36
36
|
*/
|
|
37
|
-
function isRelayContext(context:
|
|
37
|
+
function isRelayContext(context: unknown): boolean {
|
|
38
38
|
return (
|
|
39
39
|
typeof context === 'object' &&
|
|
40
40
|
context !== null &&
|