relay-runtime 11.0.0-rc.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/handlers/connection/ConnectionHandler.js.flow +7 -0
  2. package/handlers/connection/MutationHandlers.js.flow +28 -0
  3. package/index.js +1 -1
  4. package/index.js.flow +20 -3
  5. package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
  6. package/lib/handlers/connection/ConnectionHandler.js +12 -6
  7. package/lib/handlers/connection/MutationHandlers.js +67 -8
  8. package/lib/index.js +15 -0
  9. package/lib/multi-actor-environment/ActorIdentifier.js +33 -0
  10. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +148 -0
  11. package/lib/multi-actor-environment/ActorUtils.js +27 -0
  12. package/lib/multi-actor-environment/MultiActorEnvironment.js +406 -0
  13. package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +11 -0
  14. package/lib/multi-actor-environment/index.js +21 -0
  15. package/lib/mutations/RelayRecordProxy.js +1 -1
  16. package/lib/mutations/RelayRecordSourceMutator.js +1 -1
  17. package/lib/mutations/RelayRecordSourceProxy.js +1 -1
  18. package/lib/mutations/RelayRecordSourceSelectorProxy.js +7 -2
  19. package/lib/mutations/applyOptimisticMutation.js +1 -1
  20. package/lib/mutations/commitMutation.js +5 -2
  21. package/lib/mutations/validateMutation.js +39 -17
  22. package/lib/network/RelayNetwork.js +1 -1
  23. package/lib/network/RelayObservable.js +3 -1
  24. package/lib/network/RelayQueryResponseCache.js +20 -3
  25. package/lib/network/wrapNetworkWithLogObserver.js +78 -0
  26. package/lib/query/GraphQLTag.js +1 -1
  27. package/lib/query/fetchQuery.js +1 -1
  28. package/lib/query/fetchQueryInternal.js +1 -1
  29. package/lib/store/DataChecker.js +132 -50
  30. package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +524 -187
  31. package/lib/store/RelayConcreteVariables.js +29 -4
  32. package/lib/store/RelayModernEnvironment.js +137 -220
  33. package/lib/store/RelayModernFragmentSpecResolver.js +49 -23
  34. package/lib/store/RelayModernRecord.js +36 -2
  35. package/lib/store/RelayModernSelector.js +1 -1
  36. package/lib/store/RelayModernStore.js +53 -22
  37. package/lib/store/RelayOperationTracker.js +34 -24
  38. package/lib/store/RelayPublishQueue.js +30 -8
  39. package/lib/store/RelayReader.js +177 -29
  40. package/lib/store/RelayRecordSource.js +87 -3
  41. package/lib/store/RelayReferenceMarker.js +53 -28
  42. package/lib/store/RelayResponseNormalizer.js +247 -108
  43. package/lib/store/RelayStoreReactFlightUtils.js +7 -11
  44. package/lib/store/RelayStoreSubscriptions.js +8 -5
  45. package/lib/store/RelayStoreUtils.js +10 -4
  46. package/lib/store/ResolverCache.js +213 -0
  47. package/lib/store/ResolverFragments.js +57 -0
  48. package/lib/store/cloneRelayHandleSourceField.js +1 -1
  49. package/lib/store/cloneRelayScalarHandleSourceField.js +1 -1
  50. package/lib/store/createRelayContext.js +2 -2
  51. package/lib/store/defaultGetDataID.js +3 -1
  52. package/lib/store/readInlineData.js +1 -1
  53. package/lib/subscription/requestSubscription.js +32 -6
  54. package/lib/util/RelayConcreteNode.js +3 -0
  55. package/lib/util/RelayFeatureFlags.js +5 -4
  56. package/lib/util/RelayProfiler.js +17 -187
  57. package/lib/util/RelayReplaySubject.js +22 -7
  58. package/lib/util/deepFreeze.js +1 -0
  59. package/lib/util/getPaginationMetadata.js +41 -0
  60. package/lib/util/getPaginationVariables.js +67 -0
  61. package/lib/util/getPendingOperationsForFragment.js +55 -0
  62. package/lib/util/getRefetchMetadata.js +36 -0
  63. package/lib/util/getRelayHandleKey.js +1 -1
  64. package/lib/util/getRequestIdentifier.js +1 -1
  65. package/lib/util/getValueAtPath.js +51 -0
  66. package/lib/util/isEmptyObject.js +1 -1
  67. package/lib/util/registerEnvironmentWithDevTools.js +26 -0
  68. package/lib/util/withDuration.js +31 -0
  69. package/multi-actor-environment/ActorIdentifier.js.flow +43 -0
  70. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +217 -0
  71. package/multi-actor-environment/ActorUtils.js.flow +33 -0
  72. package/multi-actor-environment/MultiActorEnvironment.js.flow +485 -0
  73. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +245 -0
  74. package/multi-actor-environment/index.js.flow +27 -0
  75. package/mutations/RelayRecordSourceSelectorProxy.js.flow +7 -2
  76. package/mutations/commitMutation.js.flow +3 -1
  77. package/mutations/validateMutation.js.flow +42 -16
  78. package/network/RelayNetworkTypes.js.flow +17 -8
  79. package/network/RelayObservable.js.flow +2 -0
  80. package/network/RelayQueryResponseCache.js.flow +31 -17
  81. package/network/wrapNetworkWithLogObserver.js.flow +99 -0
  82. package/package.json +3 -2
  83. package/relay-runtime.js +2 -2
  84. package/relay-runtime.min.js +2 -2
  85. package/store/ClientID.js.flow +5 -1
  86. package/store/DataChecker.js.flow +148 -44
  87. package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +578 -237
  88. package/store/RelayConcreteVariables.js.flow +31 -1
  89. package/store/RelayModernEnvironment.js.flow +132 -220
  90. package/store/RelayModernFragmentSpecResolver.js.flow +40 -14
  91. package/store/RelayModernOperationDescriptor.js.flow +9 -3
  92. package/store/RelayModernRecord.js.flow +49 -0
  93. package/store/RelayModernStore.js.flow +57 -17
  94. package/store/RelayOperationTracker.js.flow +56 -34
  95. package/store/RelayPublishQueue.js.flow +37 -11
  96. package/store/RelayReader.js.flow +186 -27
  97. package/store/RelayRecordSource.js.flow +72 -6
  98. package/store/RelayReferenceMarker.js.flow +51 -21
  99. package/store/RelayResponseNormalizer.js.flow +251 -67
  100. package/store/RelayStoreReactFlightUtils.js.flow +6 -9
  101. package/store/RelayStoreSubscriptions.js.flow +10 -3
  102. package/store/RelayStoreTypes.js.flow +144 -21
  103. package/store/RelayStoreUtils.js.flow +19 -4
  104. package/store/ResolverCache.js.flow +247 -0
  105. package/store/ResolverFragments.js.flow +128 -0
  106. package/store/createRelayContext.js.flow +1 -1
  107. package/store/defaultGetDataID.js.flow +3 -1
  108. package/subscription/requestSubscription.js.flow +43 -8
  109. package/util/NormalizationNode.js.flow +16 -3
  110. package/util/ReaderNode.js.flow +29 -2
  111. package/util/RelayConcreteNode.js.flow +3 -0
  112. package/util/RelayFeatureFlags.js.flow +10 -6
  113. package/util/RelayProfiler.js.flow +22 -194
  114. package/util/RelayReplaySubject.js.flow +7 -6
  115. package/util/RelayRuntimeTypes.js.flow +4 -2
  116. package/util/deepFreeze.js.flow +2 -1
  117. package/util/getPaginationMetadata.js.flow +74 -0
  118. package/util/getPaginationVariables.js.flow +112 -0
  119. package/util/getPendingOperationsForFragment.js.flow +62 -0
  120. package/util/getRefetchMetadata.js.flow +80 -0
  121. package/util/getValueAtPath.js.flow +46 -0
  122. package/util/isEmptyObject.js.flow +2 -1
  123. package/util/registerEnvironmentWithDevTools.js.flow +33 -0
  124. package/util/withDuration.js.flow +32 -0
  125. package/lib/store/RelayRecordSourceMapImpl.js +0 -107
  126. package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +0 -318
  127. package/store/RelayRecordSourceMapImpl.js.flow +0 -91
  128. package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +0 -283
@@ -146,10 +146,12 @@ function update(store: RecordSourceProxy, payload: HandleFieldPayload): void {
146
146
  let nextEdges = [];
147
147
  const args = payload.args;
148
148
  if (prevEdges && serverEdges) {
149
+ // $FlowFixMe[prop-missing]
149
150
  if (args.after != null) {
150
151
  // Forward pagination from the end of the connection: append edges
151
152
  if (
152
153
  clientPageInfo &&
154
+ // $FlowFixMe[prop-missing]
153
155
  args.after === clientPageInfo.getValue(END_CURSOR)
154
156
  ) {
155
157
  const nodeIDs = new Set();
@@ -165,10 +167,12 @@ function update(store: RecordSourceProxy, payload: HandleFieldPayload): void {
165
167
  );
166
168
  return;
167
169
  }
170
+ // $FlowFixMe[prop-missing]
168
171
  } else if (args.before != null) {
169
172
  // Backward pagination from the start of the connection: prepend edges
170
173
  if (
171
174
  clientPageInfo &&
175
+ // $FlowFixMe[prop-missing]
172
176
  args.before === clientPageInfo.getValue(START_CURSOR)
173
177
  ) {
174
178
  const nodeIDs = new Set();
@@ -200,10 +204,12 @@ function update(store: RecordSourceProxy, payload: HandleFieldPayload): void {
200
204
  }
201
205
  // Page info should be updated even if no new edge were returned.
202
206
  if (clientPageInfo && serverPageInfo) {
207
+ // $FlowFixMe[prop-missing]
203
208
  if (args.after == null && args.before == null) {
204
209
  // The connection was refetched from the beginning/end: replace
205
210
  // page_info
206
211
  clientPageInfo.copyFieldsFrom(serverPageInfo);
212
+ // $FlowFixMe[prop-missing]
207
213
  } else if (args.before != null || (args.after == null && args.last)) {
208
214
  clientPageInfo.setValue(
209
215
  !!serverPageInfo.getValue(HAS_PREV_PAGE),
@@ -213,6 +219,7 @@ function update(store: RecordSourceProxy, payload: HandleFieldPayload): void {
213
219
  if (typeof startCursor === 'string') {
214
220
  clientPageInfo.setValue(startCursor, START_CURSOR);
215
221
  }
222
+ // $FlowFixMe[prop-missing]
216
223
  } else if (args.after != null || (args.before == null && args.first)) {
217
224
  clientPageInfo.setValue(
218
225
  !!serverPageInfo.getValue(HAS_NEXT_PAGE),
@@ -13,6 +13,7 @@
13
13
  'use strict';
14
14
 
15
15
  const ConnectionHandler = require('./ConnectionHandler');
16
+ const ConnectionInterface = require('./ConnectionInterface');
16
17
 
17
18
  const invariant = require('invariant');
18
19
  const warning = require('warning');
@@ -50,6 +51,7 @@ const DeleteEdgeHandler = {
50
51
  if (record == null) {
51
52
  return;
52
53
  }
54
+ // $FlowFixMe[prop-missing]
53
55
  const {connections} = payload.handleArgs;
54
56
  invariant(
55
57
  connections != null,
@@ -99,6 +101,7 @@ function edgeUpdater(
99
101
  if (record == null) {
100
102
  return;
101
103
  }
104
+ // $FlowFixMe[prop-missing]
102
105
  const {connections} = payload.handleArgs;
103
106
  invariant(
104
107
  connections != null,
@@ -120,11 +123,17 @@ function edgeUpdater(
120
123
  );
121
124
  return;
122
125
  }
126
+ const {NODE, EDGES} = ConnectionInterface.get();
123
127
  const serverEdgeList = serverEdges ?? [singleServerEdge];
124
128
  for (const serverEdge of serverEdgeList) {
125
129
  if (serverEdge == null) {
126
130
  continue;
127
131
  }
132
+ const serverNode = serverEdge.getLinkedRecord('node');
133
+ if (!serverNode) {
134
+ continue;
135
+ }
136
+ const serverNodeId = serverNode.getDataID();
128
137
  for (const connectionID of connections) {
129
138
  const connection = store.get(connectionID);
130
139
  if (connection == null) {
@@ -134,6 +143,14 @@ function edgeUpdater(
134
143
  );
135
144
  continue;
136
145
  }
146
+ const nodeAlreadyExistsInConnection = connection
147
+ .getLinkedRecords(EDGES)
148
+ ?.some(
149
+ edge => edge?.getLinkedRecord(NODE)?.getDataID() === serverNodeId,
150
+ );
151
+ if (nodeAlreadyExistsInConnection) {
152
+ continue;
153
+ }
137
154
  const clientEdge = ConnectionHandler.buildConnectionEdge(
138
155
  store,
139
156
  connection,
@@ -157,6 +174,7 @@ function nodeUpdater(
157
174
  if (record == null) {
158
175
  return;
159
176
  }
177
+ // $FlowFixMe[prop-missing]
160
178
  const {connections, edgeTypeName} = payload.handleArgs;
161
179
  invariant(
162
180
  connections != null,
@@ -180,11 +198,13 @@ function nodeUpdater(
180
198
  warning(false, 'MutationHandlers: Expected target node to exist.');
181
199
  return;
182
200
  }
201
+ const {NODE, EDGES} = ConnectionInterface.get();
183
202
  const serverNodeList = serverNodes ?? [singleServerNode];
184
203
  for (const serverNode of serverNodeList) {
185
204
  if (serverNode == null) {
186
205
  continue;
187
206
  }
207
+ const serverNodeId = serverNode.getDataID();
188
208
  for (const connectionID of connections) {
189
209
  const connection = store.get(connectionID);
190
210
  if (connection == null) {
@@ -194,6 +214,14 @@ function nodeUpdater(
194
214
  );
195
215
  continue;
196
216
  }
217
+ const nodeAlreadyExistsInConnection = connection
218
+ .getLinkedRecords(EDGES)
219
+ ?.some(
220
+ edge => edge?.getLinkedRecord(NODE)?.getDataID() === serverNodeId,
221
+ );
222
+ if (nodeAlreadyExistsInConnection) {
223
+ continue;
224
+ }
197
225
  const clientEdge = ConnectionHandler.createEdge(
198
226
  store,
199
227
  connection,
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v11.0.0-rc.0
2
+ * Relay v12.0.0
3
3
  *
4
4
  * Copyright (c) Facebook, Inc. and its affiliates.
5
5
  *
package/index.js.flow CHANGED
@@ -50,8 +50,13 @@ const fetchQuery = require('./query/fetchQuery');
50
50
  const fetchQueryInternal = require('./query/fetchQueryInternal');
51
51
  const fetchQuery_DEPRECATED = require('./query/fetchQuery_DEPRECATED');
52
52
  const getFragmentIdentifier = require('./util/getFragmentIdentifier');
53
+ const getPaginationMetadata = require('./util/getPaginationMetadata');
54
+ const getPaginationVariables = require('./util/getPaginationVariables');
55
+ const getPendingOperationsForFragment = require('./util/getPendingOperationsForFragment');
56
+ const getRefetchMetadata = require('./util/getRefetchMetadata');
53
57
  const getRelayHandleKey = require('./util/getRelayHandleKey');
54
58
  const getRequestIdentifier = require('./util/getRequestIdentifier');
59
+ const getValueAtPath = require('./util/getValueAtPath');
55
60
  const isPromise = require('./util/isPromise');
56
61
  const isRelayModernEnvironment = require('./store/isRelayModernEnvironment');
57
62
  const isScalarAndEqual = require('./util/isScalarAndEqual');
@@ -110,10 +115,11 @@ export type {
110
115
  Subscription,
111
116
  } from './network/RelayObservable';
112
117
  export type {GraphQLTaggedNode} from './query/GraphQLTag';
118
+ export type {TaskScheduler} from './store/OperationExecutor';
113
119
  export type {EnvironmentConfig} from './store/RelayModernEnvironment';
114
- export type {TaskScheduler} from './store/RelayModernQueryExecutor';
115
120
  export type {RecordState} from './store/RelayRecordState';
116
121
  export type {
122
+ ExecuteMutationConfig,
117
123
  FragmentMap,
118
124
  FragmentReference,
119
125
  FragmentSpecResolver,
@@ -136,9 +142,9 @@ export type {
136
142
  PluralReaderSelector,
137
143
  Props,
138
144
  PublishQueue,
145
+ ReactFlightClientResponse,
139
146
  ReactFlightPayloadDeserializer,
140
147
  ReactFlightServerErrorHandler,
141
- ReactFlightClientResponse,
142
148
  ReaderSelector,
143
149
  ReadOnlyRecordProxy,
144
150
  RecordProxy,
@@ -146,13 +152,18 @@ export type {
146
152
  RecordSourceSelectorProxy,
147
153
  RelayContext,
148
154
  RequestDescriptor,
155
+ RequiredFieldLogger,
149
156
  SelectorData,
150
157
  SelectorStoreUpdater,
151
158
  SingularReaderSelector,
152
159
  Snapshot,
153
160
  StoreUpdater,
154
161
  } from './store/RelayStoreTypes';
155
- export type {GraphQLSubscriptionConfig} from './subscription/requestSubscription';
162
+ export type {
163
+ DEPRECATED_GraphQLSubscriptionConfig,
164
+ GraphQLSubscriptionConfig,
165
+ SubscriptionParameters,
166
+ } from './subscription/requestSubscription';
156
167
  export type {JSResourceReference} from './util/JSResourceTypes.flow';
157
168
  export type {
158
169
  NormalizationArgument,
@@ -205,6 +216,7 @@ export type {
205
216
  VariablesOf,
206
217
  } from './util/RelayRuntimeTypes';
207
218
  export type {Local3DPayload} from './util/createPayloadFor3DField';
219
+ export type {Direction} from './util/getPaginationVariables';
208
220
  export type {RequestIdentifier} from './util/getRequestIdentifier';
209
221
 
210
222
  // As early as possible, check for the existence of the JavaScript globals which
@@ -327,6 +339,11 @@ module.exports = {
327
339
  recycleNodesInto: recycleNodesInto,
328
340
  stableCopy: stableCopy,
329
341
  getFragmentIdentifier: getFragmentIdentifier,
342
+ getRefetchMetadata: getRefetchMetadata,
343
+ getPaginationMetadata: getPaginationMetadata,
344
+ getPaginationVariables: getPaginationVariables,
345
+ getPendingOperationsForFragment: getPendingOperationsForFragment,
346
+ getValueAtPath: getValueAtPath,
330
347
  __internal: {
331
348
  OperationTracker: RelayOperationTracker,
332
349
  createRelayContext: createRelayContext,
@@ -14,7 +14,7 @@ var ConnectionHandler = require('./connection/ConnectionHandler');
14
14
 
15
15
  var MutationHandlers = require('./connection/MutationHandlers');
16
16
 
17
- var invariant = require("fbjs/lib/invariant");
17
+ var invariant = require('invariant');
18
18
 
19
19
  function RelayDefaultHandlerProvider(handle) {
20
20
  switch (handle) {
@@ -14,7 +14,7 @@ var ConnectionInterface = require('./ConnectionInterface');
14
14
 
15
15
  var getRelayHandleKey = require('../../util/getRelayHandleKey');
16
16
 
17
- var invariant = require("fbjs/lib/invariant");
17
+ var invariant = require('invariant');
18
18
 
19
19
  var warning = require("fbjs/lib/warning");
20
20
 
@@ -133,19 +133,23 @@ function update(store, payload) {
133
133
  var args = payload.args;
134
134
 
135
135
  if (prevEdges && _serverEdges) {
136
+ // $FlowFixMe[prop-missing]
136
137
  if (args.after != null) {
137
138
  // Forward pagination from the end of the connection: append edges
138
- if (clientPageInfo && args.after === clientPageInfo.getValue(END_CURSOR)) {
139
+ if (clientPageInfo && // $FlowFixMe[prop-missing]
140
+ args.after === clientPageInfo.getValue(END_CURSOR)) {
139
141
  var nodeIDs = new Set();
140
142
  mergeEdges(prevEdges, nextEdges, nodeIDs);
141
143
  mergeEdges(_serverEdges, nextEdges, nodeIDs);
142
144
  } else {
143
145
  process.env.NODE_ENV !== "production" ? warning(false, 'Relay: Unexpected after cursor `%s`, edges must ' + 'be fetched from the end of the list (`%s`).', args.after, clientPageInfo && clientPageInfo.getValue(END_CURSOR)) : void 0;
144
146
  return;
145
- }
147
+ } // $FlowFixMe[prop-missing]
148
+
146
149
  } else if (args.before != null) {
147
150
  // Backward pagination from the start of the connection: prepend edges
148
- if (clientPageInfo && args.before === clientPageInfo.getValue(START_CURSOR)) {
151
+ if (clientPageInfo && // $FlowFixMe[prop-missing]
152
+ args.before === clientPageInfo.getValue(START_CURSOR)) {
149
153
  var _nodeIDs = new Set();
150
154
 
151
155
  mergeEdges(_serverEdges, nextEdges, _nodeIDs);
@@ -172,17 +176,19 @@ function update(store, payload) {
172
176
 
173
177
 
174
178
  if (clientPageInfo && serverPageInfo) {
179
+ // $FlowFixMe[prop-missing]
175
180
  if (args.after == null && args.before == null) {
176
181
  // The connection was refetched from the beginning/end: replace
177
182
  // page_info
178
- clientPageInfo.copyFieldsFrom(serverPageInfo);
183
+ clientPageInfo.copyFieldsFrom(serverPageInfo); // $FlowFixMe[prop-missing]
179
184
  } else if (args.before != null || args.after == null && args.last) {
180
185
  clientPageInfo.setValue(!!serverPageInfo.getValue(HAS_PREV_PAGE), HAS_PREV_PAGE);
181
186
  var startCursor = serverPageInfo.getValue(START_CURSOR);
182
187
 
183
188
  if (typeof startCursor === 'string') {
184
189
  clientPageInfo.setValue(startCursor, START_CURSOR);
185
- }
190
+ } // $FlowFixMe[prop-missing]
191
+
186
192
  } else if (args.after != null || args.before == null && args.first) {
187
193
  clientPageInfo.setValue(!!serverPageInfo.getValue(HAS_NEXT_PAGE), HAS_NEXT_PAGE);
188
194
  var endCursor = serverPageInfo.getValue(END_CURSOR);
@@ -16,7 +16,9 @@ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime
16
16
 
17
17
  var ConnectionHandler = require('./ConnectionHandler');
18
18
 
19
- var invariant = require("fbjs/lib/invariant");
19
+ var ConnectionInterface = require('./ConnectionInterface');
20
+
21
+ var invariant = require('invariant');
20
22
 
21
23
  var warning = require("fbjs/lib/warning");
22
24
 
@@ -45,7 +47,8 @@ var DeleteEdgeHandler = {
45
47
 
46
48
  if (record == null) {
47
49
  return;
48
- }
50
+ } // $FlowFixMe[prop-missing]
51
+
49
52
 
50
53
  var connections = payload.handleArgs.connections;
51
54
  !(connections != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MutationHandlers: Expected connection IDs to be specified.') : invariant(false) : void 0;
@@ -98,7 +101,8 @@ function edgeUpdater(insertFn) {
98
101
 
99
102
  if (record == null) {
100
103
  return;
101
- }
104
+ } // $FlowFixMe[prop-missing]
105
+
102
106
 
103
107
  var connections = payload.handleArgs.connections;
104
108
  !(connections != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MutationHandlers: Expected connection IDs to be specified.') : invariant(false) : void 0;
@@ -119,19 +123,31 @@ function edgeUpdater(insertFn) {
119
123
  return;
120
124
  }
121
125
 
126
+ var _ConnectionInterface$ = ConnectionInterface.get(),
127
+ NODE = _ConnectionInterface$.NODE,
128
+ EDGES = _ConnectionInterface$.EDGES;
129
+
122
130
  var serverEdgeList = (_serverEdges = serverEdges) !== null && _serverEdges !== void 0 ? _serverEdges : [singleServerEdge];
123
131
 
124
132
  var _iterator2 = (0, _createForOfIteratorHelper2["default"])(serverEdgeList),
125
133
  _step2;
126
134
 
127
135
  try {
128
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
136
+ var _loop = function _loop() {
129
137
  var serverEdge = _step2.value;
130
138
 
131
139
  if (serverEdge == null) {
132
- continue;
140
+ return "continue";
133
141
  }
134
142
 
143
+ var serverNode = serverEdge.getLinkedRecord('node');
144
+
145
+ if (!serverNode) {
146
+ return "continue";
147
+ }
148
+
149
+ var serverNodeId = serverNode.getDataID();
150
+
135
151
  var _iterator3 = (0, _createForOfIteratorHelper2["default"])(connections),
136
152
  _step3;
137
153
 
@@ -145,6 +161,16 @@ function edgeUpdater(insertFn) {
145
161
  continue;
146
162
  }
147
163
 
164
+ var nodeAlreadyExistsInConnection = (_connection$getLinked = connection.getLinkedRecords(EDGES)) === null || _connection$getLinked === void 0 ? void 0 : _connection$getLinked.some(function (edge) {
165
+ var _edge$getLinkedRecord;
166
+
167
+ return (edge === null || edge === void 0 ? void 0 : (_edge$getLinkedRecord = edge.getLinkedRecord(NODE)) === null || _edge$getLinkedRecord === void 0 ? void 0 : _edge$getLinkedRecord.getDataID()) === serverNodeId;
168
+ });
169
+
170
+ if (nodeAlreadyExistsInConnection) {
171
+ continue;
172
+ }
173
+
148
174
  var clientEdge = ConnectionHandler.buildConnectionEdge(store, connection, serverEdge);
149
175
  !(clientEdge != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MutationHandlers: Failed to build the edge.') : invariant(false) : void 0;
150
176
  insertFn(connection, clientEdge);
@@ -154,6 +180,14 @@ function edgeUpdater(insertFn) {
154
180
  } finally {
155
181
  _iterator3.f();
156
182
  }
183
+ };
184
+
185
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
186
+ var _connection$getLinked;
187
+
188
+ var _ret = _loop();
189
+
190
+ if (_ret === "continue") continue;
157
191
  }
158
192
  } catch (err) {
159
193
  _iterator2.e(err);
@@ -171,7 +205,8 @@ function nodeUpdater(insertFn) {
171
205
 
172
206
  if (record == null) {
173
207
  return;
174
- }
208
+ } // $FlowFixMe[prop-missing]
209
+
175
210
 
176
211
  var _payload$handleArgs = payload.handleArgs,
177
212
  connections = _payload$handleArgs.connections,
@@ -196,19 +231,25 @@ function nodeUpdater(insertFn) {
196
231
  return;
197
232
  }
198
233
 
234
+ var _ConnectionInterface$2 = ConnectionInterface.get(),
235
+ NODE = _ConnectionInterface$2.NODE,
236
+ EDGES = _ConnectionInterface$2.EDGES;
237
+
199
238
  var serverNodeList = (_serverNodes = serverNodes) !== null && _serverNodes !== void 0 ? _serverNodes : [singleServerNode];
200
239
 
201
240
  var _iterator4 = (0, _createForOfIteratorHelper2["default"])(serverNodeList),
202
241
  _step4;
203
242
 
204
243
  try {
205
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
244
+ var _loop2 = function _loop2() {
206
245
  var serverNode = _step4.value;
207
246
 
208
247
  if (serverNode == null) {
209
- continue;
248
+ return "continue";
210
249
  }
211
250
 
251
+ var serverNodeId = serverNode.getDataID();
252
+
212
253
  var _iterator5 = (0, _createForOfIteratorHelper2["default"])(connections),
213
254
  _step5;
214
255
 
@@ -222,6 +263,16 @@ function nodeUpdater(insertFn) {
222
263
  continue;
223
264
  }
224
265
 
266
+ var nodeAlreadyExistsInConnection = (_connection$getLinked2 = connection.getLinkedRecords(EDGES)) === null || _connection$getLinked2 === void 0 ? void 0 : _connection$getLinked2.some(function (edge) {
267
+ var _edge$getLinkedRecord2;
268
+
269
+ return (edge === null || edge === void 0 ? void 0 : (_edge$getLinkedRecord2 = edge.getLinkedRecord(NODE)) === null || _edge$getLinkedRecord2 === void 0 ? void 0 : _edge$getLinkedRecord2.getDataID()) === serverNodeId;
270
+ });
271
+
272
+ if (nodeAlreadyExistsInConnection) {
273
+ continue;
274
+ }
275
+
225
276
  var clientEdge = ConnectionHandler.createEdge(store, connection, serverNode, edgeTypeName);
226
277
  !(clientEdge != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MutationHandlers: Failed to build the edge.') : invariant(false) : void 0;
227
278
  insertFn(connection, clientEdge);
@@ -231,6 +282,14 @@ function nodeUpdater(insertFn) {
231
282
  } finally {
232
283
  _iterator5.f();
233
284
  }
285
+ };
286
+
287
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
288
+ var _connection$getLinked2;
289
+
290
+ var _ret2 = _loop2();
291
+
292
+ if (_ret2 === "continue") continue;
234
293
  }
235
294
  } catch (err) {
236
295
  _iterator4.e(err);
package/lib/index.js CHANGED
@@ -84,10 +84,20 @@ var fetchQuery_DEPRECATED = require('./query/fetchQuery_DEPRECATED');
84
84
 
85
85
  var getFragmentIdentifier = require('./util/getFragmentIdentifier');
86
86
 
87
+ var getPaginationMetadata = require('./util/getPaginationMetadata');
88
+
89
+ var getPaginationVariables = require('./util/getPaginationVariables');
90
+
91
+ var getPendingOperationsForFragment = require('./util/getPendingOperationsForFragment');
92
+
93
+ var getRefetchMetadata = require('./util/getRefetchMetadata');
94
+
87
95
  var getRelayHandleKey = require('./util/getRelayHandleKey');
88
96
 
89
97
  var getRequestIdentifier = require('./util/getRequestIdentifier');
90
98
 
99
+ var getValueAtPath = require('./util/getValueAtPath');
100
+
91
101
  var isPromise = require('./util/isPromise');
92
102
 
93
103
  var isRelayModernEnvironment = require('./store/isRelayModernEnvironment');
@@ -214,6 +224,11 @@ module.exports = {
214
224
  recycleNodesInto: recycleNodesInto,
215
225
  stableCopy: stableCopy,
216
226
  getFragmentIdentifier: getFragmentIdentifier,
227
+ getRefetchMetadata: getRefetchMetadata,
228
+ getPaginationMetadata: getPaginationMetadata,
229
+ getPaginationVariables: getPaginationVariables,
230
+ getPendingOperationsForFragment: getPendingOperationsForFragment,
231
+ getValueAtPath: getValueAtPath,
217
232
  __internal: {
218
233
  OperationTracker: RelayOperationTracker,
219
234
  createRelayContext: createRelayContext,
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its 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
+ * A unique identifier of the current actor.
14
+ */
15
+
16
+ var invariant = require('invariant');
17
+
18
+ var INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE = 'INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE';
19
+
20
+ function assertInternalActorIndentifier(actorIdentifier) {
21
+ !(actorIdentifier === INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected to use only internal version of the `actorIdentifier`. "%s" was provided.', actorIdentifier) : invariant(false) : void 0;
22
+ }
23
+
24
+ module.exports = {
25
+ assertInternalActorIndentifier: assertInternalActorIndentifier,
26
+ getActorIdentifier: function getActorIdentifier(actorID) {
27
+ return actorID;
28
+ },
29
+ getDefaultActorIdentifier: function getDefaultActorIdentifier() {
30
+ throw new Error('Not Implemented');
31
+ },
32
+ INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE: INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE
33
+ };
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its 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 RelayOperationTracker = require('../store/RelayOperationTracker');
14
+
15
+ var RelayPublishQueue = require('../store/RelayPublishQueue');
16
+
17
+ var defaultGetDataID = require('../store/defaultGetDataID');
18
+
19
+ var registerEnvironmentWithDevTools = require('../util/registerEnvironmentWithDevTools');
20
+
21
+ var wrapNetworkWithLogObserver = require('../network/wrapNetworkWithLogObserver');
22
+
23
+ var ActorSpecificEnvironment = /*#__PURE__*/function () {
24
+ function ActorSpecificEnvironment(config) {
25
+ var _this = this;
26
+
27
+ this.configName = config.configName;
28
+ this.actorIdentifier = config.actorIdentifier;
29
+ this.multiActorEnvironment = config.multiActorEnvironment;
30
+ this.__log = config.logFn;
31
+ this.requiredFieldLogger = config.requiredFieldLogger;
32
+ this._operationTracker = new RelayOperationTracker();
33
+ this._store = config.store;
34
+ this._network = wrapNetworkWithLogObserver(this, config.network);
35
+ this._publishQueue = new RelayPublishQueue(config.store, config.handlerProvider, defaultGetDataID);
36
+ this._defaultRenderPolicy = config.defaultRenderPolicy; // TODO:T92305692 Remove `options` in favor of directly using `actorIdentifier` on the environment
37
+
38
+ this.options = {
39
+ actorID: this.actorIdentifier
40
+ }; // We need to add this here to pass `isRelayModernEnvironment` check
41
+ // $FlowFixMe[prop-missing]
42
+
43
+ this['@@RelayModernEnvironment'] = true;
44
+
45
+ if (process.env.NODE_ENV !== "production") {
46
+ var _require = require('../store/StoreInspector'),
47
+ inspect = _require.inspect;
48
+
49
+ this.DEBUG_inspect = function (dataID) {
50
+ return inspect(_this, dataID);
51
+ };
52
+ } // Register this Relay Environment with Relay DevTools if it exists.
53
+ // Note: this must always be the last step in the constructor.
54
+
55
+
56
+ registerEnvironmentWithDevTools(this);
57
+ }
58
+
59
+ var _proto = ActorSpecificEnvironment.prototype;
60
+
61
+ _proto.getPublishQueue = function getPublishQueue() {
62
+ return this._publishQueue;
63
+ };
64
+
65
+ _proto.UNSTABLE_getDefaultRenderPolicy = function UNSTABLE_getDefaultRenderPolicy() {
66
+ return this._defaultRenderPolicy;
67
+ };
68
+
69
+ _proto.applyMutation = function applyMutation(optimisticConfig) {
70
+ return this.multiActorEnvironment.applyMutation(this, optimisticConfig);
71
+ };
72
+
73
+ _proto.applyUpdate = function applyUpdate(optimisticUpdate) {
74
+ return this.multiActorEnvironment.applyUpdate(this, optimisticUpdate);
75
+ };
76
+
77
+ _proto.revertUpdate = function revertUpdate(optimisticUpdate) {
78
+ return this.multiActorEnvironment.revertUpdate(this, optimisticUpdate);
79
+ };
80
+
81
+ _proto.replaceUpdate = function replaceUpdate(optimisticUpdate, replacementUpdate) {
82
+ return this.multiActorEnvironment.replaceUpdate(this, optimisticUpdate, replacementUpdate);
83
+ };
84
+
85
+ _proto.check = function check(operation) {
86
+ return this.multiActorEnvironment.check(this, operation);
87
+ };
88
+
89
+ _proto.subscribe = function subscribe(snapshot, callback) {
90
+ return this.multiActorEnvironment.subscribe(this, snapshot, callback);
91
+ };
92
+
93
+ _proto.retain = function retain(operation) {
94
+ return this.multiActorEnvironment.retain(this, operation);
95
+ };
96
+
97
+ _proto.commitUpdate = function commitUpdate(updater) {
98
+ return this.multiActorEnvironment.commitUpdate(this, updater);
99
+ }
100
+ /**
101
+ * Commit a payload to the environment using the given operation selector.
102
+ */
103
+ ;
104
+
105
+ _proto.commitPayload = function commitPayload(operationDescriptor, payload) {
106
+ return this.multiActorEnvironment.commitPayload(this, operationDescriptor, payload);
107
+ };
108
+
109
+ _proto.getNetwork = function getNetwork() {
110
+ return this._network;
111
+ };
112
+
113
+ _proto.getStore = function getStore() {
114
+ return this._store;
115
+ };
116
+
117
+ _proto.getOperationTracker = function getOperationTracker() {
118
+ return this._operationTracker;
119
+ };
120
+
121
+ _proto.lookup = function lookup(selector) {
122
+ return this.multiActorEnvironment.lookup(this, selector);
123
+ };
124
+
125
+ _proto.execute = function execute(config) {
126
+ return this.multiActorEnvironment.execute(this, config);
127
+ };
128
+
129
+ _proto.executeMutation = function executeMutation(options) {
130
+ return this.multiActorEnvironment.executeMutation(this, options);
131
+ };
132
+
133
+ _proto.executeWithSource = function executeWithSource(options) {
134
+ return this.multiActorEnvironment.executeWithSource(this, options);
135
+ };
136
+
137
+ _proto.isRequestActive = function isRequestActive(requestIdentifier) {
138
+ return this.multiActorEnvironment.isRequestActive(this, requestIdentifier);
139
+ };
140
+
141
+ _proto.isServer = function isServer() {
142
+ return this.multiActorEnvironment.isServer();
143
+ };
144
+
145
+ return ActorSpecificEnvironment;
146
+ }();
147
+
148
+ module.exports = ActorSpecificEnvironment;