react-relay 14.0.0 → 15.0.0

Sign up to get free protection for your applications and to get access to all the features.
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;