react-relay 11.0.2 → 13.0.0-rc.2

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 (177) hide show
  1. package/README.md +47 -0
  2. package/ReactRelayContainerUtils.js.flow +1 -1
  3. package/ReactRelayContext.js +1 -1
  4. package/ReactRelayContext.js.flow +3 -4
  5. package/ReactRelayFragmentContainer.js.flow +25 -25
  6. package/ReactRelayFragmentMockRenderer.js.flow +2 -2
  7. package/ReactRelayLocalQueryRenderer.js.flow +7 -8
  8. package/ReactRelayPaginationContainer.js.flow +112 -59
  9. package/ReactRelayQueryFetcher.js.flow +10 -11
  10. package/ReactRelayQueryRenderer.js.flow +116 -82
  11. package/ReactRelayQueryRendererContext.js.flow +1 -1
  12. package/ReactRelayRefetchContainer.js.flow +42 -39
  13. package/ReactRelayTestMocker.js.flow +17 -15
  14. package/ReactRelayTypes.js.flow +11 -11
  15. package/RelayContext.js.flow +4 -4
  16. package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +2 -3
  17. package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +12 -8
  18. package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +11 -7
  19. package/__flowtests__/RelayModern-flowtest.js.flow +79 -47
  20. package/__flowtests__/RelayModernFlowtest_badref.graphql.js.flow +6 -5
  21. package/__flowtests__/RelayModernFlowtest_notref.graphql.js.flow +6 -5
  22. package/__flowtests__/RelayModernFlowtest_user.graphql.js.flow +5 -4
  23. package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +5 -4
  24. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +72 -0
  25. package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +72 -0
  26. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +227 -0
  27. package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +164 -0
  28. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +227 -0
  29. package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +164 -0
  30. package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +66 -0
  31. package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +66 -0
  32. package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +59 -0
  33. package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +61 -0
  34. package/assertFragmentMap.js.flow +3 -3
  35. package/buildReactRelayContainer.js.flow +12 -11
  36. package/getRootVariablesForFragments.js.flow +3 -5
  37. package/hooks.js +1 -1
  38. package/hooks.js.flow +6 -7
  39. package/index.js +1 -1
  40. package/index.js.flow +7 -8
  41. package/isRelayEnvironment.js.flow +1 -1
  42. package/jest-react/enqueueTask.js.flow +56 -0
  43. package/jest-react/index.js.flow +12 -0
  44. package/jest-react/internalAct.js.flow +138 -0
  45. package/legacy.js +1 -1
  46. package/legacy.js.flow +1 -1
  47. package/lib/ReactRelayContainerUtils.js +1 -1
  48. package/lib/ReactRelayContext.js +1 -1
  49. package/lib/ReactRelayFragmentContainer.js +22 -16
  50. package/lib/ReactRelayFragmentMockRenderer.js +3 -3
  51. package/lib/ReactRelayLocalQueryRenderer.js +8 -9
  52. package/lib/ReactRelayPaginationContainer.js +97 -39
  53. package/lib/ReactRelayQueryFetcher.js +3 -3
  54. package/lib/ReactRelayQueryRenderer.js +87 -54
  55. package/lib/ReactRelayQueryRendererContext.js +1 -1
  56. package/lib/ReactRelayRefetchContainer.js +39 -26
  57. package/lib/ReactRelayTestMocker.js +8 -9
  58. package/lib/ReactRelayTypes.js +1 -1
  59. package/lib/RelayContext.js +4 -3
  60. package/lib/assertFragmentMap.js +3 -2
  61. package/lib/buildReactRelayContainer.js +8 -8
  62. package/lib/getRootVariablesForFragments.js +2 -3
  63. package/lib/hooks.js +6 -6
  64. package/lib/index.js +8 -8
  65. package/lib/isRelayEnvironment.js +1 -1
  66. package/lib/jest-react/enqueueTask.js +53 -0
  67. package/lib/jest-react/index.js +13 -0
  68. package/lib/jest-react/internalAct.js +115 -0
  69. package/lib/legacy.js +1 -1
  70. package/lib/multi-actor/ActorChange.js +30 -0
  71. package/lib/multi-actor/index.js +11 -0
  72. package/lib/multi-actor/useRelayActorEnvironment.js +29 -0
  73. package/lib/readContext.js +1 -1
  74. package/lib/relay-hooks/EntryPointContainer.react.js +4 -4
  75. package/lib/relay-hooks/EntryPointTypes.flow.js +1 -1
  76. package/lib/relay-hooks/FragmentResource.js +342 -89
  77. package/lib/relay-hooks/InternalLogger.js +1 -1
  78. package/lib/relay-hooks/LRUCache.js +1 -1
  79. package/lib/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js +5 -5
  80. package/lib/relay-hooks/MatchContainer.js +2 -2
  81. package/lib/relay-hooks/ProfilerContext.js +1 -1
  82. package/lib/relay-hooks/QueryResource.js +172 -29
  83. package/lib/relay-hooks/RelayEnvironmentProvider.js +6 -4
  84. package/lib/relay-hooks/SuspenseResource.js +130 -0
  85. package/lib/relay-hooks/loadEntryPoint.js +1 -1
  86. package/lib/relay-hooks/loadQuery.js +42 -20
  87. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +25 -16
  88. package/lib/relay-hooks/prepareEntryPoint_DEPRECATED.js +1 -1
  89. package/lib/relay-hooks/useBlockingPaginationFragment.js +5 -6
  90. package/lib/relay-hooks/useEntryPointLoader.js +3 -3
  91. package/lib/relay-hooks/useFetchTrackingRef.js +3 -2
  92. package/lib/relay-hooks/useFragment.js +7 -7
  93. package/lib/relay-hooks/useFragmentNode.js +5 -5
  94. package/lib/relay-hooks/useIsMountedRef.js +1 -1
  95. package/lib/relay-hooks/useIsOperationNodeActive.js +3 -3
  96. package/lib/relay-hooks/useIsParentQueryActive.js +1 -1
  97. package/lib/relay-hooks/useLazyLoadQuery.js +4 -4
  98. package/lib/relay-hooks/useLazyLoadQueryNode.js +11 -5
  99. package/lib/relay-hooks/useLoadMoreFunction.js +9 -13
  100. package/lib/relay-hooks/useMemoOperationDescriptor.js +3 -3
  101. package/lib/relay-hooks/useMemoVariables.js +3 -3
  102. package/lib/relay-hooks/useMutation.js +18 -7
  103. package/lib/relay-hooks/usePaginationFragment.js +3 -4
  104. package/lib/relay-hooks/usePreloadedQuery.js +6 -6
  105. package/lib/relay-hooks/useQueryLoader.js +31 -11
  106. package/lib/relay-hooks/useRefetchableFragment.js +1 -1
  107. package/lib/relay-hooks/useRefetchableFragmentNode.js +14 -18
  108. package/lib/relay-hooks/useRelayEnvironment.js +3 -3
  109. package/lib/relay-hooks/useStaticFragmentNodeWarning.js +3 -3
  110. package/lib/relay-hooks/useSubscribeToInvalidationState.js +3 -2
  111. package/lib/relay-hooks/useSubscription.js +11 -8
  112. package/multi-actor/ActorChange.js.flow +58 -0
  113. package/multi-actor/index.js.flow +14 -0
  114. package/multi-actor/useRelayActorEnvironment.js.flow +49 -0
  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 -1
  123. package/relay-hooks/EntryPointContainer.react.js.flow +9 -16
  124. package/relay-hooks/EntryPointTypes.flow.js.flow +25 -26
  125. package/relay-hooks/FragmentResource.js.flow +359 -93
  126. package/relay-hooks/InternalLogger.js.flow +1 -1
  127. package/relay-hooks/LRUCache.js.flow +1 -1
  128. package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +33 -47
  129. package/relay-hooks/MatchContainer.js.flow +4 -3
  130. package/relay-hooks/ProfilerContext.js.flow +1 -1
  131. package/relay-hooks/QueryResource.js.flow +217 -26
  132. package/relay-hooks/RelayEnvironmentProvider.js.flow +15 -5
  133. package/relay-hooks/SuspenseResource.js.flow +115 -0
  134. package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +5 -4
  135. package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +2 -2
  136. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +59 -0
  137. package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +61 -0
  138. package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +11 -10
  139. package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +55 -32
  140. package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +11 -10
  141. package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +11 -10
  142. package/relay-hooks/__flowtests__/utils.js.flow +21 -32
  143. package/relay-hooks/loadEntryPoint.js.flow +7 -13
  144. package/relay-hooks/loadQuery.js.flow +50 -32
  145. package/relay-hooks/preloadQuery_DEPRECATED.js.flow +31 -22
  146. package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +7 -13
  147. package/relay-hooks/useBlockingPaginationFragment.js.flow +14 -12
  148. package/relay-hooks/useEntryPointLoader.js.flow +8 -11
  149. package/relay-hooks/useFetchTrackingRef.js.flow +3 -3
  150. package/relay-hooks/useFragment.js.flow +31 -62
  151. package/relay-hooks/useFragmentNode.js.flow +6 -8
  152. package/relay-hooks/useIsMountedRef.js.flow +1 -1
  153. package/relay-hooks/useIsOperationNodeActive.js.flow +4 -6
  154. package/relay-hooks/useIsParentQueryActive.js.flow +4 -5
  155. package/relay-hooks/useLazyLoadQuery.js.flow +14 -16
  156. package/relay-hooks/useLazyLoadQueryNode.js.flow +20 -14
  157. package/relay-hooks/useLoadMoreFunction.js.flow +21 -30
  158. package/relay-hooks/useMemoOperationDescriptor.js.flow +6 -8
  159. package/relay-hooks/useMemoVariables.js.flow +7 -7
  160. package/relay-hooks/useMutation.js.flow +27 -27
  161. package/relay-hooks/usePaginationFragment.js.flow +39 -45
  162. package/relay-hooks/usePreloadedQuery.js.flow +14 -20
  163. package/relay-hooks/useQueryLoader.js.flow +42 -23
  164. package/relay-hooks/useRefetchableFragment.js.flow +8 -9
  165. package/relay-hooks/useRefetchableFragmentNode.js.flow +25 -33
  166. package/relay-hooks/useRelayEnvironment.js.flow +3 -5
  167. package/relay-hooks/useStaticFragmentNodeWarning.js.flow +3 -4
  168. package/relay-hooks/useSubscribeToInvalidationState.js.flow +4 -7
  169. package/relay-hooks/useSubscription.js.flow +21 -11
  170. package/lib/relay-hooks/getPaginationMetadata.js +0 -41
  171. package/lib/relay-hooks/getPaginationVariables.js +0 -67
  172. package/lib/relay-hooks/getRefetchMetadata.js +0 -36
  173. package/lib/relay-hooks/getValueAtPath.js +0 -51
  174. package/relay-hooks/getPaginationMetadata.js.flow +0 -74
  175. package/relay-hooks/getPaginationVariables.js.flow +0 -110
  176. package/relay-hooks/getRefetchMetadata.js.flow +0 -80
  177. package/relay-hooks/getValueAtPath.js.flow +0 -46
@@ -0,0 +1,56 @@
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
+ * @format
9
+ */
10
+
11
+ // This file is sync'd from https://github.com/facebook/react/tree/main/packages/jest-react
12
+
13
+ 'use strict';
14
+
15
+ let didWarnAboutMessageChannel = false;
16
+ let enqueueTaskImpl = null;
17
+
18
+ function enqueueTask(task: () => void) {
19
+ if (enqueueTaskImpl === null) {
20
+ try {
21
+ // read require off the module object to get around the bundlers.
22
+ // we don't want them to detect a require and bundle a Node polyfill.
23
+ const requireString = ('require' + Math.random()).slice(0, 7);
24
+ const nodeRequire = module && module[requireString];
25
+ // assuming we're in node, let's try to get node's
26
+ // version of setImmediate, bypassing fake timers if any.
27
+ enqueueTaskImpl = nodeRequire.call(module, 'timers').setImmediate;
28
+ } catch {
29
+ // we're in a browser
30
+ // we can't use regular timers because they may still be faked
31
+ // so we try MessageChannel+postMessage instead
32
+ enqueueTaskImpl = function (callback: () => void) {
33
+ if (__DEV__) {
34
+ if (didWarnAboutMessageChannel === false) {
35
+ didWarnAboutMessageChannel = true;
36
+ if (typeof MessageChannel === 'undefined') {
37
+ console.error(
38
+ 'This browser does not have a MessageChannel implementation, ' +
39
+ 'so enqueuing tasks via await act(async () => ...) will fail. ' +
40
+ 'Please file an issue at https://github.com/facebook/react/issues ' +
41
+ 'if you encounter this warning.',
42
+ );
43
+ }
44
+ }
45
+ }
46
+ /*global MessageChannel*/
47
+ const channel = new MessageChannel();
48
+ channel.port1.onmessage = callback;
49
+ channel.port2.postMessage(undefined);
50
+ };
51
+ }
52
+ }
53
+ return enqueueTaskImpl(task);
54
+ }
55
+
56
+ module.exports = enqueueTask;
@@ -0,0 +1,12 @@
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
+ * @format
9
+ */
10
+
11
+ // This file is sync'd from https://github.com/facebook/react/tree/main/packages/jest-react
12
+ export {act} from './internalAct';
@@ -0,0 +1,138 @@
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
+ * @format
9
+ */
10
+
11
+ /* global jest */
12
+
13
+ // This file is sync'd from https://github.com/facebook/react/tree/main/packages/jest-react
14
+
15
+ // This version of `act` is only used by our tests. Unlike the public version
16
+ // of `act`, it's designed to work identically in both production and
17
+ // development. It may have slightly different behavior from the public
18
+ // version, too, since our constraints in our test suite are not the same as
19
+ // those of developers using React — we're testing React itself, as opposed to
20
+ // building an app with React.
21
+
22
+ 'use strict';
23
+
24
+ const enqueueTask = require('./enqueueTask');
25
+ const Scheduler = require('scheduler/unstable_mock');
26
+
27
+ // The subset of a Promise that React APIs rely on. This resolves a value.
28
+ // This doesn't require a return value neither from the handler nor the
29
+ // then function.
30
+ interface Thenable<+R> {
31
+ then<U>(
32
+ onFulfill: (value: R) => void | Thenable<U> | U,
33
+ onReject: (error: mixed) => void | Thenable<U> | U,
34
+ ): void | Thenable<U>;
35
+ }
36
+
37
+ let actingUpdatesScopeDepth = 0;
38
+
39
+ function act(scope: () => Thenable<mixed> | void) {
40
+ if (Scheduler.unstable_flushAllWithoutAsserting === undefined) {
41
+ throw Error(
42
+ 'This version of `act` requires a special mock build of Scheduler.',
43
+ );
44
+ }
45
+ if (setTimeout._isMockFunction !== true) {
46
+ throw Error(
47
+ "This version of `act` requires Jest's timer mocks " +
48
+ '(i.e. jest.useFakeTimers).',
49
+ );
50
+ }
51
+
52
+ const previousActingUpdatesScopeDepth = actingUpdatesScopeDepth;
53
+ actingUpdatesScopeDepth++;
54
+
55
+ const unwind = () => {
56
+ actingUpdatesScopeDepth--;
57
+
58
+ if (__DEV__) {
59
+ if (actingUpdatesScopeDepth > previousActingUpdatesScopeDepth) {
60
+ // if it's _less than_ previousActingUpdatesScopeDepth, then we can
61
+ // assume the 'other' one has warned
62
+ console.error(
63
+ 'You seem to have overlapping act() calls, this is not supported. ' +
64
+ 'Be sure to await previous act() calls before making a new one. ',
65
+ );
66
+ }
67
+ }
68
+ };
69
+
70
+ // TODO: This would be way simpler if 1) we required a promise to be
71
+ // returned and 2) we could use async/await. Since it's only our used in
72
+ // our test suite, we should be able to.
73
+ try {
74
+ const thenable = scope();
75
+ if (
76
+ typeof thenable === 'object' &&
77
+ thenable !== null &&
78
+ typeof thenable.then === 'function'
79
+ ) {
80
+ return {
81
+ then(resolve: () => void, reject: (error: mixed) => void) {
82
+ thenable.then(
83
+ () => {
84
+ flushActWork(
85
+ () => {
86
+ unwind();
87
+ resolve();
88
+ },
89
+ error => {
90
+ unwind();
91
+ reject(error);
92
+ },
93
+ );
94
+ },
95
+ error => {
96
+ unwind();
97
+ reject(error);
98
+ },
99
+ );
100
+ },
101
+ };
102
+ } else {
103
+ try {
104
+ // TODO: Let's not support non-async scopes at all in our tests. Need to
105
+ // migrate existing tests.
106
+ let didFlushWork;
107
+ do {
108
+ didFlushWork = Scheduler.unstable_flushAllWithoutAsserting();
109
+ } while (didFlushWork);
110
+ } finally {
111
+ unwind();
112
+ }
113
+ }
114
+ } catch (error) {
115
+ unwind();
116
+ throw error;
117
+ }
118
+ }
119
+
120
+ function flushActWork(resolve, reject) {
121
+ // Flush suspended fallbacks
122
+ // $FlowFixMe: Flow doesn't know about global Jest object
123
+ jest.runOnlyPendingTimers();
124
+ enqueueTask(() => {
125
+ try {
126
+ const didFlushWork = Scheduler.unstable_flushAllWithoutAsserting();
127
+ if (didFlushWork) {
128
+ flushActWork(resolve, reject);
129
+ } else {
130
+ resolve();
131
+ }
132
+ } catch (error) {
133
+ reject(error);
134
+ }
135
+ });
136
+ }
137
+
138
+ exports.act = act;
package/legacy.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v11.0.2
2
+ * Relay v13.0.0-rc.2
3
3
  *
4
4
  * Copyright (c) Facebook, Inc. and its affiliates.
5
5
  *
package/legacy.js.flow CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -22,20 +22,18 @@ var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inh
22
22
 
23
23
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
24
24
 
25
- var React = require('react');
26
-
27
- var areEqual = require("fbjs/lib/areEqual");
28
-
29
25
  var buildReactRelayContainer = require('./buildReactRelayContainer');
30
26
 
31
- var getRootVariablesForFragments = require('./getRootVariablesForFragments');
32
-
33
27
  var _require = require('./ReactRelayContainerUtils'),
34
28
  getContainerName = _require.getContainerName;
35
29
 
36
30
  var _require2 = require('./RelayContext'),
37
31
  assertRelayContext = _require2.assertRelayContext;
38
32
 
33
+ var areEqual = require("fbjs/lib/areEqual");
34
+
35
+ var React = require('react');
36
+
39
37
  var _require3 = require('relay-runtime'),
40
38
  createFragmentSpecResolver = _require3.createFragmentSpecResolver,
41
39
  getDataIDsFromObject = _require3.getDataIDsFromObject,
@@ -142,19 +140,17 @@ function createContainerWithFragments(Component, fragments) {
142
140
  var _proto = _class.prototype;
143
141
 
144
142
  _proto.componentDidMount = function componentDidMount() {
145
- this._subscribeToNewResolver();
146
-
147
- this._rerenderIfStoreHasChanged();
143
+ this._subscribeToNewResolverAndRerenderIfStoreHasChanged();
148
144
  };
149
145
 
150
146
  _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {
151
147
  if (this.state.resolver !== prevState.resolver) {
152
148
  prevState.resolver.dispose();
153
149
 
154
- this._subscribeToNewResolver();
150
+ this._subscribeToNewResolverAndRerenderIfStoreHasChanged();
151
+ } else {
152
+ this._rerenderIfStoreHasChanged();
155
153
  }
156
-
157
- this._rerenderIfStoreHasChanged();
158
154
  };
159
155
 
160
156
  _proto.componentWillUnmount = function componentWillUnmount() {
@@ -207,11 +203,21 @@ function createContainerWithFragments(Component, fragments) {
207
203
  }
208
204
  };
209
205
 
210
- _proto._subscribeToNewResolver = function _subscribeToNewResolver() {
211
- var resolver = this.state.resolver; // Event listeners are only safe to add during the commit phase,
206
+ _proto._subscribeToNewResolverAndRerenderIfStoreHasChanged = function _subscribeToNewResolverAndRerenderIfStoreHasChanged() {
207
+ var _this$state2 = this.state,
208
+ data = _this$state2.data,
209
+ resolver = _this$state2.resolver;
210
+ var maybeNewData = resolver.resolve(); // Event listeners are only safe to add during the commit phase,
212
211
  // So they won't leak if render is interrupted or errors.
213
212
 
214
- resolver.setCallback(this._handleFragmentDataUpdate);
213
+ resolver.setCallback(this.props, this._handleFragmentDataUpdate); // External values could change between render and commit.
214
+ // Check for this case, even though it requires an extra store read.
215
+
216
+ if (data !== maybeNewData) {
217
+ this.setState({
218
+ data: maybeNewData
219
+ });
220
+ }
215
221
  };
216
222
 
217
223
  _proto.render = function render() {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -10,10 +10,10 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var React = require('react');
14
-
15
13
  var ReactRelayContext = require('./ReactRelayContext');
16
14
 
15
+ var React = require('react');
16
+
17
17
  function ReactRelayFragmentMockRenderer(props) {
18
18
  return /*#__PURE__*/React.createElement(ReactRelayContext.Provider, {
19
19
  value: {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -10,24 +10,23 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var React = require('react');
14
-
15
13
  var ReactRelayContext = require('./ReactRelayContext');
16
14
 
17
15
  var ReactRelayQueryRendererContext = require('./ReactRelayQueryRendererContext');
18
16
 
19
- var useLayoutEffect = React.useLayoutEffect,
20
- useState = React.useState,
21
- useRef = React.useRef,
22
- useMemo = React.useMemo;
17
+ var areEqual = require("fbjs/lib/areEqual");
18
+
19
+ var React = require('react');
23
20
 
24
21
  var _require = require('relay-runtime'),
25
22
  createOperationDescriptor = _require.createOperationDescriptor,
26
23
  deepFreeze = _require.deepFreeze,
27
24
  getRequest = _require.getRequest;
28
25
 
29
- var areEqual = require("fbjs/lib/areEqual");
30
-
26
+ var useLayoutEffect = React.useLayoutEffect,
27
+ useState = React.useState,
28
+ useRef = React.useRef,
29
+ useMemo = React.useMemo;
31
30
  var queryRendererContext = {
32
31
  rootIsQueryRenderer: true
33
32
  };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -24,40 +24,40 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
24
24
 
25
25
  var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
26
26
 
27
- var React = require('react');
28
-
29
- var ReactRelayContext = require('./ReactRelayContext');
30
-
31
- var ReactRelayQueryFetcher = require('./ReactRelayQueryFetcher');
32
-
33
- var areEqual = require("fbjs/lib/areEqual");
34
-
35
27
  var buildReactRelayContainer = require('./buildReactRelayContainer');
36
28
 
37
29
  var getRootVariablesForFragments = require('./getRootVariablesForFragments');
38
30
 
39
- var invariant = require('invariant');
40
-
41
- var warning = require("fbjs/lib/warning");
42
-
43
31
  var _require = require('./ReactRelayContainerUtils'),
44
32
  getComponentName = _require.getComponentName,
45
33
  getContainerName = _require.getContainerName;
46
34
 
35
+ var ReactRelayContext = require('./ReactRelayContext');
36
+
37
+ var ReactRelayQueryFetcher = require('./ReactRelayQueryFetcher');
38
+
47
39
  var _require2 = require('./RelayContext'),
48
40
  assertRelayContext = _require2.assertRelayContext;
49
41
 
42
+ var areEqual = require("fbjs/lib/areEqual");
43
+
44
+ var invariant = require('invariant');
45
+
46
+ var React = require('react');
47
+
50
48
  var _require3 = require('relay-runtime'),
51
49
  ConnectionInterface = _require3.ConnectionInterface,
52
50
  Observable = _require3.Observable,
51
+ RelayFeatureFlags = _require3.RelayFeatureFlags,
53
52
  createFragmentSpecResolver = _require3.createFragmentSpecResolver,
54
53
  createOperationDescriptor = _require3.createOperationDescriptor,
55
54
  getDataIDsFromObject = _require3.getDataIDsFromObject,
56
55
  getRequest = _require3.getRequest,
57
- getSelector = _require3.getSelector,
58
56
  getVariablesFromObject = _require3.getVariablesFromObject,
59
57
  isScalarAndEqual = _require3.isScalarAndEqual;
60
58
 
59
+ var warning = require("fbjs/lib/warning");
60
+
61
61
  var FORWARD = 'forward';
62
62
 
63
63
  /**
@@ -211,8 +211,7 @@ function createGetConnectionFromProps(metadata) {
211
211
 
212
212
  function createGetFragmentVariables(metadata) {
213
213
  var countVariable = metadata.count;
214
- !countVariable ? process.env.NODE_ENV !== "production" ? invariant(false, 'ReactRelayPaginationContainer: Unable to synthesize a ' + 'getFragmentVariables function.') : invariant(false) : void 0; // $FlowFixMe[cannot-spread-interface]
215
-
214
+ !countVariable ? process.env.NODE_ENV !== "production" ? invariant(false, 'ReactRelayPaginationContainer: Unable to synthesize a ' + 'getFragmentVariables function.') : invariant(false) : void 0;
216
215
  return function (prevVars, totalCount) {
217
216
  return (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, prevVars), {}, (0, _defineProperty2["default"])({}, countVariable, totalCount));
218
217
  };
@@ -354,12 +353,19 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
354
353
  _this._isARequestInFlight = false;
355
354
  _this._refetchSubscription = null;
356
355
  _this._refetchVariables = null;
357
- _this._resolver = createFragmentSpecResolver(relayContext, containerName, fragments, props, rootIsQueryRenderer, _this._handleFragmentDataUpdate);
356
+
357
+ if (RelayFeatureFlags.ENABLE_CONTAINERS_SUBSCRIBE_ON_COMMIT === true) {
358
+ _this._resolver = createFragmentSpecResolver(relayContext, containerName, fragments, props, rootIsQueryRenderer);
359
+ } else {
360
+ _this._resolver = createFragmentSpecResolver(relayContext, containerName, fragments, props, rootIsQueryRenderer, _this._handleFragmentDataUpdate);
361
+ }
362
+
358
363
  _this.state = {
359
364
  data: _this._resolver.resolve(),
360
365
  prevContext: relayContext,
361
366
  contextForChildren: relayContext,
362
- relayProp: _this._buildRelayProp(relayContext)
367
+ relayProp: _this._buildRelayProp(relayContext),
368
+ resolverGeneration: 0
363
369
  };
364
370
  _this._isUnmounted = false;
365
371
  _this._hasFetched = false;
@@ -370,6 +376,20 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
370
376
 
371
377
  _proto.componentDidMount = function componentDidMount() {
372
378
  this._isUnmounted = false;
379
+
380
+ if (RelayFeatureFlags.ENABLE_CONTAINERS_SUBSCRIBE_ON_COMMIT === true) {
381
+ this._subscribeToNewResolverAndRerenderIfStoreHasChanged();
382
+ }
383
+ };
384
+
385
+ _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {
386
+ if (RelayFeatureFlags.ENABLE_CONTAINERS_SUBSCRIBE_ON_COMMIT === true) {
387
+ if (prevState.resolverGeneration !== this.state.resolverGeneration) {
388
+ this._subscribeToNewResolverAndRerenderIfStoreHasChanged();
389
+ } else {
390
+ this._rerenderIfStoreHasChanged();
391
+ }
392
+ }
373
393
  }
374
394
  /**
375
395
  * When new props are received, read data for the new props and subscribe
@@ -379,6 +399,8 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
379
399
  ;
380
400
 
381
401
  _proto.UNSAFE_componentWillReceiveProps = function UNSAFE_componentWillReceiveProps(nextProps) {
402
+ var _this2 = this;
403
+
382
404
  var _nextProps$__rootIsQu;
383
405
 
384
406
  var relayContext = assertRelayContext(nextProps.__relayContext);
@@ -396,11 +418,19 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
396
418
  this._cleanup(); // Child containers rely on context.relay being mutated (for gDSFP).
397
419
 
398
420
 
399
- this._resolver = createFragmentSpecResolver(relayContext, containerName, fragments, nextProps, rootIsQueryRenderer, this._handleFragmentDataUpdate);
400
- this.setState({
401
- prevContext: relayContext,
402
- contextForChildren: relayContext,
403
- relayProp: this._buildRelayProp(relayContext)
421
+ if (RelayFeatureFlags.ENABLE_CONTAINERS_SUBSCRIBE_ON_COMMIT === true) {
422
+ this._resolver = createFragmentSpecResolver(relayContext, containerName, fragments, nextProps, rootIsQueryRenderer);
423
+ } else {
424
+ this._resolver = createFragmentSpecResolver(relayContext, containerName, fragments, nextProps, rootIsQueryRenderer, this._handleFragmentDataUpdate);
425
+ }
426
+
427
+ this.setState(function (prevState) {
428
+ return {
429
+ prevContext: relayContext,
430
+ contextForChildren: relayContext,
431
+ relayProp: _this2._buildRelayProp(relayContext),
432
+ resolverGeneration: prevState.resolverGeneration + 1
433
+ };
404
434
  });
405
435
  } else if (!this._hasFetched) {
406
436
  this._resolver.setProps(nextProps);
@@ -423,7 +453,7 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
423
453
 
424
454
  _proto.shouldComponentUpdate = function shouldComponentUpdate(nextProps, nextState) {
425
455
  // Short-circuit if any Relay-related data has changed
426
- if (nextState.data !== this.state.data || nextState.relayProp !== this.state.relayProp) {
456
+ if (nextState.data !== this.state.data || nextState.relayProp !== this.state.relayProp || nextState.resolverGeneration !== this.state.resolverGeneration) {
427
457
  return true;
428
458
  } // Otherwise, for convenience short-circuit if all non-Relay props
429
459
  // are scalar and equal
@@ -456,6 +486,37 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
456
486
  refetchConnection: this._refetchConnection,
457
487
  environment: relayContext.environment
458
488
  };
489
+ };
490
+
491
+ _proto._rerenderIfStoreHasChanged = function _rerenderIfStoreHasChanged() {
492
+ var data = this.state.data; // External values could change between render and commit.
493
+ // Check for this case, even though it requires an extra store read.
494
+
495
+ var maybeNewData = this._resolver.resolve();
496
+
497
+ if (data !== maybeNewData) {
498
+ this.setState({
499
+ data: maybeNewData
500
+ });
501
+ }
502
+ };
503
+
504
+ _proto._subscribeToNewResolverAndRerenderIfStoreHasChanged = function _subscribeToNewResolverAndRerenderIfStoreHasChanged() {
505
+ var data = this.state.data;
506
+
507
+ var maybeNewData = this._resolver.resolve(); // Event listeners are only safe to add during the commit phase,
508
+ // So they won't leak if render is interrupted or errors.
509
+
510
+
511
+ this._resolver.setCallback(this.props, this._handleFragmentDataUpdate); // External values could change between render and commit.
512
+ // Check for this case, even though it requires an extra store read.
513
+
514
+
515
+ if (data !== maybeNewData) {
516
+ this.setState({
517
+ data: maybeNewData
518
+ });
519
+ }
459
520
  }
460
521
  /**
461
522
  * Render new data for the existing props/context.
@@ -525,7 +586,7 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
525
586
  };
526
587
 
527
588
  _proto._fetchPage = function _fetchPage(paginatingVariables, observer, options) {
528
- var _this2 = this;
589
+ var _this3 = this;
529
590
 
530
591
  var _assertRelayContext = assertRelayContext(this.props.__relayContext),
531
592
  environment = _assertRelayContext.environment;
@@ -537,17 +598,14 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
537
598
  restProps = (0, _objectWithoutPropertiesLoose2["default"])(_this$props2, ["componentRef", "__relayContext", "__rootIsQueryRenderer"]);
538
599
  var props = (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, restProps), this.state.data);
539
600
  var fragmentVariables;
540
- var rootVariables = getRootVariablesForFragments(fragments, restProps); // $FlowFixMe[cannot-spread-interface]
541
-
542
- fragmentVariables = getVariablesFromObject(fragments, restProps); // $FlowFixMe[cannot-spread-interface]
543
-
601
+ var rootVariables = getRootVariablesForFragments(fragments, restProps);
602
+ fragmentVariables = getVariablesFromObject(fragments, restProps);
544
603
  fragmentVariables = (0, _objectSpread3["default"])((0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, rootVariables), fragmentVariables), this._refetchVariables);
545
604
  var fetchVariables = connectionConfig.getVariables(props, {
546
605
  count: paginatingVariables.count,
547
606
  cursor: paginatingVariables.cursor
548
607
  }, fragmentVariables);
549
- !(typeof fetchVariables === 'object' && fetchVariables !== null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'ReactRelayPaginationContainer: Expected `getVariables()` to ' + 'return an object, got `%s` in `%s`.', fetchVariables, componentName) : invariant(false) : void 0; // $FlowFixMe[cannot-spread-interface]
550
-
608
+ !(typeof fetchVariables === 'object' && fetchVariables !== null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'ReactRelayPaginationContainer: Expected `getVariables()` to ' + 'return an object, got `%s` in `%s`.', fetchVariables, componentName) : invariant(false) : void 0;
551
609
  fetchVariables = (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, fetchVariables), this._refetchVariables);
552
610
  fragmentVariables = (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, fetchVariables), fragmentVariables);
553
611
  var cacheConfig = options ? {
@@ -569,11 +627,11 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
569
627
  this._hasFetched = true;
570
628
 
571
629
  var onNext = function onNext(payload, complete) {
572
- var prevData = _this2._resolver.resolve();
630
+ var prevData = _this3._resolver.resolve();
573
631
 
574
- _this2._resolver.setVariables(getFragmentVariables(fragmentVariables, paginatingVariables.totalCount), operation.request.node);
632
+ _this3._resolver.setVariables(getFragmentVariables(fragmentVariables, paginatingVariables.totalCount), operation.request.node);
575
633
 
576
- var nextData = _this2._resolver.resolve(); // Workaround slightly different handling for connection in different
634
+ var nextData = _this3._resolver.resolve(); // Workaround slightly different handling for connection in different
577
635
  // core implementations:
578
636
  // - Classic core requires the count to be explicitly incremented
579
637
  // - Modern core automatically appends new items, updating the count
@@ -585,10 +643,10 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
585
643
 
586
644
 
587
645
  if (!areEqual(prevData, nextData)) {
588
- _this2.setState({
646
+ _this3.setState({
589
647
  data: nextData,
590
648
  contextForChildren: {
591
- environment: _this2.props.__relayContext.environment
649
+ environment: _this3.props.__relayContext.environment
592
650
  }
593
651
  }, complete);
594
652
  } else {
@@ -597,9 +655,9 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
597
655
  };
598
656
 
599
657
  var cleanup = function cleanup() {
600
- if (_this2._refetchSubscription === refetchSubscription) {
601
- _this2._refetchSubscription = null;
602
- _this2._isARequestInFlight = false;
658
+ if (_this3._refetchSubscription === refetchSubscription) {
659
+ _this3._refetchSubscription = null;
660
+ _this3._isARequestInFlight = false;
603
661
  }
604
662
  };
605
663
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -17,9 +17,9 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
17
17
  var invariant = require('invariant');
18
18
 
19
19
  var _require = require('relay-runtime'),
20
+ fetchQuery = _require.__internal.fetchQuery,
20
21
  createOperationDescriptor = _require.createOperationDescriptor,
21
- isRelayModernEnvironment = _require.isRelayModernEnvironment,
22
- fetchQuery = _require.__internal.fetchQuery;
22
+ isRelayModernEnvironment = _require.isRelayModernEnvironment;
23
23
 
24
24
  var ReactRelayQueryFetcher = /*#__PURE__*/function () {
25
25
  function ReactRelayQueryFetcher(args) {