relay-runtime 11.0.2 → 12.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 (100) hide show
  1. package/index.js +1 -1
  2. package/index.js.flow +16 -1
  3. package/lib/index.js +15 -0
  4. package/lib/multi-actor-environment/ActorIdentifier.js +11 -1
  5. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +59 -19
  6. package/lib/multi-actor-environment/ActorUtils.js +27 -0
  7. package/lib/multi-actor-environment/MultiActorEnvironment.js +305 -55
  8. package/lib/multi-actor-environment/index.js +5 -1
  9. package/lib/mutations/RelayRecordSourceSelectorProxy.js +6 -1
  10. package/lib/mutations/commitMutation.js +4 -1
  11. package/lib/mutations/validateMutation.js +6 -1
  12. package/lib/network/RelayObservable.js +3 -1
  13. package/lib/network/RelayQueryResponseCache.js +19 -3
  14. package/lib/network/wrapNetworkWithLogObserver.js +78 -0
  15. package/lib/store/DataChecker.js +110 -40
  16. package/lib/store/OperationExecutor.js +478 -204
  17. package/lib/store/RelayConcreteVariables.js +21 -0
  18. package/lib/store/RelayModernEnvironment.js +41 -85
  19. package/lib/store/RelayModernFragmentSpecResolver.js +48 -22
  20. package/lib/store/RelayModernRecord.js +35 -1
  21. package/lib/store/RelayModernStore.js +48 -14
  22. package/lib/store/RelayOperationTracker.js +33 -23
  23. package/lib/store/RelayPublishQueue.js +23 -5
  24. package/lib/store/RelayReader.js +138 -44
  25. package/lib/store/RelayRecordSource.js +87 -3
  26. package/lib/store/RelayReferenceMarker.js +28 -15
  27. package/lib/store/RelayResponseNormalizer.js +164 -91
  28. package/lib/store/RelayStoreReactFlightUtils.js +1 -7
  29. package/lib/store/RelayStoreSubscriptions.js +8 -5
  30. package/lib/store/RelayStoreUtils.js +7 -2
  31. package/lib/store/ResolverCache.js +213 -0
  32. package/lib/store/ResolverFragments.js +1 -1
  33. package/lib/store/createRelayContext.js +1 -1
  34. package/lib/subscription/requestSubscription.js +27 -29
  35. package/lib/util/RelayConcreteNode.js +1 -0
  36. package/lib/util/RelayFeatureFlags.js +3 -5
  37. package/lib/util/RelayReplaySubject.js +21 -6
  38. package/lib/util/getPaginationMetadata.js +41 -0
  39. package/lib/util/getPaginationVariables.js +67 -0
  40. package/lib/util/getPendingOperationsForFragment.js +55 -0
  41. package/lib/util/getRefetchMetadata.js +36 -0
  42. package/lib/util/getValueAtPath.js +51 -0
  43. package/lib/util/isEmptyObject.js +1 -1
  44. package/lib/util/registerEnvironmentWithDevTools.js +26 -0
  45. package/lib/util/withDuration.js +31 -0
  46. package/multi-actor-environment/ActorIdentifier.js.flow +17 -1
  47. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +72 -44
  48. package/multi-actor-environment/ActorUtils.js.flow +33 -0
  49. package/multi-actor-environment/MultiActorEnvironment.js.flow +332 -80
  50. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +61 -12
  51. package/multi-actor-environment/index.js.flow +3 -0
  52. package/mutations/RelayRecordSourceSelectorProxy.js.flow +7 -2
  53. package/mutations/commitMutation.js.flow +2 -0
  54. package/mutations/validateMutation.js.flow +8 -0
  55. package/network/RelayObservable.js.flow +2 -0
  56. package/network/RelayQueryResponseCache.js.flow +31 -18
  57. package/network/wrapNetworkWithLogObserver.js.flow +99 -0
  58. package/package.json +1 -1
  59. package/relay-runtime.js +2 -2
  60. package/relay-runtime.min.js +2 -2
  61. package/store/ClientID.js.flow +5 -1
  62. package/store/DataChecker.js.flow +126 -35
  63. package/store/OperationExecutor.js.flow +528 -265
  64. package/store/RelayConcreteVariables.js.flow +26 -1
  65. package/store/RelayModernEnvironment.js.flow +41 -94
  66. package/store/RelayModernFragmentSpecResolver.js.flow +40 -14
  67. package/store/RelayModernOperationDescriptor.js.flow +9 -3
  68. package/store/RelayModernRecord.js.flow +49 -0
  69. package/store/RelayModernStore.js.flow +50 -12
  70. package/store/RelayOperationTracker.js.flow +56 -34
  71. package/store/RelayPublishQueue.js.flow +31 -8
  72. package/store/RelayReader.js.flow +148 -42
  73. package/store/RelayRecordSource.js.flow +72 -6
  74. package/store/RelayReferenceMarker.js.flow +29 -12
  75. package/store/RelayResponseNormalizer.js.flow +164 -48
  76. package/store/RelayStoreReactFlightUtils.js.flow +1 -7
  77. package/store/RelayStoreSubscriptions.js.flow +10 -3
  78. package/store/RelayStoreTypes.js.flow +128 -12
  79. package/store/RelayStoreUtils.js.flow +17 -3
  80. package/store/ResolverCache.js.flow +247 -0
  81. package/store/ResolverFragments.js.flow +6 -3
  82. package/store/createRelayContext.js.flow +1 -1
  83. package/subscription/requestSubscription.js.flow +41 -29
  84. package/util/NormalizationNode.js.flow +10 -3
  85. package/util/ReaderNode.js.flow +15 -1
  86. package/util/RelayConcreteNode.js.flow +1 -0
  87. package/util/RelayFeatureFlags.js.flow +8 -10
  88. package/util/RelayReplaySubject.js.flow +7 -6
  89. package/util/getPaginationMetadata.js.flow +74 -0
  90. package/util/getPaginationVariables.js.flow +112 -0
  91. package/util/getPendingOperationsForFragment.js.flow +62 -0
  92. package/util/getRefetchMetadata.js.flow +80 -0
  93. package/util/getValueAtPath.js.flow +46 -0
  94. package/util/isEmptyObject.js.flow +1 -0
  95. package/util/registerEnvironmentWithDevTools.js.flow +33 -0
  96. package/util/withDuration.js.flow +32 -0
  97. package/lib/store/RelayRecordSourceMapImpl.js +0 -107
  98. package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +0 -318
  99. package/store/RelayRecordSourceMapImpl.js.flow +0 -91
  100. package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +0 -283
@@ -30,10 +30,14 @@ var getOperation = require('../util/getOperation');
30
30
 
31
31
  var invariant = require('invariant');
32
32
 
33
- var _require = require('./TypeID'),
34
- generateTypeID = _require.generateTypeID;
33
+ var _require = require('./RelayConcreteVariables'),
34
+ getLocalVariables = _require.getLocalVariables;
35
35
 
36
- var CONDITION = RelayConcreteNode.CONDITION,
36
+ var _require2 = require('./TypeID'),
37
+ generateTypeID = _require2.generateTypeID;
38
+
39
+ var ACTOR_CHANGE = RelayConcreteNode.ACTOR_CHANGE,
40
+ CONDITION = RelayConcreteNode.CONDITION,
37
41
  CLIENT_COMPONENT = RelayConcreteNode.CLIENT_COMPONENT,
38
42
  CLIENT_EXTENSION = RelayConcreteNode.CLIENT_EXTENSION,
39
43
  DEFER = RelayConcreteNode.DEFER,
@@ -107,6 +111,12 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
107
111
  selections.forEach(function (selection) {
108
112
  /* eslint-disable no-fallthrough */
109
113
  switch (selection.kind) {
114
+ case ACTOR_CHANGE:
115
+ // TODO: T89695151 Support multi-actor record sources in RelayReferenceMarker.js
116
+ _this._traverseLink(selection.linkedField, record);
117
+
118
+ break;
119
+
110
120
  case LINKED_FIELD:
111
121
  if (selection.plural) {
112
122
  _this._traversePluralLink(selection, record);
@@ -117,7 +127,7 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
117
127
  break;
118
128
 
119
129
  case CONDITION:
120
- var conditionValue = _this._getVariableValue(selection.condition);
130
+ var conditionValue = Boolean(_this._getVariableValue(selection.condition));
121
131
 
122
132
  if (conditionValue === selection.passingValue) {
123
133
  _this._traverseSelections(selection.selections, record);
@@ -132,24 +142,25 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
132
142
  if (typeName != null && typeName === selection.type) {
133
143
  _this._traverseSelections(selection.selections, record);
134
144
  }
135
- } else if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
145
+ } else {
136
146
  var _typeName = RelayModernRecord.getType(record);
137
147
 
138
148
  var typeID = generateTypeID(_typeName);
139
149
 
140
150
  _this._references.add(typeID);
141
151
 
142
- _this._traverseSelections(selection.selections, record);
143
- } else {
144
152
  _this._traverseSelections(selection.selections, record);
145
153
  }
146
154
 
147
155
  break;
148
- // $FlowFixMe[incompatible-type]
149
156
 
150
157
  case FRAGMENT_SPREAD:
158
+ var prevVariables = _this._variables;
159
+ _this._variables = getLocalVariables(_this._variables, selection.fragment.argumentDefinitions, selection.args);
160
+
151
161
  _this._traverseSelections(selection.fragment.selections, record);
152
162
 
163
+ _this._variables = prevVariables;
153
164
  break;
154
165
 
155
166
  case LINKED_HANDLE:
@@ -184,13 +195,11 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
184
195
 
185
196
  case TYPE_DISCRIMINATOR:
186
197
  {
187
- if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
188
- var _typeName2 = RelayModernRecord.getType(record);
198
+ var _typeName2 = RelayModernRecord.getType(record);
189
199
 
190
- var _typeID = generateTypeID(_typeName2);
200
+ var _typeID = generateTypeID(_typeName2);
191
201
 
192
- _this._references.add(_typeID);
193
- }
202
+ _this._references.add(_typeID);
194
203
 
195
204
  break;
196
205
  }
@@ -245,9 +254,13 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
245
254
  var normalizationRootNode = operationLoader.get(operationReference);
246
255
 
247
256
  if (normalizationRootNode != null) {
248
- var selections = getOperation(normalizationRootNode).selections;
257
+ var operation = getOperation(normalizationRootNode);
258
+ var prevVariables = this._variables;
259
+ this._variables = getLocalVariables(this._variables, operation.argumentDefinitions, moduleImport.args);
260
+
261
+ this._traverseSelections(operation.selections, record);
249
262
 
250
- this._traverseSelections(selections, record);
263
+ this._variables = prevVariables;
251
264
  } // Otherwise, if the operation is not available, we assume that the data
252
265
  // cannot have been processed yet and therefore isn't in the store to
253
266
  // begin with.
@@ -26,48 +26,56 @@ var invariant = require('invariant');
26
26
 
27
27
  var warning = require("fbjs/lib/warning");
28
28
 
29
- var _require = require('../util/RelayConcreteNode'),
30
- CONDITION = _require.CONDITION,
31
- CLIENT_COMPONENT = _require.CLIENT_COMPONENT,
32
- CLIENT_EXTENSION = _require.CLIENT_EXTENSION,
33
- DEFER = _require.DEFER,
34
- FLIGHT_FIELD = _require.FLIGHT_FIELD,
35
- FRAGMENT_SPREAD = _require.FRAGMENT_SPREAD,
36
- INLINE_FRAGMENT = _require.INLINE_FRAGMENT,
37
- LINKED_FIELD = _require.LINKED_FIELD,
38
- LINKED_HANDLE = _require.LINKED_HANDLE,
39
- MODULE_IMPORT = _require.MODULE_IMPORT,
40
- SCALAR_FIELD = _require.SCALAR_FIELD,
41
- SCALAR_HANDLE = _require.SCALAR_HANDLE,
42
- STREAM = _require.STREAM,
43
- TYPE_DISCRIMINATOR = _require.TYPE_DISCRIMINATOR;
44
-
45
- var _require2 = require('./ClientID'),
46
- generateClientID = _require2.generateClientID,
47
- isClientID = _require2.isClientID;
48
-
49
- var _require3 = require('./RelayModernSelector'),
50
- createNormalizationSelector = _require3.createNormalizationSelector;
51
-
52
- var _require4 = require('./RelayStoreReactFlightUtils'),
53
- refineToReactFlightPayloadData = _require4.refineToReactFlightPayloadData,
54
- REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = _require4.REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY,
55
- REACT_FLIGHT_TREE_STORAGE_KEY = _require4.REACT_FLIGHT_TREE_STORAGE_KEY,
56
- REACT_FLIGHT_TYPE_NAME = _require4.REACT_FLIGHT_TYPE_NAME;
57
-
58
- var _require5 = require('./RelayStoreUtils'),
59
- getArgumentValues = _require5.getArgumentValues,
60
- getHandleStorageKey = _require5.getHandleStorageKey,
61
- getModuleComponentKey = _require5.getModuleComponentKey,
62
- getModuleOperationKey = _require5.getModuleOperationKey,
63
- getStorageKey = _require5.getStorageKey,
64
- TYPENAME_KEY = _require5.TYPENAME_KEY,
65
- ROOT_ID = _require5.ROOT_ID,
66
- ROOT_TYPE = _require5.ROOT_TYPE;
67
-
68
- var _require6 = require('./TypeID'),
69
- generateTypeID = _require6.generateTypeID,
70
- TYPE_SCHEMA_TYPE = _require6.TYPE_SCHEMA_TYPE;
29
+ var _require = require('../multi-actor-environment/ActorUtils'),
30
+ ACTOR_IDENTIFIER_FIELD_NAME = _require.ACTOR_IDENTIFIER_FIELD_NAME,
31
+ getActorIdentifierFromPayload = _require.getActorIdentifierFromPayload;
32
+
33
+ var _require2 = require('../util/RelayConcreteNode'),
34
+ ACTOR_CHANGE = _require2.ACTOR_CHANGE,
35
+ CONDITION = _require2.CONDITION,
36
+ CLIENT_COMPONENT = _require2.CLIENT_COMPONENT,
37
+ CLIENT_EXTENSION = _require2.CLIENT_EXTENSION,
38
+ DEFER = _require2.DEFER,
39
+ FLIGHT_FIELD = _require2.FLIGHT_FIELD,
40
+ FRAGMENT_SPREAD = _require2.FRAGMENT_SPREAD,
41
+ INLINE_FRAGMENT = _require2.INLINE_FRAGMENT,
42
+ LINKED_FIELD = _require2.LINKED_FIELD,
43
+ LINKED_HANDLE = _require2.LINKED_HANDLE,
44
+ MODULE_IMPORT = _require2.MODULE_IMPORT,
45
+ SCALAR_FIELD = _require2.SCALAR_FIELD,
46
+ SCALAR_HANDLE = _require2.SCALAR_HANDLE,
47
+ STREAM = _require2.STREAM,
48
+ TYPE_DISCRIMINATOR = _require2.TYPE_DISCRIMINATOR;
49
+
50
+ var _require3 = require('./ClientID'),
51
+ generateClientID = _require3.generateClientID,
52
+ isClientID = _require3.isClientID;
53
+
54
+ var _require4 = require('./RelayConcreteVariables'),
55
+ getLocalVariables = _require4.getLocalVariables;
56
+
57
+ var _require5 = require('./RelayModernSelector'),
58
+ createNormalizationSelector = _require5.createNormalizationSelector;
59
+
60
+ var _require6 = require('./RelayStoreReactFlightUtils'),
61
+ refineToReactFlightPayloadData = _require6.refineToReactFlightPayloadData,
62
+ REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = _require6.REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY,
63
+ REACT_FLIGHT_TREE_STORAGE_KEY = _require6.REACT_FLIGHT_TREE_STORAGE_KEY,
64
+ REACT_FLIGHT_TYPE_NAME = _require6.REACT_FLIGHT_TYPE_NAME;
65
+
66
+ var _require7 = require('./RelayStoreUtils'),
67
+ getArgumentValues = _require7.getArgumentValues,
68
+ getHandleStorageKey = _require7.getHandleStorageKey,
69
+ getModuleComponentKey = _require7.getModuleComponentKey,
70
+ getModuleOperationKey = _require7.getModuleOperationKey,
71
+ getStorageKey = _require7.getStorageKey,
72
+ TYPENAME_KEY = _require7.TYPENAME_KEY,
73
+ ROOT_ID = _require7.ROOT_ID,
74
+ ROOT_TYPE = _require7.ROOT_TYPE;
75
+
76
+ var _require8 = require('./TypeID'),
77
+ generateTypeID = _require8.generateTypeID,
78
+ TYPE_SCHEMA_TYPE = _require8.TYPE_SCHEMA_TYPE;
71
79
 
72
80
  /**
73
81
  * Normalizes the results of a query and standard GraphQL response, writing the
@@ -89,13 +97,14 @@ function normalize(recordSource, selector, response, options) {
89
97
 
90
98
  var RelayResponseNormalizer = /*#__PURE__*/function () {
91
99
  function RelayResponseNormalizer(recordSource, variables, options) {
100
+ this._actorIdentifier = options.actorIdentifier;
92
101
  this._getDataId = options.getDataID;
93
102
  this._handleFieldPayloads = [];
94
103
  this._treatMissingFieldsAsNull = options.treatMissingFieldsAsNull;
95
104
  this._incrementalPlaceholders = [];
96
105
  this._isClientExtension = false;
97
106
  this._isUnmatchedAbstractType = false;
98
- this._moduleImportPayloads = [];
107
+ this._followupPayloads = [];
99
108
  this._path = options.path ? (0, _toConsumableArray2["default"])(options.path) : [];
100
109
  this._recordSource = recordSource;
101
110
  this._variables = variables;
@@ -117,7 +126,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
117
126
  errors: null,
118
127
  fieldPayloads: this._handleFieldPayloads,
119
128
  incrementalPlaceholders: this._incrementalPlaceholders,
120
- moduleImportPayloads: this._moduleImportPayloads,
129
+ followupPayloads: this._followupPayloads,
121
130
  source: this._recordSource,
122
131
  isFinal: false
123
132
  };
@@ -147,7 +156,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
147
156
  break;
148
157
 
149
158
  case CONDITION:
150
- var conditionValue = this._getVariableValue(selection.condition);
159
+ var conditionValue = Boolean(this._getVariableValue(selection.condition));
151
160
 
152
161
  if (conditionValue === selection.passingValue) {
153
162
  this._traverseSelections(selection, record, data);
@@ -157,8 +166,12 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
157
166
 
158
167
  case FRAGMENT_SPREAD:
159
168
  {
169
+ var prevVariables = this._variables;
170
+ this._variables = getLocalVariables(this._variables, selection.fragment.argumentDefinitions, selection.args);
171
+
160
172
  this._traverseSelections(selection.fragment, record, data);
161
173
 
174
+ this._variables = prevVariables;
162
175
  break;
163
176
  }
164
177
 
@@ -172,7 +185,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
172
185
  if (_typeName === selection.type) {
173
186
  this._traverseSelections(selection, record, data);
174
187
  }
175
- } else if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
188
+ } else {
176
189
  var implementsInterface = data.hasOwnProperty(abstractKey);
177
190
 
178
191
  var _typeName2 = RelayModernRecord.getType(record);
@@ -192,18 +205,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
192
205
  if (implementsInterface) {
193
206
  this._traverseSelections(selection, record, data);
194
207
  }
195
- } else {
196
- // legacy behavior for abstract refinements: always normalize even
197
- // if the type doesn't conform, but track if the type matches or not
198
- // for determining whether response fields are expected to be present
199
- var _implementsInterface = data.hasOwnProperty(abstractKey);
200
-
201
- var parentIsUnmatchedAbstractType = this._isUnmatchedAbstractType;
202
- this._isUnmatchedAbstractType = this._isUnmatchedAbstractType || !_implementsInterface;
203
-
204
- this._traverseSelections(selection, record, data);
205
-
206
- this._isUnmatchedAbstractType = parentIsUnmatchedAbstractType;
207
208
  }
208
209
 
209
210
  break;
@@ -211,26 +212,23 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
211
212
 
212
213
  case TYPE_DISCRIMINATOR:
213
214
  {
214
- if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
215
- var _abstractKey = selection.abstractKey;
216
-
217
- var _implementsInterface2 = data.hasOwnProperty(_abstractKey);
215
+ var _abstractKey = selection.abstractKey;
218
216
 
219
- var _typeName3 = RelayModernRecord.getType(record);
217
+ var _implementsInterface = data.hasOwnProperty(_abstractKey);
220
218
 
221
- var _typeID = generateTypeID(_typeName3);
219
+ var _typeName3 = RelayModernRecord.getType(record);
222
220
 
223
- var _typeRecord = this._recordSource.get(_typeID);
221
+ var _typeID = generateTypeID(_typeName3);
224
222
 
225
- if (_typeRecord == null) {
226
- _typeRecord = RelayModernRecord.create(_typeID, TYPE_SCHEMA_TYPE);
223
+ var _typeRecord = this._recordSource.get(_typeID);
227
224
 
228
- this._recordSource.set(_typeID, _typeRecord);
229
- }
225
+ if (_typeRecord == null) {
226
+ _typeRecord = RelayModernRecord.create(_typeID, TYPE_SCHEMA_TYPE);
230
227
 
231
- RelayModernRecord.setValue(_typeRecord, _abstractKey, _implementsInterface2);
228
+ this._recordSource.set(_typeID, _typeRecord);
232
229
  }
233
230
 
231
+ RelayModernRecord.setValue(_typeRecord, _abstractKey, _implementsInterface);
234
232
  break;
235
233
  }
236
234
 
@@ -241,12 +239,17 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
241
239
  var handleKey = getHandleStorageKey(selection, this._variables);
242
240
 
243
241
  this._handleFieldPayloads.push({
242
+ /* $FlowFixMe[class-object-subtyping] added when improving typing
243
+ * for this parameters */
244
244
  args: args,
245
245
  dataID: RelayModernRecord.getDataID(record),
246
246
  fieldKey: fieldKey,
247
247
  handle: selection.handle,
248
248
  handleKey: handleKey,
249
- handleArgs: selection.handleArgs ? getArgumentValues(selection.handleArgs, this._variables) : {}
249
+ handleArgs: selection.handleArgs ?
250
+ /* $FlowFixMe[class-object-subtyping] added when improving typing
251
+ * for this parameters */
252
+ getArgumentValues(selection.handleArgs, this._variables) : {}
250
253
  });
251
254
 
252
255
  break;
@@ -293,6 +296,11 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
293
296
 
294
297
  break;
295
298
 
299
+ case ACTOR_CHANGE:
300
+ this._normalizeActorChange(node, selection, record, data);
301
+
302
+ break;
303
+
296
304
  default:
297
305
  selection;
298
306
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
@@ -320,7 +328,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
320
328
  label: defer.label,
321
329
  path: (0, _toConsumableArray2["default"])(this._path),
322
330
  selector: createNormalizationSelector(defer, RelayModernRecord.getDataID(record), this._variables),
323
- typeName: RelayModernRecord.getType(record)
331
+ typeName: RelayModernRecord.getType(record),
332
+ actorIdentifier: this._actorIdentifier
324
333
  });
325
334
  }
326
335
  };
@@ -346,7 +355,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
346
355
  path: (0, _toConsumableArray2["default"])(this._path),
347
356
  parentID: RelayModernRecord.getDataID(record),
348
357
  node: stream,
349
- variables: this._variables
358
+ variables: this._variables,
359
+ actorIdentifier: this._actorIdentifier
350
360
  });
351
361
  }
352
362
  };
@@ -362,13 +372,16 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
362
372
  RelayModernRecord.setValue(record, operationKey, operationReference !== null && operationReference !== void 0 ? operationReference : null);
363
373
 
364
374
  if (operationReference != null) {
365
- this._moduleImportPayloads.push({
375
+ this._followupPayloads.push({
376
+ kind: 'ModuleImportPayload',
377
+ args: moduleImport.args,
366
378
  data: data,
367
379
  dataID: RelayModernRecord.getDataID(record),
368
380
  operationReference: operationReference,
369
381
  path: (0, _toConsumableArray2["default"])(this._path),
370
382
  typeName: typeName,
371
- variables: this._variables
383
+ variables: this._variables,
384
+ actorIdentifier: this._actorIdentifier
372
385
  });
373
386
  }
374
387
  };
@@ -439,6 +452,64 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
439
452
  }
440
453
  };
441
454
 
455
+ _proto._normalizeActorChange = function _normalizeActorChange(parent, selection, record, data) {
456
+ var _field$concreteType;
457
+
458
+ var field = selection.linkedField;
459
+ !(typeof data === 'object' && data) ? process.env.NODE_ENV !== "production" ? invariant(false, '_normalizeActorChange(): Expected data for field `%s` to be an object.', field.name) : invariant(false) : void 0;
460
+ var responseKey = field.alias || field.name;
461
+ var storageKey = getStorageKey(field, this._variables);
462
+ var fieldValue = data[responseKey];
463
+
464
+ if (fieldValue == null) {
465
+ if (fieldValue === undefined) {
466
+ var isOptionalField = this._isClientExtension || this._isUnmatchedAbstractType;
467
+
468
+ if (isOptionalField) {
469
+ return;
470
+ } else if (!this._treatMissingFieldsAsNull) {
471
+ if (process.env.NODE_ENV !== "production") {
472
+ process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Payload did not contain a value ' + 'for field `%s: %s`. Check that you are parsing with the same ' + 'query that was used to fetch the payload.', responseKey, storageKey) : void 0;
473
+ }
474
+
475
+ return;
476
+ }
477
+ }
478
+
479
+ RelayModernRecord.setValue(record, storageKey, null);
480
+ return;
481
+ }
482
+
483
+ var actorIdentifier = getActorIdentifierFromPayload(fieldValue);
484
+
485
+ if (actorIdentifier == null) {
486
+ if (process.env.NODE_ENV !== "production") {
487
+ process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Payload did not contain a value ' + 'for field `%s`. Check that you are parsing with the same ' + 'query that was used to fetch the payload. Payload is `%s`.', ACTOR_IDENTIFIER_FIELD_NAME, JSON.stringify(fieldValue, null, 2)) : void 0;
488
+ }
489
+
490
+ RelayModernRecord.setValue(record, storageKey, null);
491
+ return;
492
+ } // $FlowFixMe[incompatible-call]
493
+
494
+
495
+ var typeName = (_field$concreteType = field.concreteType) !== null && _field$concreteType !== void 0 ? _field$concreteType : this._getRecordType(fieldValue);
496
+ var nextID = this._getDataId( // $FlowFixMe[incompatible-call]
497
+ fieldValue, typeName) || RelayModernRecord.getLinkedRecordID(record, storageKey) || generateClientID(RelayModernRecord.getDataID(record), storageKey);
498
+ !(typeof nextID === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected id on field `%s` to be a string.', storageKey) : invariant(false) : void 0;
499
+ RelayModernRecord.setActorLinkedRecordID(record, storageKey, actorIdentifier, nextID);
500
+
501
+ this._followupPayloads.push({
502
+ kind: 'ActorPayload',
503
+ data: fieldValue,
504
+ dataID: nextID,
505
+ path: [].concat((0, _toConsumableArray2["default"])(this._path), [responseKey]),
506
+ typeName: typeName,
507
+ variables: this._variables,
508
+ node: field,
509
+ actorIdentifier: actorIdentifier
510
+ });
511
+ };
512
+
442
513
  _proto._normalizeFlightField = function _normalizeFlightField(parent, selection, record, data) {
443
514
  var responseKey = selection.alias || selection.name;
444
515
  var storageKey = getStorageKey(selection, this._variables);
@@ -457,14 +528,10 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
457
528
  // Field not expected to exist regardless of whether the server is pruning null
458
529
  // fields or not.
459
530
  return;
460
- } else if (!this._treatMissingFieldsAsNull) {
531
+ } else {
461
532
  // Not optional and the server is not pruning null fields: field is expected
462
533
  // to be present
463
- if (process.env.NODE_ENV !== "production") {
464
- process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Payload did not contain a value ' + 'for field `%s: %s`. Check that you are parsing with the same ' + 'query that was used to fetch the payload.', responseKey, storageKey) : void 0;
465
- }
466
-
467
- return;
534
+ !this._treatMissingFieldsAsNull ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Payload did not contain a value for ' + 'field `%s: %s`. Check that you are parsing with the same ' + 'query that was used to fetch the payload.', responseKey, storageKey) : invariant(false) : void 0;
468
535
  }
469
536
  }
470
537
 
@@ -525,13 +592,16 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
525
592
  var query = _step.value;
526
593
 
527
594
  if (query.response.data != null) {
528
- this._moduleImportPayloads.push({
595
+ this._followupPayloads.push({
596
+ kind: 'ModuleImportPayload',
597
+ args: null,
529
598
  data: query.response.data,
530
599
  dataID: ROOT_ID,
531
600
  operationReference: query.module,
532
601
  path: [],
533
602
  typeName: ROOT_TYPE,
534
- variables: query.variables
603
+ variables: query.variables,
604
+ actorIdentifier: this._actorIdentifier
535
605
  });
536
606
  }
537
607
 
@@ -554,13 +624,16 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
554
624
  var fragment = _step2.value;
555
625
 
556
626
  if (fragment.response.data != null) {
557
- this._moduleImportPayloads.push({
627
+ this._followupPayloads.push({
628
+ kind: 'ModuleImportPayload',
629
+ args: null,
558
630
  data: fragment.response.data,
559
631
  dataID: fragment.__id,
560
632
  operationReference: fragment.module,
561
633
  path: [],
562
634
  typeName: fragment.__typename,
563
- variables: fragment.variables
635
+ variables: fragment.variables,
636
+ actorIdentifier: this._actorIdentifier
564
637
  });
565
638
  }
566
639
 
@@ -580,12 +653,12 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
580
653
  };
581
654
 
582
655
  _proto._normalizeLink = function _normalizeLink(field, record, storageKey, fieldValue) {
583
- var _field$concreteType;
656
+ var _field$concreteType2;
584
657
 
585
658
  !(typeof fieldValue === 'object' && fieldValue) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected data for field `%s` to be an object.', storageKey) : invariant(false) : void 0;
586
659
  var nextID = this._getDataId( // $FlowFixMe[incompatible-variance]
587
660
  fieldValue, // $FlowFixMe[incompatible-variance]
588
- (_field$concreteType = field.concreteType) !== null && _field$concreteType !== void 0 ? _field$concreteType : this._getRecordType(fieldValue)) || // Reuse previously generated client IDs
661
+ (_field$concreteType2 = field.concreteType) !== null && _field$concreteType2 !== void 0 ? _field$concreteType2 : this._getRecordType(fieldValue)) || // Reuse previously generated client IDs
589
662
  RelayModernRecord.getLinkedRecordID(record, storageKey) || generateClientID(RelayModernRecord.getDataID(record), storageKey);
590
663
  !(typeof nextID === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected id on field `%s` to be a string.', storageKey) : invariant(false) : void 0;
591
664
 
@@ -619,7 +692,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
619
692
  var prevIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
620
693
  var nextIDs = [];
621
694
  fieldValue.forEach(function (item, nextIndex) {
622
- var _field$concreteType2;
695
+ var _field$concreteType3;
623
696
 
624
697
  // validate response data
625
698
  if (item == null) {
@@ -632,7 +705,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
632
705
  !(typeof item === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected elements for field `%s` to be ' + 'objects.', storageKey) : invariant(false) : void 0;
633
706
  var nextID = _this._getDataId( // $FlowFixMe[incompatible-variance]
634
707
  item, // $FlowFixMe[incompatible-variance]
635
- (_field$concreteType2 = field.concreteType) !== null && _field$concreteType2 !== void 0 ? _field$concreteType2 : _this._getRecordType(item)) || prevIDs && prevIDs[nextIndex] || // Reuse previously generated client IDs:
708
+ (_field$concreteType3 = field.concreteType) !== null && _field$concreteType3 !== void 0 ? _field$concreteType3 : _this._getRecordType(item)) || prevIDs && prevIDs[nextIndex] || // Reuse previously generated client IDs:
636
709
  generateClientID(RelayModernRecord.getDataID(record), storageKey, nextIndex);
637
710
  !(typeof nextID === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected id of elements of field `%s` to ' + 'be strings.', storageKey) : invariant(false) : void 0;
638
711
  nextIDs.push(nextID);
@@ -671,9 +744,9 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
671
744
  ;
672
745
 
673
746
  _proto._validateRecordType = function _validateRecordType(record, field, payload) {
674
- var _field$concreteType3;
747
+ var _field$concreteType4;
675
748
 
676
- var typeName = (_field$concreteType3 = field.concreteType) !== null && _field$concreteType3 !== void 0 ? _field$concreteType3 : this._getRecordType(payload);
749
+ var typeName = (_field$concreteType4 = field.concreteType) !== null && _field$concreteType4 !== void 0 ? _field$concreteType4 : this._getRecordType(payload);
677
750
  var dataID = RelayModernRecord.getDataID(record);
678
751
  process.env.NODE_ENV !== "production" ? warning(isClientID(dataID) && dataID !== ROOT_ID || RelayModernRecord.getType(record) === typeName, 'RelayResponseNormalizer: Invalid record `%s`. Expected %s to be ' + 'consistent, but the record was assigned conflicting types `%s` ' + 'and `%s`. The GraphQL server likely violated the globally unique ' + 'id requirement by returning the same id for different objects.', dataID, TYPENAME_KEY, RelayModernRecord.getType(record), typeName) : void 0;
679
752
  }
@@ -31,13 +31,7 @@ function refineToReactFlightPayloadData(payload) {
31
31
 
32
32
  function getReactFlightClientResponse(record) {
33
33
  !(getType(record) === REACT_FLIGHT_TYPE_NAME) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getReactFlightClientResponse(): Expected a ReactFlightComponentRecord, ' + 'got %s.', record) : invariant(false) : void 0;
34
- var response = record[REACT_FLIGHT_TREE_STORAGE_KEY];
35
-
36
- if (response != null) {
37
- return response;
38
- }
39
-
40
- return null;
34
+ return record[REACT_FLIGHT_TREE_STORAGE_KEY];
41
35
  }
42
36
 
43
37
  module.exports = {
@@ -21,9 +21,10 @@ var hasOverlappingIDs = require('./hasOverlappingIDs');
21
21
  var recycleNodesInto = require('../util/recycleNodesInto');
22
22
 
23
23
  var RelayStoreSubscriptions = /*#__PURE__*/function () {
24
- function RelayStoreSubscriptions(log) {
24
+ function RelayStoreSubscriptions(log, resolverCache) {
25
25
  this._subscriptions = new Set();
26
26
  this.__log = log;
27
+ this._resolverCache = resolverCache;
27
28
  }
28
29
 
29
30
  var _proto = RelayStoreSubscriptions.prototype;
@@ -50,6 +51,8 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
50
51
  };
51
52
 
52
53
  _proto.snapshotSubscriptions = function snapshotSubscriptions(source) {
54
+ var _this2 = this;
55
+
53
56
  this._subscriptions.forEach(function (subscription) {
54
57
  // Backup occurs after writing a new "final" payload(s) and before (re)applying
55
58
  // optimistic changes. Each subscription's `snapshot` represents what was *last
@@ -69,7 +72,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
69
72
  }
70
73
 
71
74
  var snapshot = subscription.snapshot;
72
- var backup = RelayReader.read(source, snapshot.selector);
75
+ var backup = RelayReader.read(source, snapshot.selector, _this2._resolverCache);
73
76
  var nextData = recycleNodesInto(snapshot.data, backup.data);
74
77
  backup.data = nextData; // backup owns the snapshot and can safely mutate
75
78
 
@@ -101,12 +104,12 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
101
104
  };
102
105
 
103
106
  _proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners, sourceOperation) {
104
- var _this2 = this;
107
+ var _this3 = this;
105
108
 
106
109
  var hasUpdatedRecords = updatedRecordIDs.size !== 0;
107
110
 
108
111
  this._subscriptions.forEach(function (subscription) {
109
- var owner = _this2._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation);
112
+ var owner = _this3._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation);
110
113
 
111
114
  if (owner != null) {
112
115
  updatedOwners.push(owner);
@@ -134,7 +137,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
134
137
  return;
135
138
  }
136
139
 
137
- var nextSnapshot = hasOverlappingUpdates || !backup ? RelayReader.read(source, snapshot.selector) : backup;
140
+ var nextSnapshot = hasOverlappingUpdates || !backup ? RelayReader.read(source, snapshot.selector, this._resolverCache) : backup;
138
141
  var nextData = recycleNodesInto(snapshot.data, nextSnapshot.data);
139
142
  nextSnapshot = {
140
143
  data: nextData,
@@ -122,8 +122,8 @@ function getStorageKey(field, variables) {
122
122
  return field.storageKey;
123
123
  }
124
124
 
125
- var args = field.args,
126
- name = field.name;
125
+ var args = typeof field.args === 'undefined' ? undefined : field.args;
126
+ var name = field.name;
127
127
  return args && args.length !== 0 ? formatStorageKey(name, getArgumentValues(args, variables)) : name;
128
128
  }
129
129
  /**
@@ -193,6 +193,7 @@ function getModuleOperationKey(documentName) {
193
193
 
194
194
 
195
195
  var RelayStoreUtils = {
196
+ ACTOR_IDENTIFIER_KEY: '__actorIdentifier',
196
197
  FRAGMENTS_KEY: '__fragments',
197
198
  FRAGMENT_OWNER_KEY: '__fragmentOwner',
198
199
  FRAGMENT_PROP_NAME_KEY: '__fragmentPropName',
@@ -206,6 +207,10 @@ var RelayStoreUtils = {
206
207
  TYPENAME_KEY: '__typename',
207
208
  INVALIDATED_AT_KEY: '__invalidated_at',
208
209
  IS_WITHIN_UNMATCHED_TYPE_REFINEMENT: '__isWithinUnmatchedTypeRefinement',
210
+ RELAY_RESOLVER_VALUE_KEY: '__resolverValue',
211
+ RELAY_RESOLVER_INVALIDATION_KEY: '__resolverValueMayBeInvalid',
212
+ RELAY_RESOLVER_INPUTS_KEY: '__resolverInputValues',
213
+ RELAY_RESOLVER_READER_SELECTOR_KEY: '__resolverReaderSelector',
209
214
  formatStorageKey: formatStorageKey,
210
215
  getArgumentValue: getArgumentValue,
211
216
  getArgumentValues: getArgumentValues,