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.
- package/handlers/RelayDefaultHandlerProvider.js.flow +47 -0
- package/handlers/connection/ConnectionHandler.js.flow +549 -0
- package/handlers/connection/ConnectionInterface.js.flow +92 -0
- package/handlers/connection/MutationHandlers.js.flow +199 -0
- package/index.js +1 -1
- package/index.js.flow +335 -0
- package/lib/handlers/RelayDefaultHandlerProvider.js +20 -0
- package/lib/handlers/connection/ConnectionHandler.js +1 -3
- package/lib/handlers/connection/MutationHandlers.js +212 -0
- package/lib/index.js +14 -2
- package/lib/mutations/RelayDeclarativeMutationConfig.js +22 -45
- package/lib/mutations/RelayRecordProxy.js +1 -3
- package/lib/mutations/RelayRecordSourceMutator.js +1 -3
- package/lib/mutations/RelayRecordSourceProxy.js +1 -3
- package/lib/mutations/RelayRecordSourceSelectorProxy.js +1 -3
- package/lib/mutations/commitMutation.js +2 -3
- package/lib/mutations/validateMutation.js +40 -9
- package/lib/network/RelayObservable.js +9 -9
- package/lib/network/RelayQueryResponseCache.js +8 -6
- package/lib/query/GraphQLTag.js +2 -1
- package/lib/query/PreloadableQueryRegistry.js +70 -0
- package/lib/query/fetchQuery.js +2 -3
- package/lib/query/fetchQueryInternal.js +5 -14
- package/lib/store/DataChecker.js +200 -71
- package/lib/store/RelayConcreteVariables.js +6 -2
- package/lib/store/RelayModernEnvironment.js +124 -65
- package/lib/store/RelayModernFragmentSpecResolver.js +19 -14
- package/lib/store/RelayModernOperationDescriptor.js +6 -5
- package/lib/store/RelayModernQueryExecutor.js +122 -73
- package/lib/store/RelayModernRecord.js +14 -9
- package/lib/store/RelayModernSelector.js +6 -2
- package/lib/store/RelayModernStore.js +281 -131
- package/lib/store/RelayOperationTracker.js +35 -78
- package/lib/store/RelayOptimisticRecordSource.js +7 -5
- package/lib/store/RelayPublishQueue.js +2 -4
- package/lib/store/RelayReader.js +304 -52
- package/lib/store/RelayRecordSource.js +1 -3
- package/lib/store/RelayRecordSourceMapImpl.js +13 -18
- package/lib/store/RelayReferenceMarker.js +125 -14
- package/lib/store/RelayResponseNormalizer.js +261 -66
- package/lib/store/RelayStoreReactFlightUtils.js +47 -0
- package/lib/store/RelayStoreUtils.js +1 -0
- package/lib/store/StoreInspector.js +8 -8
- package/lib/store/TypeID.js +28 -0
- package/lib/store/cloneRelayScalarHandleSourceField.js +44 -0
- package/lib/store/defaultRequiredFieldLogger.js +18 -0
- package/lib/store/normalizeRelayPayload.js +6 -2
- package/lib/store/readInlineData.js +1 -1
- package/lib/subscription/requestSubscription.js +4 -3
- package/lib/util/NormalizationNode.js +1 -5
- package/lib/util/RelayConcreteNode.js +11 -6
- package/lib/util/RelayError.js +39 -9
- package/lib/util/RelayFeatureFlags.js +6 -3
- package/lib/util/RelayReplaySubject.js +3 -3
- package/lib/util/createPayloadFor3DField.js +7 -2
- package/lib/util/getFragmentIdentifier.js +12 -3
- package/lib/util/getOperation.js +33 -0
- package/lib/util/getRequestIdentifier.js +2 -2
- package/lib/util/isEmptyObject.js +25 -0
- package/lib/util/recycleNodesInto.js +6 -7
- package/lib/util/reportMissingRequiredFields.js +48 -0
- package/mutations/RelayDeclarativeMutationConfig.js.flow +380 -0
- package/mutations/RelayRecordProxy.js.flow +165 -0
- package/mutations/RelayRecordSourceMutator.js.flow +238 -0
- package/mutations/RelayRecordSourceProxy.js.flow +164 -0
- package/mutations/RelayRecordSourceSelectorProxy.js.flow +119 -0
- package/mutations/applyOptimisticMutation.js.flow +76 -0
- package/mutations/commitLocalUpdate.js.flow +24 -0
- package/mutations/commitMutation.js.flow +181 -0
- package/mutations/validateMutation.js.flow +242 -0
- package/network/ConvertToExecuteFunction.js.flow +49 -0
- package/network/RelayNetwork.js.flow +84 -0
- package/network/RelayNetworkTypes.js.flow +145 -0
- package/network/RelayObservable.js.flow +634 -0
- package/network/RelayQueryResponseCache.js.flow +111 -0
- package/package.json +2 -2
- package/query/GraphQLTag.js.flow +168 -0
- package/query/PreloadableQueryRegistry.js.flow +65 -0
- package/query/fetchQuery.js.flow +47 -0
- package/query/fetchQueryInternal.js.flow +343 -0
- package/relay-runtime.js +2 -2
- package/relay-runtime.min.js +2 -2
- package/store/ClientID.js.flow +43 -0
- package/store/DataChecker.js.flow +568 -0
- package/store/RelayConcreteVariables.js.flow +96 -0
- package/store/RelayModernEnvironment.js.flow +571 -0
- package/store/RelayModernFragmentSpecResolver.js.flow +438 -0
- package/store/RelayModernOperationDescriptor.js.flow +92 -0
- package/store/RelayModernQueryExecutor.js.flow +1345 -0
- package/store/RelayModernRecord.js.flow +403 -0
- package/store/RelayModernSelector.js.flow +455 -0
- package/store/RelayModernStore.js.flow +858 -0
- package/store/RelayOperationTracker.js.flow +164 -0
- package/store/RelayOptimisticRecordSource.js.flow +119 -0
- package/store/RelayPublishQueue.js.flow +401 -0
- package/store/RelayReader.js.flow +638 -0
- package/store/RelayRecordSource.js.flow +29 -0
- package/store/RelayRecordSourceMapImpl.js.flow +87 -0
- package/store/RelayRecordState.js.flow +37 -0
- package/store/RelayReferenceMarker.js.flow +324 -0
- package/store/RelayResponseNormalizer.js.flow +791 -0
- package/store/RelayStoreReactFlightUtils.js.flow +64 -0
- package/store/RelayStoreTypes.js.flow +958 -0
- package/store/RelayStoreUtils.js.flow +219 -0
- package/store/StoreInspector.js.flow +171 -0
- package/store/TypeID.js.flow +28 -0
- package/store/ViewerPattern.js.flow +26 -0
- package/store/cloneRelayHandleSourceField.js.flow +66 -0
- package/store/cloneRelayScalarHandleSourceField.js.flow +62 -0
- package/store/createFragmentSpecResolver.js.flow +55 -0
- package/store/createRelayContext.js.flow +44 -0
- package/store/defaultGetDataID.js.flow +27 -0
- package/store/defaultRequiredFieldLogger.js.flow +23 -0
- package/store/hasOverlappingIDs.js.flow +34 -0
- package/store/isRelayModernEnvironment.js.flow +27 -0
- package/store/normalizeRelayPayload.js.flow +51 -0
- package/store/readInlineData.js.flow +75 -0
- package/subscription/requestSubscription.js.flow +103 -0
- package/util/JSResourceTypes.flow.js.flow +20 -0
- package/util/NormalizationNode.js.flow +213 -0
- package/util/ReaderNode.js.flow +227 -0
- package/util/RelayConcreteNode.js.flow +99 -0
- package/util/RelayDefaultHandleKey.js.flow +17 -0
- package/util/RelayError.js.flow +62 -0
- package/util/RelayFeatureFlags.js.flow +37 -0
- package/util/RelayProfiler.js.flow +284 -0
- package/util/RelayReplaySubject.js.flow +135 -0
- package/util/RelayRuntimeTypes.js.flow +72 -0
- package/util/createPayloadFor3DField.js.flow +43 -0
- package/util/deepFreeze.js.flow +36 -0
- package/util/generateID.js.flow +21 -0
- package/util/getFragmentIdentifier.js.flow +76 -0
- package/util/getOperation.js.flow +40 -0
- package/util/getRelayHandleKey.js.flow +41 -0
- package/util/getRequestIdentifier.js.flow +42 -0
- package/util/isEmptyObject.js.flow +25 -0
- package/util/isPromise.js.flow +21 -0
- package/util/isScalarAndEqual.js.flow +26 -0
- package/util/recycleNodesInto.js.flow +87 -0
- package/util/reportMissingRequiredFields.js.flow +51 -0
- package/util/resolveImmediate.js.flow +30 -0
- 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
|
-
|
|
133
|
-
var
|
|
134
|
-
|
|
138
|
+
|
|
139
|
+
var _iterator = _createForOfIteratorHelper(connectionInfo),
|
|
140
|
+
_step;
|
|
135
141
|
|
|
136
142
|
try {
|
|
137
|
-
for (
|
|
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
|
-
|
|
172
|
-
_iteratorError = err;
|
|
177
|
+
_iterator.e(err);
|
|
173
178
|
} finally {
|
|
174
|
-
|
|
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
|
|
214
|
-
|
|
215
|
-
var _iteratorError2 = undefined;
|
|
210
|
+
var _iterator2 = _createForOfIteratorHelper(deletedIDFieldName),
|
|
211
|
+
_step2;
|
|
216
212
|
|
|
217
213
|
try {
|
|
218
|
-
for (
|
|
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
|
-
|
|
227
|
-
_iteratorError2 = err;
|
|
222
|
+
_iterator2.e(err);
|
|
228
223
|
} finally {
|
|
229
|
-
|
|
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
|
|
295
|
-
|
|
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 (
|
|
296
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
311
297
|
_loop();
|
|
312
298
|
}
|
|
313
299
|
} catch (err) {
|
|
314
|
-
|
|
315
|
-
_iteratorError3 = err;
|
|
300
|
+
_iterator3.e(err);
|
|
316
301
|
} finally {
|
|
317
|
-
|
|
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,
|
|
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
|
|
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 (
|
|
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 ||
|
|
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, (
|
|
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, (
|
|
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, (
|
|
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
|
|
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
|
-
|
|
426
|
-
|
|
423
|
+
if (!resolved) {
|
|
424
|
+
resolved = true;
|
|
425
|
+
resolve(val);
|
|
426
|
+
}
|
|
427
427
|
},
|
|
428
428
|
error: reject,
|
|
429
429
|
complete: resolve
|