react-relay 14.0.0 → 15.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.
Files changed (194) hide show
  1. package/ReactRelayContainerUtils.js.flow +1 -2
  2. package/ReactRelayContext.js +1 -1
  3. package/ReactRelayContext.js.flow +1 -2
  4. package/ReactRelayFragmentContainer.js.flow +6 -4
  5. package/ReactRelayFragmentMockRenderer.js.flow +1 -2
  6. package/ReactRelayLocalQueryRenderer.js.flow +5 -5
  7. package/ReactRelayPaginationContainer.js.flow +21 -14
  8. package/ReactRelayQueryFetcher.js.flow +28 -16
  9. package/ReactRelayQueryRenderer.js.flow +42 -13
  10. package/ReactRelayQueryRendererContext.js.flow +2 -3
  11. package/ReactRelayRefetchContainer.js.flow +9 -9
  12. package/ReactRelayTestMocker.js.flow +3 -3
  13. package/ReactRelayTypes.js.flow +7 -8
  14. package/RelayContext.js.flow +1 -2
  15. package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +4 -5
  16. package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +4 -5
  17. package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +4 -5
  18. package/__flowtests__/RelayModern-flowtest.js.flow +3 -4
  19. package/__flowtests__/RelayModernFlowtest_badref.graphql.js.flow +3 -4
  20. package/__flowtests__/RelayModernFlowtest_notref.graphql.js.flow +3 -4
  21. package/__flowtests__/RelayModernFlowtest_user.graphql.js.flow +3 -4
  22. package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +3 -4
  23. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +3 -1
  24. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +3 -1
  25. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +4 -2
  26. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +3 -1
  27. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +4 -2
  28. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +3 -1
  29. package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +4 -2
  30. package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +4 -2
  31. package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +3 -1
  32. package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +3 -1
  33. package/assertFragmentMap.js.flow +1 -2
  34. package/buildReactRelayContainer.js.flow +7 -7
  35. package/getRootVariablesForFragments.js.flow +1 -3
  36. package/hooks.js +1 -1
  37. package/hooks.js.flow +4 -2
  38. package/index.js +1 -1
  39. package/index.js.flow +6 -2
  40. package/isRelayEnvironment.js.flow +1 -2
  41. package/jest-react/enqueueTask.js.flow +1 -1
  42. package/jest-react/index.js.flow +1 -1
  43. package/jest-react/internalAct.js.flow +1 -1
  44. package/legacy.js +1 -1
  45. package/legacy.js.flow +1 -2
  46. package/lib/ReactRelayContainerUtils.js +2 -3
  47. package/lib/ReactRelayContext.js +3 -4
  48. package/lib/ReactRelayFragmentContainer.js +47 -73
  49. package/lib/ReactRelayFragmentMockRenderer.js +2 -4
  50. package/lib/ReactRelayLocalQueryRenderer.js +18 -31
  51. package/lib/ReactRelayPaginationContainer.js +74 -164
  52. package/lib/ReactRelayQueryFetcher.js +49 -76
  53. package/lib/ReactRelayQueryRenderer.js +63 -84
  54. package/lib/ReactRelayQueryRendererContext.js +2 -2
  55. package/lib/ReactRelayRefetchContainer.js +58 -108
  56. package/lib/ReactRelayTestMocker.js +33 -68
  57. package/lib/ReactRelayTypes.js +2 -1
  58. package/lib/RelayContext.js +4 -7
  59. package/lib/assertFragmentMap.js +3 -5
  60. package/lib/buildReactRelayContainer.js +11 -27
  61. package/lib/getRootVariablesForFragments.js +6 -10
  62. package/lib/hooks.js +5 -18
  63. package/lib/index.js +7 -24
  64. package/lib/isRelayEnvironment.js +5 -4
  65. package/lib/jest-react/enqueueTask.js +5 -9
  66. package/lib/jest-react/index.js +0 -1
  67. package/lib/jest-react/internalAct.js +9 -20
  68. package/lib/legacy.js +2 -8
  69. package/lib/multi-actor/ActorChange.js +2 -5
  70. package/lib/multi-actor/index.js +2 -1
  71. package/lib/multi-actor/useRelayActorEnvironment.js +4 -8
  72. package/lib/relay-hooks/EntryPointContainer.react.js +9 -15
  73. package/lib/relay-hooks/EntryPointTypes.flow.js +5 -3
  74. package/lib/relay-hooks/FragmentResource.js +109 -203
  75. package/lib/relay-hooks/HooksImplementation.js +3 -6
  76. package/lib/relay-hooks/InternalLogger.js +2 -3
  77. package/lib/relay-hooks/LRUCache.js +2 -20
  78. package/lib/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js +33 -54
  79. package/lib/relay-hooks/MatchContainer.js +15 -24
  80. package/lib/relay-hooks/ProfilerContext.js +3 -3
  81. package/lib/relay-hooks/QueryResource.js +31 -101
  82. package/lib/relay-hooks/RelayEnvironmentProvider.js +5 -9
  83. package/lib/relay-hooks/SuspenseResource.js +9 -33
  84. package/lib/relay-hooks/loadEntryPoint.js +19 -31
  85. package/lib/relay-hooks/loadQuery.js +42 -78
  86. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +11 -37
  87. package/lib/relay-hooks/prepareEntryPoint_DEPRECATED.js +9 -15
  88. package/lib/relay-hooks/react-cache/RelayReactCache.js +7 -12
  89. package/lib/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js +27 -81
  90. package/lib/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js +206 -0
  91. package/lib/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js +195 -215
  92. package/lib/relay-hooks/react-cache/useFragment_REACT_CACHE.js +5 -15
  93. package/lib/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js +17 -24
  94. package/lib/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js +149 -0
  95. package/lib/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js +24 -39
  96. package/lib/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js +325 -0
  97. package/lib/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js +37 -0
  98. package/lib/relay-hooks/useBlockingPaginationFragment.js +73 -93
  99. package/lib/relay-hooks/useClientQuery.js +30 -0
  100. package/lib/relay-hooks/useEntryPointLoader.js +18 -38
  101. package/lib/relay-hooks/useFetchTrackingRef.js +10 -12
  102. package/lib/relay-hooks/useFragment.js +8 -19
  103. package/lib/relay-hooks/useFragmentNode.js +20 -32
  104. package/lib/relay-hooks/useIsMountedRef.js +4 -6
  105. package/lib/relay-hooks/useIsOperationNodeActive.js +8 -20
  106. package/lib/relay-hooks/useIsParentQueryActive.js +3 -6
  107. package/lib/relay-hooks/useLazyLoadQuery.js +7 -24
  108. package/lib/relay-hooks/useLazyLoadQueryNode.js +23 -34
  109. package/lib/relay-hooks/useLoadMoreFunction.js +46 -78
  110. package/lib/relay-hooks/useMemoOperationDescriptor.js +6 -15
  111. package/lib/relay-hooks/useMemoVariables.js +15 -34
  112. package/lib/relay-hooks/useMutation.js +9 -27
  113. package/lib/relay-hooks/usePaginationFragment.js +73 -76
  114. package/lib/relay-hooks/usePreloadedQuery.js +13 -44
  115. package/lib/relay-hooks/useQueryLoader.js +24 -49
  116. package/lib/relay-hooks/useRefetchableFragment.js +19 -17
  117. package/lib/relay-hooks/useRefetchableFragmentNode.js +65 -109
  118. package/lib/relay-hooks/useRelayEnvironment.js +4 -8
  119. package/lib/relay-hooks/useStaticFragmentNodeWarning.js +4 -8
  120. package/lib/relay-hooks/useSubscribeToInvalidationState.js +8 -9
  121. package/lib/relay-hooks/useSubscription.js +5 -10
  122. package/lib/relay-hooks/useUnsafeRef_DEPRECATED.js +29 -0
  123. package/multi-actor/ActorChange.js.flow +1 -1
  124. package/multi-actor/index.js.flow +1 -1
  125. package/multi-actor/useRelayActorEnvironment.js.flow +2 -4
  126. package/package.json +2 -2
  127. package/react-relay-hooks.js +2 -2
  128. package/react-relay-hooks.min.js +2 -2
  129. package/react-relay-legacy.js +2 -2
  130. package/react-relay-legacy.min.js +2 -2
  131. package/react-relay.js +2 -2
  132. package/react-relay.min.js +2 -2
  133. package/relay-hooks/EntryPointContainer.react.js.flow +3 -5
  134. package/relay-hooks/EntryPointTypes.flow.js.flow +37 -37
  135. package/relay-hooks/FragmentResource.js.flow +43 -19
  136. package/relay-hooks/HooksImplementation.js.flow +7 -9
  137. package/relay-hooks/InternalLogger.js.flow +1 -3
  138. package/relay-hooks/LRUCache.js.flow +1 -3
  139. package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +19 -14
  140. package/relay-hooks/MatchContainer.js.flow +6 -8
  141. package/relay-hooks/ProfilerContext.js.flow +1 -3
  142. package/relay-hooks/QueryResource.js.flow +29 -11
  143. package/relay-hooks/RelayEnvironmentProvider.js.flow +4 -6
  144. package/relay-hooks/SuspenseResource.js.flow +1 -3
  145. package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +6 -4
  146. package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +4 -4
  147. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +3 -1
  148. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +3 -1
  149. package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +39 -39
  150. package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +1 -3
  151. package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +37 -38
  152. package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +18 -20
  153. package/relay-hooks/__flowtests__/utils.js.flow +21 -12
  154. package/relay-hooks/loadEntryPoint.js.flow +11 -6
  155. package/relay-hooks/loadQuery.js.flow +11 -7
  156. package/relay-hooks/preloadQuery_DEPRECATED.js.flow +9 -12
  157. package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +13 -10
  158. package/relay-hooks/react-cache/RelayReactCache.js.flow +1 -3
  159. package/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js.flow +26 -20
  160. package/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js.flow +297 -0
  161. package/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js.flow +136 -96
  162. package/relay-hooks/react-cache/useFragment_REACT_CACHE.js.flow +1 -3
  163. package/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js.flow +3 -5
  164. package/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js.flow +190 -0
  165. package/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js.flow +3 -6
  166. package/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js.flow +601 -0
  167. package/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js.flow +65 -0
  168. package/relay-hooks/useBlockingPaginationFragment.js.flow +86 -59
  169. package/relay-hooks/useClientQuery.js.flow +39 -0
  170. package/relay-hooks/useEntryPointLoader.js.flow +16 -14
  171. package/relay-hooks/useFetchTrackingRef.js.flow +7 -8
  172. package/relay-hooks/useFragment.js.flow +2 -4
  173. package/relay-hooks/useFragmentNode.js.flow +7 -8
  174. package/relay-hooks/useIsMountedRef.js.flow +2 -4
  175. package/relay-hooks/useIsOperationNodeActive.js.flow +1 -1
  176. package/relay-hooks/useIsParentQueryActive.js.flow +1 -1
  177. package/relay-hooks/useLazyLoadQuery.js.flow +9 -32
  178. package/relay-hooks/useLazyLoadQueryNode.js.flow +4 -6
  179. package/relay-hooks/useLoadMoreFunction.js.flow +20 -17
  180. package/relay-hooks/useMemoOperationDescriptor.js.flow +3 -5
  181. package/relay-hooks/useMemoVariables.js.flow +13 -31
  182. package/relay-hooks/useMutation.js.flow +6 -8
  183. package/relay-hooks/usePaginationFragment.js.flow +75 -43
  184. package/relay-hooks/usePreloadedQuery.js.flow +49 -43
  185. package/relay-hooks/useQueryLoader.js.flow +89 -28
  186. package/relay-hooks/useRefetchableFragment.js.flow +83 -23
  187. package/relay-hooks/useRefetchableFragmentNode.js.flow +26 -22
  188. package/relay-hooks/useRelayEnvironment.js.flow +2 -4
  189. package/relay-hooks/useStaticFragmentNodeWarning.js.flow +3 -5
  190. package/relay-hooks/useSubscribeToInvalidationState.js.flow +2 -4
  191. package/relay-hooks/useSubscription.js.flow +1 -3
  192. package/relay-hooks/useUnsafeRef_DEPRECATED.js.flow +25 -0
  193. package/lib/readContext.js +0 -28
  194. package/readContext.js.flow +0 -31
@@ -5,32 +5,27 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
7
  *
8
- * @emails oncall+relay
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
- // flowlint ambiguous-object-type:error
12
- 'use strict';
13
-
14
- var invariant = require('invariant'); // $FlowFixMe[prop-missing] These exist in experimental builds but aren't in React's types yet.
15
11
 
12
+ 'use strict';
16
13
 
14
+ var invariant = require('invariant');
15
+ // $FlowFixMe[prop-missing] These exist in experimental builds but aren't in React's types yet.
17
16
  var _require = require('react'),
18
- unstable_getCacheForType = _require.unstable_getCacheForType,
19
- unstable_getCacheSignal = _require.unstable_getCacheSignal;
20
-
17
+ unstable_getCacheForType = _require.unstable_getCacheForType,
18
+ unstable_getCacheSignal = _require.unstable_getCacheSignal;
21
19
  var _require2 = require('relay-runtime'),
22
- RelayFeatureFlags = _require2.RelayFeatureFlags;
23
-
20
+ RelayFeatureFlags = _require2.RelayFeatureFlags;
24
21
  function getCacheForType(factory) {
25
22
  !(typeof unstable_getCacheForType === 'function' && RelayFeatureFlags.USE_REACT_CACHE) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReactCache.getCacheForType should only be called when the USE_REACT_CACHE feature flag is enabled and when on an experimental React build that supports it.') : invariant(false) : void 0;
26
23
  return unstable_getCacheForType(factory);
27
24
  }
28
-
29
25
  function getCacheSignal() {
30
26
  !(typeof unstable_getCacheSignal === 'function' && RelayFeatureFlags.USE_REACT_CACHE) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReactCache.getCacheSignal should only be called when the USE_REACT_CACHE feature flag is enabled and when on an experimental React build that supports it.') : invariant(false) : void 0;
31
27
  return unstable_getCacheSignal();
32
28
  }
33
-
34
29
  module.exports = {
35
30
  getCacheForType: getCacheForType,
36
31
  getCacheSignal: getCacheSignal
@@ -5,98 +5,71 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
7
  *
8
- * @emails oncall+relay
9
8
  * @format
9
+ * @oncall relay
10
10
  */
11
- // flowlint ambiguous-object-type:error
12
- 'use strict';
13
11
 
14
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
12
+ 'use strict';
15
13
 
14
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
16
15
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
17
-
18
16
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
19
-
20
17
  var SuspenseResource = require('../SuspenseResource');
21
-
22
18
  var _require = require('./RelayReactCache'),
23
- getCacheForType = _require.getCacheForType,
24
- getCacheSignal = _require.getCacheSignal;
25
-
19
+ getCacheForType = _require.getCacheForType,
20
+ getCacheSignal = _require.getCacheSignal;
26
21
  var invariant = require('invariant');
27
-
28
22
  var _require2 = require('relay-runtime'),
29
- RelayFeatureFlags = _require2.RelayFeatureFlags,
30
- fetchQueryInternal = _require2.__internal.fetchQuery;
31
-
23
+ fetchQueryInternal = _require2.__internal.fetchQuery,
24
+ RelayFeatureFlags = _require2.RelayFeatureFlags;
32
25
  var warning = require("fbjs/lib/warning");
33
-
34
26
  var DEFAULT_FETCH_POLICY = 'store-or-network';
35
-
27
+ var WEAKMAP_SUPPORTED = typeof WeakMap === 'function';
36
28
  var QueryCache = /*#__PURE__*/function () {
37
29
  function QueryCache() {
38
- this._map = new Map();
30
+ this._map = WEAKMAP_SUPPORTED ? new WeakMap() : new Map();
39
31
  }
40
-
41
32
  var _proto = QueryCache.prototype;
42
-
43
33
  _proto.get = function get(environment, key) {
44
34
  var forEnv = this._map.get(environment);
45
-
46
35
  if (!forEnv) {
47
36
  forEnv = new Map();
48
-
49
37
  this._map.set(environment, forEnv);
50
38
  }
51
-
52
39
  return forEnv.get(key);
53
40
  };
54
-
55
41
  _proto.set = function set(environment, key, value) {
56
42
  var forEnv = this._map.get(environment);
57
-
58
43
  if (!forEnv) {
59
44
  forEnv = new Map();
60
-
61
45
  this._map.set(environment, forEnv);
62
46
  }
63
-
64
47
  forEnv.set(key, value);
65
48
  };
66
-
67
49
  _proto["delete"] = function _delete(environment, key) {
68
50
  var forEnv = this._map.get(environment);
69
-
70
51
  if (!forEnv) {
71
52
  return;
72
53
  }
73
-
74
54
  forEnv["delete"](key);
75
-
76
55
  if (forEnv.size === 0) {
77
56
  this._map["delete"](environment);
78
57
  }
79
58
  };
80
-
81
59
  return QueryCache;
82
60
  }();
83
-
84
61
  function createQueryCache() {
85
62
  return new QueryCache();
86
63
  }
87
-
88
64
  var noopOnCommit = function noopOnCommit() {
89
65
  return function () {
90
66
  return undefined;
91
67
  };
92
68
  };
93
-
94
69
  var noopPromise = new Promise(function () {});
95
-
96
70
  function getQueryCacheKey(operation, fetchPolicy, renderPolicy, fetchKey) {
97
71
  return "".concat(fetchPolicy, "-").concat(renderPolicy, "-").concat(operation.request.identifier, "-").concat(fetchKey !== null && fetchKey !== void 0 ? fetchKey : '');
98
72
  }
99
-
100
73
  function constructQueryResult(operation) {
101
74
  var rootFragmentRef = {
102
75
  __id: operation.fragment.dataID,
@@ -108,7 +81,6 @@ function constructQueryResult(operation) {
108
81
  fragmentRef: rootFragmentRef
109
82
  };
110
83
  }
111
-
112
84
  function makeInitialCacheEntry() {
113
85
  return {
114
86
  status: 'pending',
@@ -117,35 +89,30 @@ function makeInitialCacheEntry() {
117
89
  suspenseResource: null
118
90
  };
119
91
  }
120
-
121
92
  function getQueryResultOrFetchQuery_REACT_CACHE(environment, queryOperationDescriptor, options) {
122
93
  var _options$fetchPolicy, _options$renderPolicy;
123
-
124
94
  var fetchPolicy = (_options$fetchPolicy = options === null || options === void 0 ? void 0 : options.fetchPolicy) !== null && _options$fetchPolicy !== void 0 ? _options$fetchPolicy : DEFAULT_FETCH_POLICY;
125
95
  var renderPolicy = (_options$renderPolicy = options === null || options === void 0 ? void 0 : options.renderPolicy) !== null && _options$renderPolicy !== void 0 ? _options$renderPolicy : environment.UNSTABLE_getDefaultRenderPolicy();
126
96
  var cache = getCacheForType(createQueryCache);
127
97
  var cacheKey = getQueryCacheKey(queryOperationDescriptor, fetchPolicy, renderPolicy, options === null || options === void 0 ? void 0 : options.fetchKey);
128
98
  var initialEntry = cache.get(environment, cacheKey);
129
-
130
99
  function updateCache(updater) {
131
100
  var currentEntry = cache.get(environment, cacheKey);
132
-
133
101
  if (!currentEntry) {
134
102
  currentEntry = makeInitialCacheEntry();
135
103
  cache.set(environment, cacheKey, currentEntry);
136
- } // $FlowExpectedError[prop-missing] Extra properties are passed in -- this is fine
137
-
138
-
139
- var newStatus = updater(currentEntry); // $FlowExpectedError[cannot-spread-inexact] Flow cannot understand that this is valid...
140
-
141
- cache.set(environment, cacheKey, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, currentEntry), newStatus)); // ... but we can because QueryCacheEntry spreads QueryCacheEntryStatus, so spreading
104
+ }
105
+ // $FlowExpectedError[prop-missing] Extra properties are passed in -- this is fine
106
+ var newStatus = updater(currentEntry);
107
+ // $FlowExpectedError[cannot-spread-inexact] Flow cannot understand that this is valid...
108
+ cache.set(environment, cacheKey, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, currentEntry), newStatus));
109
+ // ... but we can because QueryCacheEntry spreads QueryCacheEntryStatus, so spreading
142
110
  // a QueryCacheEntryStatus into a QueryCacheEntry will result in a valid QueryCacheEntry.
143
- } // Initiate a query to fetch the data if needed:
144
-
111
+ }
145
112
 
113
+ // Initiate a query to fetch the data if needed:
146
114
  if (RelayFeatureFlags.USE_REACT_CACHE_LEGACY_TIMEOUTS) {
147
115
  var _entry;
148
-
149
116
  if (initialEntry === undefined) {
150
117
  onCacheMiss(environment, queryOperationDescriptor, fetchPolicy, renderPolicy, updateCache, options === null || options === void 0 ? void 0 : options.fetchObservable);
151
118
  var createdEntry = cache.get(environment, cacheKey);
@@ -154,7 +121,6 @@ function getQueryResultOrFetchQuery_REACT_CACHE(environment, queryOperationDescr
154
121
  } else {
155
122
  _entry = initialEntry;
156
123
  }
157
-
158
124
  if (!_entry.suspenseResource) {
159
125
  _entry.suspenseResource = new SuspenseResource(function () {
160
126
  var retention = environment.retain(queryOperationDescriptor);
@@ -166,60 +132,48 @@ function getQueryResultOrFetchQuery_REACT_CACHE(environment, queryOperationDescr
166
132
  };
167
133
  });
168
134
  }
169
-
170
135
  if (_entry.onCommit === noopOnCommit) {
171
136
  _entry.onCommit = function () {
172
137
  !_entry.suspenseResource ? process.env.NODE_ENV !== "production" ? invariant(false, 'SuspenseResource should have been initialized. This is a bug in Relay.') : invariant(false) : void 0;
173
-
174
138
  var retention = _entry.suspenseResource.permanentRetain(environment);
175
-
176
139
  return function () {
177
140
  retention.dispose();
178
141
  };
179
142
  };
180
143
  }
181
-
182
144
  _entry.suspenseResource.temporaryRetain(environment);
183
145
  } else {
184
146
  if (initialEntry === undefined) {
185
147
  // This is the behavior we eventually want: We retain the query until the
186
148
  // presiding Cache component unmounts, at which point the AbortSignal
187
149
  // will be triggered.
188
- onCacheMiss(environment, queryOperationDescriptor, fetchPolicy, renderPolicy, updateCache, options === null || options === void 0 ? void 0 : options.fetchObservable); // Since this is the first time rendering, retain the query. React will
189
- // trigger the abort signal when this cache entry is no longer needed.
150
+ onCacheMiss(environment, queryOperationDescriptor, fetchPolicy, renderPolicy, updateCache, options === null || options === void 0 ? void 0 : options.fetchObservable);
190
151
 
152
+ // Since this is the first time rendering, retain the query. React will
153
+ // trigger the abort signal when this cache entry is no longer needed.
191
154
  var retention = environment.retain(queryOperationDescriptor);
192
-
193
155
  var dispose = function dispose() {
194
156
  retention.dispose();
195
157
  cache["delete"](environment, cacheKey);
196
158
  };
197
-
198
159
  var abortSignal = getCacheSignal();
199
160
  abortSignal.addEventListener('abort', dispose, {
200
161
  once: true
201
162
  });
202
163
  }
203
164
  }
204
-
205
165
  var entry = cache.get(environment, cacheKey); // could be a different entry now if synchronously resolved
206
-
207
166
  !(entry !== undefined) ? process.env.NODE_ENV !== "production" ? invariant(false, 'An entry should have been created by onCacheMiss. This is a bug in Relay.') : invariant(false) : void 0;
208
-
209
167
  switch (entry.status) {
210
168
  case 'pending':
211
169
  throw entry.promise;
212
-
213
170
  case 'rejected':
214
171
  throw entry.error;
215
-
216
172
  case 'resolved':
217
173
  return [entry.result, entry.onCommit];
218
174
  }
219
-
220
175
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'switch statement should be exhaustive') : invariant(false) : void 0;
221
176
  }
222
-
223
177
  function onCacheMiss(environment, operation, fetchPolicy, renderPolicy, updateCache, customFetchObservable) {
224
178
  // NB: Besides checking if the data is available, calling `check` will write missing
225
179
  // data to the store using any missing data handlers specified in the environment.
@@ -229,7 +183,6 @@ function onCacheMiss(environment, operation, fetchPolicy, renderPolicy, updateCa
229
183
  var canPartialRender = hasFullQuery || renderPolicy === 'partial' && queryStatus !== 'stale';
230
184
  var shouldFetch;
231
185
  var shouldRenderNow;
232
-
233
186
  switch (fetchPolicy) {
234
187
  case 'store-only':
235
188
  {
@@ -237,21 +190,18 @@ function onCacheMiss(environment, operation, fetchPolicy, renderPolicy, updateCa
237
190
  shouldRenderNow = true;
238
191
  break;
239
192
  }
240
-
241
193
  case 'store-or-network':
242
194
  {
243
195
  shouldFetch = !hasFullQuery;
244
196
  shouldRenderNow = canPartialRender;
245
197
  break;
246
198
  }
247
-
248
199
  case 'store-and-network':
249
200
  {
250
201
  shouldFetch = true;
251
202
  shouldRenderNow = canPartialRender;
252
203
  break;
253
204
  }
254
-
255
205
  case 'network-only':
256
206
  default:
257
207
  {
@@ -260,17 +210,14 @@ function onCacheMiss(environment, operation, fetchPolicy, renderPolicy, updateCa
260
210
  break;
261
211
  }
262
212
  }
263
-
264
213
  if (shouldFetch) {
265
214
  executeOperationAndKeepUpToDate(environment, operation, updateCache, customFetchObservable);
266
215
  updateCache(function (existing) {
267
216
  switch (existing.status) {
268
217
  case 'resolved':
269
218
  return existing;
270
-
271
219
  case 'rejected':
272
220
  return existing;
273
-
274
221
  case 'pending':
275
222
  return shouldRenderNow ? {
276
223
  status: 'resolved',
@@ -288,16 +235,16 @@ function onCacheMiss(environment, operation, fetchPolicy, renderPolicy, updateCa
288
235
  });
289
236
  }
290
237
  }
291
-
292
238
  function executeOperationAndKeepUpToDate(environment, operation, updateCache, customFetchObservable) {
293
239
  var resolvePromise;
294
240
  var promise = new Promise(function (r) {
295
241
  resolvePromise = r;
296
- }); // $FlowExpectedError[prop-missing] Expando to annotate Promises.
297
-
242
+ });
243
+ // $FlowExpectedError[prop-missing] Expando to annotate Promises.
298
244
  promise.displayName = 'Relay(' + operation.request.node.operation.name + ')';
299
- var isFirstPayload = true; // FIXME We may still need to cancel network requests for live queries.
245
+ var isFirstPayload = true;
300
246
 
247
+ // FIXME We may still need to cancel network requests for live queries.
301
248
  var fetchObservable = customFetchObservable !== null && customFetchObservable !== void 0 ? customFetchObservable : fetchQueryInternal(environment, operation);
302
249
  fetchObservable.subscribe({
303
250
  start: function start(subscription) {},
@@ -314,7 +261,6 @@ function executeOperationAndKeepUpToDate(environment, operation, updateCache, cu
314
261
  // To complete this task we need to have a way of precisely tracking suspendable points
315
262
  process.env.NODE_ENV !== "production" ? warning(false, 'getQueryResultOrFetchQuery: An incremental payload for query `%` returned an error: `%`:`%`.', operation.request.node.operation.name, _error.message, _error.stack) : void 0;
316
263
  }
317
-
318
264
  resolvePromise();
319
265
  isFirstPayload = false;
320
266
  },
@@ -329,10 +275,11 @@ function executeOperationAndKeepUpToDate(environment, operation, updateCache, cu
329
275
  resolvePromise();
330
276
  isFirstPayload = false;
331
277
  }
332
- }); // If the above subscription yields a value synchronously, then one of the updates
278
+ });
279
+
280
+ // If the above subscription yields a value synchronously, then one of the updates
333
281
  // above will have already happened and we'll now be in a resolved or rejected state.
334
282
  // But in the usual case, we save the promise to the entry here:
335
-
336
283
  updateCache(function (existing) {
337
284
  return existing.status === 'pending' ? {
338
285
  status: 'pending',
@@ -340,5 +287,4 @@ function executeOperationAndKeepUpToDate(environment, operation, updateCache, cu
340
287
  } : existing;
341
288
  });
342
289
  }
343
-
344
290
  module.exports = getQueryResultOrFetchQuery_REACT_CACHE;
@@ -0,0 +1,206 @@
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
+ * @format
9
+ * @oncall relay
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
15
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
16
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
17
+ var _require = require('../QueryResource'),
18
+ getQueryResourceForEnvironment = _require.getQueryResourceForEnvironment;
19
+ var invariant = require('invariant');
20
+ var _require2 = require('relay-runtime'),
21
+ fetchQueryInternal = _require2.__internal.fetchQuery,
22
+ createOperationDescriptor = _require2.createOperationDescriptor,
23
+ getPendingOperationsForFragment = _require2.getPendingOperationsForFragment,
24
+ getSelector = _require2.getSelector,
25
+ getVariablesFromFragment = _require2.getVariablesFromFragment,
26
+ handlePotentialSnapshotErrors = _require2.handlePotentialSnapshotErrors;
27
+ var warning = require("fbjs/lib/warning");
28
+ function isMissingData(state) {
29
+ if (state.kind === 'bailout') {
30
+ return false;
31
+ } else if (state.kind === 'singular') {
32
+ return state.snapshot.isMissingData;
33
+ } else {
34
+ return state.snapshots.some(function (s) {
35
+ return s.isMissingData;
36
+ });
37
+ }
38
+ }
39
+ function getMissingClientEdges(state) {
40
+ if (state.kind === 'bailout') {
41
+ return null;
42
+ } else if (state.kind === 'singular') {
43
+ var _state$snapshot$missi;
44
+ return (_state$snapshot$missi = state.snapshot.missingClientEdges) !== null && _state$snapshot$missi !== void 0 ? _state$snapshot$missi : null;
45
+ } else {
46
+ var edges = null;
47
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(state.snapshots),
48
+ _step;
49
+ try {
50
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
51
+ var snapshot = _step.value;
52
+ if (snapshot.missingClientEdges) {
53
+ var _edges;
54
+ edges = (_edges = edges) !== null && _edges !== void 0 ? _edges : [];
55
+ var _iterator2 = (0, _createForOfIteratorHelper2["default"])(snapshot.missingClientEdges),
56
+ _step2;
57
+ try {
58
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
59
+ var edge = _step2.value;
60
+ edges.push(edge);
61
+ }
62
+ } catch (err) {
63
+ _iterator2.e(err);
64
+ } finally {
65
+ _iterator2.f();
66
+ }
67
+ }
68
+ }
69
+ } catch (err) {
70
+ _iterator.e(err);
71
+ } finally {
72
+ _iterator.f();
73
+ }
74
+ return edges;
75
+ }
76
+ }
77
+ function handlePotentialSnapshotErrorsForState(environment, state) {
78
+ if (state.kind === 'singular') {
79
+ handlePotentialSnapshotErrors(environment, state.snapshot.missingRequiredFields, state.snapshot.relayResolverErrors);
80
+ } else if (state.kind === 'plural') {
81
+ var _iterator3 = (0, _createForOfIteratorHelper2["default"])(state.snapshots),
82
+ _step3;
83
+ try {
84
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
85
+ var snapshot = _step3.value;
86
+ handlePotentialSnapshotErrors(environment, snapshot.missingRequiredFields, snapshot.relayResolverErrors);
87
+ }
88
+ } catch (err) {
89
+ _iterator3.e(err);
90
+ } finally {
91
+ _iterator3.f();
92
+ }
93
+ }
94
+ }
95
+ function handleMissingClientEdge(environment, parentFragmentNode, parentFragmentRef, missingClientEdgeRequestInfo, queryOptions) {
96
+ var originalVariables = getVariablesFromFragment(parentFragmentNode, parentFragmentRef);
97
+ var variables = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, originalVariables), {}, {
98
+ id: missingClientEdgeRequestInfo.clientEdgeDestinationID // TODO should be a reserved name
99
+ });
100
+
101
+ var queryOperationDescriptor = createOperationDescriptor(missingClientEdgeRequestInfo.request, variables, queryOptions === null || queryOptions === void 0 ? void 0 : queryOptions.networkCacheConfig);
102
+ // This may suspend. We don't need to do anything with the results; all we're
103
+ // doing here is started the query if needed and retaining and releasing it
104
+ // according to the component mount/suspense cycle; QueryResource
105
+ // already handles this by itself.
106
+ var QueryResource = getQueryResourceForEnvironment(environment);
107
+ return QueryResource.prepare(queryOperationDescriptor, fetchQueryInternal(environment, queryOperationDescriptor), queryOptions === null || queryOptions === void 0 ? void 0 : queryOptions.fetchPolicy);
108
+ }
109
+ function getFragmentState(environment, fragmentSelector) {
110
+ if (fragmentSelector == null) {
111
+ return {
112
+ kind: 'bailout'
113
+ };
114
+ } else if (fragmentSelector.kind === 'PluralReaderSelector') {
115
+ if (fragmentSelector.selectors.length === 0) {
116
+ return {
117
+ kind: 'bailout'
118
+ };
119
+ } else {
120
+ return {
121
+ kind: 'plural',
122
+ snapshots: fragmentSelector.selectors.map(function (s) {
123
+ return environment.lookup(s);
124
+ }),
125
+ epoch: environment.getStore().getEpoch()
126
+ };
127
+ }
128
+ } else {
129
+ return {
130
+ kind: 'singular',
131
+ snapshot: environment.lookup(fragmentSelector),
132
+ epoch: environment.getStore().getEpoch()
133
+ };
134
+ }
135
+ }
136
+
137
+ // fragmentNode cannot change during the lifetime of the component, though fragmentRef may change.
138
+ function readFragmentInternal_REACT_CACHE(environment, fragmentNode, fragmentRef, hookDisplayName, queryOptions, fragmentKey) {
139
+ var _fragmentNode$metadat, _fragmentNode$metadat2;
140
+ var fragmentSelector = getSelector(fragmentNode, fragmentRef);
141
+ var isPlural = (fragmentNode === null || fragmentNode === void 0 ? void 0 : (_fragmentNode$metadat = fragmentNode.metadata) === null || _fragmentNode$metadat === void 0 ? void 0 : _fragmentNode$metadat.plural) === true;
142
+ if (isPlural) {
143
+ !(fragmentRef == null || Array.isArray(fragmentRef)) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected fragment pointer%s for fragment `%s` to be ' + 'an array, instead got `%s`. Remove `@relay(plural: true)` ' + 'from fragment `%s` to allow the prop to be an object.', fragmentKey != null ? " for key `".concat(fragmentKey, "`") : '', fragmentNode.name, typeof fragmentRef, fragmentNode.name) : invariant(false) : void 0;
144
+ } else {
145
+ !!Array.isArray(fragmentRef) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected fragment pointer%s for fragment `%s` not to be ' + 'an array, instead got `%s`. Add `@relay(plural: true)` ' + 'to fragment `%s` to allow the prop to be an array.', fragmentKey != null ? " for key `".concat(fragmentKey, "`") : '', fragmentNode.name, typeof fragmentRef, fragmentNode.name) : invariant(false) : void 0;
146
+ }
147
+ !(fragmentRef == null || isPlural && Array.isArray(fragmentRef) && fragmentRef.length === 0 || fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected to receive an object where `...%s` was spread, ' + 'but the fragment reference was not found`. This is most ' + 'likely the result of:\n' + "- Forgetting to spread `%s` in `%s`'s parent's fragment.\n" + '- Conditionally fetching `%s` but unconditionally passing %s prop ' + 'to `%s`. If the parent fragment only fetches the fragment conditionally ' + '- with e.g. `@include`, `@skip`, or inside a `... on SomeType { }` ' + 'spread - then the fragment reference will not exist. ' + 'In this case, pass `null` if the conditions for evaluating the ' + 'fragment are not met (e.g. if the `@include(if)` value is false.)', fragmentNode.name, fragmentNode.name, hookDisplayName, fragmentNode.name, fragmentKey == null ? 'a fragment reference' : "the `".concat(fragmentKey, "`"), hookDisplayName) : invariant(false) : void 0;
148
+ var state = getFragmentState(environment, fragmentSelector);
149
+
150
+ // Handle the queries for any missing client edges; this may suspend.
151
+ // FIXME handle client edges in parallel.
152
+ var clientEdgeQueries = null;
153
+ if (((_fragmentNode$metadat2 = fragmentNode.metadata) === null || _fragmentNode$metadat2 === void 0 ? void 0 : _fragmentNode$metadat2.hasClientEdges) === true) {
154
+ var missingClientEdges = getMissingClientEdges(state);
155
+ if (missingClientEdges !== null && missingClientEdges !== void 0 && missingClientEdges.length) {
156
+ clientEdgeQueries = [];
157
+ var _iterator4 = (0, _createForOfIteratorHelper2["default"])(missingClientEdges),
158
+ _step4;
159
+ try {
160
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
161
+ var edge = _step4.value;
162
+ clientEdgeQueries.push(handleMissingClientEdge(environment, fragmentNode, fragmentRef, edge, queryOptions));
163
+ }
164
+ } catch (err) {
165
+ _iterator4.e(err);
166
+ } finally {
167
+ _iterator4.f();
168
+ }
169
+ }
170
+ }
171
+ if (isMissingData(state)) {
172
+ // Suspend if an active operation bears on this fragment, either the
173
+ // fragment's owner or some other mutation etc. that could affect it:
174
+ !(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'refinement, see invariants above') : invariant(false) : void 0;
175
+ var fragmentOwner = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors[0].owner : fragmentSelector.owner;
176
+ var pendingOperationsResult = getPendingOperationsForFragment(environment, fragmentNode, fragmentOwner);
177
+ if (pendingOperationsResult) {
178
+ throw pendingOperationsResult.promise;
179
+ }
180
+ // Report required fields only if we're not suspending, since that means
181
+ // they're missing even though we are out of options for possibly fetching them:
182
+ handlePotentialSnapshotErrorsForState(environment, state);
183
+ }
184
+ var data;
185
+ if (state.kind === 'bailout') {
186
+ data = isPlural ? [] : null;
187
+ } else if (state.kind === 'singular') {
188
+ data = state.snapshot.data;
189
+ } else {
190
+ data = state.snapshots.map(function (s) {
191
+ return s.data;
192
+ });
193
+ }
194
+ if (process.env.NODE_ENV !== "production") {
195
+ if (fragmentRef != null && (data === undefined || Array.isArray(data) && data.length > 0 && data.every(function (d) {
196
+ return d === undefined;
197
+ }))) {
198
+ process.env.NODE_ENV !== "production" ? warning(false, 'Relay: Expected to have been able to read non-null data for ' + 'fragment `%s` declared in ' + '`%s`, since fragment reference was non-null. ' + "Make sure that that `%s`'s parent isn't " + 'holding on to and/or passing a fragment reference for data that ' + 'has been deleted.', fragmentNode.name, hookDisplayName, hookDisplayName) : void 0;
199
+ }
200
+ }
201
+ return {
202
+ data: data,
203
+ clientEdgeQueries: clientEdgeQueries
204
+ };
205
+ }
206
+ module.exports = readFragmentInternal_REACT_CACHE;