relay-runtime 9.0.0 → 10.1.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 (142) hide show
  1. package/handlers/RelayDefaultHandlerProvider.js.flow +47 -0
  2. package/handlers/connection/ConnectionHandler.js.flow +549 -0
  3. package/handlers/connection/ConnectionInterface.js.flow +92 -0
  4. package/handlers/connection/MutationHandlers.js.flow +199 -0
  5. package/index.js +1 -1
  6. package/index.js.flow +335 -0
  7. package/lib/handlers/RelayDefaultHandlerProvider.js +20 -0
  8. package/lib/handlers/connection/ConnectionHandler.js +1 -3
  9. package/lib/handlers/connection/MutationHandlers.js +212 -0
  10. package/lib/index.js +14 -2
  11. package/lib/mutations/RelayDeclarativeMutationConfig.js +22 -45
  12. package/lib/mutations/RelayRecordProxy.js +1 -3
  13. package/lib/mutations/RelayRecordSourceMutator.js +1 -3
  14. package/lib/mutations/RelayRecordSourceProxy.js +1 -3
  15. package/lib/mutations/RelayRecordSourceSelectorProxy.js +1 -3
  16. package/lib/mutations/commitMutation.js +2 -3
  17. package/lib/mutations/validateMutation.js +40 -9
  18. package/lib/network/RelayObservable.js +9 -9
  19. package/lib/network/RelayQueryResponseCache.js +8 -6
  20. package/lib/query/GraphQLTag.js +2 -1
  21. package/lib/query/PreloadableQueryRegistry.js +70 -0
  22. package/lib/query/fetchQuery.js +2 -3
  23. package/lib/query/fetchQueryInternal.js +5 -14
  24. package/lib/store/DataChecker.js +200 -71
  25. package/lib/store/RelayConcreteVariables.js +6 -2
  26. package/lib/store/RelayModernEnvironment.js +124 -65
  27. package/lib/store/RelayModernFragmentSpecResolver.js +19 -14
  28. package/lib/store/RelayModernOperationDescriptor.js +6 -5
  29. package/lib/store/RelayModernQueryExecutor.js +122 -73
  30. package/lib/store/RelayModernRecord.js +14 -9
  31. package/lib/store/RelayModernSelector.js +6 -2
  32. package/lib/store/RelayModernStore.js +281 -131
  33. package/lib/store/RelayOperationTracker.js +35 -78
  34. package/lib/store/RelayOptimisticRecordSource.js +7 -5
  35. package/lib/store/RelayPublishQueue.js +2 -4
  36. package/lib/store/RelayReader.js +304 -52
  37. package/lib/store/RelayRecordSource.js +1 -3
  38. package/lib/store/RelayRecordSourceMapImpl.js +13 -18
  39. package/lib/store/RelayReferenceMarker.js +125 -14
  40. package/lib/store/RelayResponseNormalizer.js +261 -66
  41. package/lib/store/RelayStoreReactFlightUtils.js +47 -0
  42. package/lib/store/RelayStoreUtils.js +1 -0
  43. package/lib/store/StoreInspector.js +8 -8
  44. package/lib/store/TypeID.js +28 -0
  45. package/lib/store/cloneRelayScalarHandleSourceField.js +44 -0
  46. package/lib/store/defaultRequiredFieldLogger.js +18 -0
  47. package/lib/store/normalizeRelayPayload.js +6 -2
  48. package/lib/store/readInlineData.js +1 -1
  49. package/lib/subscription/requestSubscription.js +4 -3
  50. package/lib/util/NormalizationNode.js +1 -5
  51. package/lib/util/RelayConcreteNode.js +11 -6
  52. package/lib/util/RelayError.js +39 -9
  53. package/lib/util/RelayFeatureFlags.js +6 -3
  54. package/lib/util/RelayReplaySubject.js +3 -3
  55. package/lib/util/createPayloadFor3DField.js +7 -2
  56. package/lib/util/getFragmentIdentifier.js +12 -3
  57. package/lib/util/getOperation.js +33 -0
  58. package/lib/util/getRequestIdentifier.js +2 -2
  59. package/lib/util/isEmptyObject.js +25 -0
  60. package/lib/util/recycleNodesInto.js +6 -7
  61. package/lib/util/reportMissingRequiredFields.js +48 -0
  62. package/mutations/RelayDeclarativeMutationConfig.js.flow +380 -0
  63. package/mutations/RelayRecordProxy.js.flow +165 -0
  64. package/mutations/RelayRecordSourceMutator.js.flow +238 -0
  65. package/mutations/RelayRecordSourceProxy.js.flow +164 -0
  66. package/mutations/RelayRecordSourceSelectorProxy.js.flow +119 -0
  67. package/mutations/applyOptimisticMutation.js.flow +76 -0
  68. package/mutations/commitLocalUpdate.js.flow +24 -0
  69. package/mutations/commitMutation.js.flow +181 -0
  70. package/mutations/validateMutation.js.flow +242 -0
  71. package/network/ConvertToExecuteFunction.js.flow +49 -0
  72. package/network/RelayNetwork.js.flow +84 -0
  73. package/network/RelayNetworkTypes.js.flow +145 -0
  74. package/network/RelayObservable.js.flow +634 -0
  75. package/network/RelayQueryResponseCache.js.flow +111 -0
  76. package/package.json +2 -2
  77. package/query/GraphQLTag.js.flow +168 -0
  78. package/query/PreloadableQueryRegistry.js.flow +65 -0
  79. package/query/fetchQuery.js.flow +47 -0
  80. package/query/fetchQueryInternal.js.flow +343 -0
  81. package/relay-runtime.js +2 -2
  82. package/relay-runtime.min.js +2 -2
  83. package/store/ClientID.js.flow +43 -0
  84. package/store/DataChecker.js.flow +568 -0
  85. package/store/RelayConcreteVariables.js.flow +96 -0
  86. package/store/RelayModernEnvironment.js.flow +571 -0
  87. package/store/RelayModernFragmentSpecResolver.js.flow +438 -0
  88. package/store/RelayModernOperationDescriptor.js.flow +92 -0
  89. package/store/RelayModernQueryExecutor.js.flow +1345 -0
  90. package/store/RelayModernRecord.js.flow +403 -0
  91. package/store/RelayModernSelector.js.flow +455 -0
  92. package/store/RelayModernStore.js.flow +858 -0
  93. package/store/RelayOperationTracker.js.flow +164 -0
  94. package/store/RelayOptimisticRecordSource.js.flow +119 -0
  95. package/store/RelayPublishQueue.js.flow +401 -0
  96. package/store/RelayReader.js.flow +638 -0
  97. package/store/RelayRecordSource.js.flow +29 -0
  98. package/store/RelayRecordSourceMapImpl.js.flow +87 -0
  99. package/store/RelayRecordState.js.flow +37 -0
  100. package/store/RelayReferenceMarker.js.flow +324 -0
  101. package/store/RelayResponseNormalizer.js.flow +791 -0
  102. package/store/RelayStoreReactFlightUtils.js.flow +64 -0
  103. package/store/RelayStoreTypes.js.flow +958 -0
  104. package/store/RelayStoreUtils.js.flow +219 -0
  105. package/store/StoreInspector.js.flow +171 -0
  106. package/store/TypeID.js.flow +28 -0
  107. package/store/ViewerPattern.js.flow +26 -0
  108. package/store/cloneRelayHandleSourceField.js.flow +66 -0
  109. package/store/cloneRelayScalarHandleSourceField.js.flow +62 -0
  110. package/store/createFragmentSpecResolver.js.flow +55 -0
  111. package/store/createRelayContext.js.flow +44 -0
  112. package/store/defaultGetDataID.js.flow +27 -0
  113. package/store/defaultRequiredFieldLogger.js.flow +23 -0
  114. package/store/hasOverlappingIDs.js.flow +34 -0
  115. package/store/isRelayModernEnvironment.js.flow +27 -0
  116. package/store/normalizeRelayPayload.js.flow +51 -0
  117. package/store/readInlineData.js.flow +75 -0
  118. package/subscription/requestSubscription.js.flow +103 -0
  119. package/util/JSResourceTypes.flow.js.flow +20 -0
  120. package/util/NormalizationNode.js.flow +213 -0
  121. package/util/ReaderNode.js.flow +227 -0
  122. package/util/RelayConcreteNode.js.flow +99 -0
  123. package/util/RelayDefaultHandleKey.js.flow +17 -0
  124. package/util/RelayError.js.flow +62 -0
  125. package/util/RelayFeatureFlags.js.flow +37 -0
  126. package/util/RelayProfiler.js.flow +284 -0
  127. package/util/RelayReplaySubject.js.flow +135 -0
  128. package/util/RelayRuntimeTypes.js.flow +72 -0
  129. package/util/createPayloadFor3DField.js.flow +43 -0
  130. package/util/deepFreeze.js.flow +36 -0
  131. package/util/generateID.js.flow +21 -0
  132. package/util/getFragmentIdentifier.js.flow +76 -0
  133. package/util/getOperation.js.flow +40 -0
  134. package/util/getRelayHandleKey.js.flow +41 -0
  135. package/util/getRequestIdentifier.js.flow +42 -0
  136. package/util/isEmptyObject.js.flow +25 -0
  137. package/util/isPromise.js.flow +21 -0
  138. package/util/isScalarAndEqual.js.flow +26 -0
  139. package/util/recycleNodesInto.js.flow +87 -0
  140. package/util/reportMissingRequiredFields.js.flow +51 -0
  141. package/util/resolveImmediate.js.flow +30 -0
  142. package/util/stableCopy.js.flow +35 -0
@@ -0,0 +1,212 @@
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
+ *
8
+ * @format
9
+ */
10
+ // flowlint ambiguous-object-type:error
11
+ 'use strict';
12
+
13
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
14
+
15
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
+
17
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
18
+
19
+ var ConnectionHandler = require('./ConnectionHandler');
20
+
21
+ var invariant = require("fbjs/lib/invariant");
22
+
23
+ var warning = require("fbjs/lib/warning");
24
+
25
+ var DeleteRecordHandler = {
26
+ update: function update(store, payload) {
27
+ var record = store.get(payload.dataID);
28
+
29
+ if (record != null) {
30
+ var idOrIds = record.getValue(payload.fieldKey);
31
+
32
+ if (typeof idOrIds === 'string') {
33
+ store["delete"](idOrIds);
34
+ } else if (Array.isArray(idOrIds)) {
35
+ idOrIds.forEach(function (id) {
36
+ if (typeof id === 'string') {
37
+ store["delete"](id);
38
+ }
39
+ });
40
+ }
41
+ }
42
+ }
43
+ };
44
+ var DeleteEdgeHandler = {
45
+ update: function update(store, payload) {
46
+ var record = store.get(payload.dataID);
47
+
48
+ if (record == null) {
49
+ return;
50
+ }
51
+
52
+ var connections = payload.handleArgs.connections;
53
+ !(connections != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MutationHandlers: Expected connection IDs to be specified.') : invariant(false) : void 0;
54
+ var idOrIds = record.getValue(payload.fieldKey);
55
+ var idList = Array.isArray(idOrIds) ? idOrIds : [idOrIds];
56
+ idList.forEach(function (id) {
57
+ if (typeof id === 'string') {
58
+ var _iterator = _createForOfIteratorHelper(connections),
59
+ _step;
60
+
61
+ try {
62
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
63
+ var connectionID = _step.value;
64
+ var connection = store.get(connectionID);
65
+
66
+ if (connection == null) {
67
+ process.env.NODE_ENV !== "production" ? warning(false, "[Relay][Mutation] The connection with id '".concat(connectionID, "' doesn't exist.")) : void 0;
68
+ continue;
69
+ }
70
+
71
+ ConnectionHandler.deleteNode(connection, id);
72
+ }
73
+ } catch (err) {
74
+ _iterator.e(err);
75
+ } finally {
76
+ _iterator.f();
77
+ }
78
+ }
79
+ });
80
+ }
81
+ };
82
+ var AppendEdgeHandler = {
83
+ update: edgeUpdater(ConnectionHandler.insertEdgeAfter)
84
+ };
85
+ var PrependEdgeHandler = {
86
+ update: edgeUpdater(ConnectionHandler.insertEdgeBefore)
87
+ };
88
+ var AppendNodeHandler = {
89
+ update: nodeUpdater(ConnectionHandler.insertEdgeAfter)
90
+ };
91
+ var PrependNodeHandler = {
92
+ update: nodeUpdater(ConnectionHandler.insertEdgeBefore)
93
+ };
94
+
95
+ function edgeUpdater(insertFn) {
96
+ return function (store, payload) {
97
+ var record = store.get(payload.dataID);
98
+
99
+ if (record == null) {
100
+ return;
101
+ }
102
+
103
+ var connections = payload.handleArgs.connections;
104
+ !(connections != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MutationHandlers: Expected connection IDs to be specified.') : invariant(false) : void 0;
105
+ var serverEdge = record.getLinkedRecord(payload.fieldKey, payload.args);
106
+
107
+ var _iterator2 = _createForOfIteratorHelper(connections),
108
+ _step2;
109
+
110
+ try {
111
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
112
+ var connectionID = _step2.value;
113
+ var connection = store.get(connectionID);
114
+
115
+ if (connection == null) {
116
+ process.env.NODE_ENV !== "production" ? warning(false, "[Relay][Mutation] The connection with id '".concat(connectionID, "' doesn't exist.")) : void 0;
117
+ continue;
118
+ }
119
+
120
+ var clientEdge = ConnectionHandler.buildConnectionEdge(store, connection, serverEdge);
121
+ !(clientEdge != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MutationHandlers: Failed to build the edge.') : invariant(false) : void 0;
122
+ insertFn(connection, clientEdge);
123
+ }
124
+ } catch (err) {
125
+ _iterator2.e(err);
126
+ } finally {
127
+ _iterator2.f();
128
+ }
129
+ };
130
+ }
131
+
132
+ function nodeUpdater(insertFn) {
133
+ return function (store, payload) {
134
+ var _serverNodes;
135
+
136
+ var record = store.get(payload.dataID);
137
+
138
+ if (record == null) {
139
+ return;
140
+ }
141
+
142
+ var _payload$handleArgs = payload.handleArgs,
143
+ connections = _payload$handleArgs.connections,
144
+ edgeTypeName = _payload$handleArgs.edgeTypeName;
145
+ !(connections != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MutationHandlers: Expected connection IDs to be specified.') : invariant(false) : void 0;
146
+ !(edgeTypeName != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MutationHandlers: Expected edge typename to be specified.') : invariant(false) : void 0;
147
+ var singleServerNode;
148
+ var serverNodes;
149
+
150
+ try {
151
+ singleServerNode = record.getLinkedRecord(payload.fieldKey, payload.args);
152
+ } catch (_unused) {}
153
+
154
+ if (!singleServerNode) {
155
+ try {
156
+ serverNodes = record.getLinkedRecords(payload.fieldKey, payload.args);
157
+ } catch (_unused2) {}
158
+ }
159
+
160
+ !(singleServerNode != null || serverNodes != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MutationHandlers: Expected target node to exist.') : invariant(false) : void 0;
161
+ var serverNodeList = (_serverNodes = serverNodes) !== null && _serverNodes !== void 0 ? _serverNodes : [singleServerNode];
162
+
163
+ var _iterator3 = _createForOfIteratorHelper(serverNodeList),
164
+ _step3;
165
+
166
+ try {
167
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
168
+ var serverNode = _step3.value;
169
+
170
+ if (serverNode == null) {
171
+ continue;
172
+ }
173
+
174
+ var _iterator4 = _createForOfIteratorHelper(connections),
175
+ _step4;
176
+
177
+ try {
178
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
179
+ var connectionID = _step4.value;
180
+ var connection = store.get(connectionID);
181
+
182
+ if (connection == null) {
183
+ process.env.NODE_ENV !== "production" ? warning(false, "[Relay][Mutation] The connection with id '".concat(connectionID, "' doesn't exist.")) : void 0;
184
+ continue;
185
+ }
186
+
187
+ var clientEdge = ConnectionHandler.createEdge(store, connection, serverNode, edgeTypeName);
188
+ !(clientEdge != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'MutationHandlers: Failed to build the edge.') : invariant(false) : void 0;
189
+ insertFn(connection, clientEdge);
190
+ }
191
+ } catch (err) {
192
+ _iterator4.e(err);
193
+ } finally {
194
+ _iterator4.f();
195
+ }
196
+ }
197
+ } catch (err) {
198
+ _iterator3.e(err);
199
+ } finally {
200
+ _iterator3.f();
201
+ }
202
+ };
203
+ }
204
+
205
+ module.exports = {
206
+ AppendEdgeHandler: AppendEdgeHandler,
207
+ DeleteRecordHandler: DeleteRecordHandler,
208
+ PrependEdgeHandler: PrependEdgeHandler,
209
+ AppendNodeHandler: AppendNodeHandler,
210
+ PrependNodeHandler: PrependNodeHandler,
211
+ DeleteEdgeHandler: DeleteEdgeHandler
212
+ };
package/lib/index.js CHANGED
@@ -16,6 +16,10 @@ var ConnectionInterface = require('./handlers/connection/ConnectionInterface');
16
16
 
17
17
  var GraphQLTag = require('./query/GraphQLTag');
18
18
 
19
+ var MutationHandlers = require('./handlers/connection/MutationHandlers');
20
+
21
+ var PreloadableQueryRegistry = require('./query/PreloadableQueryRegistry');
22
+
19
23
  var RelayConcreteNode = require('./util/RelayConcreteNode');
20
24
 
21
25
  var RelayConcreteVariables = require('./store/RelayConcreteVariables');
@@ -92,6 +96,8 @@ var readInlineData = require('./store/readInlineData');
92
96
 
93
97
  var recycleNodesInto = require('./util/recycleNodesInto');
94
98
 
99
+ var reportMissingRequiredFields = require('./util/reportMissingRequiredFields');
100
+
95
101
  var requestSubscription = require('./subscription/requestSubscription');
96
102
 
97
103
  var stableCopy = require('./util/stableCopy');
@@ -136,6 +142,7 @@ module.exports = {
136
142
  createRequestDescriptor: RelayModernOperationDescriptor.createRequestDescriptor,
137
143
  getDataIDsFromFragment: RelayModernSelector.getDataIDsFromFragment,
138
144
  getDataIDsFromObject: RelayModernSelector.getDataIDsFromObject,
145
+ getNode: GraphQLTag.getNode,
139
146
  getFragment: GraphQLTag.getFragment,
140
147
  getInlineDataFragment: GraphQLTag.getInlineDataFragment,
141
148
  getModuleComponentKey: RelayStoreUtils.getModuleComponentKey,
@@ -153,7 +160,11 @@ module.exports = {
153
160
  getVariablesFromObject: RelayModernSelector.getVariablesFromObject,
154
161
  getVariablesFromPluralFragment: RelayModernSelector.getVariablesFromPluralFragment,
155
162
  getVariablesFromSingularFragment: RelayModernSelector.getVariablesFromSingularFragment,
163
+ reportMissingRequiredFields: reportMissingRequiredFields,
156
164
  graphql: GraphQLTag.graphql,
165
+ isFragment: GraphQLTag.isFragment,
166
+ isInlineDataFragment: GraphQLTag.isInlineDataFragment,
167
+ isRequest: GraphQLTag.isRequest,
157
168
  readInlineData: readInlineData,
158
169
  // Declarative mutation API
159
170
  MutationTypes: RelayDeclarativeMutationConfig.MutationTypes,
@@ -161,6 +172,7 @@ module.exports = {
161
172
  // Extensions
162
173
  DefaultHandlerProvider: RelayDefaultHandlerProvider,
163
174
  ConnectionHandler: ConnectionHandler,
175
+ MutationHandlers: MutationHandlers,
164
176
  VIEWER_ID: ViewerPattern.VIEWER_ID,
165
177
  VIEWER_TYPE: ViewerPattern.VIEWER_TYPE,
166
178
  // Helpers (can be implemented via the above API)
@@ -173,6 +185,7 @@ module.exports = {
173
185
  // Configuration interface for legacy or special uses
174
186
  ConnectionInterface: ConnectionInterface,
175
187
  // Utilities
188
+ PreloadableQueryRegistry: PreloadableQueryRegistry,
176
189
  RelayProfiler: RelayProfiler,
177
190
  createPayloadFor3DField: createPayloadFor3DField,
178
191
  // INTERNAL-ONLY: These exports might be removed at any point.
@@ -205,7 +218,6 @@ module.exports = {
205
218
  fetchQuery: fetchQueryInternal.fetchQuery,
206
219
  fetchQueryDeduped: fetchQueryInternal.fetchQueryDeduped,
207
220
  getPromiseForActiveRequest: fetchQueryInternal.getPromiseForActiveRequest,
208
- getObservableForActiveRequest: fetchQueryInternal.getObservableForActiveRequest,
209
- isRequestActive: fetchQueryInternal.isRequestActive
221
+ getObservableForActiveRequest: fetchQueryInternal.getObservableForActiveRequest
210
222
  }
211
223
  };
@@ -10,6 +10,12 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
14
+
15
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
+
17
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
18
+
13
19
  var ConnectionHandler = require('../handlers/connection/ConnectionHandler');
14
20
 
15
21
  var warning = require("fbjs/lib/warning");
@@ -129,12 +135,12 @@ function rangeAdd(config, request) {
129
135
  }
130
136
 
131
137
  var serverEdge = payload.getLinkedRecord(edgeName);
132
- var _iteratorNormalCompletion = true;
133
- var _didIteratorError = false;
134
- var _iteratorError = undefined;
138
+
139
+ var _iterator = _createForOfIteratorHelper(connectionInfo),
140
+ _step;
135
141
 
136
142
  try {
137
- for (var _iterator = connectionInfo[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
143
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
138
144
  var info = _step.value;
139
145
 
140
146
  if (!serverEdge) {
@@ -168,18 +174,9 @@ function rangeAdd(config, request) {
168
174
  }
169
175
  }
170
176
  } catch (err) {
171
- _didIteratorError = true;
172
- _iteratorError = err;
177
+ _iterator.e(err);
173
178
  } finally {
174
- try {
175
- if (!_iteratorNormalCompletion && _iterator["return"] != null) {
176
- _iterator["return"]();
177
- }
178
- } finally {
179
- if (_didIteratorError) {
180
- throw _iteratorError;
181
- }
182
- }
179
+ _iterator.f();
183
180
  }
184
181
  };
185
182
  }
@@ -210,12 +207,11 @@ function rangeDelete(config, request) {
210
207
  var deletedIDField = data[rootField];
211
208
 
212
209
  if (deletedIDField && Array.isArray(deletedIDFieldName)) {
213
- var _iteratorNormalCompletion2 = true;
214
- var _didIteratorError2 = false;
215
- var _iteratorError2 = undefined;
210
+ var _iterator2 = _createForOfIteratorHelper(deletedIDFieldName),
211
+ _step2;
216
212
 
217
213
  try {
218
- for (var _iterator2 = deletedIDFieldName[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
214
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
219
215
  var eachField = _step2.value;
220
216
 
221
217
  if (deletedIDField && typeof deletedIDField === 'object') {
@@ -223,18 +219,9 @@ function rangeDelete(config, request) {
223
219
  }
224
220
  }
225
221
  } catch (err) {
226
- _didIteratorError2 = true;
227
- _iteratorError2 = err;
222
+ _iterator2.e(err);
228
223
  } finally {
229
- try {
230
- if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
231
- _iterator2["return"]();
232
- }
233
- } finally {
234
- if (_didIteratorError2) {
235
- throw _iteratorError2;
236
- }
237
- }
224
+ _iterator2.f();
238
225
  }
239
226
 
240
227
  if (Array.isArray(deletedIDField)) {
@@ -291,9 +278,8 @@ function deleteNode(parentID, connectionKeys, pathToConnection, store, deleteIDs
291
278
  return;
292
279
  }
293
280
 
294
- var _iteratorNormalCompletion3 = true;
295
- var _didIteratorError3 = false;
296
- var _iteratorError3 = undefined;
281
+ var _iterator3 = _createForOfIteratorHelper(connectionKeys),
282
+ _step3;
297
283
 
298
284
  try {
299
285
  var _loop = function _loop() {
@@ -307,22 +293,13 @@ function deleteNode(parentID, connectionKeys, pathToConnection, store, deleteIDs
307
293
  }
308
294
  };
309
295
 
310
- for (var _iterator3 = connectionKeys[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
296
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
311
297
  _loop();
312
298
  }
313
299
  } catch (err) {
314
- _didIteratorError3 = true;
315
- _iteratorError3 = err;
300
+ _iterator3.e(err);
316
301
  } finally {
317
- try {
318
- if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) {
319
- _iterator3["return"]();
320
- }
321
- } finally {
322
- if (_didIteratorError3) {
323
- throw _iteratorError3;
324
- }
325
- }
302
+ _iterator3.f();
326
303
  }
327
304
  }
328
305
 
@@ -24,9 +24,7 @@ var _require2 = require('../store/RelayStoreUtils'),
24
24
  * A helper class for manipulating a given record from a record source via an
25
25
  * imperative/OO-style API.
26
26
  */
27
- var RelayRecordProxy =
28
- /*#__PURE__*/
29
- function () {
27
+ var RelayRecordProxy = /*#__PURE__*/function () {
30
28
  function RelayRecordProxy(source, mutator, dataID) {
31
29
  this._dataID = dataID;
32
30
  this._mutator = mutator;
@@ -29,9 +29,7 @@ var _require = require('../store/RelayRecordState'),
29
29
  * - Modifications cause a fresh version of a record to be created in `sink`.
30
30
  * These sink records contain only modified fields.
31
31
  */
32
- var RelayRecordSourceMutator =
33
- /*#__PURE__*/
34
- function () {
32
+ var RelayRecordSourceMutator = /*#__PURE__*/function () {
35
33
  function RelayRecordSourceMutator(base, sink) {
36
34
  this.__sources = [sink, base];
37
35
  this._base = base;
@@ -29,9 +29,7 @@ var _require2 = require('../store/RelayStoreUtils'),
29
29
  *
30
30
  * A helper for manipulating a `RecordSource` via an imperative/OO-style API.
31
31
  */
32
- var RelayRecordSourceProxy =
33
- /*#__PURE__*/
34
- function () {
32
+ var RelayRecordSourceProxy = /*#__PURE__*/function () {
35
33
  function RelayRecordSourceProxy(mutator, getDataID, handlerProvider) {
36
34
  this.__mutator = mutator;
37
35
  this._handlerProvider = handlerProvider || null;
@@ -24,9 +24,7 @@ var _require = require('../store/RelayStoreUtils'),
24
24
  * complex arguments and it can be tedious to re-construct the correct sets of
25
25
  * arguments to pass to e.g. `getRoot().getLinkedRecord()`.
26
26
  */
27
- var RelayRecordSourceSelectorProxy =
28
- /*#__PURE__*/
29
- function () {
27
+ var RelayRecordSourceSelectorProxy = /*#__PURE__*/function () {
30
28
  function RelayRecordSourceSelectorProxy(mutator, recordSource, readSelector) {
31
29
  this.__mutator = mutator;
32
30
  this.__recordSource = recordSource;
@@ -16,8 +16,6 @@ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers
16
16
 
17
17
  var RelayDeclarativeMutationConfig = require('./RelayDeclarativeMutationConfig');
18
18
 
19
- var RelayFeatureFlags = require('../util/RelayFeatureFlags');
20
-
21
19
  var invariant = require("fbjs/lib/invariant");
22
20
 
23
21
  var isRelayModernEnvironment = require('../store/isRelayModernEnvironment');
@@ -55,11 +53,12 @@ function commitMutation(environment, config) {
55
53
  optimisticUpdater = config.optimisticUpdater,
56
54
  updater = config.updater;
57
55
  var configs = config.configs,
56
+ cacheConfig = config.cacheConfig,
58
57
  onError = config.onError,
59
58
  onUnsubscribe = config.onUnsubscribe,
60
59
  variables = config.variables,
61
60
  uploadables = config.uploadables;
62
- var operation = createOperationDescriptor(mutation, variables, RelayFeatureFlags.ENABLE_UNIQUE_MUTATION_ROOT ? generateUniqueClientID() : undefined); // TODO: remove this check after we fix flow.
61
+ var operation = createOperationDescriptor(mutation, variables, cacheConfig, generateUniqueClientID()); // TODO: remove this check after we fix flow.
63
62
 
64
63
  if (typeof optimisticResponse === 'function') {
65
64
  optimisticResponse = optimisticResponse();
@@ -12,10 +12,16 @@
12
12
 
13
13
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
15
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
+
17
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
18
+
19
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
16
20
 
17
21
  var warning = require("fbjs/lib/warning");
18
22
 
23
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
24
+
19
25
  var validateMutation = function validateMutation() {};
20
26
 
21
27
  if (process.env.NODE_ENV !== "production") {
@@ -41,7 +47,8 @@ if (process.env.NODE_ENV !== "production") {
41
47
  visitedPaths: new Set(),
42
48
  variables: variables || {},
43
49
  missingDiff: {},
44
- extraDiff: {}
50
+ extraDiff: {},
51
+ moduleImportPaths: new Set()
45
52
  };
46
53
  validateSelections(optimisticResponse, mutation.operation.selections, context);
47
54
  validateOptimisticResponse(optimisticResponse, context);
@@ -63,12 +70,14 @@ if (process.env.NODE_ENV !== "production") {
63
70
 
64
71
  case 'ScalarField':
65
72
  case 'LinkedField':
73
+ case 'FlightField':
66
74
  return validateField(optimisticResponse, selection, context);
67
75
 
68
76
  case 'InlineFragment':
69
77
  var type = selection.type;
78
+ var isConcreteType = selection.abstractKey == null;
70
79
  selection.selections.forEach(function (subselection) {
71
- if (optimisticResponse.__typename !== type) {
80
+ if (isConcreteType && optimisticResponse.__typename !== type) {
72
81
  return;
73
82
  }
74
83
 
@@ -77,11 +86,19 @@ if (process.env.NODE_ENV !== "production") {
77
86
  return;
78
87
 
79
88
  case 'ClientExtension':
89
+ selection.selections.forEach(function (subselection) {
90
+ validateSelection(optimisticResponse, subselection, context);
91
+ });
92
+ return;
93
+
80
94
  case 'ModuleImport':
95
+ return validateModuleImport(context);
96
+
81
97
  case 'LinkedHandle':
82
98
  case 'ScalarHandle':
83
99
  case 'Defer':
84
100
  case 'Stream':
101
+ case 'TypeDiscriminator':
85
102
  {
86
103
  // TODO(T35864292) - Add missing validations for these types
87
104
  return;
@@ -93,6 +110,10 @@ if (process.env.NODE_ENV !== "production") {
93
110
  }
94
111
  };
95
112
 
113
+ var validateModuleImport = function validateModuleImport(context) {
114
+ context.moduleImportPaths.add(context.path);
115
+ };
116
+
96
117
  var validateField = function validateField(optimisticResponse, field, context) {
97
118
  var fieldName = field.alias || field.name;
98
119
  var path = "".concat(context.path, ".").concat(fieldName);
@@ -100,7 +121,7 @@ if (process.env.NODE_ENV !== "production") {
100
121
 
101
122
  switch (field.kind) {
102
123
  case 'ScalarField':
103
- if (optimisticResponse.hasOwnProperty(fieldName) === false) {
124
+ if (hasOwnProperty.call(optimisticResponse, fieldName) === false) {
104
125
  addFieldToDiff(path, context.missingDiff, true);
105
126
  }
106
127
 
@@ -109,7 +130,7 @@ if (process.env.NODE_ENV !== "production") {
109
130
  case 'LinkedField':
110
131
  var selections = field.selections;
111
132
 
112
- if (optimisticResponse[fieldName] === null || Object.hasOwnProperty(fieldName) && optimisticResponse[fieldName] === undefined) {
133
+ if (optimisticResponse[fieldName] === null || hasOwnProperty.call(optimisticResponse, fieldName) && optimisticResponse[fieldName] === undefined) {
113
134
  return;
114
135
  }
115
136
 
@@ -117,7 +138,7 @@ if (process.env.NODE_ENV !== "production") {
117
138
  if (Array.isArray(optimisticResponse[fieldName])) {
118
139
  optimisticResponse[fieldName].forEach(function (r) {
119
140
  if (r !== null) {
120
- validateSelections(r, selections, (0, _objectSpread2["default"])({}, context, {
141
+ validateSelections(r, selections, _objectSpread(_objectSpread({}, context), {}, {
121
142
  path: path
122
143
  }));
123
144
  }
@@ -129,7 +150,7 @@ if (process.env.NODE_ENV !== "production") {
129
150
  }
130
151
  } else {
131
152
  if (optimisticResponse[fieldName] instanceof Object) {
132
- validateSelections(optimisticResponse[fieldName], selections, (0, _objectSpread2["default"])({}, context, {
153
+ validateSelections(optimisticResponse[fieldName], selections, _objectSpread(_objectSpread({}, context), {}, {
133
154
  path: path
134
155
  }));
135
156
  return;
@@ -139,6 +160,12 @@ if (process.env.NODE_ENV !== "production") {
139
160
  }
140
161
  }
141
162
 
163
+ case 'FlightField':
164
+ if (optimisticResponse[fieldName] === null || hasOwnProperty.call(optimisticResponse, fieldName) && optimisticResponse[fieldName] === undefined) {
165
+ return;
166
+ }
167
+
168
+ throw new Error('validateMutation: Flight fields are not compatible with ' + 'optimistic updates, as React does not have the component code ' + 'necessary to process new data on the client. Instead, you ' + 'should update your code to require a full refetch of the Flight ' + 'field so your UI can be updated.');
142
169
  }
143
170
  };
144
171
 
@@ -154,7 +181,11 @@ if (process.env.NODE_ENV !== "production") {
154
181
 
155
182
  Object.keys(optimisticResponse).forEach(function (key) {
156
183
  var value = optimisticResponse[key];
157
- var path = "".concat(context.path, ".").concat(key);
184
+ var path = "".concat(context.path, ".").concat(key); // if it's a module import path we don't have an ast so we cannot validate it
185
+
186
+ if (context.moduleImportPaths.has(path)) {
187
+ return;
188
+ }
158
189
 
159
190
  if (!context.visitedPaths.has(path)) {
160
191
  addFieldToDiff(path, context.extraDiff);
@@ -162,7 +193,7 @@ if (process.env.NODE_ENV !== "production") {
162
193
  }
163
194
 
164
195
  if (value instanceof Object) {
165
- validateOptimisticResponse(value, (0, _objectSpread2["default"])({}, context, {
196
+ validateOptimisticResponse(value, _objectSpread(_objectSpread({}, context), {}, {
166
197
  path: path
167
198
  }));
168
199
  }
@@ -30,9 +30,7 @@ var hostReportError = swallowError;
30
30
  * ESObservable: https://github.com/tc39/proposal-observable
31
31
  */
32
32
 
33
- var RelayObservable =
34
- /*#__PURE__*/
35
- function () {
33
+ var RelayObservable = /*#__PURE__*/function () {
36
34
  RelayObservable.create = function create(source) {
37
35
  return new RelayObservable(source);
38
36
  } // Use RelayObservable.create()
@@ -408,6 +406,9 @@ function () {
408
406
  /**
409
407
  * Returns a Promise which resolves when this Observable yields a first value
410
408
  * or when it completes with no value.
409
+ *
410
+ * NOTE: The source Observable is *NOT* canceled when the returned Promise
411
+ * resolves. The Observable is always run to completion.
411
412
  */
412
413
  ;
413
414
 
@@ -415,15 +416,14 @@ function () {
415
416
  var _this9 = this;
416
417
 
417
418
  return new Promise(function (resolve, reject) {
418
- var subscription;
419
+ var resolved = false;
419
420
 
420
421
  _this9.subscribe({
421
- start: function start(sub) {
422
- subscription = sub;
423
- },
424
422
  next: function next(val) {
425
- resolve(val);
426
- subscription.unsubscribe();
423
+ if (!resolved) {
424
+ resolved = true;
425
+ resolve(val);
426
+ }
427
427
  },
428
428
  error: reject,
429
429
  complete: resolve