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
|
@@ -46,7 +46,7 @@ const {
|
|
|
46
46
|
const warning = require('warning');
|
|
47
47
|
|
|
48
48
|
export type RefetchFn<
|
|
49
|
-
TQuery
|
|
49
|
+
TQuery extends OperationType,
|
|
50
50
|
TOptions = Options,
|
|
51
51
|
> = RefetchFnExact<TQuery, TOptions>;
|
|
52
52
|
|
|
@@ -56,20 +56,20 @@ export type RefetchFn<
|
|
|
56
56
|
// - Or, expects /a subset/ of the query variables if the provided key type is
|
|
57
57
|
// /non-null/.
|
|
58
58
|
export type RefetchFnDynamic<
|
|
59
|
-
TQuery
|
|
60
|
-
TKey
|
|
59
|
+
TQuery extends OperationType,
|
|
60
|
+
TKey extends ?{+$data?: unknown, ...},
|
|
61
61
|
TOptions = Options,
|
|
62
|
-
> = [TKey] extends [{+$data?:
|
|
62
|
+
> = [TKey] extends [{+$data?: unknown, ...}]
|
|
63
63
|
? RefetchFnInexact<TQuery, TOptions>
|
|
64
64
|
: RefetchFnExact<TQuery, TOptions>;
|
|
65
65
|
|
|
66
66
|
export type ReturnType<
|
|
67
|
-
TQuery
|
|
68
|
-
TKey
|
|
67
|
+
TQuery extends OperationType,
|
|
68
|
+
TKey extends ?{+$data?: unknown, ...},
|
|
69
69
|
TOptions = Options,
|
|
70
70
|
> = {
|
|
71
|
-
fragmentData:
|
|
72
|
-
fragmentRef:
|
|
71
|
+
fragmentData: unknown,
|
|
72
|
+
fragmentRef: unknown,
|
|
73
73
|
refetch: RefetchFnDynamic<TQuery, TKey, TOptions>,
|
|
74
74
|
disableStoreUpdates: () => void,
|
|
75
75
|
enableStoreUpdates: () => void,
|
|
@@ -91,12 +91,12 @@ type RefetchFnBase<TVars, TOptions> = (
|
|
|
91
91
|
options?: TOptions,
|
|
92
92
|
) => Disposable;
|
|
93
93
|
|
|
94
|
-
type RefetchFnExact<
|
|
95
|
-
|
|
96
|
-
TOptions,
|
|
97
|
-
>;
|
|
94
|
+
type RefetchFnExact<
|
|
95
|
+
TQuery extends OperationType,
|
|
96
|
+
TOptions = Options,
|
|
97
|
+
> = RefetchFnBase<VariablesOf<TQuery>, TOptions>;
|
|
98
98
|
type RefetchFnInexact<
|
|
99
|
-
TQuery
|
|
99
|
+
TQuery extends OperationType,
|
|
100
100
|
TOptions = Options,
|
|
101
101
|
> = RefetchFnBase<Partial<VariablesOf<TQuery>>, TOptions>;
|
|
102
102
|
|
|
@@ -156,18 +156,18 @@ function reducer(state: RefetchState, action: Action): RefetchState {
|
|
|
156
156
|
};
|
|
157
157
|
}
|
|
158
158
|
default: {
|
|
159
|
-
|
|
159
|
+
action.type as empty;
|
|
160
160
|
throw new Error('useRefetchableFragmentNode: Unexpected action type');
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
163
|
}
|
|
164
164
|
|
|
165
165
|
hook useRefetchableFragmentNode<
|
|
166
|
-
TQuery
|
|
167
|
-
TKey
|
|
166
|
+
TQuery extends OperationType,
|
|
167
|
+
TKey extends ?{+$data?: unknown, ...},
|
|
168
168
|
>(
|
|
169
169
|
fragmentNode: ReaderFragment,
|
|
170
|
-
parentFragmentRef:
|
|
170
|
+
parentFragmentRef: unknown,
|
|
171
171
|
componentDisplayName: string,
|
|
172
172
|
): ReturnType<TQuery, TKey, InternalOptions> {
|
|
173
173
|
const parentEnvironment = useRelayEnvironment();
|
|
@@ -188,7 +188,7 @@ hook useRefetchableFragmentNode<
|
|
|
188
188
|
refetchEnvironment: null,
|
|
189
189
|
refetchQuery: null,
|
|
190
190
|
renderPolicy: undefined,
|
|
191
|
-
});
|
|
191
|
+
} as RefetchState);
|
|
192
192
|
const {
|
|
193
193
|
fetchPolicy,
|
|
194
194
|
mirroredEnvironment,
|
|
@@ -211,7 +211,7 @@ hook useRefetchableFragmentNode<
|
|
|
211
211
|
TQuery['variables'],
|
|
212
212
|
TQuery['response'],
|
|
213
213
|
TQuery['rawResponse'],
|
|
214
|
-
>(
|
|
214
|
+
>(refetchableRequest as $FlowFixMe);
|
|
215
215
|
|
|
216
216
|
let fragmentRef = parentFragmentRef;
|
|
217
217
|
|
|
@@ -222,9 +222,9 @@ hook useRefetchableFragmentNode<
|
|
|
222
222
|
|
|
223
223
|
if (shouldReset) {
|
|
224
224
|
dispatch({
|
|
225
|
-
type: 'reset',
|
|
226
225
|
environment,
|
|
227
226
|
fragmentIdentifier,
|
|
227
|
+
type: 'reset',
|
|
228
228
|
});
|
|
229
229
|
disposeQuery();
|
|
230
230
|
} else if (refetchQuery != null && queryRef != null) {
|
|
@@ -279,7 +279,6 @@ hook useRefetchableFragmentNode<
|
|
|
279
279
|
fetchPolicy,
|
|
280
280
|
renderPolicy,
|
|
281
281
|
{
|
|
282
|
-
error: handleQueryCompleted,
|
|
283
282
|
complete: () => {
|
|
284
283
|
// Validate that the type of the object we got back matches the type
|
|
285
284
|
// of the object already in the store
|
|
@@ -293,6 +292,7 @@ hook useRefetchableFragmentNode<
|
|
|
293
292
|
}
|
|
294
293
|
handleQueryCompleted();
|
|
295
294
|
},
|
|
295
|
+
error: handleQueryCompleted,
|
|
296
296
|
},
|
|
297
297
|
queryRef.fetchKey,
|
|
298
298
|
profilerContext,
|
|
@@ -342,7 +342,7 @@ hook useRefetchableFragmentNode<
|
|
|
342
342
|
data: fragmentData,
|
|
343
343
|
disableStoreUpdates,
|
|
344
344
|
enableStoreUpdates,
|
|
345
|
-
} = useFragmentNode<
|
|
345
|
+
} = useFragmentNode<unknown>(fragmentNode, fragmentRef, componentDisplayName);
|
|
346
346
|
|
|
347
347
|
const refetch = useRefetchFunction<TQuery>(
|
|
348
348
|
componentDisplayName,
|
|
@@ -358,16 +358,16 @@ hook useRefetchableFragmentNode<
|
|
|
358
358
|
refetchableRequest,
|
|
359
359
|
);
|
|
360
360
|
return {
|
|
361
|
+
disableStoreUpdates,
|
|
362
|
+
enableStoreUpdates,
|
|
361
363
|
fragmentData,
|
|
362
364
|
fragmentRef,
|
|
363
|
-
// $FlowFixMe[incompatible-
|
|
365
|
+
// $FlowFixMe[incompatible-type] RefetchFn not compatible with RefetchFnDynamic
|
|
364
366
|
refetch,
|
|
365
|
-
disableStoreUpdates,
|
|
366
|
-
enableStoreUpdates,
|
|
367
367
|
};
|
|
368
368
|
}
|
|
369
369
|
|
|
370
|
-
hook useRefetchFunction<TQuery
|
|
370
|
+
hook useRefetchFunction<TQuery extends OperationType>(
|
|
371
371
|
componentDisplayName: string,
|
|
372
372
|
dispatch: (
|
|
373
373
|
| {
|
|
@@ -385,13 +385,13 @@ hook useRefetchFunction<TQuery: OperationType>(
|
|
|
385
385
|
},
|
|
386
386
|
) => void,
|
|
387
387
|
disposeQuery: () => void,
|
|
388
|
-
fragmentData:
|
|
388
|
+
fragmentData: unknown,
|
|
389
389
|
fragmentIdentifier: string,
|
|
390
390
|
fragmentNode: ReaderFragment,
|
|
391
|
-
fragmentRefPathInResponse:
|
|
391
|
+
fragmentRefPathInResponse: ReadonlyArray<string | number>,
|
|
392
392
|
identifierInfo: ?RefetchableIdentifierInfo,
|
|
393
393
|
loadQuery: LoaderFn<TQuery>,
|
|
394
|
-
parentFragmentRef:
|
|
394
|
+
parentFragmentRef: unknown,
|
|
395
395
|
refetchableRequest: ConcreteRequest,
|
|
396
396
|
): RefetchFn<TQuery, InternalOptions> {
|
|
397
397
|
const isMountedRef = useIsMountedRef();
|
|
@@ -458,7 +458,7 @@ hook useRefetchFunction<TQuery: OperationType>(
|
|
|
458
458
|
// We fill in any variables not passed by the call to `refetch()` with the
|
|
459
459
|
// variables from the original parent fragment owner.
|
|
460
460
|
const refetchVariables: VariablesOf<TQuery> = {
|
|
461
|
-
...(parentVariables
|
|
461
|
+
...(parentVariables as $FlowFixMe),
|
|
462
462
|
...fragmentVariables,
|
|
463
463
|
...providedRefetchVariables,
|
|
464
464
|
};
|
|
@@ -483,7 +483,7 @@ hook useRefetchFunction<TQuery: OperationType>(
|
|
|
483
483
|
identifierValue,
|
|
484
484
|
);
|
|
485
485
|
}
|
|
486
|
-
(refetchVariables
|
|
486
|
+
(refetchVariables as $FlowFixMe)[
|
|
487
487
|
identifierInfo.identifierQueryVariableName
|
|
488
488
|
] = identifierValue;
|
|
489
489
|
}
|
|
@@ -502,18 +502,18 @@ hook useRefetchFunction<TQuery: OperationType>(
|
|
|
502
502
|
// so that they have been filtered out to include only the
|
|
503
503
|
// variables actually declared in the query.
|
|
504
504
|
loadQuery(refetchQuery.request.variables, {
|
|
505
|
-
fetchPolicy,
|
|
506
505
|
__environment: refetchEnvironment,
|
|
507
506
|
__nameForWarning: 'refetch',
|
|
507
|
+
fetchPolicy,
|
|
508
508
|
});
|
|
509
509
|
|
|
510
510
|
dispatch({
|
|
511
|
-
type: 'refetch',
|
|
512
511
|
fetchPolicy,
|
|
513
512
|
onComplete,
|
|
514
513
|
refetchEnvironment,
|
|
515
514
|
refetchQuery,
|
|
516
515
|
renderPolicy,
|
|
516
|
+
type: 'refetch',
|
|
517
517
|
});
|
|
518
518
|
return {dispose: disposeQuery};
|
|
519
519
|
},
|
|
@@ -531,33 +531,32 @@ hook useRefetchFunction<TQuery: OperationType>(
|
|
|
531
531
|
let debugFunctions;
|
|
532
532
|
if (__DEV__) {
|
|
533
533
|
debugFunctions = {
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
):
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
if (
|
|
543
|
-
fragmentRefPathInResponse.length !== 1 ||
|
|
544
|
-
fragmentRefPathInResponse[0] !== 'node' ||
|
|
545
|
-
id == null
|
|
546
|
-
) {
|
|
547
|
-
return null;
|
|
534
|
+
checkSameIDAfterRefetch(
|
|
535
|
+
previousIDAndTypename: ?DebugIDandTypename,
|
|
536
|
+
refetchedFragmentRef: unknown,
|
|
537
|
+
fragmentNode: ReaderFragment,
|
|
538
|
+
componentDisplayName: string,
|
|
539
|
+
): void {
|
|
540
|
+
if (previousIDAndTypename == null || refetchedFragmentRef == null) {
|
|
541
|
+
return;
|
|
548
542
|
}
|
|
549
|
-
const
|
|
550
|
-
|
|
551
|
-
const
|
|
552
|
-
if (
|
|
553
|
-
|
|
543
|
+
const {ID_KEY} = require('relay-runtime');
|
|
544
|
+
// $FlowExpectedError[incompatible-use]
|
|
545
|
+
const resultID = refetchedFragmentRef[ID_KEY];
|
|
546
|
+
if (resultID != null && resultID !== previousIDAndTypename.id) {
|
|
547
|
+
warning(
|
|
548
|
+
false,
|
|
549
|
+
'Relay: Call to `refetch` returned a different id, expected ' +
|
|
550
|
+
'`%s`, got `%s`, on `%s` in `%s`. ' +
|
|
551
|
+
'Please make sure the server correctly implements ' +
|
|
552
|
+
'unique id requirement.',
|
|
553
|
+
resultID,
|
|
554
|
+
previousIDAndTypename.id,
|
|
555
|
+
fragmentNode.name,
|
|
556
|
+
componentDisplayName,
|
|
557
|
+
);
|
|
554
558
|
}
|
|
555
|
-
return {
|
|
556
|
-
id,
|
|
557
|
-
typename,
|
|
558
|
-
};
|
|
559
559
|
},
|
|
560
|
-
|
|
561
560
|
checkSameTypeAfterRefetch(
|
|
562
561
|
previousIDAndType: ?DebugIDandTypename,
|
|
563
562
|
environment: IEnvironment,
|
|
@@ -585,32 +584,31 @@ if (__DEV__) {
|
|
|
585
584
|
);
|
|
586
585
|
}
|
|
587
586
|
},
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
587
|
+
getInitialIDAndType(
|
|
588
|
+
memoRefetchVariables: ?Variables,
|
|
589
|
+
fragmentRefPathInResponse: ReadonlyArray<string | number>,
|
|
590
|
+
identifierQueryVariableName: ?string,
|
|
591
|
+
environment: IEnvironment,
|
|
592
|
+
): ?DebugIDandTypename {
|
|
593
|
+
const {Record} = require('relay-runtime');
|
|
594
|
+
const id = memoRefetchVariables?.[identifierQueryVariableName ?? 'id'];
|
|
595
|
+
if (
|
|
596
|
+
fragmentRefPathInResponse.length !== 1 ||
|
|
597
|
+
fragmentRefPathInResponse[0] !== 'node' ||
|
|
598
|
+
id == null
|
|
599
|
+
) {
|
|
600
|
+
return null;
|
|
597
601
|
}
|
|
598
|
-
const
|
|
599
|
-
|
|
600
|
-
const
|
|
601
|
-
if (
|
|
602
|
-
|
|
603
|
-
false,
|
|
604
|
-
'Relay: Call to `refetch` returned a different id, expected ' +
|
|
605
|
-
'`%s`, got `%s`, on `%s` in `%s`. ' +
|
|
606
|
-
'Please make sure the server correctly implements ' +
|
|
607
|
-
'unique id requirement.',
|
|
608
|
-
resultID,
|
|
609
|
-
previousIDAndTypename.id,
|
|
610
|
-
fragmentNode.name,
|
|
611
|
-
componentDisplayName,
|
|
612
|
-
);
|
|
602
|
+
const recordSource = environment.getStore().getSource();
|
|
603
|
+
const record = recordSource.get(id);
|
|
604
|
+
const typename = record == null ? null : Record.getType(record);
|
|
605
|
+
if (typename == null) {
|
|
606
|
+
return null;
|
|
613
607
|
}
|
|
608
|
+
return {
|
|
609
|
+
id,
|
|
610
|
+
typename,
|
|
611
|
+
};
|
|
614
612
|
},
|
|
615
613
|
};
|
|
616
614
|
}
|
|
@@ -23,19 +23,19 @@ import type {
|
|
|
23
23
|
const {loadQuery} = require('./loadQuery');
|
|
24
24
|
|
|
25
25
|
function loadEntryPoint<
|
|
26
|
-
TEntryPointParams
|
|
26
|
+
TEntryPointParams extends {...},
|
|
27
27
|
// $FlowExpectedError[unclear-type] Need any to make it supertype of all PreloadedQuery
|
|
28
|
-
TPreloadedQueries
|
|
29
|
-
TPreloadedEntryPoints
|
|
30
|
-
TRuntimeProps
|
|
28
|
+
TPreloadedQueries extends {+[string]: PreloadedQuery<any>},
|
|
29
|
+
TPreloadedEntryPoints extends {...},
|
|
30
|
+
TRuntimeProps extends {...},
|
|
31
31
|
TExtraProps,
|
|
32
|
-
TEntryPointComponent
|
|
32
|
+
TEntryPointComponent extends EntryPointComponent<
|
|
33
33
|
TPreloadedQueries,
|
|
34
34
|
TPreloadedEntryPoints,
|
|
35
35
|
TRuntimeProps,
|
|
36
36
|
TExtraProps,
|
|
37
37
|
>,
|
|
38
|
-
TEntryPoint
|
|
38
|
+
TEntryPoint extends EntryPoint<TEntryPointParams, TEntryPointComponent>,
|
|
39
39
|
>(
|
|
40
40
|
environmentProvider: IEnvironmentProvider<EnvironmentProviderOptions>,
|
|
41
41
|
entryPoint: TEntryPoint,
|
|
@@ -78,9 +78,9 @@ function loadEntryPoint<
|
|
|
78
78
|
parameters,
|
|
79
79
|
variables,
|
|
80
80
|
{
|
|
81
|
+
__nameForWarning: 'loadEntryPoint',
|
|
81
82
|
fetchPolicy: options?.fetchPolicy,
|
|
82
83
|
networkCacheConfig: options?.networkCacheConfig,
|
|
83
|
-
__nameForWarning: 'loadEntryPoint',
|
|
84
84
|
},
|
|
85
85
|
environmentProviderOptions,
|
|
86
86
|
);
|
|
@@ -101,8 +101,8 @@ function loadEntryPoint<
|
|
|
101
101
|
{},
|
|
102
102
|
{...},
|
|
103
103
|
{...},
|
|
104
|
-
|
|
105
|
-
EntryPointComponent<{}, {...}, {...},
|
|
104
|
+
unknown,
|
|
105
|
+
EntryPointComponent<{}, {...}, {...}, unknown>,
|
|
106
106
|
_,
|
|
107
107
|
>(environmentProvider, nestedEntryPoint, nestedParams);
|
|
108
108
|
});
|
|
@@ -130,7 +130,8 @@ function loadEntryPoint<
|
|
|
130
130
|
}
|
|
131
131
|
isDisposed = true;
|
|
132
132
|
},
|
|
133
|
-
|
|
133
|
+
// $FlowFixMe[incompatible-type]
|
|
134
|
+
entryPoints: preloadedEntryPoints as TPreloadedEntryPoints,
|
|
134
135
|
extraProps: extraProps ?? null,
|
|
135
136
|
getComponent: () => {
|
|
136
137
|
const componentModule = entryPoint.root.getModuleIfRequired();
|
|
@@ -148,14 +149,15 @@ function loadEntryPoint<
|
|
|
148
149
|
componentModule.default != null
|
|
149
150
|
? componentModule.default
|
|
150
151
|
: componentModule;
|
|
151
|
-
// $FlowFixMe[incompatible-
|
|
152
|
-
return
|
|
152
|
+
// $FlowFixMe[incompatible-type] - trust me Flow, its entryPoint component
|
|
153
|
+
return component as TEntryPointComponent;
|
|
153
154
|
},
|
|
154
155
|
// $FlowFixMe[unsafe-getters-setters] - this has no side effects
|
|
155
156
|
get isDisposed() {
|
|
156
157
|
return isDisposed;
|
|
157
158
|
},
|
|
158
|
-
|
|
159
|
+
// $FlowFixMe[incompatible-type]
|
|
160
|
+
queries: preloadedQueries as TPreloadedQueries,
|
|
159
161
|
rootModuleID: entryPoint.root.getModuleId(),
|
|
160
162
|
};
|
|
161
163
|
}
|
|
@@ -48,7 +48,7 @@ export type QueryType<T> =
|
|
|
48
48
|
? {
|
|
49
49
|
variables: V,
|
|
50
50
|
response: D,
|
|
51
|
-
rawResponse?:
|
|
51
|
+
rawResponse?: NonNullable<RR>,
|
|
52
52
|
}
|
|
53
53
|
: [+t: T] extends [+t: PreloadableConcreteRequest<infer V>]
|
|
54
54
|
? V
|
|
@@ -66,7 +66,7 @@ declare function loadQuery<
|
|
|
66
66
|
): PreloadedQueryInner<QueryType<T>, TEnvironmentProviderOptions>;
|
|
67
67
|
|
|
68
68
|
function loadQuery<
|
|
69
|
-
TQuery
|
|
69
|
+
TQuery extends OperationType,
|
|
70
70
|
TEnvironmentProviderOptions = EnvironmentProviderOptions,
|
|
71
71
|
>(
|
|
72
72
|
environment: IEnvironment,
|
|
@@ -175,6 +175,9 @@ function loadQuery<
|
|
|
175
175
|
});
|
|
176
176
|
|
|
177
177
|
const {unsubscribe} = observable.subscribe({
|
|
178
|
+
complete() {
|
|
179
|
+
subject.complete();
|
|
180
|
+
},
|
|
178
181
|
error(err) {
|
|
179
182
|
networkError = err;
|
|
180
183
|
subject.error(err);
|
|
@@ -182,9 +185,6 @@ function loadQuery<
|
|
|
182
185
|
next(data) {
|
|
183
186
|
subject.next(data);
|
|
184
187
|
},
|
|
185
|
-
complete() {
|
|
186
|
-
subject.complete();
|
|
187
|
-
},
|
|
188
188
|
});
|
|
189
189
|
unsubscribeFromNetworkRequest = unsubscribe;
|
|
190
190
|
return Observable.create(sink => {
|
|
@@ -230,15 +230,15 @@ function loadQuery<
|
|
|
230
230
|
operation.request.identifier,
|
|
231
231
|
fetchFn,
|
|
232
232
|
).subscribe({
|
|
233
|
+
complete() {
|
|
234
|
+
executionSubject.complete();
|
|
235
|
+
},
|
|
233
236
|
error(err) {
|
|
234
237
|
executionSubject.error(err);
|
|
235
238
|
},
|
|
236
239
|
next(data) {
|
|
237
240
|
executionSubject.next(data);
|
|
238
241
|
},
|
|
239
|
-
complete() {
|
|
240
|
-
executionSubject.complete();
|
|
241
|
-
},
|
|
242
242
|
}));
|
|
243
243
|
};
|
|
244
244
|
|
|
@@ -284,7 +284,7 @@ function loadQuery<
|
|
|
284
284
|
let queryId;
|
|
285
285
|
if (preloadableRequest.kind === 'PreloadableConcreteRequest') {
|
|
286
286
|
const preloadableConcreteRequest: PreloadableConcreteRequest<TQuery> =
|
|
287
|
-
|
|
287
|
+
preloadableRequest as $FlowFixMe;
|
|
288
288
|
({params} = preloadableConcreteRequest);
|
|
289
289
|
|
|
290
290
|
({id: queryId} = params);
|
|
@@ -329,7 +329,7 @@ function loadQuery<
|
|
|
329
329
|
}
|
|
330
330
|
} else {
|
|
331
331
|
const graphQlTaggedNode: GraphQLTaggedNode =
|
|
332
|
-
|
|
332
|
+
preloadableRequest as $FlowFixMe;
|
|
333
333
|
const request = getRequest(graphQlTaggedNode);
|
|
334
334
|
params = request.params;
|
|
335
335
|
queryId = params.cacheID != null ? params.cacheID : params.id;
|
|
@@ -365,9 +365,7 @@ function loadQuery<
|
|
|
365
365
|
isNetworkRequestCancelled = true;
|
|
366
366
|
};
|
|
367
367
|
return {
|
|
368
|
-
|
|
369
|
-
environment,
|
|
370
|
-
environmentProviderOptions,
|
|
368
|
+
cancelNetworkRequest,
|
|
371
369
|
dispose() {
|
|
372
370
|
if (isDisposed) {
|
|
373
371
|
return;
|
|
@@ -376,21 +374,23 @@ function loadQuery<
|
|
|
376
374
|
cancelNetworkRequest();
|
|
377
375
|
isDisposed = true;
|
|
378
376
|
},
|
|
379
|
-
|
|
380
|
-
|
|
377
|
+
environment,
|
|
378
|
+
environmentProviderOptions,
|
|
381
379
|
fetchKey,
|
|
380
|
+
fetchPolicy,
|
|
382
381
|
id: queryId,
|
|
383
382
|
// $FlowFixMe[unsafe-getters-setters] - this has no side effects
|
|
384
383
|
get isDisposed() {
|
|
385
384
|
return isDisposed || isReleased;
|
|
386
385
|
},
|
|
386
|
+
kind: 'PreloadedQuery',
|
|
387
|
+
name: params.name,
|
|
388
|
+
networkCacheConfig,
|
|
387
389
|
// $FlowFixMe[unsafe-getters-setters] - this has no side effects
|
|
388
390
|
get networkError() {
|
|
389
391
|
return networkError;
|
|
390
392
|
},
|
|
391
|
-
|
|
392
|
-
networkCacheConfig,
|
|
393
|
-
fetchPolicy,
|
|
393
|
+
releaseQuery,
|
|
394
394
|
source: didMakeNetworkRequest ? returnedObservable : undefined,
|
|
395
395
|
variables,
|
|
396
396
|
};
|
|
@@ -49,7 +49,7 @@ const pendingQueriesByEnvironment = WEAKMAP_SUPPORTED
|
|
|
49
49
|
: new Map<IEnvironment, Map<string, PendingQueryEntry>>();
|
|
50
50
|
|
|
51
51
|
type PendingQueryEntry =
|
|
52
|
-
|
|
|
52
|
+
| Readonly<{
|
|
53
53
|
cacheKey: string,
|
|
54
54
|
fetchKey: ?string | ?number,
|
|
55
55
|
fetchPolicy: PreloadFetchPolicy,
|
|
@@ -60,7 +60,7 @@ type PendingQueryEntry =
|
|
|
60
60
|
subject: ReplaySubject<GraphQLResponse>,
|
|
61
61
|
subscription: Subscription,
|
|
62
62
|
}>
|
|
63
|
-
|
|
|
63
|
+
| Readonly<{
|
|
64
64
|
cacheKey: string,
|
|
65
65
|
fetchKey: ?string | ?number,
|
|
66
66
|
fetchPolicy: PreloadFetchPolicy,
|
|
@@ -70,7 +70,10 @@ type PendingQueryEntry =
|
|
|
70
70
|
status: PreloadQueryStatus,
|
|
71
71
|
}>;
|
|
72
72
|
|
|
73
|
-
function preloadQuery<
|
|
73
|
+
function preloadQuery<
|
|
74
|
+
TQuery extends OperationType,
|
|
75
|
+
TEnvironmentProviderOptions,
|
|
76
|
+
>(
|
|
74
77
|
environment: IEnvironment,
|
|
75
78
|
preloadableRequest: GraphQLTaggedNode | PreloadableConcreteRequest<TQuery>,
|
|
76
79
|
variables: VariablesOf<TQuery>,
|
|
@@ -124,21 +127,21 @@ function preloadQuery<TQuery: OperationType, TEnvironmentProviderOptions>(
|
|
|
124
127
|
})
|
|
125
128
|
: null;
|
|
126
129
|
return {
|
|
127
|
-
kind: 'PreloadedQuery_DEPRECATED',
|
|
128
130
|
environment,
|
|
129
131
|
environmentProviderOptions,
|
|
130
132
|
fetchKey: queryEntry.fetchKey,
|
|
131
133
|
fetchPolicy: queryEntry.fetchPolicy,
|
|
132
|
-
networkCacheConfig: options?.networkCacheConfig,
|
|
133
134
|
id: queryEntry.id,
|
|
135
|
+
kind: 'PreloadedQuery_DEPRECATED',
|
|
134
136
|
name: queryEntry.name,
|
|
137
|
+
networkCacheConfig: options?.networkCacheConfig,
|
|
135
138
|
source,
|
|
136
|
-
variables,
|
|
137
139
|
status: queryEntry.status,
|
|
140
|
+
variables,
|
|
138
141
|
};
|
|
139
142
|
}
|
|
140
143
|
|
|
141
|
-
function preloadQueryDeduped<TQuery
|
|
144
|
+
function preloadQueryDeduped<TQuery extends OperationType>(
|
|
142
145
|
environment: IEnvironment,
|
|
143
146
|
pendingQueries: Map<string, PendingQueryEntry>,
|
|
144
147
|
preloadableRequest: GraphQLTaggedNode | PreloadableConcreteRequest<TQuery>,
|
|
@@ -149,11 +152,11 @@ function preloadQueryDeduped<TQuery: OperationType>(
|
|
|
149
152
|
let query: ?ConcreteRequest;
|
|
150
153
|
if (preloadableRequest.kind === 'PreloadableConcreteRequest') {
|
|
151
154
|
const preloadableConcreteRequest: PreloadableConcreteRequest<TQuery> =
|
|
152
|
-
|
|
155
|
+
preloadableRequest as $FlowFixMe;
|
|
153
156
|
params = preloadableConcreteRequest.params;
|
|
154
157
|
query = params.id != null ? PreloadableQueryRegistry.get(params.id) : null;
|
|
155
158
|
} else {
|
|
156
|
-
query = getRequest(
|
|
159
|
+
query = getRequest(preloadableRequest as $FlowFixMe);
|
|
157
160
|
params = query.params;
|
|
158
161
|
}
|
|
159
162
|
const network = environment.getNetwork();
|
|
@@ -189,13 +192,13 @@ function preloadQueryDeduped<TQuery: OperationType>(
|
|
|
189
192
|
cacheKey,
|
|
190
193
|
fetchKey,
|
|
191
194
|
fetchPolicy,
|
|
192
|
-
kind: 'cache',
|
|
193
195
|
id: params.id,
|
|
196
|
+
kind: 'cache',
|
|
194
197
|
name: params.name,
|
|
195
198
|
status: {
|
|
196
199
|
cacheConfig: networkCacheConfig,
|
|
197
|
-
source: 'cache',
|
|
198
200
|
fetchTime: availability?.fetchTime ?? null,
|
|
201
|
+
source: 'cache',
|
|
199
202
|
},
|
|
200
203
|
};
|
|
201
204
|
if (!environment.isServer() && prevQueryEntry == null) {
|
|
@@ -224,13 +227,13 @@ function preloadQueryDeduped<TQuery: OperationType>(
|
|
|
224
227
|
cacheKey,
|
|
225
228
|
fetchKey,
|
|
226
229
|
fetchPolicy,
|
|
227
|
-
kind: 'network',
|
|
228
230
|
id: params.id,
|
|
231
|
+
kind: 'network',
|
|
229
232
|
name: params.name,
|
|
230
233
|
status: {
|
|
231
234
|
cacheConfig: networkCacheConfig,
|
|
232
|
-
source: 'network',
|
|
233
235
|
fetchTime: null,
|
|
236
|
+
source: 'network',
|
|
234
237
|
},
|
|
235
238
|
subject,
|
|
236
239
|
subscription: source
|
|
@@ -22,19 +22,19 @@ import type {
|
|
|
22
22
|
const preloadQuery = require('./preloadQuery_DEPRECATED');
|
|
23
23
|
|
|
24
24
|
function prepareEntryPoint<
|
|
25
|
-
TEntryPointParams
|
|
25
|
+
TEntryPointParams extends {...},
|
|
26
26
|
// $FlowExpectedError[unclear-type] Need any to make it supertype of all PreloadedQuery
|
|
27
|
-
TPreloadedQueries
|
|
28
|
-
TPreloadedEntryPoints
|
|
29
|
-
TRuntimeProps
|
|
27
|
+
TPreloadedQueries extends {+[string]: PreloadedQuery<any>},
|
|
28
|
+
TPreloadedEntryPoints extends {...},
|
|
29
|
+
TRuntimeProps extends {...},
|
|
30
30
|
TExtraProps,
|
|
31
|
-
TEntryPointComponent
|
|
31
|
+
TEntryPointComponent extends EntryPointComponent<
|
|
32
32
|
TPreloadedQueries,
|
|
33
33
|
TPreloadedEntryPoints,
|
|
34
34
|
TRuntimeProps,
|
|
35
35
|
TExtraProps,
|
|
36
36
|
>,
|
|
37
|
-
TEntryPoint
|
|
37
|
+
TEntryPoint extends EntryPoint<TEntryPointParams, TEntryPointComponent>,
|
|
38
38
|
>(
|
|
39
39
|
environmentProvider: IEnvironmentProvider<EnvironmentProviderOptions>,
|
|
40
40
|
entryPoint: TEntryPoint,
|
|
@@ -62,7 +62,7 @@ function prepareEntryPoint<
|
|
|
62
62
|
);
|
|
63
63
|
|
|
64
64
|
// $FlowFixMe[incompatible-type]
|
|
65
|
-
preloadedQueries[queryPropName] = preloadQuery<OperationType,
|
|
65
|
+
preloadedQueries[queryPropName] = preloadQuery<OperationType, unknown>(
|
|
66
66
|
environment,
|
|
67
67
|
parameters,
|
|
68
68
|
variables,
|