relay-runtime 11.0.0 → 13.0.0-rc.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 (169) hide show
  1. package/handlers/RelayDefaultHandlerProvider.js.flow +2 -2
  2. package/handlers/connection/ConnectionHandler.js.flow +8 -10
  3. package/handlers/connection/MutationHandlers.js.flow +31 -7
  4. package/index.js +1 -1
  5. package/index.js.flow +60 -36
  6. package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
  7. package/lib/handlers/connection/ConnectionHandler.js +8 -8
  8. package/lib/handlers/connection/MutationHandlers.js +61 -5
  9. package/lib/index.js +58 -43
  10. package/lib/multi-actor-environment/ActorIdentifier.js +33 -0
  11. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +152 -0
  12. package/lib/multi-actor-environment/ActorUtils.js +27 -0
  13. package/lib/multi-actor-environment/MultiActorEnvironment.js +419 -0
  14. package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +11 -0
  15. package/lib/multi-actor-environment/index.js +21 -0
  16. package/lib/mutations/RelayDeclarativeMutationConfig.js +4 -1
  17. package/lib/mutations/RelayRecordProxy.js +3 -2
  18. package/lib/mutations/RelayRecordSourceMutator.js +3 -2
  19. package/lib/mutations/RelayRecordSourceProxy.js +12 -4
  20. package/lib/mutations/RelayRecordSourceSelectorProxy.js +18 -5
  21. package/lib/mutations/applyOptimisticMutation.js +6 -6
  22. package/lib/mutations/commitMutation.js +14 -10
  23. package/lib/mutations/readUpdatableQuery_EXPERIMENTAL.js +238 -0
  24. package/lib/mutations/validateMutation.js +12 -5
  25. package/lib/network/ConvertToExecuteFunction.js +2 -1
  26. package/lib/network/RelayNetwork.js +3 -2
  27. package/lib/network/RelayQueryResponseCache.js +21 -4
  28. package/lib/network/wrapNetworkWithLogObserver.js +79 -0
  29. package/lib/query/GraphQLTag.js +3 -2
  30. package/lib/query/fetchQuery.js +6 -5
  31. package/lib/query/fetchQueryInternal.js +1 -1
  32. package/lib/query/fetchQuery_DEPRECATED.js +2 -1
  33. package/lib/store/ClientID.js +7 -1
  34. package/lib/store/DataChecker.js +141 -60
  35. package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +532 -195
  36. package/lib/store/RelayConcreteVariables.js +24 -4
  37. package/lib/store/RelayModernEnvironment.js +175 -234
  38. package/lib/store/RelayModernFragmentSpecResolver.js +52 -26
  39. package/lib/store/RelayModernOperationDescriptor.js +2 -1
  40. package/lib/store/RelayModernRecord.js +47 -12
  41. package/lib/store/RelayModernSelector.js +14 -8
  42. package/lib/store/RelayModernStore.js +58 -29
  43. package/lib/store/RelayOperationTracker.js +34 -24
  44. package/lib/store/RelayPublishQueue.js +41 -13
  45. package/lib/store/RelayReader.js +287 -46
  46. package/lib/store/RelayRecordSource.js +87 -3
  47. package/lib/store/RelayReferenceMarker.js +55 -31
  48. package/lib/store/RelayResponseNormalizer.js +250 -108
  49. package/lib/store/RelayStoreReactFlightUtils.js +8 -12
  50. package/lib/store/RelayStoreSubscriptions.js +14 -9
  51. package/lib/store/RelayStoreUtils.js +11 -5
  52. package/lib/store/ResolverCache.js +213 -0
  53. package/lib/store/ResolverFragments.js +61 -0
  54. package/lib/store/cloneRelayHandleSourceField.js +5 -4
  55. package/lib/store/cloneRelayScalarHandleSourceField.js +5 -4
  56. package/lib/store/createRelayContext.js +4 -2
  57. package/lib/store/defaultGetDataID.js +3 -1
  58. package/lib/store/readInlineData.js +6 -2
  59. package/lib/subscription/requestSubscription.js +35 -9
  60. package/lib/util/RelayConcreteNode.js +4 -0
  61. package/lib/util/RelayFeatureFlags.js +11 -4
  62. package/lib/util/RelayProfiler.js +17 -187
  63. package/lib/util/RelayReplaySubject.js +22 -7
  64. package/lib/util/RelayRuntimeTypes.js +0 -6
  65. package/lib/util/StringInterner.js +71 -0
  66. package/lib/util/deepFreeze.js +1 -0
  67. package/lib/util/getFragmentIdentifier.js +15 -7
  68. package/lib/util/getOperation.js +2 -1
  69. package/lib/util/getPaginationMetadata.js +41 -0
  70. package/lib/util/getPaginationVariables.js +66 -0
  71. package/lib/util/getPendingOperationsForFragment.js +55 -0
  72. package/lib/util/getRefetchMetadata.js +36 -0
  73. package/lib/util/getRelayHandleKey.js +2 -2
  74. package/lib/util/getRequestIdentifier.js +2 -2
  75. package/lib/util/getValueAtPath.js +51 -0
  76. package/lib/util/isEmptyObject.js +1 -1
  77. package/lib/util/registerEnvironmentWithDevTools.js +26 -0
  78. package/lib/util/withDuration.js +31 -0
  79. package/multi-actor-environment/ActorIdentifier.js.flow +43 -0
  80. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +225 -0
  81. package/multi-actor-environment/ActorUtils.js.flow +33 -0
  82. package/multi-actor-environment/MultiActorEnvironment.js.flow +506 -0
  83. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +261 -0
  84. package/multi-actor-environment/index.js.flow +26 -0
  85. package/mutations/RelayDeclarativeMutationConfig.js.flow +32 -26
  86. package/mutations/RelayRecordProxy.js.flow +4 -5
  87. package/mutations/RelayRecordSourceMutator.js.flow +4 -6
  88. package/mutations/RelayRecordSourceProxy.js.flow +19 -10
  89. package/mutations/RelayRecordSourceSelectorProxy.js.flow +22 -7
  90. package/mutations/applyOptimisticMutation.js.flow +13 -14
  91. package/mutations/commitLocalUpdate.js.flow +1 -1
  92. package/mutations/commitMutation.js.flow +35 -46
  93. package/mutations/readUpdatableQuery_EXPERIMENTAL.js.flow +309 -0
  94. package/mutations/validateMutation.js.flow +28 -16
  95. package/network/ConvertToExecuteFunction.js.flow +2 -2
  96. package/network/RelayNetwork.js.flow +4 -5
  97. package/network/RelayNetworkTypes.js.flow +17 -8
  98. package/network/RelayObservable.js.flow +1 -1
  99. package/network/RelayQueryResponseCache.js.flow +34 -20
  100. package/network/wrapNetworkWithLogObserver.js.flow +100 -0
  101. package/package.json +3 -2
  102. package/query/GraphQLTag.js.flow +9 -9
  103. package/query/PreloadableQueryRegistry.js.flow +2 -1
  104. package/query/fetchQuery.js.flow +11 -13
  105. package/query/fetchQueryInternal.js.flow +6 -9
  106. package/query/fetchQuery_DEPRECATED.js.flow +6 -6
  107. package/relay-runtime.js +2 -2
  108. package/relay-runtime.min.js +2 -2
  109. package/store/ClientID.js.flow +14 -3
  110. package/store/DataChecker.js.flow +162 -67
  111. package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +616 -283
  112. package/store/RelayConcreteVariables.js.flow +27 -5
  113. package/store/RelayModernEnvironment.js.flow +176 -235
  114. package/store/RelayModernFragmentSpecResolver.js.flow +55 -31
  115. package/store/RelayModernOperationDescriptor.js.flow +12 -7
  116. package/store/RelayModernRecord.js.flow +67 -11
  117. package/store/RelayModernSelector.js.flow +24 -14
  118. package/store/RelayModernStore.js.flow +72 -36
  119. package/store/RelayOperationTracker.js.flow +59 -43
  120. package/store/RelayOptimisticRecordSource.js.flow +2 -2
  121. package/store/RelayPublishQueue.js.flow +79 -34
  122. package/store/RelayReader.js.flow +351 -72
  123. package/store/RelayRecordSource.js.flow +72 -6
  124. package/store/RelayReferenceMarker.js.flow +60 -33
  125. package/store/RelayResponseNormalizer.js.flow +288 -102
  126. package/store/RelayStoreReactFlightUtils.js.flow +9 -13
  127. package/store/RelayStoreSubscriptions.js.flow +19 -11
  128. package/store/RelayStoreTypes.js.flow +210 -44
  129. package/store/RelayStoreUtils.js.flow +25 -11
  130. package/store/ResolverCache.js.flow +249 -0
  131. package/store/ResolverFragments.js.flow +121 -0
  132. package/store/StoreInspector.js.flow +2 -2
  133. package/store/TypeID.js.flow +1 -1
  134. package/store/ViewerPattern.js.flow +2 -2
  135. package/store/cloneRelayHandleSourceField.js.flow +5 -6
  136. package/store/cloneRelayScalarHandleSourceField.js.flow +5 -6
  137. package/store/createFragmentSpecResolver.js.flow +3 -4
  138. package/store/createRelayContext.js.flow +3 -3
  139. package/store/defaultGetDataID.js.flow +3 -1
  140. package/store/normalizeRelayPayload.js.flow +6 -7
  141. package/store/readInlineData.js.flow +7 -8
  142. package/subscription/requestSubscription.js.flow +54 -27
  143. package/util/NormalizationNode.js.flow +16 -3
  144. package/util/ReaderNode.js.flow +38 -2
  145. package/util/RelayConcreteNode.js.flow +4 -0
  146. package/util/RelayFeatureFlags.js.flow +24 -8
  147. package/util/RelayProfiler.js.flow +22 -194
  148. package/util/RelayReplaySubject.js.flow +9 -9
  149. package/util/RelayRuntimeTypes.js.flow +73 -4
  150. package/util/StringInterner.js.flow +69 -0
  151. package/util/createPayloadFor3DField.js.flow +3 -3
  152. package/util/deepFreeze.js.flow +2 -1
  153. package/util/getFragmentIdentifier.js.flow +27 -15
  154. package/util/getOperation.js.flow +2 -2
  155. package/util/getPaginationMetadata.js.flow +72 -0
  156. package/util/getPaginationVariables.js.flow +108 -0
  157. package/util/getPendingOperationsForFragment.js.flow +62 -0
  158. package/util/getRefetchMetadata.js.flow +79 -0
  159. package/util/getRelayHandleKey.js.flow +1 -2
  160. package/util/getRequestIdentifier.js.flow +3 -3
  161. package/util/getValueAtPath.js.flow +46 -0
  162. package/util/isEmptyObject.js.flow +2 -1
  163. package/util/registerEnvironmentWithDevTools.js.flow +33 -0
  164. package/util/resolveImmediate.js.flow +1 -1
  165. package/util/withDuration.js.flow +32 -0
  166. package/lib/store/RelayRecordSourceMapImpl.js +0 -107
  167. package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +0 -318
  168. package/store/RelayRecordSourceMapImpl.js.flow +0 -91
  169. package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +0 -283
@@ -12,12 +12,12 @@
12
12
 
13
13
  'use strict';
14
14
 
15
+ import type {Handler} from '../store/RelayStoreTypes';
16
+
15
17
  const ConnectionHandler = require('./connection/ConnectionHandler');
16
18
  const MutationHandlers = require('./connection/MutationHandlers');
17
-
18
19
  const invariant = require('invariant');
19
20
 
20
- import type {Handler} from '../store/RelayStoreTypes';
21
21
  export type HandlerProvider = (name: string) => ?Handler;
22
22
 
23
23
  function RelayDefaultHandlerProvider(handle: string): Handler {
@@ -12,23 +12,21 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- const ConnectionInterface = require('./ConnectionInterface');
16
-
17
- const getRelayHandleKey = require('../../util/getRelayHandleKey');
18
- const invariant = require('invariant');
19
- const warning = require('warning');
20
-
21
- const {generateClientID} = require('../../store/ClientID');
22
- const {getStableStorageKey} = require('../../store/RelayStoreUtils');
23
-
24
15
  import type {
25
16
  HandleFieldPayload,
26
- RecordProxy,
27
17
  ReadOnlyRecordProxy,
18
+ RecordProxy,
28
19
  RecordSourceProxy,
29
20
  } from '../../store/RelayStoreTypes';
30
21
  import type {DataID, Variables} from '../../util/RelayRuntimeTypes';
31
22
 
23
+ const {generateClientID} = require('../../store/ClientID');
24
+ const {getStableStorageKey} = require('../../store/RelayStoreUtils');
25
+ const getRelayHandleKey = require('../../util/getRelayHandleKey');
26
+ const ConnectionInterface = require('./ConnectionInterface');
27
+ const invariant = require('invariant');
28
+ const warning = require('warning');
29
+
32
30
  export type ConnectionMetadata = {
33
31
  path: ?Array<string>,
34
32
  direction: ?('forward' | 'backward' | 'bidirectional'),
@@ -12,18 +12,18 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- const ConnectionHandler = require('./ConnectionHandler');
16
-
17
- const invariant = require('invariant');
18
- const warning = require('warning');
19
-
20
15
  import type {
21
- RecordProxy,
22
16
  HandleFieldPayload,
23
- RecordSourceProxy,
24
17
  Handler,
18
+ RecordProxy,
19
+ RecordSourceProxy,
25
20
  } from '../../store/RelayStoreTypes';
26
21
 
22
+ const ConnectionHandler = require('./ConnectionHandler');
23
+ const ConnectionInterface = require('./ConnectionInterface');
24
+ const invariant = require('invariant');
25
+ const warning = require('warning');
26
+
27
27
  const DeleteRecordHandler = {
28
28
  update: (store: RecordSourceProxy, payload: HandleFieldPayload) => {
29
29
  const record = store.get(payload.dataID);
@@ -120,11 +120,17 @@ function edgeUpdater(
120
120
  );
121
121
  return;
122
122
  }
123
+ const {NODE, EDGES} = ConnectionInterface.get();
123
124
  const serverEdgeList = serverEdges ?? [singleServerEdge];
124
125
  for (const serverEdge of serverEdgeList) {
125
126
  if (serverEdge == null) {
126
127
  continue;
127
128
  }
129
+ const serverNode = serverEdge.getLinkedRecord('node');
130
+ if (!serverNode) {
131
+ continue;
132
+ }
133
+ const serverNodeId = serverNode.getDataID();
128
134
  for (const connectionID of connections) {
129
135
  const connection = store.get(connectionID);
130
136
  if (connection == null) {
@@ -134,6 +140,14 @@ function edgeUpdater(
134
140
  );
135
141
  continue;
136
142
  }
143
+ const nodeAlreadyExistsInConnection = connection
144
+ .getLinkedRecords(EDGES)
145
+ ?.some(
146
+ edge => edge?.getLinkedRecord(NODE)?.getDataID() === serverNodeId,
147
+ );
148
+ if (nodeAlreadyExistsInConnection) {
149
+ continue;
150
+ }
137
151
  const clientEdge = ConnectionHandler.buildConnectionEdge(
138
152
  store,
139
153
  connection,
@@ -180,11 +194,13 @@ function nodeUpdater(
180
194
  warning(false, 'MutationHandlers: Expected target node to exist.');
181
195
  return;
182
196
  }
197
+ const {NODE, EDGES} = ConnectionInterface.get();
183
198
  const serverNodeList = serverNodes ?? [singleServerNode];
184
199
  for (const serverNode of serverNodeList) {
185
200
  if (serverNode == null) {
186
201
  continue;
187
202
  }
203
+ const serverNodeId = serverNode.getDataID();
188
204
  for (const connectionID of connections) {
189
205
  const connection = store.get(connectionID);
190
206
  if (connection == null) {
@@ -194,6 +210,14 @@ function nodeUpdater(
194
210
  );
195
211
  continue;
196
212
  }
213
+ const nodeAlreadyExistsInConnection = connection
214
+ .getLinkedRecords(EDGES)
215
+ ?.some(
216
+ edge => edge?.getLinkedRecord(NODE)?.getDataID() === serverNodeId,
217
+ );
218
+ if (nodeAlreadyExistsInConnection) {
219
+ continue;
220
+ }
197
221
  const clientEdge = ConnectionHandler.createEdge(
198
222
  store,
199
223
  connection,
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v11.0.0
2
+ * Relay v13.0.0-rc.0
3
3
  *
4
4
  * Copyright (c) Facebook, Inc. and its affiliates.
5
5
  *
package/index.js.flow CHANGED
@@ -14,59 +14,62 @@
14
14
 
15
15
  const ConnectionHandler = require('./handlers/connection/ConnectionHandler');
16
16
  const ConnectionInterface = require('./handlers/connection/ConnectionInterface');
17
- const GraphQLTag = require('./query/GraphQLTag');
18
17
  const MutationHandlers = require('./handlers/connection/MutationHandlers');
18
+ const RelayDefaultHandlerProvider = require('./handlers/RelayDefaultHandlerProvider');
19
+ const applyOptimisticMutation = require('./mutations/applyOptimisticMutation');
20
+ const commitLocalUpdate = require('./mutations/commitLocalUpdate');
21
+ const commitMutation = require('./mutations/commitMutation');
22
+ const RelayDeclarativeMutationConfig = require('./mutations/RelayDeclarativeMutationConfig');
23
+ const RelayNetwork = require('./network/RelayNetwork');
24
+ const RelayObservable = require('./network/RelayObservable');
25
+ const RelayQueryResponseCache = require('./network/RelayQueryResponseCache');
26
+ const fetchQuery = require('./query/fetchQuery');
27
+ const fetchQuery_DEPRECATED = require('./query/fetchQuery_DEPRECATED');
28
+ const fetchQueryInternal = require('./query/fetchQueryInternal');
29
+ const GraphQLTag = require('./query/GraphQLTag');
19
30
  const PreloadableQueryRegistry = require('./query/PreloadableQueryRegistry');
20
- const RelayConcreteNode = require('./util/RelayConcreteNode');
31
+ const {
32
+ generateClientID,
33
+ generateUniqueClientID,
34
+ isClientID,
35
+ } = require('./store/ClientID');
36
+ const createFragmentSpecResolver = require('./store/createFragmentSpecResolver');
37
+ const createRelayContext = require('./store/createRelayContext');
38
+ const isRelayModernEnvironment = require('./store/isRelayModernEnvironment');
39
+ const readInlineData = require('./store/readInlineData');
21
40
  const RelayConcreteVariables = require('./store/RelayConcreteVariables');
22
- const RelayDeclarativeMutationConfig = require('./mutations/RelayDeclarativeMutationConfig');
23
- const RelayDefaultHandleKey = require('./util/RelayDefaultHandleKey');
24
- const RelayDefaultHandlerProvider = require('./handlers/RelayDefaultHandlerProvider');
25
- const RelayError = require('./util/RelayError');
26
- const RelayFeatureFlags = require('./util/RelayFeatureFlags');
27
41
  const RelayModernEnvironment = require('./store/RelayModernEnvironment');
28
42
  const RelayModernOperationDescriptor = require('./store/RelayModernOperationDescriptor');
29
43
  const RelayModernRecord = require('./store/RelayModernRecord');
30
44
  const RelayModernSelector = require('./store/RelayModernSelector');
31
45
  const RelayModernStore = require('./store/RelayModernStore');
32
- const RelayNetwork = require('./network/RelayNetwork');
33
- const RelayObservable = require('./network/RelayObservable');
34
46
  const RelayOperationTracker = require('./store/RelayOperationTracker');
35
- const RelayProfiler = require('./util/RelayProfiler');
36
- const RelayQueryResponseCache = require('./network/RelayQueryResponseCache');
37
47
  const RelayRecordSource = require('./store/RelayRecordSource');
38
- const RelayReplaySubject = require('./util/RelayReplaySubject');
39
48
  const RelayStoreUtils = require('./store/RelayStoreUtils');
40
49
  const ViewerPattern = require('./store/ViewerPattern');
41
-
42
- const applyOptimisticMutation = require('./mutations/applyOptimisticMutation');
43
- const commitLocalUpdate = require('./mutations/commitLocalUpdate');
44
- const commitMutation = require('./mutations/commitMutation');
45
- const createFragmentSpecResolver = require('./store/createFragmentSpecResolver');
50
+ const requestSubscription = require('./subscription/requestSubscription');
46
51
  const createPayloadFor3DField = require('./util/createPayloadFor3DField');
47
- const createRelayContext = require('./store/createRelayContext');
48
52
  const deepFreeze = require('./util/deepFreeze');
49
- const fetchQuery = require('./query/fetchQuery');
50
- const fetchQueryInternal = require('./query/fetchQueryInternal');
51
- const fetchQuery_DEPRECATED = require('./query/fetchQuery_DEPRECATED');
52
53
  const getFragmentIdentifier = require('./util/getFragmentIdentifier');
54
+ const getPaginationMetadata = require('./util/getPaginationMetadata');
55
+ const getPaginationVariables = require('./util/getPaginationVariables');
56
+ const getPendingOperationsForFragment = require('./util/getPendingOperationsForFragment');
57
+ const getRefetchMetadata = require('./util/getRefetchMetadata');
53
58
  const getRelayHandleKey = require('./util/getRelayHandleKey');
54
59
  const getRequestIdentifier = require('./util/getRequestIdentifier');
60
+ const getValueAtPath = require('./util/getValueAtPath');
55
61
  const isPromise = require('./util/isPromise');
56
- const isRelayModernEnvironment = require('./store/isRelayModernEnvironment');
57
62
  const isScalarAndEqual = require('./util/isScalarAndEqual');
58
- const readInlineData = require('./store/readInlineData');
59
63
  const recycleNodesInto = require('./util/recycleNodesInto');
64
+ const RelayConcreteNode = require('./util/RelayConcreteNode');
65
+ const RelayDefaultHandleKey = require('./util/RelayDefaultHandleKey');
66
+ const RelayError = require('./util/RelayError');
67
+ const RelayFeatureFlags = require('./util/RelayFeatureFlags');
68
+ const RelayProfiler = require('./util/RelayProfiler');
69
+ const RelayReplaySubject = require('./util/RelayReplaySubject');
60
70
  const reportMissingRequiredFields = require('./util/reportMissingRequiredFields');
61
- const requestSubscription = require('./subscription/requestSubscription');
62
71
  const stableCopy = require('./util/stableCopy');
63
72
 
64
- const {
65
- generateClientID,
66
- generateUniqueClientID,
67
- isClientID,
68
- } = require('./store/ClientID');
69
-
70
73
  export type {ConnectionMetadata} from './handlers/connection/ConnectionHandler';
71
74
  export type {
72
75
  EdgeRecord,
@@ -82,7 +85,6 @@ export type {OptimisticMutationConfig} from './mutations/applyOptimisticMutation
82
85
  export type {
83
86
  DEPRECATED_MutationConfig,
84
87
  MutationConfig,
85
- MutationParameters,
86
88
  } from './mutations/commitMutation';
87
89
  export type {
88
90
  ExecuteFunction,
@@ -110,12 +112,15 @@ export type {
110
112
  Subscription,
111
113
  } from './network/RelayObservable';
112
114
  export type {GraphQLTaggedNode} from './query/GraphQLTag';
115
+ export type {TaskScheduler} from './store/OperationExecutor';
113
116
  export type {EnvironmentConfig} from './store/RelayModernEnvironment';
114
- export type {TaskScheduler} from './store/RelayModernQueryExecutor';
115
117
  export type {RecordState} from './store/RelayRecordState';
116
118
  export type {
119
+ ExecuteMutationConfig,
117
120
  FragmentMap,
118
- FragmentReference,
121
+ // DEPRECATED: use FragmentType instead of FragmentReference
122
+ FragmentType as FragmentReference,
123
+ FragmentType,
119
124
  FragmentSpecResolver,
120
125
  HandleFieldPayload,
121
126
  IEnvironment,
@@ -125,6 +130,7 @@ export type {
125
130
  MissingFieldHandler,
126
131
  MissingRequiredFields,
127
132
  ModuleImportPointer,
133
+ MutationParameters,
128
134
  NormalizationSelector,
129
135
  OperationAvailability,
130
136
  OperationDescriptor,
@@ -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,
@@ -168,8 +179,8 @@ export type {
168
179
  NormalizationSplitOperation,
169
180
  NormalizationStream,
170
181
  NormalizationTypeDiscriminator,
182
+ NormalizationOperation,
171
183
  } from './util/NormalizationNode';
172
- export type {NormalizationOperation} from './util/NormalizationNode';
173
184
  export type {
174
185
  ReaderArgument,
175
186
  ReaderArgumentDefinition,
@@ -199,12 +210,20 @@ export type {
199
210
  Disposable,
200
211
  FetchPolicy,
201
212
  FetchQueryFetchPolicy,
213
+ Fragment,
214
+ GraphQLSubscription,
215
+ InlineFragment,
216
+ Mutation,
217
+ Operation,
202
218
  OperationType,
219
+ Query,
220
+ RefetchableFragment,
203
221
  RenderPolicy,
204
222
  Variables,
205
223
  VariablesOf,
206
224
  } from './util/RelayRuntimeTypes';
207
225
  export type {Local3DPayload} from './util/createPayloadFor3DField';
226
+ export type {Direction} from './util/getPaginationVariables';
208
227
  export type {RequestIdentifier} from './util/getRequestIdentifier';
209
228
 
210
229
  // As early as possible, check for the existence of the JavaScript globals which
@@ -327,6 +346,11 @@ module.exports = {
327
346
  recycleNodesInto: recycleNodesInto,
328
347
  stableCopy: stableCopy,
329
348
  getFragmentIdentifier: getFragmentIdentifier,
349
+ getRefetchMetadata: getRefetchMetadata,
350
+ getPaginationMetadata: getPaginationMetadata,
351
+ getPaginationVariables: getPaginationVariables,
352
+ getPendingOperationsForFragment: getPendingOperationsForFragment,
353
+ getValueAtPath: getValueAtPath,
330
354
  __internal: {
331
355
  OperationTracker: RelayOperationTracker,
332
356
  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) {
@@ -10,20 +10,20 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var ConnectionInterface = require('./ConnectionInterface');
14
-
15
- var getRelayHandleKey = require('../../util/getRelayHandleKey');
16
-
17
- var invariant = require("fbjs/lib/invariant");
18
-
19
- var warning = require("fbjs/lib/warning");
20
-
21
13
  var _require = require('../../store/ClientID'),
22
14
  generateClientID = _require.generateClientID;
23
15
 
24
16
  var _require2 = require('../../store/RelayStoreUtils'),
25
17
  getStableStorageKey = _require2.getStableStorageKey;
26
18
 
19
+ var getRelayHandleKey = require('../../util/getRelayHandleKey');
20
+
21
+ var ConnectionInterface = require('./ConnectionInterface');
22
+
23
+ var invariant = require('invariant');
24
+
25
+ var warning = require("fbjs/lib/warning");
26
+
27
27
  var CONNECTION = 'connection'; // Per-instance incrementing index used to generate unique edge IDs
28
28
 
29
29
  var NEXT_EDGE_INDEX = '__connection_next_edge_index';
@@ -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
 
@@ -119,19 +121,31 @@ function edgeUpdater(insertFn) {
119
121
  return;
120
122
  }
121
123
 
124
+ var _ConnectionInterface$ = ConnectionInterface.get(),
125
+ NODE = _ConnectionInterface$.NODE,
126
+ EDGES = _ConnectionInterface$.EDGES;
127
+
122
128
  var serverEdgeList = (_serverEdges = serverEdges) !== null && _serverEdges !== void 0 ? _serverEdges : [singleServerEdge];
123
129
 
124
130
  var _iterator2 = (0, _createForOfIteratorHelper2["default"])(serverEdgeList),
125
131
  _step2;
126
132
 
127
133
  try {
128
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
134
+ var _loop = function _loop() {
129
135
  var serverEdge = _step2.value;
130
136
 
131
137
  if (serverEdge == null) {
132
- continue;
138
+ return "continue";
133
139
  }
134
140
 
141
+ var serverNode = serverEdge.getLinkedRecord('node');
142
+
143
+ if (!serverNode) {
144
+ return "continue";
145
+ }
146
+
147
+ var serverNodeId = serverNode.getDataID();
148
+
135
149
  var _iterator3 = (0, _createForOfIteratorHelper2["default"])(connections),
136
150
  _step3;
137
151
 
@@ -145,6 +159,16 @@ function edgeUpdater(insertFn) {
145
159
  continue;
146
160
  }
147
161
 
162
+ var nodeAlreadyExistsInConnection = (_connection$getLinked = connection.getLinkedRecords(EDGES)) === null || _connection$getLinked === void 0 ? void 0 : _connection$getLinked.some(function (edge) {
163
+ var _edge$getLinkedRecord;
164
+
165
+ return (edge === null || edge === void 0 ? void 0 : (_edge$getLinkedRecord = edge.getLinkedRecord(NODE)) === null || _edge$getLinkedRecord === void 0 ? void 0 : _edge$getLinkedRecord.getDataID()) === serverNodeId;
166
+ });
167
+
168
+ if (nodeAlreadyExistsInConnection) {
169
+ continue;
170
+ }
171
+
148
172
  var clientEdge = ConnectionHandler.buildConnectionEdge(store, connection, serverEdge);
149
173
  !(clientEdge != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MutationHandlers: Failed to build the edge.') : invariant(false) : void 0;
150
174
  insertFn(connection, clientEdge);
@@ -154,6 +178,14 @@ function edgeUpdater(insertFn) {
154
178
  } finally {
155
179
  _iterator3.f();
156
180
  }
181
+ };
182
+
183
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
184
+ var _connection$getLinked;
185
+
186
+ var _ret = _loop();
187
+
188
+ if (_ret === "continue") continue;
157
189
  }
158
190
  } catch (err) {
159
191
  _iterator2.e(err);
@@ -196,19 +228,25 @@ function nodeUpdater(insertFn) {
196
228
  return;
197
229
  }
198
230
 
231
+ var _ConnectionInterface$2 = ConnectionInterface.get(),
232
+ NODE = _ConnectionInterface$2.NODE,
233
+ EDGES = _ConnectionInterface$2.EDGES;
234
+
199
235
  var serverNodeList = (_serverNodes = serverNodes) !== null && _serverNodes !== void 0 ? _serverNodes : [singleServerNode];
200
236
 
201
237
  var _iterator4 = (0, _createForOfIteratorHelper2["default"])(serverNodeList),
202
238
  _step4;
203
239
 
204
240
  try {
205
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
241
+ var _loop2 = function _loop2() {
206
242
  var serverNode = _step4.value;
207
243
 
208
244
  if (serverNode == null) {
209
- continue;
245
+ return "continue";
210
246
  }
211
247
 
248
+ var serverNodeId = serverNode.getDataID();
249
+
212
250
  var _iterator5 = (0, _createForOfIteratorHelper2["default"])(connections),
213
251
  _step5;
214
252
 
@@ -222,6 +260,16 @@ function nodeUpdater(insertFn) {
222
260
  continue;
223
261
  }
224
262
 
263
+ var nodeAlreadyExistsInConnection = (_connection$getLinked2 = connection.getLinkedRecords(EDGES)) === null || _connection$getLinked2 === void 0 ? void 0 : _connection$getLinked2.some(function (edge) {
264
+ var _edge$getLinkedRecord2;
265
+
266
+ return (edge === null || edge === void 0 ? void 0 : (_edge$getLinkedRecord2 = edge.getLinkedRecord(NODE)) === null || _edge$getLinkedRecord2 === void 0 ? void 0 : _edge$getLinkedRecord2.getDataID()) === serverNodeId;
267
+ });
268
+
269
+ if (nodeAlreadyExistsInConnection) {
270
+ continue;
271
+ }
272
+
225
273
  var clientEdge = ConnectionHandler.createEdge(store, connection, serverNode, edgeTypeName);
226
274
  !(clientEdge != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MutationHandlers: Failed to build the edge.') : invariant(false) : void 0;
227
275
  insertFn(connection, clientEdge);
@@ -231,6 +279,14 @@ function nodeUpdater(insertFn) {
231
279
  } finally {
232
280
  _iterator5.f();
233
281
  }
282
+ };
283
+
284
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
285
+ var _connection$getLinked2;
286
+
287
+ var _ret2 = _loop2();
288
+
289
+ if (_ret2 === "continue") continue;
234
290
  }
235
291
  } catch (err) {
236
292
  _iterator4.e(err);