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.
Files changed (166) hide show
  1. package/index.js +2 -2
  2. package/lib/ReactRelayContext.js +6 -3
  3. package/lib/ReactRelayFragmentContainer.js +48 -46
  4. package/lib/ReactRelayFragmentMockRenderer.js +5 -1
  5. package/lib/ReactRelayPaginationContainer.js +102 -68
  6. package/lib/ReactRelayQueryFetcher.js +54 -28
  7. package/lib/ReactRelayQueryRenderer.js +28 -20
  8. package/lib/ReactRelayRefetchContainer.js +70 -58
  9. package/lib/ReactRelayTestMocker.js +56 -43
  10. package/lib/ReactRelayTypes.js +1 -1
  11. package/lib/RelayContext.js +8 -2
  12. package/lib/assertFragmentMap.js +9 -7
  13. package/lib/buildReactRelayContainer.js +32 -23
  14. package/lib/index.js +41 -0
  15. package/lib/isRelayEnvironment.js +1 -1
  16. package/lib/isRelayVariables.js +1 -1
  17. package/lib/readContext.js +7 -4
  18. package/package.json +4 -4
  19. package/react-relay.js +2 -2
  20. package/react-relay.min.js +2 -2
  21. package/classic.js +0 -10
  22. package/compat.js +0 -10
  23. package/lib/ConcreteQuery.js +0 -10
  24. package/lib/GraphQLQueryRunner.js +0 -264
  25. package/lib/GraphQLRange.js +0 -1124
  26. package/lib/GraphQLSegment.js +0 -743
  27. package/lib/GraphQLStoreChangeEmitter.js +0 -141
  28. package/lib/GraphQLStoreQueryResolver.js +0 -288
  29. package/lib/GraphQLStoreRangeUtils.js +0 -126
  30. package/lib/QueryBuilder.js +0 -228
  31. package/lib/ReactRelayClassicExports.js +0 -29
  32. package/lib/ReactRelayCompatContainerBuilder.js +0 -175
  33. package/lib/ReactRelayCompatPublic.js +0 -28
  34. package/lib/ReactRelayContainerProfiler.js +0 -30
  35. package/lib/ReactRelayFragmentContainer-flowtest.js +0 -201
  36. package/lib/ReactRelayPaginationContainer-flowtest.js +0 -213
  37. package/lib/ReactRelayPublic.js +0 -29
  38. package/lib/ReactRelayRefetchContainer-flowtest.js +0 -191
  39. package/lib/RelayCacheProcessor.js +0 -196
  40. package/lib/RelayChangeTracker.js +0 -83
  41. package/lib/RelayClassicContainerUtils.js +0 -49
  42. package/lib/RelayClassicCore.js +0 -34
  43. package/lib/RelayClassicRecordState.js +0 -31
  44. package/lib/RelayCompatContainer.js +0 -25
  45. package/lib/RelayCompatEnvironment.js +0 -27
  46. package/lib/RelayCompatMutations.js +0 -133
  47. package/lib/RelayCompatPaginationContainer.js +0 -27
  48. package/lib/RelayCompatRefetchContainer.js +0 -27
  49. package/lib/RelayCompatTypes.js +0 -10
  50. package/lib/RelayContainer.js +0 -889
  51. package/lib/RelayContainerComparators.js +0 -75
  52. package/lib/RelayContainerProxy.js +0 -21
  53. package/lib/RelayDefaultNetworkLayer.js +0 -192
  54. package/lib/RelayEnvironment.js +0 -449
  55. package/lib/RelayEnvironmentTypes.js +0 -10
  56. package/lib/RelayFetchMode.js +0 -17
  57. package/lib/RelayFragmentPointer.js +0 -161
  58. package/lib/RelayFragmentReference.js +0 -249
  59. package/lib/RelayFragmentSpecResolver.js +0 -305
  60. package/lib/RelayGraphQLMutation.js +0 -288
  61. package/lib/RelayGraphQLTag.js +0 -42
  62. package/lib/RelayInternalTypes.js +0 -15
  63. package/lib/RelayInternals.js +0 -24
  64. package/lib/RelayMetaRoute.js +0 -35
  65. package/lib/RelayMockRenderer.js +0 -71
  66. package/lib/RelayModern-flowtest.js +0 -342
  67. package/lib/RelayModernFlowtest_badref.graphql.js +0 -10
  68. package/lib/RelayModernFlowtest_notref.graphql.js +0 -10
  69. package/lib/RelayModernFlowtest_user.graphql.js +0 -10
  70. package/lib/RelayModernFlowtest_users.graphql.js +0 -10
  71. package/lib/RelayMutation.js +0 -322
  72. package/lib/RelayMutationDebugPrinter.js +0 -47
  73. package/lib/RelayMutationQuery.js +0 -558
  74. package/lib/RelayMutationQueue.js +0 -530
  75. package/lib/RelayMutationRequest.js +0 -103
  76. package/lib/RelayMutationTracker.js +0 -113
  77. package/lib/RelayMutationTransaction.js +0 -92
  78. package/lib/RelayMutationTransactionStatus.js +0 -55
  79. package/lib/RelayNetworkDebug.js +0 -131
  80. package/lib/RelayNetworkLayer.js +0 -185
  81. package/lib/RelayNodeInterface.js +0 -104
  82. package/lib/RelayOperationDescriptor.js +0 -40
  83. package/lib/RelayOptimisticMutationUtils.js +0 -208
  84. package/lib/RelayPendingQueryTracker.js +0 -166
  85. package/lib/RelayPropTypes.js +0 -57
  86. package/lib/RelayPublic.js +0 -44
  87. package/lib/RelayQL.js +0 -128
  88. package/lib/RelayQuery.js +0 -1584
  89. package/lib/RelayQueryCaching.js +0 -33
  90. package/lib/RelayQueryConfig.js +0 -58
  91. package/lib/RelayQueryPath.js +0 -204
  92. package/lib/RelayQueryRequest.js +0 -103
  93. package/lib/RelayQueryTracker.js +0 -86
  94. package/lib/RelayQueryTransform.js +0 -91
  95. package/lib/RelayQueryVisitor.js +0 -93
  96. package/lib/RelayQueryWriter.js +0 -573
  97. package/lib/RelayReadyState.js +0 -83
  98. package/lib/RelayReadyStateRenderer.js +0 -145
  99. package/lib/RelayRecord.js +0 -75
  100. package/lib/RelayRecordStatusMap.js +0 -57
  101. package/lib/RelayRecordStore.js +0 -433
  102. package/lib/RelayRecordWriter.js +0 -601
  103. package/lib/RelayRefQueryDescriptor.js +0 -27
  104. package/lib/RelayRenderer.js +0 -268
  105. package/lib/RelayRootContainer.js +0 -125
  106. package/lib/RelayRoute.js +0 -92
  107. package/lib/RelayRouteFragment.js +0 -44
  108. package/lib/RelaySelector.js +0 -201
  109. package/lib/RelayShallowMock.js +0 -69
  110. package/lib/RelayStaticContainer.js +0 -38
  111. package/lib/RelayStore.js +0 -12
  112. package/lib/RelayStoreConstants.js +0 -20
  113. package/lib/RelayStoreData.js +0 -660
  114. package/lib/RelayTaskQueue.js +0 -189
  115. package/lib/RelayTypes.js +0 -13
  116. package/lib/RelayVariable.js +0 -32
  117. package/lib/RelayVariables.js +0 -92
  118. package/lib/buildRQL.js +0 -160
  119. package/lib/callsFromGraphQL.js +0 -74
  120. package/lib/callsToGraphQL.js +0 -34
  121. package/lib/checkRelayQueryData.js +0 -250
  122. package/lib/createRelayQuery.js +0 -17
  123. package/lib/dedent.js +0 -49
  124. package/lib/diffRelayQuery.js +0 -757
  125. package/lib/directivesToGraphQL.js +0 -39
  126. package/lib/filterRelayQuery.js +0 -29
  127. package/lib/findRelayQueryLeaves.js +0 -293
  128. package/lib/flattenRelayQuery.js +0 -121
  129. package/lib/flattenSplitRelayQueries.js +0 -44
  130. package/lib/forEachRootCallArg.js +0 -40
  131. package/lib/fromGraphQL.js +0 -48
  132. package/lib/generateClientEdgeID.js +0 -22
  133. package/lib/generateClientID.js +0 -27
  134. package/lib/generateConcreteFragmentID.js +0 -30
  135. package/lib/generateForceIndex.js +0 -24
  136. package/lib/generateRQLFieldAlias.js +0 -39
  137. package/lib/getRangeBehavior.js +0 -58
  138. package/lib/getRelayQueries.js +0 -83
  139. package/lib/intersectRelayQuery.js +0 -149
  140. package/lib/isClassicRelayContext.js +0 -20
  141. package/lib/isClassicRelayEnvironment.js +0 -20
  142. package/lib/isCompatibleRelayFragmentType.js +0 -27
  143. package/lib/isRelayContainer.js +0 -16
  144. package/lib/makeLegacyStringishComponentRef.js +0 -52
  145. package/lib/printRelayOSSQuery.js +0 -329
  146. package/lib/printRelayQuery.js +0 -26
  147. package/lib/rangeOperationToMetadataKey.js +0 -25
  148. package/lib/readRelayQueryData.js +0 -551
  149. package/lib/relayUnstableBatchedUpdates.js +0 -12
  150. package/lib/relayUnstableBatchedUpdates.native.js +0 -11
  151. package/lib/restoreRelayCacheData.js +0 -188
  152. package/lib/serializeRelayQueryCall.js +0 -42
  153. package/lib/splitDeferredRelayQueries.js +0 -298
  154. package/lib/stableStringify.js +0 -85
  155. package/lib/testEditDistance.js +0 -112
  156. package/lib/throwFailedPromise.js +0 -26
  157. package/lib/toGraphQL.js +0 -94
  158. package/lib/transformRelayQueryPayload.js +0 -145
  159. package/lib/validateMutationConfig.js +0 -117
  160. package/lib/validateRelayReadQuery.js +0 -112
  161. package/lib/writeRelayQueryPayload.js +0 -44
  162. package/lib/writeRelayUpdatePayload.js +0 -513
  163. package/react-relay-classic.js +0 -4
  164. package/react-relay-classic.min.js +0 -9
  165. package/react-relay-compat.js +0 -4
  166. package/react-relay-compat.min.js +0 -9
@@ -1,573 +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
- *
8
- * @format
9
- */
10
- 'use strict';
11
-
12
- var _objectSpread2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/objectSpread"));
13
-
14
- var _inheritsLoose2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/inheritsLoose"));
15
-
16
- /**
17
- * @internal
18
- *
19
- * Helper for writing the result of one or more queries/operations into the
20
- * store, updating tracked queries, and recording changed record IDs.
21
- */
22
- var RelayQueryWriter =
23
- /*#__PURE__*/
24
- function (_RelayQueryVisitor) {
25
- (0, _inheritsLoose2["default"])(RelayQueryWriter, _RelayQueryVisitor);
26
-
27
- function RelayQueryWriter(store, writer, queryTracker, changeTracker, options) {
28
- var _this;
29
-
30
- _this = _RelayQueryVisitor.call(this) || this;
31
- _this._changeTracker = changeTracker;
32
- _this._forceIndex = options && options.forceIndex ? options.forceIndex : 0;
33
- _this._isOptimisticUpdate = !!(options && options.isOptimisticUpdate);
34
- _this._store = store;
35
- _this._queryTracker = queryTracker;
36
- _this._updateTrackedQueries = !!(options && options.updateTrackedQueries);
37
- _this._writer = writer;
38
- return _this;
39
- }
40
-
41
- var _proto = RelayQueryWriter.prototype;
42
-
43
- _proto.getRecordStore = function getRecordStore() {
44
- return this._store;
45
- };
46
-
47
- _proto.getRecordWriter = function getRecordWriter() {
48
- return this._writer;
49
- };
50
-
51
- _proto.getRecordTypeName = function getRecordTypeName(node, recordID, payload) {
52
- if (this._isOptimisticUpdate) {
53
- // Optimistic queries are inferred. Reuse existing type if available.
54
- return this._store.getType(recordID);
55
- }
56
-
57
- var typeName = payload[require("./RelayNodeInterface").TYPENAME];
58
-
59
- if (typeName == null) {
60
- if (!node.isAbstract()) {
61
- typeName = node.getType();
62
- } else {
63
- typeName = this._store.getType(recordID);
64
- }
65
- }
66
-
67
- process.env.NODE_ENV !== "production" ? require("fbjs/lib/warning")(typeName && typeName !== require("./RelayNodeInterface").ANY_TYPE, 'RelayQueryWriter: Could not find a type name for record `%s`.', recordID) : void 0;
68
- return typeName || null;
69
- };
70
- /**
71
- * Traverses a query and payload in parallel, writing the results into the
72
- * store.
73
- */
74
-
75
-
76
- _proto.writePayload = function writePayload(node, recordID, responseData, path) {
77
- var _this2 = this;
78
-
79
- var state = {
80
- nodeID: null,
81
- path: path,
82
- recordID: recordID,
83
- responseData: responseData
84
- };
85
-
86
- if (node instanceof require("./RelayQuery").Field && node.canHaveSubselections()) {
87
- // for non-scalar fields, the recordID is the parent
88
- node.getChildren().forEach(function (child) {
89
- _this2.visit(child, state);
90
- });
91
- return;
92
- }
93
-
94
- this.visit(node, state);
95
- };
96
- /**
97
- * Records are "created" whenever an entry did not previously exist for the
98
- * `recordID`, including cases when a `recordID` is created with a null value.
99
- */
100
-
101
-
102
- _proto.recordCreate = function recordCreate(recordID) {
103
- this._changeTracker.createID(recordID);
104
- };
105
- /**
106
- * Records are "updated" if any field changes (including being set to null).
107
- * Updates are not recorded for newly created records.
108
- */
109
-
110
-
111
- _proto.recordUpdate = function recordUpdate(recordID) {
112
- this._changeTracker.updateID(recordID);
113
- };
114
- /**
115
- * Determine if the record was created by this write operation.
116
- */
117
-
118
-
119
- _proto.isNewRecord = function isNewRecord(recordID) {
120
- return this._changeTracker.isNewRecord(recordID);
121
- };
122
- /**
123
- * Helper to create a record and the corresponding notification.
124
- */
125
-
126
-
127
- _proto.createRecordIfMissing = function createRecordIfMissing(node, recordID, path, payload) {
128
- var recordState = this._store.getRecordState(recordID);
129
-
130
- var typeName = payload && this.getRecordTypeName(node, recordID, payload);
131
-
132
- this._writer.putRecord(recordID, typeName, path);
133
-
134
- if (recordState !== require("./RelayClassicRecordState").EXISTENT) {
135
- this.recordCreate(recordID);
136
- }
137
-
138
- if (this._queryTracker && (this.isNewRecord(recordID) || this._updateTrackedQueries) && (!require("./RelayRecord").isClientID(recordID) || require("./RelayQueryPath").isRootPath(path))) {
139
- this._queryTracker.trackNodeForID(node, recordID);
140
- }
141
- };
142
-
143
- _proto.visitRoot = function visitRoot(root, state) {
144
- var path = state.path,
145
- recordID = state.recordID,
146
- responseData = state.responseData;
147
-
148
- var recordState = this._store.getRecordState(recordID); // GraphQL should never return undefined for a field
149
-
150
-
151
- if (responseData == null) {
152
- !(responseData !== undefined) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayQueryWriter: Unexpectedly encountered `undefined` in payload. ' + 'Cannot set root record `%s` to undefined.', recordID) : require("fbjs/lib/invariant")(false) : void 0;
153
-
154
- this._writer.deleteRecord(recordID);
155
-
156
- if (recordState === require("./RelayClassicRecordState").EXISTENT) {
157
- this.recordUpdate(recordID);
158
- }
159
-
160
- return;
161
- }
162
-
163
- !(typeof responseData === 'object' && responseData !== null) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayQueryWriter: Cannot update record `%s`, expected response to be ' + 'an array or object.', recordID) : require("fbjs/lib/invariant")(false) : void 0;
164
- this.createRecordIfMissing(root, recordID, path, responseData);
165
- this.traverse(root, state);
166
- };
167
-
168
- _proto.visitFragment = function visitFragment(fragment, state) {
169
- var recordID = state.recordID;
170
-
171
- if (fragment.isDeferred()) {
172
- var hash = fragment.getSourceCompositeHash() || fragment.getCompositeHash();
173
-
174
- this._writer.setHasDeferredFragmentData(recordID, hash);
175
-
176
- this.recordUpdate(recordID);
177
- } // Skip fragments that do not match the record's concrete type. Fragments
178
- // cannot be skipped for optimistic writes because optimistically created
179
- // records *may* have a default `Node` type.
180
-
181
-
182
- if (this._isOptimisticUpdate || require("./isCompatibleRelayFragmentType")(fragment, this._store.getType(recordID))) {
183
- if (!this._isOptimisticUpdate && fragment.isTrackingEnabled()) {
184
- this._writer.setHasFragmentData(recordID, fragment.getCompositeHash());
185
- }
186
-
187
- var path = require("./RelayQueryPath").getPath(state.path, fragment, recordID);
188
-
189
- this.traverse(fragment, (0, _objectSpread2["default"])({}, state, {
190
- path: path
191
- }));
192
- }
193
- };
194
-
195
- _proto.visitField = function visitField(field, state) {
196
- var recordID = state.recordID,
197
- responseData = state.responseData;
198
- !(this._writer.getRecordState(recordID) === require("./RelayClassicRecordState").EXISTENT) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayQueryWriter: Cannot update a non-existent record, `%s`.', recordID) : require("fbjs/lib/invariant")(false) : void 0;
199
- !(typeof responseData === 'object' && responseData !== null) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayQueryWriter: Cannot update record `%s`, expected response to be ' + 'an object.', recordID) : require("fbjs/lib/invariant")(false) : void 0;
200
- var serializationKey = field.getSerializationKey();
201
- var fieldData = responseData[serializationKey]; // Queried fields that are `undefined` are stored as nulls.
202
-
203
- if (fieldData == null) {
204
- if (fieldData === undefined) {
205
- if (responseData.hasOwnProperty(serializationKey)) {
206
- process.env.NODE_ENV !== "production" ? require("fbjs/lib/warning")(false, 'RelayQueryWriter: Encountered an explicit `undefined` field `%s` ' + 'on record `%s`, expected response to not contain `undefined`.', field.getDebugName(), recordID) : void 0;
207
- return;
208
- } else if (this._isOptimisticUpdate) {
209
- return;
210
- }
211
- }
212
-
213
- var storageKey = field.getStorageKey();
214
-
215
- var prevValue = this._store.getField(recordID, storageKey); // Always write to ensure data is stored in the correct recordStore.
216
-
217
-
218
- this._writer.deleteField(recordID, storageKey);
219
-
220
- if (prevValue !== null) {
221
- this.recordUpdate(recordID);
222
- }
223
-
224
- return;
225
- }
226
-
227
- if (!field.canHaveSubselections()) {
228
- this._writeScalar(field, state, recordID, fieldData);
229
- } else if (field.isConnection()) {
230
- this._writeConnection(field, state, recordID, fieldData);
231
- } else if (field.isPlural()) {
232
- this._writePluralLink(field, state, recordID, fieldData);
233
- } else {
234
- this._writeLink(field, state, recordID, fieldData);
235
- }
236
- };
237
- /**
238
- * Writes the value for a 'scalar' field such as `id` or `name`. The response
239
- * data is expected to be scalar values or arrays of scalar values.
240
- */
241
-
242
-
243
- _proto._writeScalar = function _writeScalar(field, state, recordID, nextValue) {
244
- var storageKey = field.getStorageKey();
245
-
246
- var prevValue = this._store.getField(recordID, storageKey); // always update the store to ensure the value is present in the appropriate
247
- // data sink (records/queuedRecords), but only record an update if the value
248
- // changed.
249
-
250
-
251
- this._writer.putField(recordID, storageKey, nextValue); // TODO: Flow: `nextValue` is an array, array indexing should work
252
-
253
-
254
- if (Array.isArray(prevValue) && Array.isArray(nextValue) && prevValue.length === nextValue.length && prevValue.every(function (prev, ii) {
255
- return prev === nextValue[ii];
256
- })) {
257
- return;
258
- } else if (prevValue === nextValue) {
259
- return;
260
- }
261
-
262
- this.recordUpdate(recordID);
263
- };
264
- /**
265
- * Writes data for connection fields such as `news_feed` or `friends`. The
266
- * response data is expected to be array of edge objects.
267
- */
268
-
269
-
270
- _proto._writeConnection = function _writeConnection(field, state, recordID, connectionData) {
271
- var _ConnectionInterface$ = require("relay-runtime").ConnectionInterface.get(),
272
- EDGES = _ConnectionInterface$.EDGES; // Each unique combination of filter calls is stored in its own
273
- // generated record (ex: `field.orderby(x)` results are separate from
274
- // `field.orderby(y)` results).
275
-
276
-
277
- var storageKey = field.getStorageKey();
278
-
279
- var connectionID = this._store.getLinkedRecordID(recordID, storageKey) || require("./generateClientID")();
280
-
281
- var connectionRecordState = this._store.getRecordState(connectionID);
282
-
283
- var hasEdges = !!(field.getFieldByStorageKey(EDGES) || connectionData != null && typeof connectionData === 'object' && connectionData[EDGES]);
284
-
285
- var path = require("./RelayQueryPath").getPath(state.path, field, connectionID); // always update the store to ensure the value is present in the appropriate
286
- // data sink (records/queuedRecords), but only record an update if the value
287
- // changed.
288
-
289
-
290
- this._writer.putRecord(connectionID, null, path);
291
-
292
- this._writer.putLinkedRecordID(recordID, storageKey, connectionID); // record the create/update only if something changed
293
-
294
-
295
- if (connectionRecordState !== require("./RelayClassicRecordState").EXISTENT) {
296
- this.recordUpdate(recordID);
297
- this.recordCreate(connectionID);
298
- }
299
-
300
- if (hasEdges) {
301
- // Only create a range if `edges` field is present
302
- // Overwrite an existing range only if the new force index is greater
303
- if (!this._writer.hasRange(connectionID) || this._forceIndex && this._forceIndex > this._store.getRangeForceIndex(connectionID)) {
304
- this._writer.putRange(connectionID, field.getCallsWithValues(), this._forceIndex);
305
- } // Update the connection record regardless of whether a range was written
306
- // to also handle cases like an empty edge range or updated page_info.
307
-
308
-
309
- this.recordUpdate(connectionID);
310
- }
311
-
312
- var connectionState = {
313
- nodeID: null,
314
- path: path,
315
- recordID: connectionID,
316
- responseData: connectionData
317
- };
318
-
319
- this._traverseConnection(field, field, connectionState);
320
- };
321
- /**
322
- * Recurse through connection subfields and write their results. This is
323
- * necessary because handling an `edges` field also requires information about
324
- * the parent connection field (see `_writeEdges`).
325
- */
326
-
327
-
328
- _proto._traverseConnection = function _traverseConnection(connection, // the parent connection
329
- node, // the parent connection or an intermediary fragment
330
- state) {
331
- var _this3 = this;
332
-
333
- var _ConnectionInterface$2 = require("relay-runtime").ConnectionInterface.get(),
334
- EDGES = _ConnectionInterface$2.EDGES,
335
- PAGE_INFO = _ConnectionInterface$2.PAGE_INFO;
336
-
337
- node.getChildren().forEach(function (child) {
338
- if (child instanceof require("./RelayQuery").Field) {
339
- if (child.getSchemaName() === EDGES) {
340
- _this3._writeEdges(connection, child, state);
341
- } else if (child.getSchemaName() !== PAGE_INFO) {
342
- // Page info is handled by the range
343
- // Otherwise, write metadata fields normally (ex: `count`)
344
- _this3.visit(child, state);
345
- }
346
- } else {
347
- // Fragment case, recurse keeping track of parent connection
348
- _this3._traverseConnection(connection, child, state);
349
- }
350
- });
351
- };
352
- /**
353
- * Update a connection with newly fetched edges.
354
- */
355
-
356
-
357
- _proto._writeEdges = function _writeEdges(connection, edges, state) {
358
- var _this4 = this;
359
-
360
- var _ConnectionInterface$3 = require("relay-runtime").ConnectionInterface.get(),
361
- EDGES = _ConnectionInterface$3.EDGES,
362
- NODE = _ConnectionInterface$3.NODE,
363
- PAGE_INFO = _ConnectionInterface$3.PAGE_INFO;
364
-
365
- var connectionID = state.recordID,
366
- connectionData = state.responseData;
367
- !(typeof connectionData === 'object' && connectionData !== null) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayQueryWriter: Cannot write edges for malformed connection `%s` on ' + 'record `%s`, expected the response to be an object.', connection.getDebugName(), connectionID) : require("fbjs/lib/invariant")(false) : void 0;
368
- var edgesData = connectionData[EDGES]; // Validate response data.
369
-
370
- if (edgesData == null) {
371
- process.env.NODE_ENV !== "production" ? require("fbjs/lib/warning")(false, 'RelayQueryWriter: Cannot write edges for connection `%s` on record ' + '`%s`, expected a response for field `edges`.', connection.getDebugName(), connectionID) : void 0;
372
- return;
373
- }
374
-
375
- !Array.isArray(edgesData) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayQueryWriter: Cannot write edges for connection `%s` on record ' + '`%s`, expected `edges` to be an array.', connection.getDebugName(), connectionID) : require("fbjs/lib/invariant")(false) : void 0;
376
- var rangeCalls = connection.getCallsWithValues();
377
- !require("relay-runtime").ConnectionInterface.hasRangeCalls(rangeCalls) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayQueryWriter: Cannot write edges for connection on record ' + '`%s` without `first`, `last`, or `find` argument.', connectionID) : require("fbjs/lib/invariant")(false) : void 0;
378
-
379
- var rangeInfo = this._store.getRangeMetadata(connectionID, rangeCalls);
380
-
381
- !rangeInfo ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayQueryWriter: Expected a range to exist for connection field `%s` ' + 'on record `%s`.', connection.getDebugName(), connectionID) : require("fbjs/lib/invariant")(false) : void 0;
382
- var fetchedEdgeIDs = [];
383
- var filteredEdges = rangeInfo.filteredEdges;
384
- var isUpdate = false;
385
- var nextIndex = 0; // Traverse connection edges, reusing existing edges if they exist
386
-
387
- edgesData.forEach(function (edgeData) {
388
- // validate response data
389
- if (edgeData == null) {
390
- return;
391
- }
392
-
393
- !(typeof edgeData === 'object' && edgeData) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayQueryWriter: Cannot write edge for connection field `%s` on ' + 'record `%s`, expected an object.', connection.getDebugName(), connectionID) : require("fbjs/lib/invariant")(false) : void 0;
394
- var nodeData = edgeData[NODE];
395
-
396
- if (nodeData == null) {
397
- return;
398
- }
399
-
400
- !(typeof nodeData === 'object') ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayQueryWriter: Expected node to be an object for field `%s` on ' + 'record `%s`.', connection.getDebugName(), connectionID) : require("fbjs/lib/invariant")(false) : void 0; // For consistency, edge IDs are calculated from the connection & node ID.
401
- // A node ID is only generated if the node does not have an id and
402
- // there is no existing edge.
403
-
404
- var prevEdge = filteredEdges[nextIndex++];
405
-
406
- var nodeID = nodeData && nodeData[require("./RelayNodeInterface").ID] || prevEdge && _this4._store.getLinkedRecordID(prevEdge.edgeID, NODE) || require("./generateClientID")(); // TODO: Flow: `nodeID` is `string`
407
- // $FlowFixMe(>=0.33.0)
408
-
409
-
410
- var edgeID = require("./generateClientEdgeID")(connectionID, nodeID);
411
-
412
- var path = require("./RelayQueryPath").getPath(state.path, edges, edgeID);
413
-
414
- _this4.createRecordIfMissing(edges, edgeID, path, null);
415
-
416
- fetchedEdgeIDs.push(edgeID); // Write data for the edge, using `nodeID` as the id for direct descendant
417
- // `node` fields. This is necessary for `node`s that do not have an `id`,
418
- // which would cause the generated ID here to not match the ID generated
419
- // in `_writeLink`.
420
-
421
- _this4.traverse(edges, {
422
- /* $FlowFixMe(>=0.66.0) This comment suppresses an error found when Flow
423
- * v0.66 was deployed. To see the error delete this comment and
424
- * run Flow. */
425
- nodeID: nodeID,
426
- path: path,
427
- recordID: edgeID,
428
- responseData: edgeData
429
- });
430
-
431
- isUpdate = isUpdate || !prevEdge || edgeID !== prevEdge.edgeID;
432
- });
433
-
434
- var pageInfo = connectionData[PAGE_INFO] || require("relay-runtime").ConnectionInterface.getDefaultPageInfo();
435
-
436
- this._writer.putRangeEdges(connectionID, rangeCalls, pageInfo, fetchedEdgeIDs); // Only broadcast an update to the range if an edge was added/changed.
437
- // Node-level changes will broadcast at the node ID.
438
-
439
-
440
- if (isUpdate) {
441
- this.recordUpdate(connectionID);
442
- }
443
- };
444
- /**
445
- * Writes a plural linked field such as `actors`. The response data is
446
- * expected to be an array of item objects. These fields are similar to
447
- * connections, but do not support range calls such as `first` or `after`.
448
- */
449
-
450
-
451
- _proto._writePluralLink = function _writePluralLink(field, state, recordID, fieldData) {
452
- var _this5 = this;
453
-
454
- var storageKey = field.getStorageKey();
455
- !Array.isArray(fieldData) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayQueryWriter: Expected array data for field `%s` on record `%s`.', field.getDebugName(), recordID) : require("fbjs/lib/invariant")(false) : void 0;
456
-
457
- var prevLinkedIDs = this._store.getLinkedRecordIDs(recordID, storageKey);
458
-
459
- var nextLinkedIDs = [];
460
- var nextRecords = {};
461
- var isUpdate = false;
462
- var nextIndex = 0;
463
- fieldData.forEach(function (nextRecord) {
464
- // validate response data
465
- if (nextRecord == null) {
466
- return;
467
- }
468
-
469
- !(typeof nextRecord === 'object' && nextRecord) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayQueryWriter: Expected elements for plural field `%s` to be ' + 'objects.', storageKey) : require("fbjs/lib/invariant")(false) : void 0; // Reuse existing generated IDs if the node does not have its own `id`.
470
-
471
- var prevLinkedID = prevLinkedIDs && prevLinkedIDs[nextIndex];
472
-
473
- var nextLinkedID = nextRecord[require("./RelayNodeInterface").ID] || prevLinkedID || require("./generateClientID")();
474
-
475
- nextLinkedIDs.push(nextLinkedID); // $FlowFixMe(>=0.33.0)
476
-
477
- var path = require("./RelayQueryPath").getPath(state.path, field, nextLinkedID); // $FlowFixMe(>=0.33.0)
478
-
479
-
480
- _this5.createRecordIfMissing(field, nextLinkedID, path, nextRecord); // $FlowFixMe(>=0.33.0)
481
-
482
-
483
- nextRecords[nextLinkedID] = {
484
- record: nextRecord,
485
- path: path
486
- };
487
- isUpdate = isUpdate || nextLinkedID !== prevLinkedID;
488
- nextIndex++;
489
- }); // Write the linked records before traverse to prevent generating extraneous
490
- // client ids.
491
-
492
- /* $FlowFixMe(>=0.66.0) This comment suppresses an error found when Flow
493
- * v0.66 was deployed. To see the error delete this comment and run Flow. */
494
-
495
- this._writer.putLinkedRecordIDs(recordID, storageKey, nextLinkedIDs);
496
-
497
- nextLinkedIDs.forEach(function (nextLinkedID) {
498
- /* $FlowFixMe(>=0.54.0) This comment suppresses an
499
- * error found when Flow v0.54 was deployed. To see the error delete this
500
- * comment and run Flow. */
501
- var itemData = nextRecords[nextLinkedID];
502
-
503
- if (itemData) {
504
- _this5.traverse(field, {
505
- nodeID: null,
506
- // never propagate `nodeID` past the first linked field
507
- path: itemData.path,
508
-
509
- /* $FlowFixMe(>=0.66.0) This comment suppresses an error found when
510
- * Flow v0.66 was deployed. To see the error delete this comment and
511
- * run Flow. */
512
- recordID: nextLinkedID,
513
- responseData: itemData.record
514
- });
515
- }
516
- }); // Only broadcast a list-level change if a record was changed/added/removed
517
-
518
- if (isUpdate || !prevLinkedIDs || prevLinkedIDs.length !== nextLinkedIDs.length) {
519
- this.recordUpdate(recordID);
520
- }
521
- };
522
- /**
523
- * Writes a link from one record to another, for example linking the `viewer`
524
- * record to the `actor` record in the query `viewer { actor }`. The `field`
525
- * variable is the field being linked (`actor` in the example).
526
- */
527
-
528
-
529
- _proto._writeLink = function _writeLink(field, state, recordID, fieldData) {
530
- var _ConnectionInterface$4 = require("relay-runtime").ConnectionInterface.get(),
531
- NODE = _ConnectionInterface$4.NODE;
532
-
533
- var nodeID = state.nodeID;
534
- var storageKey = field.getStorageKey();
535
- !(typeof fieldData === 'object' && fieldData !== null) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayQueryWriter: Expected data for non-scalar field `%s` on record ' + '`%s` to be an object.', field.getDebugName(), recordID) : require("fbjs/lib/invariant")(false) : void 0; // Prefer the actual `id` if present, otherwise generate one (if an id
536
- // was already generated it is reused). `node`s within a connection are
537
- // a special case as the ID used here must match the one generated prior to
538
- // storing the parent `edge`.
539
-
540
- var prevLinkedID = this._store.getLinkedRecordID(recordID, storageKey);
541
-
542
- var nextLinkedID = field.getSchemaName() === NODE && nodeID || fieldData[require("./RelayNodeInterface").ID] || prevLinkedID || require("./generateClientID")(); // $FlowFixMe(>=0.33.0)
543
-
544
-
545
- var path = require("./RelayQueryPath").getPath(state.path, field, nextLinkedID); // $FlowFixMe(>=0.33.0)
546
-
547
-
548
- this.createRecordIfMissing(field, nextLinkedID, path, fieldData); // always update the store to ensure the value is present in the appropriate
549
- // data sink (record/queuedRecords), but only record an update if the value
550
- // changed.
551
- // $FlowFixMe(>=0.33.0)
552
-
553
- this._writer.putLinkedRecordID(recordID, storageKey, nextLinkedID);
554
-
555
- if (prevLinkedID !== nextLinkedID) {
556
- this.recordUpdate(recordID);
557
- }
558
-
559
- this.traverse(field, {
560
- nodeID: null,
561
- path: path,
562
-
563
- /* $FlowFixMe(>=0.66.0) This comment suppresses an error found when Flow
564
- * v0.66 was deployed. To see the error delete this comment and run Flow. */
565
- recordID: nextLinkedID,
566
- responseData: fieldData
567
- });
568
- };
569
-
570
- return RelayQueryWriter;
571
- }(require("./RelayQueryVisitor"));
572
-
573
- module.exports = RelayQueryWriter;
@@ -1,83 +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
- *
8
- * @format
9
- */
10
- 'use strict';
11
-
12
- var _objectSpread2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/objectSpread"));
13
-
14
- var _toConsumableArray2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/toConsumableArray"));
15
-
16
- /**
17
- * @internal
18
- */
19
- var RelayReadyState =
20
- /*#__PURE__*/
21
- function () {
22
- function RelayReadyState(onReadyStateChange) {
23
- this._onReadyStateChange = onReadyStateChange;
24
- this._readyState = {
25
- aborted: false,
26
- done: false,
27
- error: null,
28
- events: [],
29
- ready: false,
30
- stale: false
31
- };
32
- this._scheduled = false;
33
- }
34
-
35
- var _proto = RelayReadyState.prototype;
36
-
37
- _proto.update = function update(nextReadyState, newEvents) {
38
- var prevReadyState = this._readyState;
39
-
40
- if (prevReadyState.aborted) {
41
- return;
42
- }
43
-
44
- if (prevReadyState.done || prevReadyState.error) {
45
- if (nextReadyState.stale) {
46
- if (prevReadyState.error) {
47
- this._mergeState(nextReadyState, newEvents);
48
- } // Do nothing if stale data comes after server data.
49
-
50
- } else if (!nextReadyState.aborted) {
51
- process.env.NODE_ENV !== "production" ? require("fbjs/lib/warning")(false, 'RelayReadyState: Invalid state change from `%s` to `%s`.', JSON.stringify(prevReadyState), JSON.stringify(nextReadyState)) : void 0;
52
- }
53
-
54
- return;
55
- }
56
-
57
- this._mergeState(nextReadyState, newEvents);
58
- };
59
-
60
- _proto._mergeState = function _mergeState(nextReadyState, newEvents) {
61
- var _this = this;
62
-
63
- this._readyState = (0, _objectSpread2["default"])({}, this._readyState, nextReadyState, {
64
- events: newEvents && newEvents.length ? (0, _toConsumableArray2["default"])(this._readyState.events).concat((0, _toConsumableArray2["default"])(newEvents)) : this._readyState.events
65
- });
66
-
67
- if (this._scheduled) {
68
- return;
69
- }
70
-
71
- this._scheduled = true;
72
-
73
- require("fbjs/lib/resolveImmediate")(function () {
74
- _this._scheduled = false;
75
-
76
- _this._onReadyStateChange(_this._readyState);
77
- });
78
- };
79
-
80
- return RelayReadyState;
81
- }();
82
-
83
- module.exports = RelayReadyState;