react-relay 20.1.1 → 21.0.1
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 +32 -25
- 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.d.ts +377 -0
- package/ReactRelayTypes.js.flow +47 -43
- 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 +32 -32
- 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 +5 -5
- package/getRootVariablesForFragments.js.flow +1 -1
- package/hooks.d.ts +89 -0
- package/hooks.js +1 -1
- package/hooks.js.flow +23 -8
- package/index.d.ts +9 -0
- 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.d.ts +143 -0
- 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.d.ts +22 -0
- package/relay-hooks/EntryPointContainer.react.js.flow +6 -6
- package/relay-hooks/EntryPointTypes.flow.js.flow +106 -108
- package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +23 -21
- package/relay-hooks/MatchContainer.d.ts +95 -0
- package/relay-hooks/MatchContainer.js.flow +17 -11
- package/relay-hooks/NestedRelayEntryPointBuilderUtils.js.flow +3 -9
- package/relay-hooks/ProfilerContext.d.ts +18 -0
- package/relay-hooks/QueryResource.js.flow +9 -9
- package/relay-hooks/RelayEnvironmentProvider.d.ts +16 -0
- 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 +50 -3
- 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 +17 -17
- package/relay-hooks/getConnectionState.js.flow +2 -2
- package/relay-hooks/legacy/FragmentResource.js.flow +13 -13
- package/relay-hooks/legacy/useBlockingPaginationFragment.js.flow +28 -25
- package/relay-hooks/legacy/useFragmentNode.js.flow +4 -4
- package/relay-hooks/legacy/useRefetchableFragmentNode.js.flow +79 -81
- package/relay-hooks/loadEntryPoint.d.ts +14 -0
- package/relay-hooks/loadEntryPoint.js.flow +15 -13
- package/relay-hooks/loadQuery.d.ts +20 -0
- package/relay-hooks/loadQuery.js.flow +19 -19
- package/relay-hooks/preloadQuery_DEPRECATED.js.flow +16 -13
- package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +7 -7
- package/relay-hooks/readFragmentInternal.js.flow +11 -11
- 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.d.ts +16 -0
- package/relay-hooks/useClientQuery.js.flow +2 -2
- package/relay-hooks/useEntryPointLoader.d.ts +21 -0
- package/relay-hooks/useEntryPointLoader.js.flow +11 -11
- package/relay-hooks/useFragment.d.ts +36 -0
- package/relay-hooks/useFragment.js.flow +8 -8
- 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 +5 -1
- package/relay-hooks/useLazyLoadQuery.d.ts +19 -0
- package/relay-hooks/useLazyLoadQuery.js.flow +14 -7
- package/relay-hooks/useLazyLoadQueryNode.js.flow +67 -28
- package/relay-hooks/useLoadMoreFunction.d.ts +56 -0
- 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.d.ts +36 -0
- package/relay-hooks/useMutation.js.flow +9 -17
- package/relay-hooks/useMutationAction_EXPERIMENTAL.js.flow +68 -0
- package/relay-hooks/usePaginationFragment.d.ts +33 -0
- package/relay-hooks/usePaginationFragment.js.flow +19 -11
- package/relay-hooks/usePrefetchableForwardPaginationFragment.js.flow +23 -18
- package/relay-hooks/usePrefetchableForwardPaginationFragment_EXPERIMENTAL.js.flow +23 -18
- package/relay-hooks/usePreloadedQuery.d.ts +17 -0
- package/relay-hooks/usePreloadedQuery.js.flow +119 -85
- package/relay-hooks/useQueryLoader.d.ts +33 -0
- package/relay-hooks/useQueryLoader.js.flow +28 -24
- package/relay-hooks/useQueryLoader_EXPERIMENTAL.js.flow +10 -10
- package/relay-hooks/useRefetchableFragment.d.ts +23 -0
- package/relay-hooks/useRefetchableFragment.js.flow +20 -11
- package/relay-hooks/useRefetchableFragmentInternal.js.flow +77 -79
- package/relay-hooks/useRelayEnvironment.d.ts +10 -0
- package/relay-hooks/useRelayLoggingContext.js.flow +1 -1
- package/relay-hooks/useSubscribeToInvalidationState.d.ts +19 -0
- package/relay-hooks/useSubscribeToInvalidationState.js.flow +1 -1
- package/relay-hooks/useSubscription.d.ts +14 -0
- package/relay-hooks/useSubscription.js.flow +1 -1
- package/rsc-client_EXPERIMENTAL.d.ts +17 -0
- package/rsc-client_EXPERIMENTAL.js +10 -0
- package/rsc-client_EXPERIMENTAL.js.flow +23 -0
- package/rsc_EXPERIMENTAL.d.ts +48 -0
- package/rsc_EXPERIMENTAL.js +10 -0
- package/rsc_EXPERIMENTAL.js.flow +90 -0
|
@@ -43,7 +43,7 @@ const {
|
|
|
43
43
|
getValueAtPath,
|
|
44
44
|
} = require('relay-runtime');
|
|
45
45
|
|
|
46
|
-
type LoadMoreFn<TVariables
|
|
46
|
+
type LoadMoreFn<TVariables extends Variables> = (
|
|
47
47
|
count: number,
|
|
48
48
|
options?: {
|
|
49
49
|
onComplete?: (Error | null) => void,
|
|
@@ -55,7 +55,9 @@ export type ReturnType<TVariables, TData, TEdgeData, TKey> = {
|
|
|
55
55
|
// NOTE: This type ensures that the type of the returned data is either:
|
|
56
56
|
// - nullable if the provided ref type is nullable
|
|
57
57
|
// - non-nullable if the provided ref type is non-nullable
|
|
58
|
-
data: [
|
|
58
|
+
data: [readonly key: TKey] extends [
|
|
59
|
+
readonly key: {readonly $fragmentSpreads: unknown, ...},
|
|
60
|
+
]
|
|
59
61
|
? TData
|
|
60
62
|
: ?TData,
|
|
61
63
|
loadNext: LoadMoreFn<TVariables>,
|
|
@@ -72,18 +74,20 @@ type LoadMoreOptions<TVariables> = {
|
|
|
72
74
|
|
|
73
75
|
export type GetExtraVariablesFn<TEdgeData, TData, TVariables, TKey> = ({
|
|
74
76
|
hasNext: boolean,
|
|
75
|
-
data: [
|
|
77
|
+
data: [readonly key: TKey] extends [
|
|
78
|
+
readonly key: {readonly $fragmentSpreads: unknown, ...},
|
|
79
|
+
]
|
|
76
80
|
? TData
|
|
77
81
|
: ?TData,
|
|
78
82
|
getServerEdges: () => TEdgeData,
|
|
79
83
|
}) => Partial<TVariables>;
|
|
80
84
|
|
|
81
85
|
hook usePrefetchableForwardPaginationFragment<
|
|
82
|
-
TFragmentType
|
|
83
|
-
TVariables
|
|
86
|
+
TFragmentType extends FragmentType,
|
|
87
|
+
TVariables extends Variables,
|
|
84
88
|
TData,
|
|
85
89
|
TEdgeData,
|
|
86
|
-
TKey
|
|
90
|
+
TKey extends ?{readonly $fragmentSpreads: TFragmentType, ...},
|
|
87
91
|
>(
|
|
88
92
|
fragmentInput: PrefetchableRefetchableFragment<
|
|
89
93
|
TFragmentType,
|
|
@@ -257,26 +261,26 @@ hook usePrefetchableForwardPaginationFragment<
|
|
|
257
261
|
onComplete: prefetchingOnComplete,
|
|
258
262
|
UNSTABLE_extraVariables:
|
|
259
263
|
typeof prefetchingUNSTABLE_extraVariables === 'function'
|
|
260
|
-
? // $FlowFixMe[incompatible-
|
|
264
|
+
? // $FlowFixMe[incompatible-type]
|
|
261
265
|
prefetchingUNSTABLE_extraVariables({
|
|
262
266
|
hasNext,
|
|
263
|
-
// $FlowFixMe[incompatible-
|
|
267
|
+
// $FlowFixMe[incompatible-type]
|
|
264
268
|
data: fragmentData,
|
|
265
269
|
getServerEdges: () => {
|
|
266
270
|
const selector = getSelector(
|
|
267
|
-
// $FlowFixMe[incompatible-
|
|
271
|
+
// $FlowFixMe[incompatible-type]
|
|
268
272
|
edgesFragment,
|
|
269
273
|
edgeKeys,
|
|
270
274
|
);
|
|
271
275
|
if (selector == null) {
|
|
272
|
-
// $FlowFixMe[incompatible-
|
|
276
|
+
// $FlowFixMe[incompatible-type]
|
|
273
277
|
return [];
|
|
274
278
|
}
|
|
275
279
|
invariant(
|
|
276
280
|
selector.kind === 'PluralReaderSelector',
|
|
277
281
|
'Expected a plural selector',
|
|
278
282
|
);
|
|
279
|
-
// $FlowFixMe[incompatible-
|
|
283
|
+
// $FlowFixMe[incompatible-type]
|
|
280
284
|
return selector.selectors.map(
|
|
281
285
|
sel => environment.lookup(sel).data,
|
|
282
286
|
);
|
|
@@ -332,22 +336,22 @@ hook usePrefetchableForwardPaginationFragment<
|
|
|
332
336
|
onComplete,
|
|
333
337
|
UNSTABLE_extraVariables:
|
|
334
338
|
typeof prefetchingUNSTABLE_extraVariables === 'function'
|
|
335
|
-
? // $FlowFixMe[incompatible-
|
|
339
|
+
? // $FlowFixMe[incompatible-type]
|
|
336
340
|
prefetchingUNSTABLE_extraVariables({
|
|
337
341
|
hasNext,
|
|
338
|
-
// $FlowFixMe[incompatible-
|
|
342
|
+
// $FlowFixMe[incompatible-type]
|
|
339
343
|
data: fragmentData,
|
|
340
344
|
getServerEdges: () => {
|
|
341
345
|
const selector = getSelector(edgesFragment, edgeKeys);
|
|
342
346
|
if (selector == null) {
|
|
343
|
-
// $FlowFixMe[incompatible-
|
|
347
|
+
// $FlowFixMe[incompatible-type]
|
|
344
348
|
return [];
|
|
345
349
|
}
|
|
346
350
|
invariant(
|
|
347
351
|
selector.kind === 'PluralReaderSelector',
|
|
348
352
|
'Expected a plural selector',
|
|
349
353
|
);
|
|
350
|
-
// $FlowFixMe[incompatible-
|
|
354
|
+
// $FlowFixMe[incompatible-type]
|
|
351
355
|
return selector.selectors.map(
|
|
352
356
|
sel => environment.lookup(sel).data,
|
|
353
357
|
);
|
|
@@ -375,12 +379,12 @@ hook usePrefetchableForwardPaginationFragment<
|
|
|
375
379
|
|
|
376
380
|
const realNumInUse = Math.min(numInUse, sourceSize);
|
|
377
381
|
|
|
378
|
-
const derivedEdgeKeys:
|
|
382
|
+
const derivedEdgeKeys: ReadonlyArray<unknown> = useMemo(
|
|
379
383
|
() => edgeKeys?.slice(0, realNumInUse) ?? [],
|
|
380
384
|
[edgeKeys, realNumInUse],
|
|
381
385
|
);
|
|
382
386
|
|
|
383
|
-
// $FlowExpectedError[incompatible-
|
|
387
|
+
// $FlowExpectedError[incompatible-type] - we know derivedEdgeKeys are the correct keys
|
|
384
388
|
const edges: TEdgeData = useFragment(edgesFragment, derivedEdgeKeys);
|
|
385
389
|
|
|
386
390
|
const refetchPagination = useCallback(
|
|
@@ -422,13 +426,14 @@ hook usePrefetchableForwardPaginationFragment<
|
|
|
422
426
|
|
|
423
427
|
return {
|
|
424
428
|
edges,
|
|
425
|
-
// $FlowFixMe[incompatible-
|
|
429
|
+
// $FlowFixMe[incompatible-type]
|
|
426
430
|
data: fragmentData,
|
|
427
431
|
loadNext: showMore,
|
|
428
432
|
hasNext: hasNext || sourceSize > numInUse,
|
|
429
433
|
// Only reflect `isLoadingMore` if the product depends on it, do not refelect
|
|
430
434
|
// `isLoaindgMore` state if it is for fufilling the buffer
|
|
431
435
|
isLoadingNext: isLoadingMore && numInUse > sourceSize,
|
|
436
|
+
// $FlowFixMe[incompatible-type]
|
|
432
437
|
refetch: refetchPagination,
|
|
433
438
|
};
|
|
434
439
|
}
|
|
@@ -43,7 +43,7 @@ const {
|
|
|
43
43
|
getValueAtPath,
|
|
44
44
|
} = require('relay-runtime');
|
|
45
45
|
|
|
46
|
-
type LoadMoreFn<TVariables
|
|
46
|
+
type LoadMoreFn<TVariables extends Variables> = (
|
|
47
47
|
count: number,
|
|
48
48
|
options?: {
|
|
49
49
|
onComplete?: (Error | null) => void,
|
|
@@ -55,7 +55,9 @@ export type ReturnType<TVariables, TData, TEdgeData, TKey> = {
|
|
|
55
55
|
// NOTE: This type ensures that the type of the returned data is either:
|
|
56
56
|
// - nullable if the provided ref type is nullable
|
|
57
57
|
// - non-nullable if the provided ref type is non-nullable
|
|
58
|
-
data: [
|
|
58
|
+
data: [readonly key: TKey] extends [
|
|
59
|
+
readonly key: {readonly $fragmentSpreads: unknown, ...},
|
|
60
|
+
]
|
|
59
61
|
? TData
|
|
60
62
|
: ?TData,
|
|
61
63
|
loadNext: LoadMoreFn<TVariables>,
|
|
@@ -72,18 +74,20 @@ type LoadMoreOptions<TVariables> = {
|
|
|
72
74
|
|
|
73
75
|
export type GetExtraVariablesFn<TEdgeData, TData, TVariables, TKey> = ({
|
|
74
76
|
hasNext: boolean,
|
|
75
|
-
data: [
|
|
77
|
+
data: [readonly key: TKey] extends [
|
|
78
|
+
readonly key: {readonly $fragmentSpreads: unknown, ...},
|
|
79
|
+
]
|
|
76
80
|
? TData
|
|
77
81
|
: ?TData,
|
|
78
82
|
getServerEdges: () => TEdgeData,
|
|
79
83
|
}) => Partial<TVariables>;
|
|
80
84
|
|
|
81
85
|
hook usePrefetchableForwardPaginationFragment_EXPERIMENTAL<
|
|
82
|
-
TFragmentType
|
|
83
|
-
TVariables
|
|
86
|
+
TFragmentType extends FragmentType,
|
|
87
|
+
TVariables extends Variables,
|
|
84
88
|
TData,
|
|
85
89
|
TEdgeData,
|
|
86
|
-
TKey
|
|
90
|
+
TKey extends ?{readonly $fragmentSpreads: TFragmentType, ...},
|
|
87
91
|
>(
|
|
88
92
|
fragmentInput: PrefetchableRefetchableFragment<
|
|
89
93
|
TFragmentType,
|
|
@@ -257,26 +261,26 @@ hook usePrefetchableForwardPaginationFragment_EXPERIMENTAL<
|
|
|
257
261
|
onComplete: prefetchingOnComplete,
|
|
258
262
|
UNSTABLE_extraVariables:
|
|
259
263
|
typeof prefetchingUNSTABLE_extraVariables === 'function'
|
|
260
|
-
? // $FlowFixMe[incompatible-
|
|
264
|
+
? // $FlowFixMe[incompatible-type]
|
|
261
265
|
prefetchingUNSTABLE_extraVariables({
|
|
262
266
|
hasNext,
|
|
263
|
-
// $FlowFixMe[incompatible-
|
|
267
|
+
// $FlowFixMe[incompatible-type]
|
|
264
268
|
data: fragmentData,
|
|
265
269
|
getServerEdges: () => {
|
|
266
270
|
const selector = getSelector(
|
|
267
|
-
// $FlowFixMe[incompatible-
|
|
271
|
+
// $FlowFixMe[incompatible-type]
|
|
268
272
|
edgesFragment,
|
|
269
273
|
edgeKeys,
|
|
270
274
|
);
|
|
271
275
|
if (selector == null) {
|
|
272
|
-
// $FlowFixMe[incompatible-
|
|
276
|
+
// $FlowFixMe[incompatible-type]
|
|
273
277
|
return [];
|
|
274
278
|
}
|
|
275
279
|
invariant(
|
|
276
280
|
selector.kind === 'PluralReaderSelector',
|
|
277
281
|
'Expected a plural selector',
|
|
278
282
|
);
|
|
279
|
-
// $FlowFixMe[incompatible-
|
|
283
|
+
// $FlowFixMe[incompatible-type]
|
|
280
284
|
return selector.selectors.map(
|
|
281
285
|
sel => environment.lookup(sel).data,
|
|
282
286
|
);
|
|
@@ -331,22 +335,22 @@ hook usePrefetchableForwardPaginationFragment_EXPERIMENTAL<
|
|
|
331
335
|
onComplete,
|
|
332
336
|
UNSTABLE_extraVariables:
|
|
333
337
|
typeof prefetchingUNSTABLE_extraVariables === 'function'
|
|
334
|
-
? // $FlowFixMe[incompatible-
|
|
338
|
+
? // $FlowFixMe[incompatible-type]
|
|
335
339
|
prefetchingUNSTABLE_extraVariables({
|
|
336
340
|
hasNext,
|
|
337
|
-
// $FlowFixMe[incompatible-
|
|
341
|
+
// $FlowFixMe[incompatible-type]
|
|
338
342
|
data: fragmentData,
|
|
339
343
|
getServerEdges: () => {
|
|
340
344
|
const selector = getSelector(edgesFragment, edgeKeys);
|
|
341
345
|
if (selector == null) {
|
|
342
|
-
// $FlowFixMe[incompatible-
|
|
346
|
+
// $FlowFixMe[incompatible-type]
|
|
343
347
|
return [];
|
|
344
348
|
}
|
|
345
349
|
invariant(
|
|
346
350
|
selector.kind === 'PluralReaderSelector',
|
|
347
351
|
'Expected a plural selector',
|
|
348
352
|
);
|
|
349
|
-
// $FlowFixMe[incompatible-
|
|
353
|
+
// $FlowFixMe[incompatible-type]
|
|
350
354
|
return selector.selectors.map(
|
|
351
355
|
sel => environment.lookup(sel).data,
|
|
352
356
|
);
|
|
@@ -374,12 +378,12 @@ hook usePrefetchableForwardPaginationFragment_EXPERIMENTAL<
|
|
|
374
378
|
|
|
375
379
|
const realNumInUse = Math.min(numInUse, sourceSize);
|
|
376
380
|
|
|
377
|
-
const derivedEdgeKeys:
|
|
381
|
+
const derivedEdgeKeys: ReadonlyArray<unknown> = useMemo(
|
|
378
382
|
() => edgeKeys?.slice(0, realNumInUse) ?? [],
|
|
379
383
|
[edgeKeys, realNumInUse],
|
|
380
384
|
);
|
|
381
385
|
|
|
382
|
-
// $FlowExpectedError[incompatible-
|
|
386
|
+
// $FlowExpectedError[incompatible-type] - we know derivedEdgeKeys are the correct keys
|
|
383
387
|
const edges: TEdgeData = useFragment(edgesFragment, derivedEdgeKeys);
|
|
384
388
|
|
|
385
389
|
const refetchPagination = useCallback(
|
|
@@ -421,13 +425,14 @@ hook usePrefetchableForwardPaginationFragment_EXPERIMENTAL<
|
|
|
421
425
|
|
|
422
426
|
return {
|
|
423
427
|
edges,
|
|
424
|
-
// $FlowFixMe[incompatible-
|
|
428
|
+
// $FlowFixMe[incompatible-type]
|
|
425
429
|
data: fragmentData,
|
|
426
430
|
loadNext: showMore,
|
|
427
431
|
hasNext: hasNext || sourceSize > numInUse,
|
|
428
432
|
// Only reflect `isLoadingMore` if the product depends on it, do not refelect
|
|
429
433
|
// `isLoaindgMore` state if it is for fufilling the buffer
|
|
430
434
|
isLoadingNext: isLoadingMore && numInUse > sourceSize,
|
|
435
|
+
// $FlowFixMe[incompatible-type]
|
|
431
436
|
refetch: refetchPagination,
|
|
432
437
|
};
|
|
433
438
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
|
|
8
|
+
import { PreloadedQuery } from '../ReactRelayTypes';
|
|
9
|
+
import {GraphQLTaggedNode, OperationType, RenderPolicy} from 'relay-runtime';
|
|
10
|
+
|
|
11
|
+
export function usePreloadedQuery<TQuery extends OperationType>(
|
|
12
|
+
gqlQuery: GraphQLTaggedNode,
|
|
13
|
+
preloadedQuery: PreloadedQuery<TQuery>,
|
|
14
|
+
options?: {
|
|
15
|
+
UNSTABLE_renderPolicy?: RenderPolicy | undefined;
|
|
16
|
+
},
|
|
17
|
+
): TQuery['response'];
|
|
@@ -29,7 +29,7 @@ const {
|
|
|
29
29
|
const warning = require('warning');
|
|
30
30
|
|
|
31
31
|
type PreloadedQuery<
|
|
32
|
-
TVariables
|
|
32
|
+
TVariables extends Variables,
|
|
33
33
|
TData,
|
|
34
34
|
TRawResponse,
|
|
35
35
|
TEnvironmentProviderOptions = EnvironmentProviderOptions,
|
|
@@ -51,114 +51,147 @@ type PreloadedQuery<
|
|
|
51
51
|
TEnvironmentProviderOptions,
|
|
52
52
|
>;
|
|
53
53
|
|
|
54
|
-
hook usePreloadedQuery<
|
|
55
|
-
TVariables
|
|
54
|
+
declare hook usePreloadedQuery<
|
|
55
|
+
TVariables extends Variables,
|
|
56
|
+
TData,
|
|
57
|
+
TRawResponse extends ?{...} = void,
|
|
58
|
+
>(
|
|
59
|
+
gqlQuery:
|
|
60
|
+
| Query<TVariables, TData, TRawResponse>
|
|
61
|
+
| ClientQuery<TVariables, TData, TRawResponse>,
|
|
62
|
+
preloadedQuery: PreloadedQuery<TVariables, TData, NonNullable<TRawResponse>>,
|
|
63
|
+
options?: {
|
|
64
|
+
UNSTABLE_renderPolicy?: RenderPolicy,
|
|
65
|
+
},
|
|
66
|
+
): TData;
|
|
67
|
+
|
|
68
|
+
declare hook usePreloadedQuery<
|
|
69
|
+
TVariables extends Variables,
|
|
56
70
|
TData,
|
|
57
|
-
TRawResponse
|
|
71
|
+
TRawResponse extends ?{...} = void,
|
|
58
72
|
>(
|
|
59
73
|
gqlQuery:
|
|
60
74
|
| Query<TVariables, TData, TRawResponse>
|
|
61
75
|
| ClientQuery<TVariables, TData, TRawResponse>,
|
|
62
|
-
preloadedQuery: PreloadedQuery<
|
|
76
|
+
preloadedQuery: ?PreloadedQuery<TVariables, TData, NonNullable<TRawResponse>>,
|
|
77
|
+
options?: {
|
|
78
|
+
UNSTABLE_renderPolicy?: RenderPolicy,
|
|
79
|
+
},
|
|
80
|
+
): ?TData;
|
|
81
|
+
|
|
82
|
+
hook usePreloadedQuery<
|
|
83
|
+
TVariables extends Variables,
|
|
84
|
+
TData,
|
|
85
|
+
TRawResponse extends ?{...} = void,
|
|
86
|
+
TPreloadedQuery extends ?PreloadedQuery<
|
|
63
87
|
TVariables,
|
|
64
88
|
TData,
|
|
65
|
-
|
|
66
|
-
|
|
89
|
+
NonNullable<TRawResponse>,
|
|
90
|
+
> = PreloadedQuery<TVariables, TData, NonNullable<TRawResponse>>,
|
|
91
|
+
>(
|
|
92
|
+
gqlQuery:
|
|
93
|
+
| Query<TVariables, TData, TRawResponse>
|
|
94
|
+
| ClientQuery<TVariables, TData, TRawResponse>,
|
|
95
|
+
preloadedQuery: TPreloadedQuery,
|
|
67
96
|
options?: {
|
|
68
97
|
UNSTABLE_renderPolicy?: RenderPolicy,
|
|
69
98
|
},
|
|
70
|
-
): TData {
|
|
99
|
+
): ?TData {
|
|
71
100
|
const environment = useRelayEnvironment();
|
|
72
|
-
const {fetchKey, fetchPolicy, source, variables, networkCacheConfig} =
|
|
73
|
-
preloadedQuery;
|
|
74
101
|
const operation = useMemoOperationDescriptor(
|
|
75
102
|
gqlQuery,
|
|
76
|
-
variables,
|
|
77
|
-
networkCacheConfig,
|
|
103
|
+
preloadedQuery != null ? preloadedQuery.variables : {},
|
|
104
|
+
preloadedQuery != null ? preloadedQuery.networkCacheConfig : undefined,
|
|
78
105
|
);
|
|
79
106
|
|
|
80
107
|
let useLazyLoadQueryNodeParams;
|
|
81
|
-
if (preloadedQuery
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
componentDisplayName: 'usePreloadedQuery()',
|
|
92
|
-
fetchKey,
|
|
93
|
-
fetchObservable: fetchQueryDeduped(
|
|
94
|
-
environment,
|
|
95
|
-
operation.request.identifier,
|
|
96
|
-
() => {
|
|
97
|
-
if (environment === preloadedQuery.environment && source != null) {
|
|
98
|
-
return environment.executeWithSource({operation, source});
|
|
99
|
-
} else {
|
|
100
|
-
return environment.execute({operation});
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
),
|
|
104
|
-
fetchPolicy,
|
|
105
|
-
query: operation,
|
|
106
|
-
renderPolicy: options?.UNSTABLE_renderPolicy,
|
|
107
|
-
};
|
|
108
|
-
} else {
|
|
109
|
-
warning(
|
|
110
|
-
preloadedQuery.isDisposed === false,
|
|
111
|
-
'usePreloadedQuery(): Expected preloadedQuery to not be disposed yet. ' +
|
|
112
|
-
'This is because disposing the query marks it for future garbage ' +
|
|
113
|
-
'collection, and as such query results may no longer be present in the Relay ' +
|
|
114
|
-
'store. In the future, this will become a hard error.',
|
|
115
|
-
);
|
|
108
|
+
if (preloadedQuery != null) {
|
|
109
|
+
const {fetchKey, fetchPolicy, source} = preloadedQuery;
|
|
110
|
+
if (preloadedQuery.kind === 'PreloadedQuery_DEPRECATED') {
|
|
111
|
+
invariant(
|
|
112
|
+
operation.request.node.params.name === preloadedQuery.name,
|
|
113
|
+
'usePreloadedQuery(): Expected data to be prefetched for query `%s`, ' +
|
|
114
|
+
'got prefetch results for query `%s`.',
|
|
115
|
+
operation.request.node.params.name,
|
|
116
|
+
preloadedQuery.name,
|
|
117
|
+
);
|
|
116
118
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
119
|
+
useLazyLoadQueryNodeParams = {
|
|
120
|
+
componentDisplayName: 'usePreloadedQuery()',
|
|
121
|
+
fetchKey,
|
|
122
|
+
fetchObservable: fetchQueryDeduped(
|
|
123
|
+
environment,
|
|
124
|
+
operation.request.identifier,
|
|
125
|
+
() => {
|
|
126
|
+
if (environment === preloadedQuery.environment && source != null) {
|
|
127
|
+
return environment.executeWithSource({operation, source});
|
|
128
|
+
} else {
|
|
129
|
+
return environment.execute({operation});
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
),
|
|
133
|
+
fetchPolicy,
|
|
134
|
+
query: operation,
|
|
135
|
+
renderPolicy: options?.UNSTABLE_renderPolicy,
|
|
136
|
+
};
|
|
137
|
+
} else {
|
|
132
138
|
warning(
|
|
133
|
-
false,
|
|
134
|
-
'usePreloadedQuery():
|
|
135
|
-
'
|
|
136
|
-
'
|
|
139
|
+
preloadedQuery.isDisposed === false,
|
|
140
|
+
'usePreloadedQuery(): Expected preloadedQuery to not be disposed yet. ' +
|
|
141
|
+
'This is because disposing the query marks it for future garbage ' +
|
|
142
|
+
'collection, and as such query results may no longer be present in the Relay ' +
|
|
143
|
+
'store. In the future, this will become a hard error.',
|
|
137
144
|
);
|
|
138
|
-
fetchObservable = fallbackFetchObservable;
|
|
139
|
-
} else {
|
|
140
|
-
// if (source == null)
|
|
141
|
-
// If the source observable does not exist, we need to
|
|
142
|
-
// fall back and re-execute and de-dupe the query (at render time).
|
|
143
|
-
fetchObservable = fallbackFetchObservable;
|
|
144
|
-
}
|
|
145
145
|
|
|
146
|
+
const fallbackFetchObservable = fetchQuery(environment, operation);
|
|
147
|
+
let fetchObservable;
|
|
148
|
+
if (source != null && environment === preloadedQuery.environment) {
|
|
149
|
+
// If the source observable exists and the environments match, reuse
|
|
150
|
+
// the source observable.
|
|
151
|
+
// If the source observable happens to be empty, we need to fall back
|
|
152
|
+
// and re-execute and de-dupe the query (at render time).
|
|
153
|
+
fetchObservable = source.ifEmpty(fallbackFetchObservable);
|
|
154
|
+
} else if (environment !== preloadedQuery.environment) {
|
|
155
|
+
// If a call to loadQuery is made with a particular environment, and that
|
|
156
|
+
// preloaded query is passed to usePreloadedQuery in a different environment
|
|
157
|
+
// context, we cannot re-use the existing preloaded query.
|
|
158
|
+
// Instead, we need to fall back and re-execute and de-dupe the query with
|
|
159
|
+
// the new environment (at render time).
|
|
160
|
+
// TODO T68036756 track occurrences of this warning and turn it into a hard error
|
|
161
|
+
warning(
|
|
162
|
+
false,
|
|
163
|
+
'usePreloadedQuery(): usePreloadedQuery was passed a preloaded query ' +
|
|
164
|
+
'that was created with a different environment than the one that is currently ' +
|
|
165
|
+
'in context. In the future, this will become a hard error.',
|
|
166
|
+
);
|
|
167
|
+
fetchObservable = fallbackFetchObservable;
|
|
168
|
+
} else {
|
|
169
|
+
// if (source == null)
|
|
170
|
+
// If the source observable does not exist, we need to
|
|
171
|
+
// fall back and re-execute and de-dupe the query (at render time).
|
|
172
|
+
fetchObservable = fallbackFetchObservable;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
useLazyLoadQueryNodeParams = {
|
|
176
|
+
componentDisplayName: 'usePreloadedQuery()',
|
|
177
|
+
fetchKey,
|
|
178
|
+
fetchObservable,
|
|
179
|
+
fetchPolicy,
|
|
180
|
+
query: operation,
|
|
181
|
+
renderPolicy: options?.UNSTABLE_renderPolicy,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
} else {
|
|
146
185
|
useLazyLoadQueryNodeParams = {
|
|
147
186
|
componentDisplayName: 'usePreloadedQuery()',
|
|
148
|
-
|
|
149
|
-
fetchKey,
|
|
150
|
-
fetchPolicy,
|
|
151
|
-
query: operation,
|
|
152
|
-
renderPolicy: options?.UNSTABLE_renderPolicy,
|
|
187
|
+
fragmentNode: gqlQuery.fragment,
|
|
153
188
|
};
|
|
154
189
|
}
|
|
155
190
|
|
|
156
191
|
const data = useLazyLoadQueryNode<{
|
|
157
192
|
variables: TVariables,
|
|
158
193
|
response: TData,
|
|
159
|
-
rawResponse?:
|
|
160
|
-
/* $FlowFixMe[incompatible-call] Natural Inference rollout. See
|
|
161
|
-
* https://fburl.com/gdoc/y8dn025u */
|
|
194
|
+
rawResponse?: NonNullable<TRawResponse>,
|
|
162
195
|
}>(useLazyLoadQueryNodeParams);
|
|
163
196
|
|
|
164
197
|
if (__DEV__) {
|
|
@@ -166,14 +199,15 @@ hook usePreloadedQuery<
|
|
|
166
199
|
// $FlowFixMe[react-rule-hook]
|
|
167
200
|
// $FlowFixMe[react-rule-hook-conditional]
|
|
168
201
|
useDebugValue({
|
|
169
|
-
query: preloadedQuery.name,
|
|
170
|
-
variables: preloadedQuery.variables,
|
|
171
202
|
data,
|
|
172
|
-
fetchKey,
|
|
173
|
-
fetchPolicy,
|
|
203
|
+
fetchKey: preloadedQuery?.fetchKey,
|
|
204
|
+
fetchPolicy: preloadedQuery?.fetchPolicy,
|
|
205
|
+
query: preloadedQuery?.name,
|
|
174
206
|
renderPolicy: options?.UNSTABLE_renderPolicy,
|
|
207
|
+
variables: preloadedQuery?.variables,
|
|
175
208
|
});
|
|
176
209
|
}
|
|
210
|
+
|
|
177
211
|
return data;
|
|
178
212
|
}
|
|
179
213
|
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
|
|
8
|
+
import {LoadQueryOptions, PreloadedQuery} from '../ReactRelayTypes';
|
|
9
|
+
import {
|
|
10
|
+
DisposeFn,
|
|
11
|
+
GraphQLTaggedNode,
|
|
12
|
+
IEnvironment,
|
|
13
|
+
OperationType,
|
|
14
|
+
PreloadableConcreteRequest,
|
|
15
|
+
VariablesOf,
|
|
16
|
+
} from 'relay-runtime';
|
|
17
|
+
|
|
18
|
+
export type useQueryLoaderHookType<TQuery extends OperationType> = [
|
|
19
|
+
PreloadedQuery<TQuery> | null | undefined,
|
|
20
|
+
(variables: VariablesOf<TQuery>, options?: UseQueryLoaderLoadQueryOptions) => void,
|
|
21
|
+
DisposeFn,
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
export type UseQueryLoaderLoadQueryOptions =
|
|
25
|
+
& LoadQueryOptions
|
|
26
|
+
& Readonly<{
|
|
27
|
+
__environment?: IEnvironment | null | undefined;
|
|
28
|
+
}>;
|
|
29
|
+
|
|
30
|
+
export function useQueryLoader<TQuery extends OperationType>(
|
|
31
|
+
preloadableRequest: GraphQLTaggedNode | PreloadableConcreteRequest<TQuery>,
|
|
32
|
+
initialQueryReference?: PreloadedQuery<TQuery> | null,
|
|
33
|
+
): useQueryLoaderHookType<TQuery>;
|