react-relay 2.0.0-rc.2 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +2 -2
- package/lib/ReactRelayContext.js +6 -3
- package/lib/ReactRelayFragmentContainer.js +48 -46
- package/lib/ReactRelayFragmentMockRenderer.js +5 -1
- package/lib/ReactRelayPaginationContainer.js +102 -68
- package/lib/ReactRelayQueryFetcher.js +54 -28
- package/lib/ReactRelayQueryRenderer.js +28 -20
- package/lib/ReactRelayRefetchContainer.js +70 -58
- package/lib/ReactRelayTestMocker.js +56 -43
- package/lib/ReactRelayTypes.js +1 -1
- package/lib/RelayContext.js +8 -2
- package/lib/assertFragmentMap.js +9 -7
- package/lib/buildReactRelayContainer.js +32 -23
- package/lib/index.js +41 -0
- package/lib/isRelayEnvironment.js +1 -1
- package/lib/isRelayVariables.js +1 -1
- package/lib/readContext.js +7 -4
- package/package.json +4 -4
- package/react-relay.js +2 -2
- package/react-relay.min.js +2 -2
- package/classic.js +0 -10
- package/compat.js +0 -10
- package/lib/ConcreteQuery.js +0 -10
- package/lib/GraphQLQueryRunner.js +0 -264
- package/lib/GraphQLRange.js +0 -1124
- package/lib/GraphQLSegment.js +0 -743
- package/lib/GraphQLStoreChangeEmitter.js +0 -141
- package/lib/GraphQLStoreQueryResolver.js +0 -288
- package/lib/GraphQLStoreRangeUtils.js +0 -126
- package/lib/QueryBuilder.js +0 -228
- package/lib/ReactRelayClassicExports.js +0 -29
- package/lib/ReactRelayCompatContainerBuilder.js +0 -175
- package/lib/ReactRelayCompatPublic.js +0 -28
- package/lib/ReactRelayContainerProfiler.js +0 -30
- package/lib/ReactRelayFragmentContainer-flowtest.js +0 -201
- package/lib/ReactRelayPaginationContainer-flowtest.js +0 -213
- package/lib/ReactRelayPublic.js +0 -29
- package/lib/ReactRelayRefetchContainer-flowtest.js +0 -191
- package/lib/RelayCacheProcessor.js +0 -196
- package/lib/RelayChangeTracker.js +0 -83
- package/lib/RelayClassicContainerUtils.js +0 -49
- package/lib/RelayClassicCore.js +0 -34
- package/lib/RelayClassicRecordState.js +0 -31
- package/lib/RelayCompatContainer.js +0 -25
- package/lib/RelayCompatEnvironment.js +0 -27
- package/lib/RelayCompatMutations.js +0 -133
- package/lib/RelayCompatPaginationContainer.js +0 -27
- package/lib/RelayCompatRefetchContainer.js +0 -27
- package/lib/RelayCompatTypes.js +0 -10
- package/lib/RelayContainer.js +0 -889
- package/lib/RelayContainerComparators.js +0 -75
- package/lib/RelayContainerProxy.js +0 -21
- package/lib/RelayDefaultNetworkLayer.js +0 -192
- package/lib/RelayEnvironment.js +0 -449
- package/lib/RelayEnvironmentTypes.js +0 -10
- package/lib/RelayFetchMode.js +0 -17
- package/lib/RelayFragmentPointer.js +0 -161
- package/lib/RelayFragmentReference.js +0 -249
- package/lib/RelayFragmentSpecResolver.js +0 -305
- package/lib/RelayGraphQLMutation.js +0 -288
- package/lib/RelayGraphQLTag.js +0 -42
- package/lib/RelayInternalTypes.js +0 -15
- package/lib/RelayInternals.js +0 -24
- package/lib/RelayMetaRoute.js +0 -35
- package/lib/RelayMockRenderer.js +0 -71
- package/lib/RelayModern-flowtest.js +0 -342
- package/lib/RelayModernFlowtest_badref.graphql.js +0 -10
- package/lib/RelayModernFlowtest_notref.graphql.js +0 -10
- package/lib/RelayModernFlowtest_user.graphql.js +0 -10
- package/lib/RelayModernFlowtest_users.graphql.js +0 -10
- package/lib/RelayMutation.js +0 -322
- package/lib/RelayMutationDebugPrinter.js +0 -47
- package/lib/RelayMutationQuery.js +0 -558
- package/lib/RelayMutationQueue.js +0 -530
- package/lib/RelayMutationRequest.js +0 -103
- package/lib/RelayMutationTracker.js +0 -113
- package/lib/RelayMutationTransaction.js +0 -92
- package/lib/RelayMutationTransactionStatus.js +0 -55
- package/lib/RelayNetworkDebug.js +0 -131
- package/lib/RelayNetworkLayer.js +0 -185
- package/lib/RelayNodeInterface.js +0 -104
- package/lib/RelayOperationDescriptor.js +0 -40
- package/lib/RelayOptimisticMutationUtils.js +0 -208
- package/lib/RelayPendingQueryTracker.js +0 -166
- package/lib/RelayPropTypes.js +0 -57
- package/lib/RelayPublic.js +0 -44
- package/lib/RelayQL.js +0 -128
- package/lib/RelayQuery.js +0 -1584
- package/lib/RelayQueryCaching.js +0 -33
- package/lib/RelayQueryConfig.js +0 -58
- package/lib/RelayQueryPath.js +0 -204
- package/lib/RelayQueryRequest.js +0 -103
- package/lib/RelayQueryTracker.js +0 -86
- package/lib/RelayQueryTransform.js +0 -91
- package/lib/RelayQueryVisitor.js +0 -93
- package/lib/RelayQueryWriter.js +0 -573
- package/lib/RelayReadyState.js +0 -83
- package/lib/RelayReadyStateRenderer.js +0 -145
- package/lib/RelayRecord.js +0 -75
- package/lib/RelayRecordStatusMap.js +0 -57
- package/lib/RelayRecordStore.js +0 -433
- package/lib/RelayRecordWriter.js +0 -601
- package/lib/RelayRefQueryDescriptor.js +0 -27
- package/lib/RelayRenderer.js +0 -268
- package/lib/RelayRootContainer.js +0 -125
- package/lib/RelayRoute.js +0 -92
- package/lib/RelayRouteFragment.js +0 -44
- package/lib/RelaySelector.js +0 -201
- package/lib/RelayShallowMock.js +0 -69
- package/lib/RelayStaticContainer.js +0 -38
- package/lib/RelayStore.js +0 -12
- package/lib/RelayStoreConstants.js +0 -20
- package/lib/RelayStoreData.js +0 -660
- package/lib/RelayTaskQueue.js +0 -189
- package/lib/RelayTypes.js +0 -13
- package/lib/RelayVariable.js +0 -32
- package/lib/RelayVariables.js +0 -92
- package/lib/buildRQL.js +0 -160
- package/lib/callsFromGraphQL.js +0 -74
- package/lib/callsToGraphQL.js +0 -34
- package/lib/checkRelayQueryData.js +0 -250
- package/lib/createRelayQuery.js +0 -17
- package/lib/dedent.js +0 -49
- package/lib/diffRelayQuery.js +0 -757
- package/lib/directivesToGraphQL.js +0 -39
- package/lib/filterRelayQuery.js +0 -29
- package/lib/findRelayQueryLeaves.js +0 -293
- package/lib/flattenRelayQuery.js +0 -121
- package/lib/flattenSplitRelayQueries.js +0 -44
- package/lib/forEachRootCallArg.js +0 -40
- package/lib/fromGraphQL.js +0 -48
- package/lib/generateClientEdgeID.js +0 -22
- package/lib/generateClientID.js +0 -27
- package/lib/generateConcreteFragmentID.js +0 -30
- package/lib/generateForceIndex.js +0 -24
- package/lib/generateRQLFieldAlias.js +0 -39
- package/lib/getRangeBehavior.js +0 -58
- package/lib/getRelayQueries.js +0 -83
- package/lib/intersectRelayQuery.js +0 -149
- package/lib/isClassicRelayContext.js +0 -20
- package/lib/isClassicRelayEnvironment.js +0 -20
- package/lib/isCompatibleRelayFragmentType.js +0 -27
- package/lib/isRelayContainer.js +0 -16
- package/lib/makeLegacyStringishComponentRef.js +0 -52
- package/lib/printRelayOSSQuery.js +0 -329
- package/lib/printRelayQuery.js +0 -26
- package/lib/rangeOperationToMetadataKey.js +0 -25
- package/lib/readRelayQueryData.js +0 -551
- package/lib/relayUnstableBatchedUpdates.js +0 -12
- package/lib/relayUnstableBatchedUpdates.native.js +0 -11
- package/lib/restoreRelayCacheData.js +0 -188
- package/lib/serializeRelayQueryCall.js +0 -42
- package/lib/splitDeferredRelayQueries.js +0 -298
- package/lib/stableStringify.js +0 -85
- package/lib/testEditDistance.js +0 -112
- package/lib/throwFailedPromise.js +0 -26
- package/lib/toGraphQL.js +0 -94
- package/lib/transformRelayQueryPayload.js +0 -145
- package/lib/validateMutationConfig.js +0 -117
- package/lib/validateRelayReadQuery.js +0 -112
- package/lib/writeRelayQueryPayload.js +0 -44
- package/lib/writeRelayUpdatePayload.js +0 -513
- package/react-relay-classic.js +0 -4
- package/react-relay-classic.min.js +0 -9
- package/react-relay-compat.js +0 -4
- package/react-relay-compat.min.js +0 -9
package/lib/GraphQLSegment.js
DELETED
|
@@ -1,743 +0,0 @@
|
|
|
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
|
-
* @format
|
|
8
|
-
*/
|
|
9
|
-
'use strict';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Represents one contiguous segment of edges within a `GraphQLRange`. Has
|
|
13
|
-
* methods for adding/removing edges (`appendEdge`, `prependEdge`, `removeEdge`)
|
|
14
|
-
* and working with cursors (`getFirstCursor`, `getLastCursor` etc)
|
|
15
|
-
*
|
|
16
|
-
* Edges are never actually deleted from segments; they are merely marked as
|
|
17
|
-
* being deleted. As such, `GraphQLSegment` offers both a `getCount` method
|
|
18
|
-
* (returning the number of non-deleted edges) and a `getLength` method (which
|
|
19
|
-
* returns the total number, including deleted edges).
|
|
20
|
-
*
|
|
21
|
-
* Used mostly as an implementation detail internal to `GraphQLRange`.
|
|
22
|
-
*
|
|
23
|
-
* @internal
|
|
24
|
-
*/
|
|
25
|
-
var GraphQLSegment =
|
|
26
|
-
/*#__PURE__*/
|
|
27
|
-
function () {
|
|
28
|
-
function GraphQLSegment() {
|
|
29
|
-
// We use a map rather than an array because indices can become negative
|
|
30
|
-
// when prepending.
|
|
31
|
-
this._indexToMetadataMap = {}; // We keep track of past indices to ensure we can delete them completely.
|
|
32
|
-
|
|
33
|
-
this._idToIndicesMap = {};
|
|
34
|
-
this._cursorToIndexMap = {};
|
|
35
|
-
this._count = 0;
|
|
36
|
-
this._minIndex = null;
|
|
37
|
-
this._maxIndex = null;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* @param {string} cursor
|
|
41
|
-
* @return {?number}
|
|
42
|
-
*/
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
var _proto = GraphQLSegment.prototype;
|
|
46
|
-
|
|
47
|
-
_proto._getIndexForCursor = function _getIndexForCursor(cursor) {
|
|
48
|
-
return this._cursorToIndexMap[cursor];
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* @param {string} id
|
|
52
|
-
* @return {?number}
|
|
53
|
-
*/
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
_proto._getIndexForID = function _getIndexForID(id) {
|
|
57
|
-
var indices = this._idToIndicesMap[id];
|
|
58
|
-
return indices && indices[0];
|
|
59
|
-
};
|
|
60
|
-
/**
|
|
61
|
-
* @return {?string} cursor for first non-deleted edge
|
|
62
|
-
*/
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
_proto.getFirstCursor = function getFirstCursor() {
|
|
66
|
-
if (this.getLength()) {
|
|
67
|
-
for (var ii = this._minIndex; ii <= this._maxIndex; ii++) {
|
|
68
|
-
var metadata = this._indexToMetadataMap[ii];
|
|
69
|
-
|
|
70
|
-
if (!metadata.deleted) {
|
|
71
|
-
return metadata.cursor;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
/**
|
|
77
|
-
* @return {?string} cursor for last non-deleted edge
|
|
78
|
-
*/
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
_proto.getLastCursor = function getLastCursor() {
|
|
82
|
-
if (this.getLength()) {
|
|
83
|
-
for (var ii = this._maxIndex; ii >= this._minIndex; ii--) {
|
|
84
|
-
var metadata = this._indexToMetadataMap[ii];
|
|
85
|
-
|
|
86
|
-
if (!metadata.deleted) {
|
|
87
|
-
return metadata.cursor;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
/**
|
|
93
|
-
* @return {boolean} returns whether cursor is before the first non-deleted
|
|
94
|
-
* cursor inclusively.
|
|
95
|
-
*/
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
_proto.isFirstCursor = function isFirstCursor(cursor) {
|
|
99
|
-
if (this.getLength()) {
|
|
100
|
-
for (var ii = this._minIndex; ii <= this._maxIndex; ii++) {
|
|
101
|
-
var metadata = this._indexToMetadataMap[ii];
|
|
102
|
-
|
|
103
|
-
if (!metadata.deleted) {
|
|
104
|
-
return metadata.cursor === cursor;
|
|
105
|
-
} else if (metadata.cursor === cursor) {
|
|
106
|
-
return true;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
/**
|
|
114
|
-
* @return {boolean} returns whether cursor is after the last non-deleted
|
|
115
|
-
* cursor inclusively.
|
|
116
|
-
*/
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
_proto.isLastCursor = function isLastCursor(cursor) {
|
|
120
|
-
if (this.getLength()) {
|
|
121
|
-
for (var ii = this._maxIndex; ii >= this._minIndex; ii--) {
|
|
122
|
-
var metadata = this._indexToMetadataMap[ii];
|
|
123
|
-
|
|
124
|
-
if (!metadata.deleted) {
|
|
125
|
-
return metadata.cursor === cursor;
|
|
126
|
-
} else if (metadata.cursor === cursor) {
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return false;
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
/**
|
|
135
|
-
* @return {?string} id for first non-deleted edge
|
|
136
|
-
*/
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
_proto.getFirstID = function getFirstID() {
|
|
140
|
-
if (this.getLength()) {
|
|
141
|
-
for (var ii = this._minIndex; ii <= this._maxIndex; ii++) {
|
|
142
|
-
var metadata = this._indexToMetadataMap[ii];
|
|
143
|
-
|
|
144
|
-
if (!metadata.deleted) {
|
|
145
|
-
return metadata.edgeID;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
/**
|
|
151
|
-
* @return {?string} id for last non-deleted edge
|
|
152
|
-
*/
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
_proto.getLastID = function getLastID() {
|
|
156
|
-
if (this.getLength()) {
|
|
157
|
-
for (var ii = this._maxIndex; ii >= this._minIndex; ii--) {
|
|
158
|
-
var metadata = this._indexToMetadataMap[ii];
|
|
159
|
-
|
|
160
|
-
if (!metadata.deleted) {
|
|
161
|
-
return metadata.edgeID;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
/**
|
|
167
|
-
* @param {number} index
|
|
168
|
-
* @return {?object} Returns the not-deleted edge at index
|
|
169
|
-
*/
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
_proto._getEdgeAtIndex = function _getEdgeAtIndex(index) {
|
|
173
|
-
var edge = this._indexToMetadataMap[index];
|
|
174
|
-
return edge && !edge.deleted ? edge : null;
|
|
175
|
-
};
|
|
176
|
-
/**
|
|
177
|
-
* Returns whether there is a non-deleted edge for id
|
|
178
|
-
* @param {string} id
|
|
179
|
-
* @return {boolean}
|
|
180
|
-
*/
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
_proto.containsEdgeWithID = function containsEdgeWithID(id) {
|
|
184
|
-
var index = this._getIndexForID(id);
|
|
185
|
-
|
|
186
|
-
if (index === undefined) {
|
|
187
|
-
return false;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
return !!this._getEdgeAtIndex(index);
|
|
191
|
-
};
|
|
192
|
-
/**
|
|
193
|
-
* Returns whether there is a non-deleted edge for cursor
|
|
194
|
-
* @param {string} cursor
|
|
195
|
-
* @param {?boolean} includeDeleted
|
|
196
|
-
* @return {boolean}
|
|
197
|
-
*/
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
_proto.containsEdgeWithCursor = function containsEdgeWithCursor(cursor) {
|
|
201
|
-
var includeDeleted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
202
|
-
|
|
203
|
-
var index = this._getIndexForCursor(cursor);
|
|
204
|
-
|
|
205
|
-
if (index === undefined) {
|
|
206
|
-
return false;
|
|
207
|
-
} else if (includeDeleted) {
|
|
208
|
-
return true;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
return !!this._getEdgeAtIndex(index);
|
|
212
|
-
};
|
|
213
|
-
/**
|
|
214
|
-
* Returns up to count number of ids and cursors that is after input cursor
|
|
215
|
-
* @param {number} count
|
|
216
|
-
* @param {?string} cursor
|
|
217
|
-
* @return {object} object with arrays of ids and cursors
|
|
218
|
-
*/
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
_proto.getMetadataAfterCursor = function getMetadataAfterCursor(count, cursor) {
|
|
222
|
-
if (!this.getLength()) {
|
|
223
|
-
return {
|
|
224
|
-
edgeIDs: [],
|
|
225
|
-
cursors: []
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
var currentIndex = this._minIndex;
|
|
230
|
-
|
|
231
|
-
if (cursor) {
|
|
232
|
-
var index = this._getIndexForCursor(cursor);
|
|
233
|
-
|
|
234
|
-
if (index === undefined) {
|
|
235
|
-
console.warn('This segment does not have a cursor %s', cursor);
|
|
236
|
-
return {
|
|
237
|
-
edgeIDs: [],
|
|
238
|
-
cursors: []
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
currentIndex = index + 1;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
var total = 0;
|
|
246
|
-
var edgeIDs = [];
|
|
247
|
-
var cursors = [];
|
|
248
|
-
|
|
249
|
-
while (currentIndex <= this._maxIndex && total < count) {
|
|
250
|
-
var metadata = this._indexToMetadataMap[currentIndex];
|
|
251
|
-
|
|
252
|
-
if (!metadata.deleted) {
|
|
253
|
-
edgeIDs.push(metadata.edgeID);
|
|
254
|
-
cursors.push(metadata.cursor);
|
|
255
|
-
total++;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
currentIndex++;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
return {
|
|
262
|
-
edgeIDs: edgeIDs,
|
|
263
|
-
cursors: cursors
|
|
264
|
-
};
|
|
265
|
-
};
|
|
266
|
-
/**
|
|
267
|
-
* Returns up to count number of ids and cursors that is before index
|
|
268
|
-
* @param {number} count
|
|
269
|
-
* @param {?string} cursor
|
|
270
|
-
* @return {object} object with arrays of ids and cursors
|
|
271
|
-
*/
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
_proto.getMetadataBeforeCursor = function getMetadataBeforeCursor(count, cursor) {
|
|
275
|
-
if (!this.getLength()) {
|
|
276
|
-
return {
|
|
277
|
-
edgeIDs: [],
|
|
278
|
-
cursors: []
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
var currentIndex = this._maxIndex;
|
|
283
|
-
|
|
284
|
-
if (cursor) {
|
|
285
|
-
var index = this._getIndexForCursor(cursor);
|
|
286
|
-
|
|
287
|
-
if (index === undefined) {
|
|
288
|
-
console.warn('This segment does not have a cursor %s', cursor);
|
|
289
|
-
return {
|
|
290
|
-
edgeIDs: [],
|
|
291
|
-
cursors: []
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
currentIndex = index - 1;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
var total = 0;
|
|
299
|
-
var edgeIDs = [];
|
|
300
|
-
var cursors = [];
|
|
301
|
-
|
|
302
|
-
while (currentIndex >= this._minIndex && total < count) {
|
|
303
|
-
var metadata = this._indexToMetadataMap[currentIndex];
|
|
304
|
-
|
|
305
|
-
if (!metadata.deleted) {
|
|
306
|
-
edgeIDs.push(metadata.edgeID);
|
|
307
|
-
cursors.push(metadata.cursor);
|
|
308
|
-
total++;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
currentIndex--;
|
|
312
|
-
} // Reverse edges because larger index were added first
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
return {
|
|
316
|
-
edgeIDs: edgeIDs.reverse(),
|
|
317
|
-
cursors: cursors.reverse()
|
|
318
|
-
};
|
|
319
|
-
};
|
|
320
|
-
/**
|
|
321
|
-
* @param {object} edge
|
|
322
|
-
* @param {number} index
|
|
323
|
-
*/
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
_proto._addEdgeAtIndex = function _addEdgeAtIndex(edge, index) {
|
|
327
|
-
var edgeID = require("./RelayRecord").getDataIDForObject(edge);
|
|
328
|
-
|
|
329
|
-
var cursor = edge.cursor;
|
|
330
|
-
|
|
331
|
-
var idIndex = this._getIndexForID(edgeID); // If the id is has an index and is not deleted
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
if (idIndex !== undefined && this._getEdgeAtIndex(idIndex)) {
|
|
335
|
-
console.warn('Attempted to add an ID already in GraphQLSegment: %s', edgeID);
|
|
336
|
-
return;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
if (this.getLength() === 0) {
|
|
340
|
-
this._minIndex = index;
|
|
341
|
-
this._maxIndex = index;
|
|
342
|
-
} else if (this._minIndex === index + 1) {
|
|
343
|
-
this._minIndex = index;
|
|
344
|
-
} else if (this._maxIndex === index - 1) {
|
|
345
|
-
this._maxIndex = index;
|
|
346
|
-
} else {
|
|
347
|
-
console.warn("Attempted to add noncontiguous index to GraphQLSegment: ".concat(index, " to ") + "(".concat(this._minIndex, ", ").concat(this._maxIndex, ")"));
|
|
348
|
-
return;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
this._indexToMetadataMap[index] = {
|
|
352
|
-
edgeID: edgeID,
|
|
353
|
-
cursor: cursor,
|
|
354
|
-
deleted: false
|
|
355
|
-
};
|
|
356
|
-
this._idToIndicesMap[edgeID] = this._idToIndicesMap[edgeID] || [];
|
|
357
|
-
|
|
358
|
-
this._idToIndicesMap[edgeID].unshift(index);
|
|
359
|
-
|
|
360
|
-
this._count++;
|
|
361
|
-
|
|
362
|
-
if (cursor) {
|
|
363
|
-
this._cursorToIndexMap[cursor] = index;
|
|
364
|
-
}
|
|
365
|
-
};
|
|
366
|
-
/**
|
|
367
|
-
* @param {object} edge should have cursor and a node with id
|
|
368
|
-
*/
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
_proto.prependEdge = function prependEdge(edge) {
|
|
372
|
-
this._addEdgeAtIndex(edge, this._minIndex !== null ? this._minIndex - 1 : 0);
|
|
373
|
-
};
|
|
374
|
-
/**
|
|
375
|
-
* @param {object} edge should have cursor and a node with id
|
|
376
|
-
*/
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
_proto.appendEdge = function appendEdge(edge) {
|
|
380
|
-
this._addEdgeAtIndex(edge, this._maxIndex !== null ? this._maxIndex + 1 : 0);
|
|
381
|
-
};
|
|
382
|
-
/**
|
|
383
|
-
* Mark the currently valid edge with given id to be deleted.
|
|
384
|
-
*
|
|
385
|
-
* @param {string} id the id of the edge to be removed
|
|
386
|
-
*/
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
_proto.removeEdge = function removeEdge(id) {
|
|
390
|
-
var index = this._getIndexForID(id);
|
|
391
|
-
|
|
392
|
-
if (index === undefined) {
|
|
393
|
-
console.warn('Attempted to remove edge with ID that was never in GraphQLSegment: ' + id);
|
|
394
|
-
return;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
var data = this._indexToMetadataMap[index];
|
|
398
|
-
|
|
399
|
-
if (data.deleted) {
|
|
400
|
-
console.warn('Attempted to remove edge with ID that was already removed: ' + id);
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
data.deleted = true;
|
|
405
|
-
this._count--;
|
|
406
|
-
};
|
|
407
|
-
/**
|
|
408
|
-
* Mark all edges with given id to be deleted. This is used by
|
|
409
|
-
* delete mutations to ensure both the current and past edges are no longer
|
|
410
|
-
* accessible.
|
|
411
|
-
*
|
|
412
|
-
* @param {string} id the id of the edge to be removed
|
|
413
|
-
*/
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
_proto.removeAllEdges = function removeAllEdges(id) {
|
|
417
|
-
var indices = this._idToIndicesMap[id];
|
|
418
|
-
|
|
419
|
-
if (!indices) {
|
|
420
|
-
return;
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
for (var ii = 0; ii < indices.length; ii++) {
|
|
424
|
-
var data = this._indexToMetadataMap[indices[ii]];
|
|
425
|
-
|
|
426
|
-
if (!data.deleted) {
|
|
427
|
-
data.deleted = true;
|
|
428
|
-
this._count--;
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
};
|
|
432
|
-
/**
|
|
433
|
-
* @param {array} edges
|
|
434
|
-
* @param {?string} cursor
|
|
435
|
-
*/
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
_proto.addEdgesAfterCursor = function addEdgesAfterCursor(edges, cursor) {
|
|
439
|
-
if (!edges.length) {
|
|
440
|
-
return;
|
|
441
|
-
} // Default adding after with no cursor to -1
|
|
442
|
-
// So the first element in the segment is stored at index 0
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
var index = -1;
|
|
446
|
-
|
|
447
|
-
if (cursor) {
|
|
448
|
-
index = this._getIndexForCursor(cursor);
|
|
449
|
-
|
|
450
|
-
if (index === undefined) {
|
|
451
|
-
console.warn('This segment does not have a cursor %s', cursor);
|
|
452
|
-
return;
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
while (this._maxIndex !== null && index < this._maxIndex) {
|
|
457
|
-
var data = this._indexToMetadataMap[index + 1]; // Skip over elements that have been deleted
|
|
458
|
-
// so we can add new edges on the end.
|
|
459
|
-
|
|
460
|
-
if (data.deleted) {
|
|
461
|
-
index++;
|
|
462
|
-
} else {
|
|
463
|
-
console.warn('Attempted to do an overwrite to GraphQLSegment: ' + 'last index is ' + this._maxIndex + ' trying to add edges before ' + index);
|
|
464
|
-
return;
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
var startIndex = index + 1;
|
|
469
|
-
|
|
470
|
-
for (var ii = 0; ii < edges.length; ii++) {
|
|
471
|
-
var edge = edges[ii];
|
|
472
|
-
|
|
473
|
-
this._addEdgeAtIndex(edge, startIndex + ii);
|
|
474
|
-
}
|
|
475
|
-
};
|
|
476
|
-
/**
|
|
477
|
-
* @param {array} edges - should be in increasing order of index
|
|
478
|
-
* @param {?string} cursor
|
|
479
|
-
*/
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
_proto.addEdgesBeforeCursor = function addEdgesBeforeCursor(edges, cursor) {
|
|
483
|
-
if (!edges.length) {
|
|
484
|
-
return;
|
|
485
|
-
} // Default adding before with no cursor to 1
|
|
486
|
-
// So the first element in the segment is stored at index 0
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
var index = 1;
|
|
490
|
-
|
|
491
|
-
if (cursor) {
|
|
492
|
-
index = this._getIndexForCursor(cursor);
|
|
493
|
-
|
|
494
|
-
if (index === undefined) {
|
|
495
|
-
console.warn('This segment does not have a cursor %s', cursor);
|
|
496
|
-
return;
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
while (this._minIndex !== null && index > this._minIndex) {
|
|
501
|
-
var data = this._indexToMetadataMap[index - 1]; // Skip over elements that have been deleted
|
|
502
|
-
// so we can add new edges in the front.
|
|
503
|
-
|
|
504
|
-
if (data.deleted) {
|
|
505
|
-
index--;
|
|
506
|
-
} else {
|
|
507
|
-
console.warn('Attempted to do an overwrite to GraphQLSegment: ' + 'first index is ' + this._minIndex + ' trying to add edges after ' + index);
|
|
508
|
-
return;
|
|
509
|
-
}
|
|
510
|
-
} // Edges must be added in reverse order since the
|
|
511
|
-
// segment must be continuous at all times.
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
var startIndex = index - 1;
|
|
515
|
-
|
|
516
|
-
for (var ii = 0; ii < edges.length; ii++) {
|
|
517
|
-
// Iterates from edges.length - 1 to 0
|
|
518
|
-
var edge = edges[edges.length - ii - 1];
|
|
519
|
-
|
|
520
|
-
this._addEdgeAtIndex(edge, startIndex - ii);
|
|
521
|
-
}
|
|
522
|
-
};
|
|
523
|
-
/**
|
|
524
|
-
* This is the total length of the segment including the deleted edges.
|
|
525
|
-
* Non-zero length guarantees value max and min indices.
|
|
526
|
-
* DO NOT USE THIS TO DETERMINE THE TOTAL NUMBER OF EDGES; use `getCount`
|
|
527
|
-
* instead.
|
|
528
|
-
* @return {number}
|
|
529
|
-
*/
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
_proto.getLength = function getLength() {
|
|
533
|
-
if (this._minIndex === null && this._maxIndex === null) {
|
|
534
|
-
return 0;
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
return this._maxIndex - this._minIndex + 1;
|
|
538
|
-
};
|
|
539
|
-
/**
|
|
540
|
-
* Returns the total number of non-deleted edges in the segment.
|
|
541
|
-
*
|
|
542
|
-
* @return {number}
|
|
543
|
-
*/
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
_proto.getCount = function getCount() {
|
|
547
|
-
return this._count;
|
|
548
|
-
};
|
|
549
|
-
/**
|
|
550
|
-
* In the event of a failed `concatSegment` operation, rollback internal
|
|
551
|
-
* properties to their former values.
|
|
552
|
-
*
|
|
553
|
-
* @param {object} cursorRollbackMap
|
|
554
|
-
* @param {object} idRollbackMap
|
|
555
|
-
* @param {object} counters
|
|
556
|
-
*/
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
_proto._rollback = function _rollback(cursorRollbackMap, idRollbackMap, counters) {
|
|
560
|
-
Object.assign(this._cursorToIndexMap, cursorRollbackMap);
|
|
561
|
-
Object.assign(this._idToIndicesMap, idRollbackMap); // no need to reset _indexToMetadataMap; resetting counters is enough
|
|
562
|
-
|
|
563
|
-
this._count = counters.count;
|
|
564
|
-
this._maxIndex = counters.maxIndex;
|
|
565
|
-
this._minIndex = counters.minIndex;
|
|
566
|
-
};
|
|
567
|
-
/**
|
|
568
|
-
* @return {object} Captured counter state.
|
|
569
|
-
*/
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
_proto._getCounterState = function _getCounterState() {
|
|
573
|
-
return {
|
|
574
|
-
count: this._count,
|
|
575
|
-
maxIndex: this._maxIndex,
|
|
576
|
-
minIndex: this._minIndex
|
|
577
|
-
};
|
|
578
|
-
};
|
|
579
|
-
/**
|
|
580
|
-
* Copies over content of the input segment and add to the current
|
|
581
|
-
* segment.
|
|
582
|
-
* @param {GraphQLSegment} segment - the segment to be copied over
|
|
583
|
-
* @return {boolean} whether or not we successfully concatenated the segments
|
|
584
|
-
*/
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
_proto.concatSegment = function concatSegment(segment) {
|
|
588
|
-
if (!segment.getLength()) {
|
|
589
|
-
return true;
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
var idRollbackMap = {};
|
|
593
|
-
var cursorRollbackMap = {};
|
|
594
|
-
|
|
595
|
-
var counterState = this._getCounterState();
|
|
596
|
-
|
|
597
|
-
var newEdges = segment._indexToMetadataMap;
|
|
598
|
-
|
|
599
|
-
for (var ii = segment._minIndex; ii <= segment._maxIndex; ii++) {
|
|
600
|
-
var index = void 0;
|
|
601
|
-
|
|
602
|
-
if (this.getLength()) {
|
|
603
|
-
index = this._maxIndex + 1;
|
|
604
|
-
} else {
|
|
605
|
-
index = 0;
|
|
606
|
-
this._minIndex = 0;
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
this._maxIndex = index;
|
|
610
|
-
var newEdge = newEdges[ii];
|
|
611
|
-
|
|
612
|
-
var idIndex = this._getIndexForID(newEdge.edgeID);
|
|
613
|
-
|
|
614
|
-
if (!idRollbackMap.hasOwnProperty(newEdge.edgeID)) {
|
|
615
|
-
if (this._idToIndicesMap[newEdge.edgeID]) {
|
|
616
|
-
idRollbackMap[newEdge.edgeID] = this._idToIndicesMap[newEdge.edgeID].slice();
|
|
617
|
-
} else {
|
|
618
|
-
idRollbackMap[newEdge.edgeID] = undefined;
|
|
619
|
-
}
|
|
620
|
-
} // Check for id collision. Can't have same id twice
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
if (idIndex !== undefined) {
|
|
624
|
-
var idEdge = this._indexToMetadataMap[idIndex];
|
|
625
|
-
|
|
626
|
-
if (idEdge.deleted && !newEdge.deleted) {
|
|
627
|
-
// We want to map to most recent edge. Only write to the front of map
|
|
628
|
-
// if existing edge with id is deleted or have an older deletion
|
|
629
|
-
// time.
|
|
630
|
-
this._idToIndicesMap[newEdge.edgeID].unshift(index);
|
|
631
|
-
} else if (!newEdge.deleted) {
|
|
632
|
-
console.warn('Attempt to concat an ID already in GraphQLSegment: %s', newEdge.edgeID);
|
|
633
|
-
|
|
634
|
-
this._rollback(cursorRollbackMap, idRollbackMap, counterState);
|
|
635
|
-
|
|
636
|
-
return false;
|
|
637
|
-
} else {
|
|
638
|
-
// We want to keep track of past edges as well. Write these indices
|
|
639
|
-
// to the end of the array.
|
|
640
|
-
this._idToIndicesMap[newEdge.edgeID] = this._idToIndicesMap[newEdge.edgeID] || [];
|
|
641
|
-
|
|
642
|
-
this._idToIndicesMap[newEdge.edgeID].push(index);
|
|
643
|
-
}
|
|
644
|
-
} else {
|
|
645
|
-
this._idToIndicesMap[newEdge.edgeID] = this._idToIndicesMap[newEdge.edgeID] || [];
|
|
646
|
-
|
|
647
|
-
this._idToIndicesMap[newEdge.edgeID].unshift(index);
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
var cursorIndex = this._getIndexForCursor(newEdge.cursor); // Check for cursor collision. Can't have same cursor twice
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
if (cursorIndex !== undefined) {
|
|
654
|
-
var cursorEdge = this._indexToMetadataMap[cursorIndex];
|
|
655
|
-
|
|
656
|
-
if (cursorEdge.deleted && !newEdge.deleted) {
|
|
657
|
-
// We want to map to most recent edge. Only write in the cursor map if
|
|
658
|
-
// existing edge with cursor is deleted or have and older deletion
|
|
659
|
-
// time.
|
|
660
|
-
cursorRollbackMap[newEdge.cursor] = this._cursorToIndexMap[newEdge.cursor];
|
|
661
|
-
this._cursorToIndexMap[newEdge.cursor] = index;
|
|
662
|
-
} else if (!newEdge.deleted) {
|
|
663
|
-
console.warn('Attempt to concat a cursor already in GraphQLSegment: %s', newEdge.cursor);
|
|
664
|
-
|
|
665
|
-
this._rollback(cursorRollbackMap, idRollbackMap, counterState);
|
|
666
|
-
|
|
667
|
-
return false;
|
|
668
|
-
}
|
|
669
|
-
} else if (newEdge.cursor) {
|
|
670
|
-
cursorRollbackMap[newEdge.cursor] = this._cursorToIndexMap[newEdge.cursor];
|
|
671
|
-
this._cursorToIndexMap[newEdge.cursor] = index;
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
if (!newEdge.deleted) {
|
|
675
|
-
this._count++;
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
this._indexToMetadataMap[index] = Object.assign({}, newEdge);
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
return true;
|
|
682
|
-
};
|
|
683
|
-
|
|
684
|
-
_proto.toJSON = function toJSON() {
|
|
685
|
-
return [this._indexToMetadataMap, this._idToIndicesMap, this._cursorToIndexMap, this._minIndex, this._maxIndex, this._count];
|
|
686
|
-
};
|
|
687
|
-
|
|
688
|
-
GraphQLSegment.fromJSON = function fromJSON(descriptor) {
|
|
689
|
-
var indexToMetadataMap = descriptor[0],
|
|
690
|
-
idToIndicesMap = descriptor[1],
|
|
691
|
-
cursorToIndexMap = descriptor[2],
|
|
692
|
-
minIndex = descriptor[3],
|
|
693
|
-
maxIndex = descriptor[4],
|
|
694
|
-
count = descriptor[5];
|
|
695
|
-
var segment = new GraphQLSegment();
|
|
696
|
-
segment._indexToMetadataMap = indexToMetadataMap;
|
|
697
|
-
segment._idToIndicesMap = idToIndicesMap;
|
|
698
|
-
segment._cursorToIndexMap = cursorToIndexMap;
|
|
699
|
-
segment._minIndex = minIndex;
|
|
700
|
-
segment._maxIndex = maxIndex;
|
|
701
|
-
segment._count = count;
|
|
702
|
-
return segment;
|
|
703
|
-
};
|
|
704
|
-
|
|
705
|
-
_proto.__debug = function __debug() {
|
|
706
|
-
return {
|
|
707
|
-
metadata: this._indexToMetadataMap,
|
|
708
|
-
idToIndices: this._idToIndicesMap,
|
|
709
|
-
cursorToIndex: this._cursorToIndexMap
|
|
710
|
-
};
|
|
711
|
-
};
|
|
712
|
-
/**
|
|
713
|
-
* Returns a list of all IDs that were registered for this segment.
|
|
714
|
-
*/
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
_proto.getEdgeIDs = function getEdgeIDs() {
|
|
718
|
-
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
|
|
719
|
-
includeDeleted: false
|
|
720
|
-
},
|
|
721
|
-
includeDeleted = _ref.includeDeleted;
|
|
722
|
-
|
|
723
|
-
var edgeIds = [];
|
|
724
|
-
|
|
725
|
-
if (this.getLength() > 0) {
|
|
726
|
-
for (var ii = this._minIndex; ii <= this._maxIndex; ii++) {
|
|
727
|
-
var _this$_indexToMetadat = this._indexToMetadataMap[ii],
|
|
728
|
-
deleted = _this$_indexToMetadat.deleted,
|
|
729
|
-
edgeID = _this$_indexToMetadat.edgeID;
|
|
730
|
-
|
|
731
|
-
if (includeDeleted || !deleted) {
|
|
732
|
-
edgeIds.push(edgeID);
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
return edgeIds;
|
|
738
|
-
};
|
|
739
|
-
|
|
740
|
-
return GraphQLSegment;
|
|
741
|
-
}();
|
|
742
|
-
|
|
743
|
-
module.exports = GraphQLSegment;
|