relay-runtime 18.1.0 → 19.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 (92) hide show
  1. package/experimental.js +1 -1
  2. package/experimental.js.flow +22 -9
  3. package/handlers/connection/ConnectionHandler.js.flow +6 -1
  4. package/index.js +1 -1
  5. package/index.js.flow +4 -0
  6. package/lib/experimental.js +5 -2
  7. package/lib/handlers/connection/ConnectionHandler.js +1 -1
  8. package/lib/index.js +3 -0
  9. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +1 -1
  10. package/lib/mutations/RelayRecordProxy.js +14 -3
  11. package/lib/mutations/RelayRecordSourceMutator.js +17 -0
  12. package/lib/mutations/RelayRecordSourceProxy.js +2 -1
  13. package/lib/mutations/createUpdatableProxy.js +1 -1
  14. package/lib/mutations/validateMutation.js +2 -2
  15. package/lib/network/RelayObservable.js +1 -3
  16. package/lib/network/wrapNetworkWithLogObserver.js +2 -2
  17. package/lib/query/fetchQuery.js +1 -1
  18. package/lib/store/DataChecker.js +4 -5
  19. package/lib/store/OperationExecutor.js +11 -0
  20. package/lib/store/RelayModernEnvironment.js +13 -4
  21. package/lib/store/RelayModernFragmentSpecResolver.js +4 -4
  22. package/lib/store/RelayModernStore.js +43 -21
  23. package/lib/store/RelayPublishQueue.js +11 -15
  24. package/lib/store/RelayReader.js +244 -183
  25. package/lib/store/RelayReferenceMarker.js +3 -4
  26. package/lib/store/RelayResponseNormalizer.js +48 -26
  27. package/lib/store/RelayStoreSubscriptions.js +2 -2
  28. package/lib/store/RelayStoreUtils.js +8 -0
  29. package/lib/store/ResolverCache.js +1 -165
  30. package/lib/store/ResolverFragments.js +2 -2
  31. package/lib/store/createRelayLoggingContext.js +17 -0
  32. package/lib/store/generateTypenamePrefixedDataID.js +9 -0
  33. package/lib/store/live-resolvers/LiveResolverCache.js +5 -10
  34. package/lib/store/live-resolvers/resolverDataInjector.js +4 -4
  35. package/lib/store/observeFragmentExperimental.js +60 -13
  36. package/lib/store/observeQueryExperimental.js +21 -0
  37. package/lib/util/RelayFeatureFlags.js +7 -2
  38. package/lib/util/handlePotentialSnapshotErrors.js +12 -9
  39. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +1 -0
  40. package/mutations/RelayRecordProxy.js.flow +30 -3
  41. package/mutations/RelayRecordSourceMutator.js.flow +27 -0
  42. package/mutations/RelayRecordSourceProxy.js.flow +4 -0
  43. package/mutations/createUpdatableProxy.js.flow +1 -1
  44. package/mutations/validateMutation.js.flow +3 -3
  45. package/network/RelayNetworkTypes.js.flow +3 -0
  46. package/network/RelayObservable.js.flow +1 -5
  47. package/network/wrapNetworkWithLogObserver.js.flow +19 -1
  48. package/package.json +1 -1
  49. package/query/fetchQuery.js.flow +1 -1
  50. package/store/DataChecker.js.flow +5 -2
  51. package/store/OperationExecutor.js.flow +12 -1
  52. package/store/RelayExperimentalGraphResponseTransform.js.flow +4 -4
  53. package/store/RelayModernEnvironment.js.flow +22 -6
  54. package/store/RelayModernFragmentSpecResolver.js.flow +6 -6
  55. package/store/RelayModernRecord.js.flow +1 -1
  56. package/store/RelayModernSelector.js.flow +2 -0
  57. package/store/RelayModernStore.js.flow +74 -27
  58. package/store/RelayOptimisticRecordSource.js.flow +2 -0
  59. package/store/RelayPublishQueue.js.flow +32 -21
  60. package/store/RelayReader.js.flow +400 -145
  61. package/store/RelayRecordState.js.flow +1 -1
  62. package/store/RelayReferenceMarker.js.flow +3 -4
  63. package/store/RelayResponseNormalizer.js.flow +94 -62
  64. package/store/RelayStoreSubscriptions.js.flow +2 -2
  65. package/store/RelayStoreTypes.js.flow +45 -15
  66. package/store/RelayStoreUtils.js.flow +30 -1
  67. package/store/ResolverCache.js.flow +2 -271
  68. package/store/ResolverFragments.js.flow +5 -3
  69. package/store/StoreInspector.js.flow +5 -0
  70. package/store/createRelayContext.js.flow +3 -2
  71. package/store/createRelayLoggingContext.js.flow +46 -0
  72. package/store/generateTypenamePrefixedDataID.js.flow +25 -0
  73. package/store/live-resolvers/LiveResolverCache.js.flow +5 -10
  74. package/store/live-resolvers/resolverDataInjector.js.flow +10 -6
  75. package/store/observeFragmentExperimental.js.flow +82 -28
  76. package/store/observeQueryExperimental.js.flow +61 -0
  77. package/store/waitForFragmentExperimental.js.flow +4 -3
  78. package/util/NormalizationNode.js.flow +10 -1
  79. package/util/ReaderNode.js.flow +9 -3
  80. package/util/RelayConcreteNode.js.flow +3 -1
  81. package/util/RelayError.js.flow +1 -0
  82. package/util/RelayFeatureFlags.js.flow +31 -7
  83. package/util/RelayRuntimeTypes.js.flow +17 -3
  84. package/util/getPaginationVariables.js.flow +2 -0
  85. package/util/handlePotentialSnapshotErrors.js.flow +24 -12
  86. package/util/registerEnvironmentWithDevTools.js.flow +4 -2
  87. package/util/withProvidedVariables.js.flow +1 -0
  88. package/util/withStartAndDuration.js.flow +3 -0
  89. package/relay-runtime-experimental.js +0 -4
  90. package/relay-runtime-experimental.min.js +0 -9
  91. package/relay-runtime.js +0 -4
  92. package/relay-runtime.min.js +0 -9
@@ -12,7 +12,8 @@ var RelayStoreUtils = require('./RelayStoreUtils');
12
12
  var _require2 = require('./TypeID'),
13
13
  generateTypeID = _require2.generateTypeID;
14
14
  var invariant = require('invariant');
15
- var getStorageKey = RelayStoreUtils.getStorageKey,
15
+ var getReadTimeResolverStorageKey = RelayStoreUtils.getReadTimeResolverStorageKey,
16
+ getStorageKey = RelayStoreUtils.getStorageKey,
16
17
  getModuleOperationKey = RelayStoreUtils.getModuleOperationKey;
17
18
  function mark(recordSource, selector, references, operationLoader, shouldProcessClientComponents) {
18
19
  var dataID = selector.dataID,
@@ -123,8 +124,6 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
123
124
  _this._traverseSelections(selection.fragment.selections, record);
124
125
  break;
125
126
  case 'RelayResolver':
126
- _this._traverseResolverField(selection, record);
127
- break;
128
127
  case 'RelayLiveResolver':
129
128
  _this._traverseResolverField(selection, record);
130
129
  break;
@@ -195,7 +194,7 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
195
194
  }
196
195
  };
197
196
  _proto._traverseResolverField = function _traverseResolverField(field, record) {
198
- var storageKey = getStorageKey(field, this._variables);
197
+ var storageKey = getReadTimeResolverStorageKey(field, this._variables);
199
198
  var dataID = RelayModernRecord.getLinkedRecordID(record, storageKey);
200
199
  if (dataID != null) {
201
200
  this._references.add(dataID);
@@ -6,6 +6,7 @@ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers
6
6
  var _require = require('../multi-actor-environment/ActorUtils'),
7
7
  ACTOR_IDENTIFIER_FIELD_NAME = _require.ACTOR_IDENTIFIER_FIELD_NAME,
8
8
  getActorIdentifierFromPayload = _require.getActorIdentifierFromPayload;
9
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
9
10
  var _require2 = require('./ClientID'),
10
11
  generateClientID = _require2.generateClientID,
11
12
  isClientID = _require2.isClientID;
@@ -53,6 +54,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
53
54
  this._recordSource = recordSource;
54
55
  this._variables = variables;
55
56
  this._shouldProcessClientComponents = options.shouldProcessClientComponents;
57
+ this._log = options.log;
56
58
  }
57
59
  var _proto = RelayResponseNormalizer.prototype;
58
60
  _proto.normalizeResponse = function normalizeResponse(node, dataID, data, errors) {
@@ -204,8 +206,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
204
206
  this._normalizeActorChange(selection, record, data);
205
207
  break;
206
208
  case 'RelayResolver':
207
- this._normalizeResolver(selection, record, data);
208
- break;
209
209
  case 'RelayLiveResolver':
210
210
  this._normalizeResolver(selection, record, data);
211
211
  break;
@@ -288,7 +288,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
288
288
  var responseKey = selection.alias || selection.name;
289
289
  var storageKey = getStorageKey(selection, this._variables);
290
290
  var fieldValue = data[responseKey];
291
- if (fieldValue == null) {
291
+ var isNoncompliantlyNullish = RelayFeatureFlags.ENABLE_NONCOMPLIANT_ERROR_HANDLING_ON_LISTS && Array.isArray(fieldValue) && fieldValue.length === 0;
292
+ if (fieldValue == null || isNoncompliantlyNullish) {
292
293
  if (fieldValue === undefined) {
293
294
  var isOptionalField = this._isClientExtension || this._isUnmatchedAbstractType;
294
295
  if (isOptionalField) {
@@ -300,12 +301,18 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
300
301
  return;
301
302
  }
302
303
  }
303
- if (process.env.NODE_ENV !== "production") {
304
- if (selection.kind === 'ScalarField') {
305
- this._validateConflictingFieldsWithIdenticalId(record, storageKey, null);
304
+ if (selection.kind === 'ScalarField') {
305
+ this._validateConflictingFieldsWithIdenticalId(record, storageKey, null);
306
+ }
307
+ if (isNoncompliantlyNullish) {
308
+ if (selection.kind === 'LinkedField') {
309
+ RelayModernRecord.setLinkedRecordIDs(record, storageKey, []);
310
+ } else {
311
+ RelayModernRecord.setValue(record, storageKey, []);
306
312
  }
313
+ } else {
314
+ RelayModernRecord.setValue(record, storageKey, null);
307
315
  }
308
- RelayModernRecord.setValue(record, storageKey, null);
309
316
  var errorTrie = this._errorTrie;
310
317
  if (errorTrie != null) {
311
318
  var errors = getErrorsByKey(errorTrie, responseKey);
@@ -316,9 +323,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
316
323
  return;
317
324
  }
318
325
  if (selection.kind === 'ScalarField') {
319
- if (process.env.NODE_ENV !== "production") {
320
- this._validateConflictingFieldsWithIdenticalId(record, storageKey, fieldValue);
321
- }
326
+ this._validateConflictingFieldsWithIdenticalId(record, storageKey, fieldValue);
322
327
  RelayModernRecord.setValue(record, storageKey, fieldValue);
323
328
  } else if (selection.kind === 'LinkedField') {
324
329
  this._path.push(responseKey);
@@ -386,16 +391,14 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
386
391
  !(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;
387
392
  var nextID = this._getDataId(fieldValue, (_field$concreteType2 = field.concreteType) !== null && _field$concreteType2 !== void 0 ? _field$concreteType2 : this._getRecordType(fieldValue)) || RelayModernRecord.getLinkedRecordID(record, storageKey) || generateClientID(RelayModernRecord.getDataID(record), storageKey);
388
393
  !(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;
389
- if (process.env.NODE_ENV !== "production") {
390
- this._validateConflictingLinkedFieldsWithIdenticalId(RelayModernRecord.getLinkedRecordID(record, storageKey), nextID, storageKey);
391
- }
394
+ this._validateConflictingLinkedFieldsWithIdenticalId(RelayModernRecord.getLinkedRecordID(record, storageKey), nextID, storageKey);
392
395
  RelayModernRecord.setLinkedRecordID(record, storageKey, nextID);
393
396
  var nextRecord = this._recordSource.get(nextID);
394
397
  if (!nextRecord) {
395
398
  var typeName = field.concreteType || this._getRecordType(fieldValue);
396
399
  nextRecord = RelayModernRecord.create(nextID, typeName);
397
400
  this._recordSource.set(nextID, nextRecord);
398
- } else if (process.env.NODE_ENV !== "production") {
401
+ } else {
399
402
  this._validateRecordType(nextRecord, field, fieldValue);
400
403
  }
401
404
  this._traverseSelections(field, nextRecord, fieldValue);
@@ -423,13 +426,11 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
423
426
  var typeName = field.concreteType || _this._getRecordType(item);
424
427
  nextRecord = RelayModernRecord.create(nextID, typeName);
425
428
  _this._recordSource.set(nextID, nextRecord);
426
- } else if (process.env.NODE_ENV !== "production") {
429
+ } else {
427
430
  _this._validateRecordType(nextRecord, field, item);
428
431
  }
429
- if (process.env.NODE_ENV !== "production") {
430
- if (prevIDs) {
431
- _this._validateConflictingLinkedFieldsWithIdenticalId(prevIDs[nextIndex], nextID, storageKey);
432
- }
432
+ if (prevIDs) {
433
+ _this._validateConflictingLinkedFieldsWithIdenticalId(prevIDs[nextIndex], nextID, storageKey);
433
434
  }
434
435
  _this._traverseSelections(field, nextRecord, item);
435
436
  _this._errorTrie = oldErrorTrie;
@@ -438,21 +439,42 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
438
439
  RelayModernRecord.setLinkedRecordIDs(record, storageKey, nextIDs);
439
440
  };
440
441
  _proto._validateRecordType = function _validateRecordType(record, field, payload) {
441
- var _field$concreteType4;
442
- var typeName = (_field$concreteType4 = field.concreteType) !== null && _field$concreteType4 !== void 0 ? _field$concreteType4 : this._getRecordType(payload);
443
- var dataID = RelayModernRecord.getDataID(record);
444
- 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;
442
+ if (RelayFeatureFlags.ENABLE_STORE_ID_COLLISION_LOGGING) {
443
+ var _field$concreteType4;
444
+ var typeName = (_field$concreteType4 = field.concreteType) !== null && _field$concreteType4 !== void 0 ? _field$concreteType4 : this._getRecordType(payload);
445
+ var dataID = RelayModernRecord.getDataID(record);
446
+ var expected = isClientID(dataID) && dataID !== ROOT_ID || RelayModernRecord.getType(record) === typeName;
447
+ if (!expected) {
448
+ var logEvent = {
449
+ name: 'idCollision.typename',
450
+ previous_typename: RelayModernRecord.getType(record),
451
+ new_typename: typeName
452
+ };
453
+ if (this._log != null) {
454
+ this._log(logEvent);
455
+ }
456
+ }
457
+ }
458
+ if (process.env.NODE_ENV !== "production") {
459
+ var _field$concreteType5;
460
+ var _typeName3 = (_field$concreteType5 = field.concreteType) !== null && _field$concreteType5 !== void 0 ? _field$concreteType5 : this._getRecordType(payload);
461
+ var _dataID = RelayModernRecord.getDataID(record);
462
+ var _expected = isClientID(_dataID) && _dataID !== ROOT_ID || RelayModernRecord.getType(record) === _typeName3;
463
+ process.env.NODE_ENV !== "production" ? warning(_expected, '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), _typeName3) : void 0;
464
+ }
445
465
  };
446
466
  _proto._validateConflictingFieldsWithIdenticalId = function _validateConflictingFieldsWithIdenticalId(record, storageKey, fieldValue) {
447
467
  if (process.env.NODE_ENV !== "production") {
448
- var dataID = RelayModernRecord.getDataID(record);
449
468
  var previousValue = RelayModernRecord.getValue(record, storageKey);
450
- process.env.NODE_ENV !== "production" ? warning(storageKey === TYPENAME_KEY || previousValue === undefined || areEqual(previousValue, fieldValue), 'RelayResponseNormalizer: Invalid record. The record contains two ' + 'instances of the same id: `%s` with conflicting field, %s and its values: %s and %s. ' + 'If two fields are different but share ' + 'the same id, one field will overwrite the other.', dataID, storageKey, previousValue, fieldValue) : void 0;
469
+ var dataID = RelayModernRecord.getDataID(record);
470
+ var expected = storageKey === TYPENAME_KEY || previousValue === undefined || areEqual(previousValue, fieldValue);
471
+ process.env.NODE_ENV !== "production" ? warning(expected, 'RelayResponseNormalizer: Invalid record. The record contains two ' + 'instances of the same id: `%s` with conflicting field, %s and its values: %s and %s. ' + 'If two fields are different but share ' + 'the same id, one field will overwrite the other.', dataID, storageKey, previousValue, fieldValue) : void 0;
451
472
  }
452
473
  };
453
474
  _proto._validateConflictingLinkedFieldsWithIdenticalId = function _validateConflictingLinkedFieldsWithIdenticalId(prevID, nextID, storageKey) {
454
475
  if (process.env.NODE_ENV !== "production") {
455
- process.env.NODE_ENV !== "production" ? warning(prevID === undefined || prevID === nextID, 'RelayResponseNormalizer: Invalid record. The record contains ' + 'references to the conflicting field, %s and its id values: %s and %s. ' + 'We need to make sure that the record the field points ' + 'to remains consistent or one field will overwrite the other.', storageKey, prevID, nextID) : void 0;
476
+ var expected = prevID === undefined || prevID === nextID;
477
+ process.env.NODE_ENV !== "production" ? warning(expected, 'RelayResponseNormalizer: Invalid record. The record contains ' + 'references to the conflicting field, %s and its id values: %s and %s. ' + 'We need to make sure that the record the field points ' + 'to remains consistent or one field will overwrite the other.', storageKey, prevID, nextID) : void 0;
456
478
  }
457
479
  };
458
480
  return RelayResponseNormalizer;
@@ -59,7 +59,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
59
59
  missingLiveResolverFields: backup.missingLiveResolverFields,
60
60
  seenRecords: backup.seenRecords,
61
61
  selector: backup.selector,
62
- errorResponseFields: backup.errorResponseFields
62
+ fieldErrors: backup.fieldErrors
63
63
  };
64
64
  } else {
65
65
  subscription.stale = true;
@@ -94,7 +94,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
94
94
  missingLiveResolverFields: nextSnapshot.missingLiveResolverFields,
95
95
  seenRecords: nextSnapshot.seenRecords,
96
96
  selector: nextSnapshot.selector,
97
- errorResponseFields: nextSnapshot.errorResponseFields
97
+ fieldErrors: nextSnapshot.fieldErrors
98
98
  };
99
99
  if (process.env.NODE_ENV !== "production") {
100
100
  deepFreeze(nextSnapshot);
@@ -4,6 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
5
5
  var getRelayHandleKey = require('../util/getRelayHandleKey');
6
6
  var RelayConcreteNode = require('../util/RelayConcreteNode');
7
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
7
8
  var _require = require('../util/stableCopy'),
8
9
  stableCopy = _require.stableCopy;
9
10
  var invariant = require('invariant');
@@ -14,6 +15,7 @@ var VARIABLE = RelayConcreteNode.VARIABLE,
14
15
  var ERRORS_KEY = '__errors';
15
16
  var MODULE_COMPONENT_KEY_PREFIX = '__module_component_';
16
17
  var MODULE_OPERATION_KEY_PREFIX = '__module_operation_';
18
+ var RELAY_READ_TIME_RESOLVER_KEY_PREFIX = '$r:';
17
19
  function getArgumentValue(arg, variables) {
18
20
  if (arg.kind === VARIABLE) {
19
21
  return getStableVariableValue(arg.variableName, variables);
@@ -76,6 +78,10 @@ function getStorageKey(field, variables) {
76
78
  var name = field.name;
77
79
  return args && args.length !== 0 ? formatStorageKey(name, getArgumentValues(args, variables)) : name;
78
80
  }
81
+ function getReadTimeResolverStorageKey(field, variables) {
82
+ var storageKey = getStorageKey(field, variables);
83
+ return RelayFeatureFlags.ENABLE_READ_TIME_RESOLVER_STORAGE_KEY_PREFIX ? '$r:' + storageKey : storageKey;
84
+ }
79
85
  function getArguments(field) {
80
86
  if (field.kind === 'RelayResolver' || field.kind === 'RelayLiveResolver') {
81
87
  var _field$fragment2;
@@ -141,11 +147,13 @@ var RelayStoreUtils = {
141
147
  RELAY_RESOLVER_SNAPSHOT_KEY: '__resolverSnapshot',
142
148
  RELAY_RESOLVER_ERROR_KEY: '__resolverError',
143
149
  RELAY_RESOLVER_OUTPUT_TYPE_RECORD_IDS: '__resolverOutputTypeRecordIDs',
150
+ RELAY_READ_TIME_RESOLVER_KEY_PREFIX: RELAY_READ_TIME_RESOLVER_KEY_PREFIX,
144
151
  formatStorageKey: formatStorageKey,
145
152
  getArgumentValue: getArgumentValue,
146
153
  getArgumentValues: getArgumentValues,
147
154
  getHandleStorageKey: getHandleStorageKey,
148
155
  getStorageKey: getStorageKey,
156
+ getReadTimeResolverStorageKey: getReadTimeResolverStorageKey,
149
157
  getStableStorageKey: getStableStorageKey,
150
158
  getModuleComponentKey: getModuleComponentKey,
151
159
  getModuleOperationKey: getModuleOperationKey
@@ -1,24 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
- var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
5
- var recycleNodesInto = require('../util/recycleNodesInto');
6
3
  var _require = require('../util/RelayConcreteNode'),
7
4
  RELAY_LIVE_RESOLVER = _require.RELAY_LIVE_RESOLVER;
8
- var RelayFeatureFlags = require('../util/RelayFeatureFlags');
9
- var shallowFreeze = require('../util/shallowFreeze');
10
- var _require2 = require('./ClientID'),
11
- generateClientID = _require2.generateClientID;
12
- var RelayModernRecord = require('./RelayModernRecord');
13
- var _require3 = require('./RelayStoreUtils'),
14
- RELAY_RESOLVER_ERROR_KEY = _require3.RELAY_RESOLVER_ERROR_KEY,
15
- RELAY_RESOLVER_INVALIDATION_KEY = _require3.RELAY_RESOLVER_INVALIDATION_KEY,
16
- RELAY_RESOLVER_SNAPSHOT_KEY = _require3.RELAY_RESOLVER_SNAPSHOT_KEY,
17
- RELAY_RESOLVER_VALUE_KEY = _require3.RELAY_RESOLVER_VALUE_KEY,
18
- getStorageKey = _require3.getStorageKey;
19
5
  var invariant = require('invariant');
20
- var warning = require("fbjs/lib/warning");
21
- var emptySet = new Set();
22
6
  var NoopResolverCache = /*#__PURE__*/function () {
23
7
  function NoopResolverCache() {}
24
8
  var _proto = NoopResolverCache.prototype;
@@ -37,154 +21,6 @@ var NoopResolverCache = /*#__PURE__*/function () {
37
21
  _proto.notifyUpdatedSubscribers = function notifyUpdatedSubscribers(updatedDataIDs) {};
38
22
  return NoopResolverCache;
39
23
  }();
40
- function addDependencyEdge(edges, from, to) {
41
- var set = edges.get(from);
42
- if (!set) {
43
- set = new Set();
44
- edges.set(from, set);
45
- }
46
- set.add(to);
47
- }
48
- var RecordResolverCache = /*#__PURE__*/function () {
49
- function RecordResolverCache(getRecordSource) {
50
- this._resolverIDToRecordIDs = new Map();
51
- this._recordIDToResolverIDs = new Map();
52
- this._getRecordSource = getRecordSource;
53
- }
54
- var _proto2 = RecordResolverCache.prototype;
55
- _proto2.readFromCacheOrEvaluate = function readFromCacheOrEvaluate(recordID, field, variables, evaluate, getDataForResolverFragment) {
56
- var recordSource = this._getRecordSource();
57
- var record = recordSource.get(recordID);
58
- !(record != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'We expect record to exist in the store.') : invariant(false) : void 0;
59
- var storageKey = getStorageKey(field, variables);
60
- var linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
61
- var linkedRecord = linkedID == null ? null : recordSource.get(linkedID);
62
- if (linkedRecord == null || this._isInvalid(linkedRecord, getDataForResolverFragment)) {
63
- var _linkedID;
64
- linkedID = (_linkedID = linkedID) !== null && _linkedID !== void 0 ? _linkedID : generateClientID(recordID, storageKey);
65
- linkedRecord = RelayModernRecord.create(linkedID, '__RELAY_RESOLVER__');
66
- var evaluationResult = evaluate();
67
- shallowFreeze(evaluationResult.resolverResult);
68
- RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_VALUE_KEY, evaluationResult.resolverResult);
69
- RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_SNAPSHOT_KEY, evaluationResult.snapshot);
70
- RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_ERROR_KEY, evaluationResult.error);
71
- recordSource.set(linkedID, linkedRecord);
72
- var currentRecord = recordSource.get(recordID);
73
- !(currentRecord != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected the parent record to still be in the record source.') : invariant(false) : void 0;
74
- var nextRecord = RelayModernRecord.clone(currentRecord);
75
- RelayModernRecord.setLinkedRecordID(nextRecord, storageKey, linkedID);
76
- recordSource.set(recordID, nextRecord);
77
- if (field.fragment != null) {
78
- var _evaluationResult$sna;
79
- var fragmentStorageKey = getStorageKey(field.fragment, variables);
80
- var resolverID = generateClientID(recordID, fragmentStorageKey);
81
- addDependencyEdge(this._resolverIDToRecordIDs, resolverID, linkedID);
82
- addDependencyEdge(this._recordIDToResolverIDs, recordID, resolverID);
83
- var seenRecordIds = (_evaluationResult$sna = evaluationResult.snapshot) === null || _evaluationResult$sna === void 0 ? void 0 : _evaluationResult$sna.seenRecords;
84
- if (seenRecordIds != null) {
85
- var _iterator = (0, _createForOfIteratorHelper2["default"])(seenRecordIds),
86
- _step;
87
- try {
88
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
89
- var seenRecordID = _step.value;
90
- addDependencyEdge(this._recordIDToResolverIDs, seenRecordID, resolverID);
91
- }
92
- } catch (err) {
93
- _iterator.e(err);
94
- } finally {
95
- _iterator.f();
96
- }
97
- }
98
- }
99
- }
100
- var answer = RelayModernRecord.getValue(linkedRecord, RELAY_RESOLVER_VALUE_KEY);
101
- var snapshot = RelayModernRecord.getValue(linkedRecord, RELAY_RESOLVER_SNAPSHOT_KEY);
102
- var error = RelayModernRecord.getValue(linkedRecord, RELAY_RESOLVER_ERROR_KEY);
103
- return [answer, linkedID, error, snapshot, undefined, undefined];
104
- };
105
- _proto2.invalidateDataIDs = function invalidateDataIDs(updatedDataIDs) {
106
- var recordSource = this._getRecordSource();
107
- var visited = new Set();
108
- var recordsToVisit = Array.from(updatedDataIDs);
109
- while (recordsToVisit.length) {
110
- var recordID = recordsToVisit.pop();
111
- updatedDataIDs.add(recordID);
112
- var _iterator2 = (0, _createForOfIteratorHelper2["default"])((_this$_recordIDToReso = this._recordIDToResolverIDs.get(recordID)) !== null && _this$_recordIDToReso !== void 0 ? _this$_recordIDToReso : emptySet),
113
- _step2;
114
- try {
115
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
116
- var _this$_recordIDToReso;
117
- var fragment = _step2.value;
118
- if (!visited.has(fragment)) {
119
- var _iterator3 = (0, _createForOfIteratorHelper2["default"])((_this$_resolverIDToRe = this._resolverIDToRecordIDs.get(fragment)) !== null && _this$_resolverIDToRe !== void 0 ? _this$_resolverIDToRe : emptySet),
120
- _step3;
121
- try {
122
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
123
- var _this$_resolverIDToRe;
124
- var anotherRecordID = _step3.value;
125
- this._markInvalidatedResolverRecord(anotherRecordID, recordSource, updatedDataIDs);
126
- if (!visited.has(anotherRecordID)) {
127
- recordsToVisit.push(anotherRecordID);
128
- }
129
- }
130
- } catch (err) {
131
- _iterator3.e(err);
132
- } finally {
133
- _iterator3.f();
134
- }
135
- }
136
- }
137
- } catch (err) {
138
- _iterator2.e(err);
139
- } finally {
140
- _iterator2.f();
141
- }
142
- }
143
- };
144
- _proto2._markInvalidatedResolverRecord = function _markInvalidatedResolverRecord(dataID, recordSource, updatedDataIDs) {
145
- var record = recordSource.get(dataID);
146
- if (!record) {
147
- process.env.NODE_ENV !== "production" ? warning(false, 'Expected a resolver record with ID %s, but it was missing.', dataID) : void 0;
148
- return;
149
- }
150
- var nextRecord = RelayModernRecord.clone(record);
151
- RelayModernRecord.setValue(nextRecord, RELAY_RESOLVER_INVALIDATION_KEY, true);
152
- recordSource.set(dataID, nextRecord);
153
- };
154
- _proto2._isInvalid = function _isInvalid(record, getDataForResolverFragment) {
155
- if (!RelayModernRecord.getValue(record, RELAY_RESOLVER_INVALIDATION_KEY)) {
156
- return false;
157
- }
158
- var snapshot = RelayModernRecord.getValue(record, RELAY_RESOLVER_SNAPSHOT_KEY);
159
- var originalInputs = snapshot === null || snapshot === void 0 ? void 0 : snapshot.data;
160
- var readerSelector = snapshot === null || snapshot === void 0 ? void 0 : snapshot.selector;
161
- if (originalInputs == null || readerSelector == null) {
162
- process.env.NODE_ENV !== "production" ? warning(false, 'Expected previous inputs and reader selector on resolver record with ID %s, but they were missing.', RelayModernRecord.getDataID(record)) : void 0;
163
- return true;
164
- }
165
- var _getDataForResolverFr = getDataForResolverFragment(readerSelector),
166
- latestValues = _getDataForResolverFr.data;
167
- var recycled = recycleNodesInto(originalInputs, latestValues);
168
- if (recycled !== originalInputs) {
169
- return true;
170
- }
171
- if (RelayFeatureFlags.MARK_RESOLVER_VALUES_AS_CLEAN_AFTER_FRAGMENT_REREAD) {
172
- var nextRecord = RelayModernRecord.clone(record);
173
- RelayModernRecord.setValue(nextRecord, RELAY_RESOLVER_INVALIDATION_KEY, false);
174
- var recordSource = this._getRecordSource();
175
- recordSource.set(RelayModernRecord.getDataID(record), nextRecord);
176
- }
177
- return false;
178
- };
179
- _proto2.ensureClientRecord = function ensureClientRecord(id, typename) {
180
- !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Client Edges to Client Objects are not supported in this version of Relay Store') : invariant(false) : void 0;
181
- };
182
- _proto2.notifyUpdatedSubscribers = function notifyUpdatedSubscribers(updatedDataIDs) {
183
- !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Processing @outputType records is not supported in this version of Relay Store') : invariant(false) : void 0;
184
- };
185
- return RecordResolverCache;
186
- }();
187
24
  module.exports = {
188
- NoopResolverCache: NoopResolverCache,
189
- RecordResolverCache: RecordResolverCache
25
+ NoopResolverCache: NoopResolverCache
190
26
  };
@@ -28,8 +28,8 @@ function readFragment(fragmentInput, fragmentKey) {
28
28
  var _context$getDataForRe = context.getDataForResolverFragment(fragmentSelector, fragmentKey),
29
29
  data = _context$getDataForRe.data,
30
30
  isMissingData = _context$getDataForRe.isMissingData,
31
- errorResponseFields = _context$getDataForRe.errorResponseFields;
32
- if (isMissingData || errorResponseFields != null && errorResponseFields.some(eventShouldThrow)) {
31
+ fieldErrors = _context$getDataForRe.fieldErrors;
32
+ if (isMissingData || fieldErrors != null && fieldErrors.some(eventShouldThrow)) {
33
33
  throw RESOLVER_FRAGMENT_ERRORED_SENTINEL;
34
34
  }
35
35
  return data;
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ var invariant = require('invariant');
4
+ var relayLoggingContext;
5
+ var firstReact;
6
+ function createRelayLoggingContext(react) {
7
+ if (!relayLoggingContext) {
8
+ relayLoggingContext = react.createContext(null);
9
+ if (process.env.NODE_ENV !== "production") {
10
+ relayLoggingContext.displayName = 'RelayLoggingContext';
11
+ }
12
+ firstReact = react;
13
+ }
14
+ !(react === firstReact) ? process.env.NODE_ENV !== "production" ? invariant(false, '[createRelayLoggingContext]: You are passing a different instance of React', react.version) : invariant(false) : void 0;
15
+ return relayLoggingContext;
16
+ }
17
+ module.exports = createRelayLoggingContext;
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ var TYPENAME_PREFIX = '__type:';
4
+ function generateTypenamePrefixedDataID(typeName, dataID) {
5
+ return "".concat(TYPENAME_PREFIX).concat(typeName, ":").concat(dataID);
6
+ }
7
+ module.exports = {
8
+ generateTypenamePrefixedDataID: generateTypenamePrefixedDataID
9
+ };
@@ -22,6 +22,7 @@ var _require5 = require('../RelayStoreUtils'),
22
22
  RELAY_RESOLVER_OUTPUT_TYPE_RECORD_IDS = _require5.RELAY_RESOLVER_OUTPUT_TYPE_RECORD_IDS,
23
23
  RELAY_RESOLVER_SNAPSHOT_KEY = _require5.RELAY_RESOLVER_SNAPSHOT_KEY,
24
24
  RELAY_RESOLVER_VALUE_KEY = _require5.RELAY_RESOLVER_VALUE_KEY,
25
+ getReadTimeResolverStorageKey = _require5.getReadTimeResolverStorageKey,
25
26
  getStorageKey = _require5.getStorageKey;
26
27
  var getOutputTypeRecordIDs = require('./getOutputTypeRecordIDs');
27
28
  var isLiveStateValue = require('./isLiveStateValue');
@@ -55,7 +56,7 @@ var LiveResolverCache = /*#__PURE__*/function () {
55
56
  _proto.readFromCacheOrEvaluate = function readFromCacheOrEvaluate(recordID, field, variables, evaluate, getDataForResolverFragment) {
56
57
  var recordSource = this._getRecordSource();
57
58
  var record = expectRecord(recordSource, recordID);
58
- var storageKey = getStorageKey(field, variables);
59
+ var storageKey = getReadTimeResolverStorageKey(field, variables);
59
60
  var linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
60
61
  var linkedRecord = linkedID == null ? null : recordSource.get(linkedID);
61
62
  var updatedDataIDs;
@@ -292,9 +293,7 @@ var LiveResolverCache = /*#__PURE__*/function () {
292
293
  var recordsToVisit = Array.from(updatedDataIDs);
293
294
  while (recordsToVisit.length) {
294
295
  var recordID = recordsToVisit.pop();
295
- if (RelayFeatureFlags.AVOID_CYCLES_IN_RESOLVER_NOTIFICATION) {
296
- visited.add(recordID);
297
- }
296
+ visited.add(recordID);
298
297
  updatedDataIDs.add(recordID);
299
298
  var fragmentSet = this._recordIDToResolverIDs.get(recordID);
300
299
  if (fragmentSet == null) {
@@ -306,9 +305,7 @@ var LiveResolverCache = /*#__PURE__*/function () {
306
305
  for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
307
306
  var fragment = _step4.value;
308
307
  if (!visited.has(fragment)) {
309
- if (RelayFeatureFlags.AVOID_CYCLES_IN_RESOLVER_NOTIFICATION) {
310
- visited.add(fragment);
311
- }
308
+ visited.add(fragment);
312
309
  var recordSet = this._resolverIDToRecordIDs.get(fragment);
313
310
  if (recordSet == null) {
314
311
  continue;
@@ -320,9 +317,7 @@ var LiveResolverCache = /*#__PURE__*/function () {
320
317
  var anotherRecordID = _step5.value;
321
318
  markInvalidatedResolverRecord(anotherRecordID, recordSource);
322
319
  if (!visited.has(anotherRecordID)) {
323
- if (RelayFeatureFlags.AVOID_CYCLES_IN_RESOLVER_NOTIFICATION) {
324
- visited.add(anotherRecordID);
325
- }
320
+ visited.add(anotherRecordID);
326
321
  recordsToVisit.push(anotherRecordID);
327
322
  }
328
323
  }
@@ -5,26 +5,26 @@ var _require = require('../ResolverFragments'),
5
5
  var invariant = require('invariant');
6
6
  function resolverDataInjector(fragment, _resolverFn, fieldName, isRequiredField) {
7
7
  var resolverFn = _resolverFn;
8
- return function (fragmentKey, args) {
8
+ return function (fragmentKey, args, resolverContext) {
9
9
  var data = readFragment(fragment, fragmentKey);
10
10
  if (fieldName != null) {
11
11
  if (data == null) {
12
12
  if (isRequiredField === true) {
13
13
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected required resolver field `%s` in fragment `%s` to be present. But resolvers fragment data is null/undefined.', fieldName, fragment.name) : invariant(false) : void 0;
14
14
  } else {
15
- return resolverFn(null, args);
15
+ return resolverFn(null, args, resolverContext);
16
16
  }
17
17
  }
18
18
  if (fieldName in data) {
19
19
  if (isRequiredField === true) {
20
20
  !(data[fieldName] != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected required resolver field `%s` in fragment `%s` to be non-null.', fieldName, fragment.name) : invariant(false) : void 0;
21
21
  }
22
- return resolverFn(data[fieldName], args);
22
+ return resolverFn(data[fieldName], args, resolverContext);
23
23
  } else {
24
24
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Missing field `%s` in fragment `%s` in resolver response.', fieldName, fragment.name) : invariant(false) : void 0;
25
25
  }
26
26
  } else {
27
- return resolverFn(data, args);
27
+ return resolverFn(null, args, resolverContext);
28
28
  }
29
29
  };
30
30
  }