react-relay 13.1.1 → 14.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (178) hide show
  1. package/ReactRelayContainerUtils.js.flow +0 -2
  2. package/ReactRelayContext.js +1 -1
  3. package/ReactRelayContext.js.flow +0 -2
  4. package/ReactRelayFragmentContainer.js.flow +7 -6
  5. package/ReactRelayFragmentMockRenderer.js.flow +0 -2
  6. package/ReactRelayLocalQueryRenderer.js.flow +1 -3
  7. package/ReactRelayPaginationContainer.js.flow +13 -10
  8. package/ReactRelayQueryFetcher.js.flow +10 -11
  9. package/ReactRelayQueryRenderer.js.flow +15 -16
  10. package/ReactRelayQueryRendererContext.js.flow +1 -3
  11. package/ReactRelayRefetchContainer.js.flow +10 -7
  12. package/ReactRelayTestMocker.js.flow +0 -2
  13. package/ReactRelayTypes.js.flow +6 -8
  14. package/RelayContext.js.flow +0 -2
  15. package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +2 -4
  16. package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +3 -5
  17. package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +3 -5
  18. package/__flowtests__/RelayModern-flowtest.js.flow +2 -4
  19. package/__flowtests__/RelayModernFlowtest_badref.graphql.js.flow +2 -4
  20. package/__flowtests__/RelayModernFlowtest_notref.graphql.js.flow +2 -4
  21. package/__flowtests__/RelayModernFlowtest_user.graphql.js.flow +2 -4
  22. package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +2 -4
  23. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +2 -2
  24. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +2 -2
  25. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +3 -3
  26. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +3 -3
  27. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +3 -3
  28. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +3 -3
  29. package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +2 -2
  30. package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +2 -2
  31. package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +2 -2
  32. package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +2 -2
  33. package/assertFragmentMap.js.flow +0 -2
  34. package/buildReactRelayContainer.js.flow +2 -4
  35. package/getRootVariablesForFragments.js.flow +0 -2
  36. package/hooks.js +1 -1
  37. package/hooks.js.flow +0 -2
  38. package/index.js +1 -1
  39. package/index.js.flow +2 -2
  40. package/isRelayEnvironment.js.flow +0 -2
  41. package/jest-react/internalAct.js.flow +25 -9
  42. package/legacy.js +1 -1
  43. package/legacy.js.flow +0 -2
  44. package/lib/ReactRelayContainerUtils.js +0 -1
  45. package/lib/ReactRelayContext.js +0 -1
  46. package/lib/ReactRelayFragmentContainer.js +10 -9
  47. package/lib/ReactRelayFragmentMockRenderer.js +0 -1
  48. package/lib/ReactRelayLocalQueryRenderer.js +0 -1
  49. package/lib/ReactRelayPaginationContainer.js +14 -11
  50. package/lib/ReactRelayQueryFetcher.js +2 -2
  51. package/lib/ReactRelayQueryRenderer.js +2 -4
  52. package/lib/ReactRelayQueryRendererContext.js +0 -1
  53. package/lib/ReactRelayRefetchContainer.js +11 -14
  54. package/lib/ReactRelayTestMocker.js +1 -2
  55. package/lib/ReactRelayTypes.js +0 -1
  56. package/lib/RelayContext.js +0 -1
  57. package/lib/assertFragmentMap.js +0 -1
  58. package/lib/buildReactRelayContainer.js +1 -2
  59. package/lib/getRootVariablesForFragments.js +1 -2
  60. package/lib/hooks.js +0 -1
  61. package/lib/index.js +3 -1
  62. package/lib/isRelayEnvironment.js +0 -1
  63. package/lib/jest-react/internalAct.js +24 -4
  64. package/lib/legacy.js +0 -1
  65. package/lib/multi-actor/useRelayActorEnvironment.js +0 -1
  66. package/lib/readContext.js +2 -2
  67. package/lib/relay-hooks/EntryPointContainer.react.js +0 -1
  68. package/lib/relay-hooks/EntryPointTypes.flow.js +0 -1
  69. package/lib/relay-hooks/FragmentResource.js +68 -29
  70. package/lib/relay-hooks/HooksImplementation.js +29 -0
  71. package/lib/relay-hooks/InternalLogger.js +0 -1
  72. package/lib/relay-hooks/LRUCache.js +0 -1
  73. package/lib/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js +0 -1
  74. package/lib/relay-hooks/MatchContainer.js +2 -2
  75. package/lib/relay-hooks/ProfilerContext.js +0 -1
  76. package/lib/relay-hooks/QueryResource.js +5 -168
  77. package/lib/relay-hooks/RelayEnvironmentProvider.js +0 -1
  78. package/lib/relay-hooks/SuspenseResource.js +1 -2
  79. package/lib/relay-hooks/loadQuery.js +1 -1
  80. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +8 -13
  81. package/lib/relay-hooks/prepareEntryPoint_DEPRECATED.js +0 -1
  82. package/lib/relay-hooks/react-cache/RelayReactCache.js +36 -0
  83. package/lib/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js +344 -0
  84. package/lib/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js +239 -0
  85. package/lib/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js +598 -0
  86. package/lib/relay-hooks/react-cache/useFragment_REACT_CACHE.js +50 -0
  87. package/lib/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js +55 -0
  88. package/lib/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js +150 -0
  89. package/lib/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js +124 -0
  90. package/lib/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js +367 -0
  91. package/lib/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js +45 -0
  92. package/lib/relay-hooks/useBlockingPaginationFragment.js +4 -3
  93. package/lib/relay-hooks/useClientQuery.js +33 -0
  94. package/lib/relay-hooks/useEntryPointLoader.js +1 -2
  95. package/lib/relay-hooks/useFetchTrackingRef.js +0 -1
  96. package/lib/relay-hooks/useFragment.js +15 -2
  97. package/lib/relay-hooks/useFragmentNode.js +0 -1
  98. package/lib/relay-hooks/useIsMountedRef.js +0 -1
  99. package/lib/relay-hooks/useLazyLoadQuery.js +4 -2
  100. package/lib/relay-hooks/useLazyLoadQueryNode.js +0 -1
  101. package/lib/relay-hooks/useLoadMoreFunction.js +1 -2
  102. package/lib/relay-hooks/useMemoOperationDescriptor.js +0 -1
  103. package/lib/relay-hooks/useMemoVariables.js +0 -1
  104. package/lib/relay-hooks/useMutation.js +5 -7
  105. package/lib/relay-hooks/usePaginationFragment.js +15 -3
  106. package/lib/relay-hooks/usePreloadedQuery.js +4 -2
  107. package/lib/relay-hooks/useQueryLoader.js +1 -2
  108. package/lib/relay-hooks/useRefetchableFragment.js +14 -2
  109. package/lib/relay-hooks/useRefetchableFragmentNode.js +1 -2
  110. package/lib/relay-hooks/useRelayEnvironment.js +0 -1
  111. package/lib/relay-hooks/useStaticFragmentNodeWarning.js +0 -1
  112. package/lib/relay-hooks/useSubscribeToInvalidationState.js +0 -1
  113. package/lib/relay-hooks/useSubscription.js +0 -1
  114. package/multi-actor/useRelayActorEnvironment.js.flow +0 -2
  115. package/package.json +3 -3
  116. package/react-relay-hooks.js +2 -2
  117. package/react-relay-hooks.min.js +2 -2
  118. package/react-relay-legacy.js +2 -2
  119. package/react-relay-legacy.min.js +2 -2
  120. package/react-relay.js +2 -2
  121. package/react-relay.min.js +2 -2
  122. package/readContext.js.flow +1 -2
  123. package/relay-hooks/EntryPointContainer.react.js.flow +2 -4
  124. package/relay-hooks/EntryPointTypes.flow.js.flow +30 -32
  125. package/relay-hooks/FragmentResource.js.flow +80 -37
  126. package/relay-hooks/HooksImplementation.js.flow +43 -0
  127. package/relay-hooks/InternalLogger.js.flow +0 -2
  128. package/relay-hooks/LRUCache.js.flow +0 -2
  129. package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +4 -6
  130. package/relay-hooks/MatchContainer.js.flow +11 -6
  131. package/relay-hooks/ProfilerContext.js.flow +0 -2
  132. package/relay-hooks/QueryResource.js.flow +12 -209
  133. package/relay-hooks/RelayEnvironmentProvider.js.flow +2 -4
  134. package/relay-hooks/SuspenseResource.js.flow +0 -2
  135. package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +3 -3
  136. package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +2 -2
  137. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +2 -2
  138. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +2 -2
  139. package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +4 -6
  140. package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +0 -2
  141. package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +4 -6
  142. package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +0 -2
  143. package/relay-hooks/__flowtests__/utils.js.flow +8 -10
  144. package/relay-hooks/loadQuery.js.flow +2 -1
  145. package/relay-hooks/preloadQuery_DEPRECATED.js.flow +11 -20
  146. package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +0 -2
  147. package/relay-hooks/react-cache/RelayReactCache.js.flow +40 -0
  148. package/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js.flow +430 -0
  149. package/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js.flow +297 -0
  150. package/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js.flow +599 -0
  151. package/relay-hooks/react-cache/useFragment_REACT_CACHE.js.flow +72 -0
  152. package/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js.flow +70 -0
  153. package/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js.flow +171 -0
  154. package/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js.flow +151 -0
  155. package/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js.flow +595 -0
  156. package/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js.flow +65 -0
  157. package/relay-hooks/useBlockingPaginationFragment.js.flow +4 -6
  158. package/relay-hooks/useClientQuery.js.flow +39 -0
  159. package/relay-hooks/useEntryPointLoader.js.flow +6 -8
  160. package/relay-hooks/useFetchTrackingRef.js.flow +2 -4
  161. package/relay-hooks/useFragment.js.flow +17 -12
  162. package/relay-hooks/useFragmentNode.js.flow +2 -4
  163. package/relay-hooks/useIsMountedRef.js.flow +1 -3
  164. package/relay-hooks/useLazyLoadQuery.js.flow +17 -5
  165. package/relay-hooks/useLazyLoadQueryNode.js.flow +2 -4
  166. package/relay-hooks/useLoadMoreFunction.js.flow +6 -8
  167. package/relay-hooks/useMemoOperationDescriptor.js.flow +0 -2
  168. package/relay-hooks/useMemoVariables.js.flow +0 -2
  169. package/relay-hooks/useMutation.js.flow +5 -7
  170. package/relay-hooks/usePaginationFragment.js.flow +44 -19
  171. package/relay-hooks/usePreloadedQuery.js.flow +14 -5
  172. package/relay-hooks/useQueryLoader.js.flow +4 -6
  173. package/relay-hooks/useRefetchableFragment.js.flow +32 -3
  174. package/relay-hooks/useRefetchableFragmentNode.js.flow +38 -25
  175. package/relay-hooks/useRelayEnvironment.js.flow +0 -2
  176. package/relay-hooks/useStaticFragmentNodeWarning.js.flow +0 -2
  177. package/relay-hooks/useSubscribeToInvalidationState.js.flow +0 -2
  178. package/relay-hooks/useSubscription.js.flow +14 -10
@@ -7,10 +7,9 @@
7
7
  *
8
8
  * @format
9
9
  */
10
- // flowlint ambiguous-object-type:error
11
10
  'use strict';
12
11
 
13
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
12
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
14
13
 
15
14
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
16
15
 
@@ -24,6 +23,8 @@ var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inh
24
23
 
25
24
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
26
25
 
26
+ var _excluded = ["componentRef", "__relayContext", "__rootIsQueryRenderer"];
27
+
27
28
  var buildReactRelayContainer = require('./buildReactRelayContainer');
28
29
 
29
30
  var getRootVariablesForFragments = require('./getRootVariablesForFragments');
@@ -59,10 +60,10 @@ var warning = require("fbjs/lib/warning");
59
60
  * updates.
60
61
  */
61
62
  function createContainerWithFragments(Component, fragments, taggedNode) {
62
- var _class, _temp;
63
+ var _class;
63
64
 
64
65
  var containerName = getContainerName(Component);
65
- return _temp = _class = /*#__PURE__*/function (_React$Component) {
66
+ return _class = /*#__PURE__*/function (_React$Component) {
66
67
  (0, _inheritsLoose2["default"])(_class, _React$Component);
67
68
 
68
69
  function _class(props) {
@@ -113,11 +114,7 @@ function createContainerWithFragments(Component, fragments, taggedNode) {
113
114
  var query = getRequest(taggedNode);
114
115
  var operation = createOperationDescriptor(query, fetchVariables, cacheConfig); // TODO: T26288752 find a better way
115
116
 
116
- /* eslint-disable lint/react-state-props-mutation */
117
-
118
- _this.state.localVariables = fetchVariables;
119
- /* eslint-enable lint/react-state-props-mutation */
120
- // Cancel any previously running refetch.
117
+ _this.state.localVariables = fetchVariables; // Cancel any previously running refetch.
121
118
 
122
119
  _this._refetchSubscription && _this._refetchSubscription.unsubscribe(); // Declare refetchSubscription before assigning it in .start(), since
123
120
  // synchronous completion may call callbacks .subscribe() returns.
@@ -304,14 +301,14 @@ function createContainerWithFragments(Component, fragments, taggedNode) {
304
301
  var keys = Object.keys(nextProps);
305
302
 
306
303
  for (var ii = 0; ii < keys.length; ii++) {
307
- var _key = keys[ii];
304
+ var key = keys[ii];
308
305
 
309
- if (_key === '__relayContext') {
306
+ if (key === '__relayContext') {
310
307
  if (this.state.prevPropsContext.environment !== nextState.prevPropsContext.environment) {
311
308
  return true;
312
309
  }
313
310
  } else {
314
- if (!fragments.hasOwnProperty(_key) && !isScalarAndEqual(nextProps[_key], this.props[_key])) {
311
+ if (!fragments.hasOwnProperty(key) && !isScalarAndEqual(nextProps[key], this.props[key])) {
315
312
  return true;
316
313
  }
317
314
  }
@@ -373,7 +370,7 @@ function createContainerWithFragments(Component, fragments, taggedNode) {
373
370
  componentRef = _this$props.componentRef,
374
371
  __relayContext = _this$props.__relayContext,
375
372
  __rootIsQueryRenderer = _this$props.__rootIsQueryRenderer,
376
- props = (0, _objectWithoutPropertiesLoose2["default"])(_this$props, ["componentRef", "__relayContext", "__rootIsQueryRenderer"]);
373
+ props = (0, _objectWithoutPropertiesLoose2["default"])(_this$props, _excluded);
377
374
  var _this$state3 = this.state,
378
375
  relayProp = _this$state3.relayProp,
379
376
  contextForChildren = _this$state3.contextForChildren;
@@ -386,7 +383,7 @@ function createContainerWithFragments(Component, fragments, taggedNode) {
386
383
  };
387
384
 
388
385
  return _class;
389
- }(React.Component), (0, _defineProperty2["default"])(_class, "displayName", containerName), _temp;
386
+ }(React.Component), (0, _defineProperty2["default"])(_class, "displayName", containerName), _class;
390
387
  }
391
388
 
392
389
  function getRelayProp(environment, refetch) {
@@ -7,10 +7,9 @@
7
7
  *
8
8
  * @format
9
9
  */
10
- // flowlint ambiguous-object-type:error
11
10
  'use strict';
12
11
 
13
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
12
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
14
13
 
15
14
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
16
15
 
@@ -7,5 +7,4 @@
7
7
  *
8
8
  * @format
9
9
  */
10
- // flowlint ambiguous-object-type:error
11
10
  'use strict';
@@ -7,7 +7,6 @@
7
7
  *
8
8
  * @format
9
9
  */
10
- // flowlint ambiguous-object-type:error
11
10
  'use strict';
12
11
 
13
12
  var isRelayEnvironment = require('./isRelayEnvironment');
@@ -7,7 +7,6 @@
7
7
  *
8
8
  * @format
9
9
  */
10
- // flowlint ambiguous-object-type:error
11
10
  'use strict';
12
11
 
13
12
  var invariant = require('invariant');
@@ -7,10 +7,9 @@
7
7
  *
8
8
  * @format
9
9
  */
10
- // flowlint ambiguous-object-type:error
11
10
  'use strict';
12
11
 
13
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
12
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
14
13
 
15
14
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
16
15
 
@@ -7,10 +7,9 @@
7
7
  *
8
8
  * @format
9
9
  */
10
- // flowlint ambiguous-object-type:error
11
10
  'use strict';
12
11
 
13
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
12
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
14
13
 
15
14
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
16
15
 
package/lib/hooks.js CHANGED
@@ -7,7 +7,6 @@
7
7
  *
8
8
  * @format
9
9
  */
10
- // flowlint ambiguous-object-type:error
11
10
  'use strict';
12
11
 
13
12
  var EntryPointContainer = require('./relay-hooks/EntryPointContainer.react');
package/lib/index.js CHANGED
@@ -7,7 +7,6 @@
7
7
  *
8
8
  * @format
9
9
  */
10
- // flowlint ambiguous-object-type:error
11
10
  'use strict';
12
11
 
13
12
  var ReactRelayContext = require('./ReactRelayContext');
@@ -31,6 +30,8 @@ var _require = require('./relay-hooks/loadQuery'),
31
30
 
32
31
  var RelayEnvironmentProvider = require('./relay-hooks/RelayEnvironmentProvider');
33
32
 
33
+ var useClientQuery = require('./relay-hooks/useClientQuery');
34
+
34
35
  var useEntryPointLoader = require('./relay-hooks/useEntryPointLoader');
35
36
 
36
37
  var useFragment = require('./relay-hooks/useFragment');
@@ -83,6 +84,7 @@ module.exports = {
83
84
  fetchQuery: RelayRuntime.fetchQuery,
84
85
  loadQuery: loadQuery,
85
86
  loadEntryPoint: loadEntryPoint,
87
+ useClientQuery: useClientQuery,
86
88
  useFragment: useFragment,
87
89
  useLazyLoadQuery: useLazyLoadQuery,
88
90
  useEntryPointLoader: useEntryPointLoader,
@@ -7,7 +7,6 @@
7
7
  *
8
8
  * @format
9
9
  */
10
- // flowlint ambiguous-object-type:error
11
10
  'use strict';
12
11
  /**
13
12
  * Determine if a given value is an object that implements the `Environment`
@@ -36,10 +36,21 @@ function act(scope) {
36
36
  throw Error("This version of `act` requires Jest's timer mocks " + '(i.e. jest.useFakeTimers).');
37
37
  }
38
38
 
39
+ var previousIsActEnvironment = global.IS_REACT_ACT_ENVIRONMENT;
39
40
  var previousActingUpdatesScopeDepth = actingUpdatesScopeDepth;
40
41
  actingUpdatesScopeDepth++;
41
42
 
43
+ if (process.env.NODE_ENV !== "production" && actingUpdatesScopeDepth === 1) {
44
+ // Because this is not the "real" `act`, we set this to `false` so React
45
+ // knows not to fire `act` warnings.
46
+ global.IS_REACT_ACT_ENVIRONMENT = false;
47
+ }
48
+
42
49
  var unwind = function unwind() {
50
+ if (process.env.NODE_ENV !== "production" && actingUpdatesScopeDepth === 1) {
51
+ global.IS_REACT_ACT_ENVIRONMENT = previousIsActEnvironment;
52
+ }
53
+
43
54
  actingUpdatesScopeDepth--;
44
55
 
45
56
  if (process.env.NODE_ENV !== "production") {
@@ -55,15 +66,16 @@ function act(scope) {
55
66
 
56
67
 
57
68
  try {
58
- var thenable = scope();
69
+ var result = scope();
59
70
 
60
- if (typeof thenable === 'object' && thenable !== null && typeof thenable.then === 'function') {
71
+ if (typeof result === 'object' && result !== null && typeof result.then === 'function') {
72
+ var thenableResult = result;
61
73
  return {
62
74
  then: function then(resolve, reject) {
63
- thenable.then(function () {
75
+ thenableResult.then(function (returnValue) {
64
76
  flushActWork(function () {
65
77
  unwind();
66
- resolve();
78
+ resolve(returnValue);
67
79
  }, function (error) {
68
80
  unwind();
69
81
  reject(error);
@@ -75,6 +87,8 @@ function act(scope) {
75
87
  }
76
88
  };
77
89
  } else {
90
+ var returnValue = result;
91
+
78
92
  try {
79
93
  // TODO: Let's not support non-async scopes at all in our tests. Need to
80
94
  // migrate existing tests.
@@ -83,6 +97,12 @@ function act(scope) {
83
97
  do {
84
98
  didFlushWork = Scheduler.unstable_flushAllWithoutAsserting();
85
99
  } while (didFlushWork);
100
+
101
+ return {
102
+ then: function then(resolve, reject) {
103
+ resolve(returnValue);
104
+ }
105
+ };
86
106
  } finally {
87
107
  unwind();
88
108
  }
package/lib/legacy.js CHANGED
@@ -7,7 +7,6 @@
7
7
  *
8
8
  * @format
9
9
  */
10
- // flowlint ambiguous-object-type:error
11
10
  'use strict';
12
11
 
13
12
  var ReactRelayContext = require('./ReactRelayContext');
@@ -8,7 +8,6 @@
8
8
  *
9
9
  * @format
10
10
  */
11
- // flowlint ambiguous-object-type:error
12
11
  'use strict';
13
12
 
14
13
  var invariant = require('invariant');
@@ -7,10 +7,10 @@
7
7
  *
8
8
  * @format
9
9
  */
10
- // flowlint ambiguous-object-type:error
11
10
  'use strict';
12
11
 
13
- var React = require('react');
12
+ var React = require('react'); // $FlowFixMe[incompatible-use]
13
+
14
14
 
15
15
  var _React$__SECRET_INTER =
16
16
  /* $FlowFixMe[prop-missing] Flow doesn't know about React's internals for
@@ -8,7 +8,6 @@
8
8
  *
9
9
  * @format
10
10
  */
11
- // flowlint ambiguous-object-type:error
12
11
  'use strict';
13
12
 
14
13
  var ProfilerContext = require('./ProfilerContext');
@@ -8,5 +8,4 @@
8
8
  *
9
9
  * @format
10
10
  */
11
- // flowlint ambiguous-object-type:error
12
11
  'use strict';
@@ -8,10 +8,9 @@
8
8
  * @emails oncall+relay
9
9
  * @format
10
10
  */
11
- // flowlint ambiguous-object-type:error
12
11
  'use strict';
13
12
 
14
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
13
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
15
14
 
16
15
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
17
16
 
@@ -38,9 +37,9 @@ var _require2 = require('relay-runtime'),
38
37
  getPendingOperationsForFragment = _require2.getPendingOperationsForFragment,
39
38
  getSelector = _require2.getSelector,
40
39
  getVariablesFromFragment = _require2.getVariablesFromFragment,
40
+ handlePotentialSnapshotErrors = _require2.handlePotentialSnapshotErrors,
41
41
  isPromise = _require2.isPromise,
42
- recycleNodesInto = _require2.recycleNodesInto,
43
- reportMissingRequiredFields = _require2.reportMissingRequiredFields;
42
+ recycleNodesInto = _require2.recycleNodesInto;
44
43
 
45
44
  var WEAKMAP_SUPPORTED = typeof WeakMap === 'function';
46
45
  // TODO: Fix to not rely on LRU. If the number of active fragments exceeds this
@@ -74,6 +73,16 @@ function hasMissingClientEdges(snapshot) {
74
73
  return ((_snapshot$missingClie = (_snapshot$missingClie2 = snapshot.missingClientEdges) === null || _snapshot$missingClie2 === void 0 ? void 0 : _snapshot$missingClie2.length) !== null && _snapshot$missingClie !== void 0 ? _snapshot$missingClie : 0) > 0;
75
74
  }
76
75
 
76
+ function missingLiveResolverFields(snapshot) {
77
+ if (Array.isArray(snapshot)) {
78
+ return snapshot.map(function (s) {
79
+ return s.missingLiveResolverFields;
80
+ }).filter(Boolean).flat();
81
+ }
82
+
83
+ return snapshot.missingLiveResolverFields;
84
+ }
85
+
77
86
  function singularOrPluralForEach(snapshot, f) {
78
87
  if (Array.isArray(snapshot)) {
79
88
  snapshot.forEach(f);
@@ -126,7 +135,8 @@ var ClientEdgeQueryResultsCache = /*#__PURE__*/function () {
126
135
  return (_this$_cache$get$ = (_this$_cache$get = this._cache.get(fragmentIdentifier)) === null || _this$_cache$get === void 0 ? void 0 : _this$_cache$get[0]) !== null && _this$_cache$get$ !== void 0 ? _this$_cache$get$ : undefined;
127
136
  };
128
137
 
129
- _proto.recordQueryResults = function recordQueryResults(fragmentIdentifier, value) {
138
+ _proto.recordQueryResults = function recordQueryResults(fragmentIdentifier, value // may be mutated after being passed here
139
+ ) {
130
140
  var _this = this;
131
141
 
132
142
  var existing = this._cache.get(fragmentIdentifier);
@@ -210,7 +220,7 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
210
220
  _proto2.readWithIdentifier = function readWithIdentifier(fragmentNode, fragmentRef, fragmentIdentifier, componentDisplayName, fragmentKey) {
211
221
  var _this3 = this;
212
222
 
213
- var _fragmentNode$metadat, _clientEdgePromises;
223
+ var _fragmentNode$metadat, _fragmentNode$metadat2, _missingLiveResolverF2, _missingLiveResolverF3;
214
224
 
215
225
  var environment = this._environment; // If fragmentRef is null or undefined, pass it directly through.
216
226
  // This is a convenience when consuming fragments via a HOC API, when the
@@ -248,6 +258,8 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
248
258
  var cachedValue = this._cache.get(fragmentIdentifier);
249
259
 
250
260
  if (cachedValue != null) {
261
+ var _missingLiveResolverF;
262
+
251
263
  if (cachedValue.kind === 'pending' && isPromise(cachedValue.promise)) {
252
264
  environment.__log({
253
265
  name: 'suspense.fragment',
@@ -262,8 +274,8 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
262
274
  throw cachedValue.promise;
263
275
  }
264
276
 
265
- if (cachedValue.kind === 'done' && cachedValue.result.snapshot) {
266
- this._reportMissingRequiredFieldsInSnapshot(cachedValue.result.snapshot);
277
+ if (cachedValue.kind === 'done' && cachedValue.result.snapshot && !((_missingLiveResolverF = missingLiveResolverFields(cachedValue.result.snapshot)) !== null && _missingLiveResolverF !== void 0 && _missingLiveResolverF.length)) {
278
+ this._handlePotentialSnapshotErrorsInSnapshot(cachedValue.result.snapshot);
267
279
 
268
280
  return cachedValue.result;
269
281
  }
@@ -279,7 +291,7 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
279
291
  var fragmentResult = getFragmentResult(fragmentIdentifier, snapshot, storeEpoch);
280
292
 
281
293
  if (!fragmentResult.isMissingData) {
282
- this._reportMissingRequiredFieldsInSnapshot(snapshot);
294
+ this._handlePotentialSnapshotErrorsInSnapshot(snapshot);
283
295
 
284
296
  this._cache.set(fragmentIdentifier, {
285
297
  kind: 'done',
@@ -300,7 +312,7 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
300
312
 
301
313
  var clientEdgeRequests = null;
302
314
 
303
- if (RelayFeatureFlags.ENABLE_CLIENT_EDGES && hasMissingClientEdges(snapshot)) {
315
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES && ((_fragmentNode$metadat2 = fragmentNode.metadata) === null || _fragmentNode$metadat2 === void 0 ? void 0 : _fragmentNode$metadat2.hasClientEdges) === true && hasMissingClientEdges(snapshot)) {
304
316
  clientEdgeRequests = [];
305
317
  var queryResource = getQueryResourceForEnvironment(this._environment);
306
318
  var queryResults = [];
@@ -328,14 +340,12 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
328
340
  this._clientEdgeQueryResultsCache.recordQueryResults(fragmentIdentifier, queryResults);
329
341
  }
330
342
 
331
- var clientEdgePromises = null;
343
+ var clientEdgePromises = [];
332
344
 
333
345
  if (RelayFeatureFlags.ENABLE_CLIENT_EDGES && clientEdgeRequests) {
334
346
  clientEdgePromises = clientEdgeRequests.map(function (request) {
335
347
  return getPromiseForActiveRequest(_this3._environment, request);
336
- }).filter(function (p) {
337
- return p != null;
338
- });
348
+ }).filter(Boolean);
339
349
  } // Finally look for operations in flight for our parent query:
340
350
 
341
351
 
@@ -345,8 +355,15 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
345
355
 
346
356
  var parentQueryPromiseResultPromise = parentQueryPromiseResult === null || parentQueryPromiseResult === void 0 ? void 0 : parentQueryPromiseResult.promise; // for refinement
347
357
 
348
- if (((_clientEdgePromises = clientEdgePromises) === null || _clientEdgePromises === void 0 ? void 0 : _clientEdgePromises.length) || isPromise(parentQueryPromiseResultPromise)) {
349
- var _parentQueryPromiseRe, _clientEdgeRequests2, _clientEdgePromises2;
358
+ var missingResolverFieldPromises = (_missingLiveResolverF2 = (_missingLiveResolverF3 = missingLiveResolverFields(snapshot)) === null || _missingLiveResolverF3 === void 0 ? void 0 : _missingLiveResolverF3.map(function (_ref2) {
359
+ var liveStateID = _ref2.liveStateID;
360
+ var store = environment.getStore(); // $FlowFixMe[prop-missing] This is expected to be a LiveResolverStore
361
+
362
+ return store.getLiveResolverPromise(liveStateID);
363
+ })) !== null && _missingLiveResolverF2 !== void 0 ? _missingLiveResolverF2 : [];
364
+
365
+ if (clientEdgePromises.length || missingResolverFieldPromises.length || isPromise(parentQueryPromiseResultPromise)) {
366
+ var _parentQueryPromiseRe, _clientEdgeRequests2;
350
367
 
351
368
  environment.__log({
352
369
  name: 'suspense.fragment',
@@ -355,13 +372,37 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
355
372
  isRelayHooks: true,
356
373
  isPromiseCached: false,
357
374
  isMissingData: fragmentResult.isMissingData,
375
+ // TODO! Attach information here about missing live resolver fields
358
376
  pendingOperations: [].concat((0, _toConsumableArray2["default"])((_parentQueryPromiseRe = parentQueryPromiseResult === null || parentQueryPromiseResult === void 0 ? void 0 : parentQueryPromiseResult.pendingOperations) !== null && _parentQueryPromiseRe !== void 0 ? _parentQueryPromiseRe : []), (0, _toConsumableArray2["default"])((_clientEdgeRequests2 = clientEdgeRequests) !== null && _clientEdgeRequests2 !== void 0 ? _clientEdgeRequests2 : []))
359
377
  });
360
378
 
361
- throw ((_clientEdgePromises2 = clientEdgePromises) === null || _clientEdgePromises2 === void 0 ? void 0 : _clientEdgePromises2.length) ? Promise.all([parentQueryPromiseResultPromise].concat((0, _toConsumableArray2["default"])(clientEdgePromises))) : parentQueryPromiseResultPromise;
379
+ var promises = [];
380
+
381
+ if (clientEdgePromises.length > 0) {
382
+ promises = promises.concat(clientEdgePromises);
383
+ }
384
+
385
+ if (missingResolverFieldPromises.length > 0) {
386
+ promises = promises.concat(missingResolverFieldPromises);
387
+ }
388
+
389
+ if (promises.length > 0) {
390
+ if (parentQueryPromiseResultPromise) {
391
+ promises.push(parentQueryPromiseResultPromise);
392
+ }
393
+
394
+ throw Promise.all(promises);
395
+ } // Note: we are re-throwing the `parentQueryPromiseResultPromise` here,
396
+ // because some of our suspense-related code is relying on the instance equality
397
+ // of thrown promises. See FragmentResource-test.js
398
+
399
+
400
+ if (parentQueryPromiseResultPromise) {
401
+ throw parentQueryPromiseResultPromise;
402
+ }
362
403
  }
363
404
 
364
- this._reportMissingRequiredFieldsInSnapshot(snapshot);
405
+ this._handlePotentialSnapshotErrorsInSnapshot(snapshot);
365
406
 
366
407
  return getFragmentResult(fragmentIdentifier, snapshot, storeEpoch);
367
408
  };
@@ -383,27 +424,23 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
383
424
  };
384
425
  };
385
426
 
386
- _proto2._reportMissingRequiredFieldsInSnapshot = function _reportMissingRequiredFieldsInSnapshot(snapshot) {
427
+ _proto2._handlePotentialSnapshotErrorsInSnapshot = function _handlePotentialSnapshotErrorsInSnapshot(snapshot) {
387
428
  var _this4 = this;
388
429
 
389
430
  if (Array.isArray(snapshot)) {
390
431
  snapshot.forEach(function (s) {
391
- if (s.missingRequiredFields != null) {
392
- reportMissingRequiredFields(_this4._environment, s.missingRequiredFields);
393
- }
432
+ handlePotentialSnapshotErrors(_this4._environment, s.missingRequiredFields, s.relayResolverErrors);
394
433
  });
395
434
  } else {
396
- if (snapshot.missingRequiredFields != null) {
397
- reportMissingRequiredFields(this._environment, snapshot.missingRequiredFields);
398
- }
435
+ handlePotentialSnapshotErrors(this._environment, snapshot.missingRequiredFields, snapshot.relayResolverErrors);
399
436
  }
400
437
  };
401
438
 
402
439
  _proto2.readSpec = function readSpec(fragmentNodes, fragmentRefs, componentDisplayName) {
403
440
  var result = {};
404
441
 
405
- for (var _key in fragmentNodes) {
406
- result[_key] = this.read(fragmentNodes[_key], fragmentRefs[_key], componentDisplayName, _key);
442
+ for (var key in fragmentNodes) {
443
+ result[key] = this.read(fragmentNodes[key], fragmentRefs[key], componentDisplayName, key);
407
444
  }
408
445
 
409
446
  return result;
@@ -467,7 +504,7 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
467
504
 
468
505
  var clientEdgeQueryResults = (_this$_clientEdgeQuer = (_this$_clientEdgeQuer2 = this._clientEdgeQueryResultsCache) === null || _this$_clientEdgeQuer2 === void 0 ? void 0 : _this$_clientEdgeQuer2.get(cacheKey)) !== null && _this$_clientEdgeQuer !== void 0 ? _this$_clientEdgeQuer : undefined;
469
506
 
470
- if (clientEdgeQueryResults === null || clientEdgeQueryResults === void 0 ? void 0 : clientEdgeQueryResults.length) {
507
+ if (clientEdgeQueryResults !== null && clientEdgeQueryResults !== void 0 && clientEdgeQueryResults.length) {
471
508
  var queryResource = getQueryResourceForEnvironment(this._environment);
472
509
  clientEdgeQueryResults.forEach(function (queryResult) {
473
510
  disposables.push(queryResource.retain(queryResult));
@@ -557,9 +594,11 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
557
594
  data: updatedData,
558
595
  isMissingData: currentSnapshot.isMissingData,
559
596
  missingClientEdges: currentSnapshot.missingClientEdges,
597
+ missingLiveResolverFields: currentSnapshot.missingLiveResolverFields,
560
598
  seenRecords: currentSnapshot.seenRecords,
561
599
  selector: currentSnapshot.selector,
562
- missingRequiredFields: currentSnapshot.missingRequiredFields
600
+ missingRequiredFields: currentSnapshot.missingRequiredFields,
601
+ relayResolverErrors: currentSnapshot.relayResolverErrors
563
602
  };
564
603
 
565
604
  if (updatedData !== renderData) {
@@ -0,0 +1,29 @@
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
+ * @emails oncall+relay
8
+ *
9
+ * @format
10
+ */
11
+ 'use strict';
12
+
13
+ var warning = require("fbjs/lib/warning");
14
+
15
+ var implementation = null;
16
+
17
+ function inject(impl) {
18
+ process.env.NODE_ENV !== "production" ? warning(implementation !== null, 'Relay HooksImplementation was injected twice.') : void 0;
19
+ implementation = impl;
20
+ }
21
+
22
+ function get() {
23
+ return implementation;
24
+ }
25
+
26
+ module.exports = {
27
+ inject: inject,
28
+ get: get
29
+ };
@@ -8,7 +8,6 @@
8
8
  *
9
9
  * @format
10
10
  */
11
- // flowlint ambiguous-object-type:error
12
11
  'use strict';
13
12
 
14
13
  var loggerImpl = function loggerImpl(eventData) {};
@@ -8,7 +8,6 @@
8
8
  * @emails oncall+relay
9
9
  * @format
10
10
  */
11
- // flowlint ambiguous-object-type:error
12
11
  'use strict';
13
12
 
14
13
  var invariant = require('invariant');
@@ -8,7 +8,6 @@
8
8
  *
9
9
  * @format
10
10
  */
11
- // flowlint ambiguous-object-type:error
12
11
  'use strict';
13
12
 
14
13
  var preloadQuery_DEPRECATED = require('./preloadQuery_DEPRECATED');
@@ -8,10 +8,9 @@
8
8
  *
9
9
  * @format
10
10
  */
11
- // flowlint ambiguous-object-type:error
12
11
  'use strict';
13
12
 
14
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
13
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
15
14
 
16
15
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
17
16
 
@@ -137,6 +136,7 @@ function MatchContainer(_ref2) {
137
136
 
138
137
  if (LoadedContainer != null && fragmentProps != null) {
139
138
  // $FlowFixMe[incompatible-type]
139
+ // $FlowFixMe[cannot-spread-indexer]
140
140
  return /*#__PURE__*/React.createElement(LoadedContainer, (0, _extends2["default"])({}, props, fragmentProps));
141
141
  } else {
142
142
  return fallback !== null && fallback !== void 0 ? fallback : null;
@@ -8,7 +8,6 @@
8
8
  *
9
9
  * @format
10
10
  */
11
- // flowlint ambiguous-object-type:error
12
11
  // This contextual profiler can be used to wrap a react sub-tree. It will bind
13
12
  // the RelayProfiler during the render phase of these components. Allows
14
13
  // collecting metrics for a specific part of your application.