react-relay 11.0.1 → 13.0.0-rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (150) hide show
  1. package/ReactRelayContext.js +1 -1
  2. package/ReactRelayContext.js.flow +2 -3
  3. package/ReactRelayFragmentContainer.js.flow +24 -24
  4. package/ReactRelayFragmentMockRenderer.js.flow +1 -1
  5. package/ReactRelayLocalQueryRenderer.js.flow +6 -7
  6. package/ReactRelayPaginationContainer.js.flow +111 -58
  7. package/ReactRelayQueryFetcher.js.flow +9 -10
  8. package/ReactRelayQueryRenderer.js.flow +115 -81
  9. package/ReactRelayRefetchContainer.js.flow +41 -38
  10. package/ReactRelayTestMocker.js.flow +16 -14
  11. package/ReactRelayTypes.js.flow +10 -10
  12. package/RelayContext.js.flow +3 -3
  13. package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +1 -2
  14. package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +11 -7
  15. package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +10 -6
  16. package/__flowtests__/RelayModern-flowtest.js.flow +78 -46
  17. package/__flowtests__/RelayModernFlowtest_badref.graphql.js.flow +5 -4
  18. package/__flowtests__/RelayModernFlowtest_notref.graphql.js.flow +5 -4
  19. package/__flowtests__/RelayModernFlowtest_user.graphql.js.flow +4 -3
  20. package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +4 -3
  21. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +72 -0
  22. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +72 -0
  23. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +227 -0
  24. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +164 -0
  25. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +227 -0
  26. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +164 -0
  27. package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +66 -0
  28. package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +66 -0
  29. package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +59 -0
  30. package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +61 -0
  31. package/assertFragmentMap.js.flow +2 -2
  32. package/buildReactRelayContainer.js.flow +15 -12
  33. package/getRootVariablesForFragments.js.flow +2 -4
  34. package/hooks.js +1 -1
  35. package/hooks.js.flow +5 -6
  36. package/index.js +1 -1
  37. package/index.js.flow +6 -7
  38. package/jest-react/enqueueTask.js.flow +56 -0
  39. package/jest-react/index.js.flow +12 -0
  40. package/jest-react/internalAct.js.flow +139 -0
  41. package/legacy.js +1 -1
  42. package/lib/ReactRelayFragmentContainer.js +21 -15
  43. package/lib/ReactRelayFragmentMockRenderer.js +2 -2
  44. package/lib/ReactRelayLocalQueryRenderer.js +7 -8
  45. package/lib/ReactRelayPaginationContainer.js +96 -38
  46. package/lib/ReactRelayQueryFetcher.js +3 -3
  47. package/lib/ReactRelayQueryRenderer.js +86 -53
  48. package/lib/ReactRelayRefetchContainer.js +38 -25
  49. package/lib/ReactRelayTestMocker.js +8 -9
  50. package/lib/RelayContext.js +3 -2
  51. package/lib/assertFragmentMap.js +3 -2
  52. package/lib/buildReactRelayContainer.js +14 -11
  53. package/lib/getRootVariablesForFragments.js +1 -2
  54. package/lib/hooks.js +5 -5
  55. package/lib/index.js +7 -7
  56. package/lib/jest-react/enqueueTask.js +53 -0
  57. package/lib/jest-react/index.js +13 -0
  58. package/lib/jest-react/internalAct.js +116 -0
  59. package/lib/multi-actor/ActorChange.js +30 -0
  60. package/lib/multi-actor/index.js +11 -0
  61. package/lib/multi-actor/useRelayActorEnvironment.js +29 -0
  62. package/lib/relay-hooks/EntryPointContainer.react.js +3 -3
  63. package/lib/relay-hooks/FragmentResource.js +347 -92
  64. package/lib/relay-hooks/LRUCache.js +1 -1
  65. package/lib/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js +4 -4
  66. package/lib/relay-hooks/MatchContainer.js +1 -1
  67. package/lib/relay-hooks/QueryResource.js +172 -29
  68. package/lib/relay-hooks/RelayEnvironmentProvider.js +5 -3
  69. package/lib/relay-hooks/SuspenseResource.js +130 -0
  70. package/lib/relay-hooks/loadQuery.js +42 -20
  71. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +24 -15
  72. package/lib/relay-hooks/useBlockingPaginationFragment.js +4 -5
  73. package/lib/relay-hooks/useEntryPointLoader.js +2 -2
  74. package/lib/relay-hooks/useFetchTrackingRef.js +2 -1
  75. package/lib/relay-hooks/useFragment.js +8 -7
  76. package/lib/relay-hooks/useFragmentNode.js +4 -4
  77. package/lib/relay-hooks/useIsOperationNodeActive.js +3 -3
  78. package/lib/relay-hooks/useLazyLoadQuery.js +3 -3
  79. package/lib/relay-hooks/useLazyLoadQueryNode.js +10 -4
  80. package/lib/relay-hooks/useLoadMoreFunction.js +8 -12
  81. package/lib/relay-hooks/useMemoOperationDescriptor.js +2 -2
  82. package/lib/relay-hooks/useMemoVariables.js +2 -2
  83. package/lib/relay-hooks/useMutation.js +17 -6
  84. package/lib/relay-hooks/usePaginationFragment.js +2 -3
  85. package/lib/relay-hooks/usePreloadedQuery.js +8 -7
  86. package/lib/relay-hooks/useQueryLoader.js +30 -10
  87. package/lib/relay-hooks/useRefetchableFragmentNode.js +13 -17
  88. package/lib/relay-hooks/useRelayEnvironment.js +3 -3
  89. package/lib/relay-hooks/useStaticFragmentNodeWarning.js +2 -2
  90. package/lib/relay-hooks/useSubscribeToInvalidationState.js +2 -1
  91. package/lib/relay-hooks/useSubscription.js +10 -7
  92. package/multi-actor/ActorChange.js.flow +58 -0
  93. package/multi-actor/index.js.flow +14 -0
  94. package/multi-actor/useRelayActorEnvironment.js.flow +49 -0
  95. package/package.json +3 -2
  96. package/react-relay-hooks.js +2 -2
  97. package/react-relay-hooks.min.js +2 -2
  98. package/react-relay-legacy.js +2 -2
  99. package/react-relay-legacy.min.js +2 -2
  100. package/react-relay.js +2 -2
  101. package/react-relay.min.js +2 -2
  102. package/relay-hooks/EntryPointContainer.react.js.flow +8 -15
  103. package/relay-hooks/EntryPointTypes.flow.js.flow +24 -25
  104. package/relay-hooks/FragmentResource.js.flow +368 -94
  105. package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +32 -46
  106. package/relay-hooks/MatchContainer.js.flow +3 -2
  107. package/relay-hooks/QueryResource.js.flow +216 -25
  108. package/relay-hooks/RelayEnvironmentProvider.js.flow +14 -4
  109. package/relay-hooks/SuspenseResource.js.flow +115 -0
  110. package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +4 -3
  111. package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +1 -1
  112. package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +10 -9
  113. package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +8 -7
  114. package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +10 -9
  115. package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +10 -9
  116. package/relay-hooks/__flowtests__/utils.js.flow +8 -12
  117. package/relay-hooks/loadEntryPoint.js.flow +6 -12
  118. package/relay-hooks/loadQuery.js.flow +49 -31
  119. package/relay-hooks/preloadQuery_DEPRECATED.js.flow +30 -21
  120. package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +6 -12
  121. package/relay-hooks/useBlockingPaginationFragment.js.flow +13 -11
  122. package/relay-hooks/useEntryPointLoader.js.flow +7 -10
  123. package/relay-hooks/useFetchTrackingRef.js.flow +2 -2
  124. package/relay-hooks/useFragment.js.flow +26 -46
  125. package/relay-hooks/useFragmentNode.js.flow +5 -7
  126. package/relay-hooks/useIsOperationNodeActive.js.flow +3 -5
  127. package/relay-hooks/useIsParentQueryActive.js.flow +3 -4
  128. package/relay-hooks/useLazyLoadQuery.js.flow +9 -10
  129. package/relay-hooks/useLazyLoadQueryNode.js.flow +19 -13
  130. package/relay-hooks/useLoadMoreFunction.js.flow +20 -29
  131. package/relay-hooks/useMemoOperationDescriptor.js.flow +5 -7
  132. package/relay-hooks/useMemoVariables.js.flow +6 -6
  133. package/relay-hooks/useMutation.js.flow +26 -26
  134. package/relay-hooks/usePaginationFragment.js.flow +38 -44
  135. package/relay-hooks/usePreloadedQuery.js.flow +18 -14
  136. package/relay-hooks/useQueryLoader.js.flow +41 -22
  137. package/relay-hooks/useRefetchableFragment.js.flow +7 -8
  138. package/relay-hooks/useRefetchableFragmentNode.js.flow +24 -32
  139. package/relay-hooks/useRelayEnvironment.js.flow +2 -4
  140. package/relay-hooks/useStaticFragmentNodeWarning.js.flow +2 -3
  141. package/relay-hooks/useSubscribeToInvalidationState.js.flow +3 -6
  142. package/relay-hooks/useSubscription.js.flow +20 -10
  143. package/lib/relay-hooks/getPaginationMetadata.js +0 -41
  144. package/lib/relay-hooks/getPaginationVariables.js +0 -67
  145. package/lib/relay-hooks/getRefetchMetadata.js +0 -36
  146. package/lib/relay-hooks/getValueAtPath.js +0 -51
  147. package/relay-hooks/getPaginationMetadata.js.flow +0 -74
  148. package/relay-hooks/getPaginationVariables.js.flow +0 -110
  149. package/relay-hooks/getRefetchMetadata.js.flow +0 -80
  150. package/relay-hooks/getValueAtPath.js.flow +0 -46
@@ -13,25 +13,27 @@
13
13
 
14
14
  'use strict';
15
15
 
16
- const getPaginationMetadata = require('./getPaginationMetadata');
17
- const invariant = require('invariant');
18
- const useLoadMoreFunction = require('./useLoadMoreFunction');
19
- const useRefetchableFragmentNode = require('./useRefetchableFragmentNode');
20
- const useStaticFragmentNodeWarning = require('./useStaticFragmentNodeWarning');
21
-
22
- const {useCallback, useEffect, useRef, useState} = require('react');
23
- const {getFragment, getFragmentIdentifier} = require('relay-runtime');
24
-
25
16
  import type {LoadMoreFn, UseLoadMoreFunctionArgs} from './useLoadMoreFunction';
26
17
  import type {RefetchFnDynamic} from './useRefetchableFragmentNode';
27
18
  import type {
28
- FragmentReference,
19
+ FragmentType,
29
20
  GraphQLResponse,
30
21
  GraphQLTaggedNode,
31
22
  Observer,
32
23
  OperationType,
33
24
  } from 'relay-runtime';
34
25
 
26
+ const useLoadMoreFunction = require('./useLoadMoreFunction');
27
+ const useRefetchableFragmentNode = require('./useRefetchableFragmentNode');
28
+ const useStaticFragmentNodeWarning = require('./useStaticFragmentNodeWarning');
29
+ const invariant = require('invariant');
30
+ const {useCallback, useEffect, useRef, useState} = require('react');
31
+ const {
32
+ getFragment,
33
+ getFragmentIdentifier,
34
+ getPaginationMetadata,
35
+ } = require('relay-runtime');
36
+
35
37
  export type ReturnType<TQuery: OperationType, TKey, TFragmentData> = {|
36
38
  data: TFragmentData,
37
39
  loadNext: LoadMoreFn<TQuery>,
@@ -43,7 +45,7 @@ export type ReturnType<TQuery: OperationType, TKey, TFragmentData> = {|
43
45
 
44
46
  function useBlockingPaginationFragment<
45
47
  TQuery: OperationType,
46
- TKey: ?{+$data?: mixed, +$fragmentRefs: FragmentReference, ...},
48
+ TKey: ?{+$data?: mixed, +$fragmentSpreads: FragmentType, ...},
47
49
  >(
48
50
  fragmentInput: GraphQLTaggedNode,
49
51
  parentFragmentRef: TKey,
@@ -13,12 +13,6 @@
13
13
 
14
14
  'use strict';
15
15
 
16
- const loadEntryPoint = require('./loadEntryPoint');
17
- const useIsMountedRef = require('./useIsMountedRef');
18
-
19
- const {useTrackLoadQueryInRender} = require('./loadQuery');
20
- const {useCallback, useEffect, useRef, useState} = require('react');
21
-
22
16
  import type {
23
17
  EntryPoint,
24
18
  EntryPointComponent,
@@ -27,6 +21,11 @@ import type {
27
21
  PreloadedEntryPoint,
28
22
  } from './EntryPointTypes.flow';
29
23
 
24
+ const loadEntryPoint = require('./loadEntryPoint');
25
+ const {useTrackLoadQueryInRender} = require('./loadQuery');
26
+ const useIsMountedRef = require('./useIsMountedRef');
27
+ const {useCallback, useEffect, useRef, useState} = require('react');
28
+
30
29
  type UseEntryPointLoaderHookReturnType<
31
30
  TEntryPointParams: {...},
32
31
  TPreloadedQueries: {...},
@@ -121,10 +120,8 @@ function useLoadEntryPoint<
121
120
  const [entryPointReference, setEntryPointReference] = useState<
122
121
  PreloadedEntryPoint<TEntryPointComponent> | NullEntryPointReference,
123
122
  >(initialEntryPointReferenceInternal);
124
- const [
125
- entryPointParams,
126
- setEntryPointParams,
127
- ] = useState<TEntryPointParams | null>(initialEntryPointParamsInternal);
123
+ const [entryPointParams, setEntryPointParams] =
124
+ useState<TEntryPointParams | null>(initialEntryPointParamsInternal);
128
125
 
129
126
  const disposeEntryPoint = useCallback(() => {
130
127
  if (isMountedRef.current) {
@@ -13,10 +13,10 @@
13
13
 
14
14
  'use strict';
15
15
 
16
- const {useCallback, useEffect, useRef} = require('react');
17
-
18
16
  import type {Subscription} from 'relay-runtime';
19
17
 
18
+ const {useCallback, useEffect, useRef} = require('react');
19
+
20
20
  /**
21
21
  * This hook returns a mutable React ref that holds the value of whether a
22
22
  * fetch request is in flight. The reason this is a mutable ref instead of
@@ -13,82 +13,62 @@
13
13
 
14
14
  'use strict';
15
15
 
16
- const useFragmentNode = require('./useFragmentNode');
17
- const useStaticFragmentNodeWarning = require('./useStaticFragmentNodeWarning');
16
+ import type {FragmentType, GraphQLTaggedNode} from 'relay-runtime';
18
17
 
19
18
  const {useTrackLoadQueryInRender} = require('./loadQuery');
19
+ const useFragmentNode = require('./useFragmentNode');
20
+ const useStaticFragmentNodeWarning = require('./useStaticFragmentNodeWarning');
20
21
  const {useDebugValue} = require('react');
21
22
  const {getFragment} = require('relay-runtime');
22
23
 
23
- import type {GraphQLTaggedNode, FragmentReference} from 'relay-runtime';
24
-
25
- // NOTE: These declares ensure that the type of the returned data is:
26
- // - non-nullable if the provided ref type is non-nullable
27
- // - nullable if the provided ref type is nullable
28
- // - array of non-nullable if the privoided ref type is an array of
29
- // non-nullable refs
30
- // - array of nullable if the privoided ref type is an array of nullable refs
31
-
24
+ // if the key is non-nullable, return non-nullable value
32
25
  declare function useFragment<
33
- TKey: {+$data?: mixed, +$fragmentRefs: FragmentReference, ...},
26
+ TKey: {+$data?: mixed, +$fragmentSpreads: FragmentType, ...},
34
27
  >(
35
- fragmentInput: GraphQLTaggedNode,
36
- fragmentRef: TKey,
37
- ): $Call<<TFragmentData>({+$data?: TFragmentData, ...}) => TFragmentData, TKey>;
28
+ fragment: GraphQLTaggedNode,
29
+ key: TKey,
30
+ ): $Call<<TData>({+$data?: TData, ...}) => TData, TKey>;
38
31
 
32
+ // if the key is nullable, return nullable value
39
33
  declare function useFragment<
40
- TKey: ?{+$data?: mixed, +$fragmentRefs: FragmentReference, ...},
34
+ TKey: ?{+$data?: mixed, +$fragmentSpreads: FragmentType, ...},
41
35
  >(
42
- fragmentInput: GraphQLTaggedNode,
43
- fragmentRef: TKey,
44
- ): $Call<
45
- <TFragmentData>(?{+$data?: TFragmentData, ...}) => ?TFragmentData,
46
- TKey,
47
- >;
36
+ fragment: GraphQLTaggedNode,
37
+ key: TKey,
38
+ ): $Call<<TData>(?{+$data?: TData, ...}) => ?TData, TKey>;
48
39
 
40
+ // if the key is a non-nullable array of keys, return non-nullable array
49
41
  declare function useFragment<
50
42
  TKey: $ReadOnlyArray<{
51
43
  +$data?: mixed,
52
- +$fragmentRefs: FragmentReference,
44
+ +$fragmentSpreads: FragmentType,
53
45
  ...
54
46
  }>,
55
47
  >(
56
- fragmentInput: GraphQLTaggedNode,
57
- fragmentRef: TKey,
58
- ): $Call<
59
- <TFragmentData>(
60
- $ReadOnlyArray<{+$data?: TFragmentData, ...}>,
61
- ) => TFragmentData,
62
- TKey,
63
- >;
48
+ fragment: GraphQLTaggedNode,
49
+ key: TKey,
50
+ ): $Call<<TData>($ReadOnlyArray<{+$data?: TData, ...}>) => TData, TKey>;
64
51
 
52
+ // if the key is a nullable array of keys, return nullable array
65
53
  declare function useFragment<
66
54
  TKey: ?$ReadOnlyArray<{
67
55
  +$data?: mixed,
68
- +$fragmentRefs: FragmentReference,
56
+ +$fragmentSpreads: FragmentType,
69
57
  ...
70
58
  }>,
71
59
  >(
72
- fragmentInput: GraphQLTaggedNode,
73
- fragmentRef: TKey,
74
- ): $Call<
75
- <TFragmentData>(
76
- ?$ReadOnlyArray<{+$data?: TFragmentData, ...}>,
77
- ) => ?TFragmentData,
78
- TKey,
79
- >;
60
+ fragment: GraphQLTaggedNode,
61
+ key: TKey,
62
+ ): $Call<<TData>(?$ReadOnlyArray<{+$data?: TData, ...}>) => ?TData, TKey>;
80
63
 
81
- function useFragment(
82
- fragmentInput: GraphQLTaggedNode,
83
- fragmentRef: mixed,
84
- ): mixed {
64
+ function useFragment(fragment: GraphQLTaggedNode, key: mixed): mixed {
85
65
  // We need to use this hook in order to be able to track if
86
66
  // loadQuery was called during render
87
67
  useTrackLoadQueryInRender();
88
68
 
89
- const fragmentNode = getFragment(fragmentInput);
69
+ const fragmentNode = getFragment(fragment);
90
70
  useStaticFragmentNodeWarning(fragmentNode, 'first argument of useFragment()');
91
- const {data} = useFragmentNode<_>(fragmentNode, fragmentRef, 'useFragment()');
71
+ const {data} = useFragmentNode<_>(fragmentNode, key, 'useFragment()');
92
72
  if (__DEV__) {
93
73
  // eslint-disable-next-line react-hooks/rules-of-hooks
94
74
  useDebugValue({fragment: fragmentNode.name, data});
@@ -13,14 +13,13 @@
13
13
 
14
14
  'use strict';
15
15
 
16
- const useRelayEnvironment = require('./useRelayEnvironment');
17
- const warning = require('warning');
16
+ import type {ReaderFragment} from 'relay-runtime';
18
17
 
19
18
  const {getFragmentResourceForEnvironment} = require('./FragmentResource');
19
+ const useRelayEnvironment = require('./useRelayEnvironment');
20
20
  const {useEffect, useRef, useState} = require('react');
21
21
  const {getFragmentIdentifier} = require('relay-runtime');
22
-
23
- import type {ReaderFragment} from 'relay-runtime';
22
+ const warning = require('warning');
24
23
 
25
24
  type ReturnType<TFragmentData: mixed> = {|
26
25
  data: TFragmentData,
@@ -51,9 +50,8 @@ function useFragmentNode<TFragmentData: mixed>(
51
50
  const isListeningForUpdatesRef = useRef(true);
52
51
  function enableStoreUpdates() {
53
52
  isListeningForUpdatesRef.current = true;
54
- const didMissUpdates = FragmentResource.checkMissedUpdates(
55
- fragmentResult,
56
- )[0];
53
+ const didMissUpdates =
54
+ FragmentResource.checkMissedUpdates(fragmentResult)[0];
57
55
  if (didMissUpdates) {
58
56
  handleDataUpdate();
59
57
  }
@@ -11,18 +11,16 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- const React = require('react');
14
+ import type {ReaderFragment} from 'relay-runtime';
15
15
 
16
- const invariant = require('invariant');
17
16
  const useRelayEnvironment = require('./useRelayEnvironment');
18
-
17
+ const invariant = require('invariant');
18
+ const React = require('react');
19
19
  const {
20
20
  __internal: {getObservableForActiveRequest},
21
21
  getSelector,
22
22
  } = require('relay-runtime');
23
23
 
24
- import type {ReaderFragment} from 'relay-runtime';
25
-
26
24
  const {useEffect, useState, useMemo} = React;
27
25
 
28
26
  function useIsOperationNodeActive(
@@ -11,15 +11,14 @@
11
11
 
12
12
  'use strict';
13
13
 
14
+ import type {FragmentType, GraphQLTaggedNode} from 'relay-runtime';
15
+
14
16
  const useIsOperationNodeActive = require('./useIsOperationNodeActive');
15
17
  const useStaticFragmentNodeWarning = require('./useStaticFragmentNodeWarning');
16
-
17
18
  const {getFragment} = require('relay-runtime');
18
19
 
19
- import type {GraphQLTaggedNode, FragmentReference} from 'relay-runtime';
20
-
21
20
  function useIsParentQueryActive<
22
- TKey: ?{+$data?: mixed, +$fragmentRefs: FragmentReference, ...},
21
+ TKey: ?{+$data?: mixed, +$fragmentSpreads: FragmentType, ...},
23
22
  >(fragmentInput: GraphQLTaggedNode, fragmentRef: TKey): boolean {
24
23
  const fragmentNode = getFragment(fragmentInput);
25
24
  useStaticFragmentNodeWarning(
@@ -13,15 +13,6 @@
13
13
 
14
14
  'use strict';
15
15
 
16
- const useLazyLoadQueryNode = require('./useLazyLoadQueryNode');
17
- const useMemoOperationDescriptor = require('./useMemoOperationDescriptor');
18
- const useRelayEnvironment = require('./useRelayEnvironment');
19
-
20
- const {useTrackLoadQueryInRender} = require('./loadQuery');
21
- const {
22
- __internal: {fetchQuery},
23
- } = require('relay-runtime');
24
-
25
16
  import type {
26
17
  CacheConfig,
27
18
  FetchPolicy,
@@ -31,6 +22,14 @@ import type {
31
22
  VariablesOf,
32
23
  } from 'relay-runtime';
33
24
 
25
+ const {useTrackLoadQueryInRender} = require('./loadQuery');
26
+ const useLazyLoadQueryNode = require('./useLazyLoadQueryNode');
27
+ const useMemoOperationDescriptor = require('./useMemoOperationDescriptor');
28
+ const useRelayEnvironment = require('./useRelayEnvironment');
29
+ const {
30
+ __internal: {fetchQuery},
31
+ } = require('relay-runtime');
32
+
34
33
  function useLazyLoadQuery<TQuery: OperationType>(
35
34
  gqlQuery: GraphQLTaggedNode,
36
35
  variables: VariablesOf<TQuery>,
@@ -40,7 +39,7 @@ function useLazyLoadQuery<TQuery: OperationType>(
40
39
  networkCacheConfig?: CacheConfig,
41
40
  UNSTABLE_renderPolicy?: RenderPolicy,
42
41
  |},
43
- ): $ElementType<TQuery, 'response'> {
42
+ ): TQuery['response'] {
44
43
  // We need to use this hook in order to be able to track if
45
44
  // loadQuery was called during render
46
45
  useTrackLoadQueryInRender();
@@ -13,18 +13,6 @@
13
13
 
14
14
  'use strict';
15
15
 
16
- const ProfilerContext = require('./ProfilerContext');
17
- const React = require('react');
18
-
19
- const useFetchTrackingRef = require('./useFetchTrackingRef');
20
- const useFragmentNode = require('./useFragmentNode');
21
- const useRelayEnvironment = require('./useRelayEnvironment');
22
-
23
- const {
24
- getQueryResourceForEnvironment,
25
- getQueryCacheIdentifier,
26
- } = require('./QueryResource');
27
-
28
16
  import type {
29
17
  FetchPolicy,
30
18
  GraphQLResponse,
@@ -34,6 +22,16 @@ import type {
34
22
  RenderPolicy,
35
23
  } from 'relay-runtime';
36
24
 
25
+ const ProfilerContext = require('./ProfilerContext');
26
+ const {
27
+ getQueryCacheIdentifier,
28
+ getQueryResourceForEnvironment,
29
+ } = require('./QueryResource');
30
+ const useFetchTrackingRef = require('./useFetchTrackingRef');
31
+ const useFragmentNode = require('./useFragmentNode');
32
+ const useRelayEnvironment = require('./useRelayEnvironment');
33
+ const React = require('react');
34
+
37
35
  const {useContext, useEffect, useState, useRef} = React;
38
36
 
39
37
  function useLazyLoadQueryNode<TQuery: OperationType>({
@@ -50,7 +48,7 @@ function useLazyLoadQueryNode<TQuery: OperationType>({
50
48
  fetchPolicy?: ?FetchPolicy,
51
49
  fetchKey?: ?string | ?number,
52
50
  renderPolicy?: ?RenderPolicy,
53
- |}): $ElementType<TQuery, 'response'> {
51
+ |}): TQuery['response'] {
54
52
  const environment = useRelayEnvironment();
55
53
  const profilerContext = useContext(ProfilerContext);
56
54
  const QueryResource = getQueryResourceForEnvironment(environment);
@@ -120,6 +118,14 @@ function useLazyLoadQueryNode<TQuery: OperationType>({
120
118
  // eslint-disable-next-line react-hooks/exhaustive-deps
121
119
  }, [environment, cacheIdentifier]);
122
120
 
121
+ useEffect(() => {
122
+ // Release any temporary retain that's not released. At this point, if the
123
+ // cacheIdentifier doesn't change, the query is still permanently retained,
124
+ // and the temporary retain is redundant.
125
+ QueryResource.releaseTemporaryRetain(preparedQueryResult);
126
+ // This effect is intended to run on every commit, thus no dependency
127
+ });
128
+
123
129
  const {fragmentNode, fragmentRef} = preparedQueryResult;
124
130
  const {data} = useFragmentNode(
125
131
  fragmentNode,
@@ -13,25 +13,9 @@
13
13
 
14
14
  'use strict';
15
15
 
16
- const getPaginationVariables = require('./getPaginationVariables');
17
- const getValueAtPath = require('./getValueAtPath');
18
- const invariant = require('invariant');
19
- const useFetchTrackingRef = require('./useFetchTrackingRef');
20
- const useIsMountedRef = require('./useIsMountedRef');
21
- const useIsOperationNodeActive = require('./useIsOperationNodeActive');
22
- const useRelayEnvironment = require('./useRelayEnvironment');
23
- const warning = require('warning');
24
-
25
- const {useCallback, useEffect, useState} = require('react');
26
- const {
27
- ConnectionInterface,
28
- __internal: {fetchQuery},
29
- createOperationDescriptor,
30
- getSelector,
31
- } = require('relay-runtime');
32
-
33
16
  import type {
34
17
  ConcreteRequest,
18
+ Direction,
35
19
  Disposable,
36
20
  GraphQLResponse,
37
21
  Observer,
@@ -41,7 +25,21 @@ import type {
41
25
  VariablesOf,
42
26
  } from 'relay-runtime';
43
27
 
44
- export type Direction = 'forward' | 'backward';
28
+ const useFetchTrackingRef = require('./useFetchTrackingRef');
29
+ const useIsMountedRef = require('./useIsMountedRef');
30
+ const useIsOperationNodeActive = require('./useIsOperationNodeActive');
31
+ const useRelayEnvironment = require('./useRelayEnvironment');
32
+ const invariant = require('invariant');
33
+ const {useCallback, useEffect, useState} = require('react');
34
+ const {
35
+ ConnectionInterface,
36
+ __internal: {fetchQuery},
37
+ createOperationDescriptor,
38
+ getPaginationVariables,
39
+ getSelector,
40
+ getValueAtPath,
41
+ } = require('relay-runtime');
42
+ const warning = require('warning');
45
43
 
46
44
  export type LoadMoreFn<TQuery: OperationType> = (
47
45
  count: number,
@@ -84,12 +82,8 @@ function useLoadMoreFunction<TQuery: OperationType>(
84
82
  identifierField,
85
83
  } = args;
86
84
  const environment = useRelayEnvironment();
87
- const {
88
- isFetchingRef,
89
- startFetch,
90
- disposeFetch,
91
- completeFetch,
92
- } = useFetchTrackingRef();
85
+ const {isFetchingRef, startFetch, disposeFetch, completeFetch} =
86
+ useFetchTrackingRef();
93
87
  const identifierValue =
94
88
  identifierField != null &&
95
89
  fragmentData != null &&
@@ -98,9 +92,8 @@ function useLoadMoreFunction<TQuery: OperationType>(
98
92
  : null;
99
93
  const isMountedRef = useIsMountedRef();
100
94
  const [mirroredEnvironment, setMirroredEnvironment] = useState(environment);
101
- const [mirroredFragmentIdentifier, setMirroredFragmentIdentifier] = useState(
102
- fragmentIdentifier,
103
- );
95
+ const [mirroredFragmentIdentifier, setMirroredFragmentIdentifier] =
96
+ useState(fragmentIdentifier);
104
97
 
105
98
  const isParentQueryActive = useIsOperationNodeActive(
106
99
  fragmentNode,
@@ -190,7 +183,6 @@ function useLoadMoreFunction<TQuery: OperationType>(
190
183
  const parentVariables = fragmentSelector.owner.variables;
191
184
  const fragmentVariables = fragmentSelector.variables;
192
185
  const extraVariables = options?.UNSTABLE_extraVariables;
193
- // $FlowFixMe[cannot-spread-interface]
194
186
  const baseVariables = {
195
187
  ...parentVariables,
196
188
  ...fragmentVariables,
@@ -200,7 +192,6 @@ function useLoadMoreFunction<TQuery: OperationType>(
200
192
  count,
201
193
  cursor,
202
194
  baseVariables,
203
- // $FlowFixMe[cannot-spread-interface]
204
195
  {...extraVariables},
205
196
  paginationMetadata,
206
197
  );
@@ -13,19 +13,17 @@
13
13
 
14
14
  'use strict';
15
15
 
16
- const React = require('react');
17
-
18
- const useMemoVariables = require('./useMemoVariables');
19
-
20
- const {createOperationDescriptor, getRequest} = require('relay-runtime');
21
-
22
16
  import type {
17
+ CacheConfig,
23
18
  GraphQLTaggedNode,
24
19
  OperationDescriptor,
25
20
  Variables,
26
- CacheConfig,
27
21
  } from 'relay-runtime';
28
22
 
23
+ const useMemoVariables = require('./useMemoVariables');
24
+ const React = require('react');
25
+ const {createOperationDescriptor, getRequest} = require('relay-runtime');
26
+
29
27
  const {useMemo} = React;
30
28
 
31
29
  function useMemoOperationDescriptor(
@@ -13,11 +13,10 @@
13
13
 
14
14
  'use strict';
15
15
 
16
- const React = require('react');
16
+ import type {Variables} from 'relay-runtime';
17
17
 
18
18
  const areEqual = require('areEqual');
19
-
20
- import type {Variables} from 'relay-runtime';
19
+ const React = require('react');
21
20
 
22
21
  const {useMemo, useRef, useState} = React;
23
22
 
@@ -45,9 +44,10 @@ function useMemoVariables<TVariables: Variables | null>(
45
44
  // NOTE: We disable react-hooks-deps warning because we explicitly
46
45
  // don't want to memoize on object identity
47
46
  // eslint-disable-next-line react-hooks/exhaustive-deps
48
- const memoVariables = useMemo(() => variables, [
49
- variablesChangedGenerationRef.current,
50
- ]);
47
+ const memoVariables = useMemo(
48
+ () => variables,
49
+ [variablesChangedGenerationRef.current],
50
+ );
51
51
  return [memoVariables, variablesChangedGenerationRef.current ?? 0];
52
52
  }
53
53
 
@@ -13,46 +13,43 @@
13
13
 
14
14
  'use strict';
15
15
 
16
- const React = require('react');
17
-
18
- const useRelayEnvironment = require('./useRelayEnvironment');
19
-
20
- const {commitMutation: defaultCommitMutation} = require('relay-runtime');
21
- const {useState, useEffect, useRef, useCallback} = React;
22
- const useIsMountedRef = require('./useIsMountedRef');
23
-
24
16
  import type {
25
- GraphQLTaggedNode,
17
+ DeclarativeMutationConfig,
26
18
  Disposable,
19
+ GraphQLTaggedNode,
20
+ IEnvironment,
27
21
  MutationConfig,
28
22
  MutationParameters,
29
- IEnvironment,
30
23
  PayloadError,
31
- DeclarativeMutationConfig,
32
24
  SelectorStoreUpdater,
33
25
  UploadableMap,
34
26
  } from 'relay-runtime';
35
27
 
28
+ const useIsMountedRef = require('./useIsMountedRef');
29
+ const useRelayEnvironment = require('./useRelayEnvironment');
30
+ const React = require('react');
31
+ const {commitMutation: defaultCommitMutation} = require('relay-runtime');
32
+
33
+ const {useState, useEffect, useRef, useCallback} = React;
34
+
36
35
  export type UseMutationConfig<TMutation: MutationParameters> = {|
37
36
  configs?: Array<DeclarativeMutationConfig>,
38
37
  onError?: ?(error: Error) => void,
39
38
  onCompleted?: ?(
40
- response: $ElementType<TMutation, 'response'>,
39
+ response: TMutation['response'],
41
40
  errors: ?Array<PayloadError>,
42
41
  ) => void,
42
+ onNext?: ?() => void,
43
43
  onUnsubscribe?: ?() => void,
44
- optimisticResponse?: $ElementType<
45
- {
46
- +rawResponse?: {...},
47
- ...TMutation,
48
- ...
49
- },
50
- 'rawResponse',
51
- >,
52
- optimisticUpdater?: ?SelectorStoreUpdater,
53
- updater?: ?SelectorStoreUpdater,
44
+ optimisticResponse?: {
45
+ +rawResponse?: {...},
46
+ ...TMutation,
47
+ ...
48
+ }['rawResponse'],
49
+ optimisticUpdater?: ?SelectorStoreUpdater<TMutation['response']>,
50
+ updater?: ?SelectorStoreUpdater<TMutation['response']>,
54
51
  uploadables?: UploadableMap,
55
- variables: $ElementType<TMutation, 'variables'>,
52
+ variables: TMutation['variables'],
56
53
  |};
57
54
 
58
55
  function useMutation<TMutation: MutationParameters>(
@@ -105,15 +102,18 @@ function useMutation<TMutation: MutationParameters>(
105
102
  mutation,
106
103
  onCompleted: (response, errors) => {
107
104
  cleanup(disposable);
108
- config.onCompleted && config.onCompleted(response, errors);
105
+ config.onCompleted?.(response, errors);
109
106
  },
110
107
  onError: error => {
111
108
  cleanup(disposable);
112
- config.onError && config.onError(error);
109
+ config.onError?.(error);
113
110
  },
114
111
  onUnsubscribe: () => {
115
112
  cleanup(disposable);
116
- config.onUnsubscribe && config.onUnsubscribe();
113
+ config.onUnsubscribe?.();
114
+ },
115
+ onNext: () => {
116
+ config.onNext?.();
117
117
  },
118
118
  });
119
119
  inFlightMutationsRef.current.add(disposable);