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
@@ -28,7 +28,7 @@ var DEFAULT_RELEASE_BUFFER_SIZE = 10;
28
28
  var RelayModernStore = /*#__PURE__*/function () {
29
29
  function RelayModernStore(source, options) {
30
30
  var _this = this;
31
- var _options$gcReleaseBuf, _options$gcScheduler, _options$getDataID, _options$log, _options$operationLoa, _options$shouldProces, _options$treatMissing;
31
+ var _options$gcReleaseBuf, _options$shouldRetain, _options$gcScheduler, _options$getDataID, _options$log, _options$operationLoa, _options$shouldProces, _options$treatMissing;
32
32
  (0, _defineProperty2["default"])(this, "_gcStep", function () {
33
33
  if (_this._gcRun) {
34
34
  if (_this._gcRun.next().done) {
@@ -50,6 +50,7 @@ var RelayModernStore = /*#__PURE__*/function () {
50
50
  this._currentWriteEpoch = 0;
51
51
  this._gcHoldCounter = 0;
52
52
  this._gcReleaseBufferSize = (_options$gcReleaseBuf = options === null || options === void 0 ? void 0 : options.gcReleaseBufferSize) !== null && _options$gcReleaseBuf !== void 0 ? _options$gcReleaseBuf : DEFAULT_RELEASE_BUFFER_SIZE;
53
+ this._shouldRetainWithinTTL_EXPERIMENTAL = (_options$shouldRetain = options === null || options === void 0 ? void 0 : options.shouldRetainWithinTTL_EXPERIMENTAL) !== null && _options$shouldRetain !== void 0 ? _options$shouldRetain : false;
53
54
  this._gcRun = null;
54
55
  this._gcScheduler = (_options$gcScheduler = options === null || options === void 0 ? void 0 : options.gcScheduler) !== null && _options$gcScheduler !== void 0 ? _options$gcScheduler : resolveImmediate;
55
56
  this._getDataID = (_options$getDataID = options === null || options === void 0 ? void 0 : options.getDataID) !== null && _options$getDataID !== void 0 ? _options$getDataID : defaultGetDataID;
@@ -67,10 +68,10 @@ var RelayModernStore = /*#__PURE__*/function () {
67
68
  this._resolverCache = new LiveResolverCache(function () {
68
69
  return _this._getMutableRecordSource();
69
70
  }, this);
70
- this._storeSubscriptions = new RelayStoreSubscriptions(options === null || options === void 0 ? void 0 : options.log, this._resolverCache);
71
+ this._resolverContext = options === null || options === void 0 ? void 0 : options.resolverContext;
72
+ this._storeSubscriptions = new RelayStoreSubscriptions(options === null || options === void 0 ? void 0 : options.log, this._resolverCache, this._resolverContext);
71
73
  this._updatedRecordIDs = new Set();
72
74
  this._shouldProcessClientComponents = (_options$shouldProces = options === null || options === void 0 ? void 0 : options.shouldProcessClientComponents) !== null && _options$shouldProces !== void 0 ? _options$shouldProces : false;
73
- this._resolverContext = options === null || options === void 0 ? void 0 : options.resolverContext;
74
75
  this._treatMissingFieldsAsNull = (_options$treatMissing = options === null || options === void 0 ? void 0 : options.treatMissingFieldsAsNull) !== null && _options$treatMissing !== void 0 ? _options$treatMissing : false;
75
76
  this._actorIdentifier = options === null || options === void 0 ? void 0 : options.actorIdentifier;
76
77
  initializeRecordSource(this._recordSource);
@@ -150,13 +151,17 @@ var RelayModernStore = /*#__PURE__*/function () {
150
151
  var _queryCacheExpirationTime = _this2._queryCacheExpirationTime;
151
152
  var rootEntryIsStale = rootEntry.fetchTime != null && _queryCacheExpirationTime != null && rootEntry.fetchTime <= Date.now() - _queryCacheExpirationTime;
152
153
  if (rootEntryIsStale) {
153
- _this2._roots["delete"](id);
154
+ if (!_this2._shouldRetainWithinTTL_EXPERIMENTAL) {
155
+ _this2._roots["delete"](id);
156
+ }
154
157
  _this2.scheduleGC();
155
158
  } else {
156
159
  _this2._releaseBuffer.push(id);
157
160
  if (_this2._releaseBuffer.length > _this2._gcReleaseBufferSize) {
158
161
  var _id = _this2._releaseBuffer.shift();
159
- _this2._roots["delete"](_id);
162
+ if (!_this2._shouldRetainWithinTTL_EXPERIMENTAL) {
163
+ _this2._roots["delete"](_id);
164
+ }
160
165
  _this2.scheduleGC();
161
166
  }
162
167
  }
@@ -414,6 +419,9 @@ var RelayModernStore = /*#__PURE__*/function () {
414
419
  while (!gcRun.next().done) {}
415
420
  };
416
421
  _proto._collect = function* _collect() {
422
+ if (this._shouldRetainWithinTTL_EXPERIMENTAL && this._queryCacheExpirationTime == null) {
423
+ return;
424
+ }
417
425
  var log = this.__log;
418
426
  top: while (true) {
419
427
  if (log != null) {
@@ -423,11 +431,25 @@ var RelayModernStore = /*#__PURE__*/function () {
423
431
  }
424
432
  var startEpoch = this._currentWriteEpoch;
425
433
  var references = new Set();
426
- var _iterator2 = (0, _createForOfIteratorHelper2["default"])(this._roots.values()),
434
+ var _iterator2 = (0, _createForOfIteratorHelper2["default"])(this._roots.entries()),
427
435
  _step2;
428
436
  try {
429
437
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
430
- var operation = _step2.value.operation;
438
+ var _step2$value = _step2.value,
439
+ _dataID = _step2$value[0],
440
+ _step2$value$ = _step2$value[1],
441
+ operation = _step2$value$.operation,
442
+ refCount = _step2$value$.refCount,
443
+ fetchTime = _step2$value$.fetchTime;
444
+ if (this._shouldRetainWithinTTL_EXPERIMENTAL) {
445
+ var _queryCacheExpirationTime = this._queryCacheExpirationTime;
446
+ !(_queryCacheExpirationTime != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Query cache expiration time should be non-null if executing GC') : invariant(false) : void 0;
447
+ var recordHasExpired = fetchTime == null || fetchTime <= Date.now() - _queryCacheExpirationTime;
448
+ var recordShouldBeCollected = recordHasExpired && refCount === 0 && !this._releaseBuffer.includes(_dataID);
449
+ if (recordShouldBeCollected) {
450
+ continue;
451
+ }
452
+ }
431
453
  var selector = operation.root;
432
454
  RelayReferenceMarker.mark(this._recordSource, selector, references, this._operationLoader, this._shouldProcessClientComponents);
433
455
  yield;
@@ -445,21 +467,20 @@ var RelayModernStore = /*#__PURE__*/function () {
445
467
  } finally {
446
468
  _iterator2.f();
447
469
  }
448
- if (references.size === 0) {
449
- this._recordSource.clear();
450
- } else {
451
- var storeIDs = this._recordSource.getRecordIDs();
452
- for (var ii = 0; ii < storeIDs.length; ii++) {
453
- var dataID = storeIDs[ii];
454
- if (!references.has(dataID)) {
455
- var record = this._recordSource.get(dataID);
456
- if (record != null) {
457
- var maybeResolverSubscription = RelayModernRecord.getValue(record, RELAY_RESOLVER_LIVE_STATE_SUBSCRIPTION_KEY);
458
- if (maybeResolverSubscription != null) {
459
- maybeResolverSubscription();
460
- }
470
+ var storeIDs = this._recordSource.getRecordIDs();
471
+ for (var ii = 0; ii < storeIDs.length; ii++) {
472
+ var dataID = storeIDs[ii];
473
+ if (!references.has(dataID)) {
474
+ var record = this._recordSource.get(dataID);
475
+ if (record != null) {
476
+ var maybeResolverSubscription = RelayModernRecord.getValue(record, RELAY_RESOLVER_LIVE_STATE_SUBSCRIPTION_KEY);
477
+ if (maybeResolverSubscription != null) {
478
+ maybeResolverSubscription();
461
479
  }
462
- this._recordSource.remove(dataID);
480
+ }
481
+ this._recordSource.remove(dataID);
482
+ if (this._shouldRetainWithinTTL_EXPERIMENTAL) {
483
+ this._roots["delete"](dataID);
463
484
  }
464
485
  }
465
486
  }
@@ -476,6 +497,7 @@ var RelayModernStore = /*#__PURE__*/function () {
476
497
  return {
477
498
  path: path,
478
499
  getDataID: this._getDataID,
500
+ log: this.__log,
479
501
  treatMissingFieldsAsNull: this._treatMissingFieldsAsNull,
480
502
  shouldProcessClientComponents: this._shouldProcessClientComponents,
481
503
  actorIdentifier: this._actorIdentifier
@@ -4,6 +4,7 @@ var _global$ErrorUtils$ap, _global$ErrorUtils;
4
4
  var RelayRecordSourceMutator = require('../mutations/RelayRecordSourceMutator');
5
5
  var RelayRecordSourceProxy = require('../mutations/RelayRecordSourceProxy');
6
6
  var RelayRecordSourceSelectorProxy = require('../mutations/RelayRecordSourceSelectorProxy');
7
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
7
8
  var RelayReader = require('./RelayReader');
8
9
  var RelayRecordSource = require('./RelayRecordSource');
9
10
  var invariant = require('invariant');
@@ -13,7 +14,7 @@ var applyWithGuard = (_global$ErrorUtils$ap = _global === null || _global === vo
13
14
  return callback.apply(context, args);
14
15
  };
15
16
  var RelayPublishQueue = /*#__PURE__*/function () {
16
- function RelayPublishQueue(store, handlerProvider, getDataID, missingFieldHandlers) {
17
+ function RelayPublishQueue(store, handlerProvider, getDataID, missingFieldHandlers, log) {
17
18
  this._hasStoreSnapshot = false;
18
19
  this._handlerProvider = handlerProvider || null;
19
20
  this._pendingBackupRebase = false;
@@ -24,6 +25,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
24
25
  this._gcHold = null;
25
26
  this._getDataID = getDataID;
26
27
  this._missingFieldHandlers = missingFieldHandlers;
28
+ this._log = log;
27
29
  }
28
30
  var _proto = RelayPublishQueue.prototype;
29
31
  _proto.applyUpdate = function applyUpdate(updater) {
@@ -69,15 +71,11 @@ var RelayPublishQueue = /*#__PURE__*/function () {
69
71
  _proto.run = function run(sourceOperation) {
70
72
  var runWillClearGcHold = this._appliedOptimisticUpdates === 0 && !!this._gcHold;
71
73
  var runIsANoop = !this._pendingBackupRebase && this._pendingOptimisticUpdates.size === 0 && !runWillClearGcHold;
72
- if (process.env.NODE_ENV !== "production") {
73
- process.env.NODE_ENV !== "production" ? warning(!runIsANoop, 'RelayPublishQueue.run was called, but the call would have been a noop.') : void 0;
74
- process.env.NODE_ENV !== "production" ? warning(this._isRunning !== true, 'A store update was detected within another store update. Please ' + "make sure new store updates aren't being executed within an " + 'updater function for a different update.') : void 0;
75
- this._isRunning = true;
76
- }
74
+ process.env.NODE_ENV !== "production" ? warning(!runIsANoop, 'RelayPublishQueue.run was called, but the call would have been a noop.') : void 0;
75
+ RelayFeatureFlags.DISALLOW_NESTED_UPDATES ? !(this._isRunning !== true) ? process.env.NODE_ENV !== "production" ? invariant(false, 'A store update was detected within another store update. Please ' + "make sure new store updates aren't being executed within an " + 'updater function for a different update.') : invariant(false) : void 0 : process.env.NODE_ENV !== "production" ? warning(this._isRunning !== true, 'A store update was detected within another store update. Please ' + "make sure new store updates aren't being executed within an " + 'updater function for a different update.') : void 0;
76
+ this._isRunning = true;
77
77
  if (runIsANoop) {
78
- if (process.env.NODE_ENV !== "production") {
79
- this._isRunning = false;
80
- }
78
+ this._isRunning = false;
81
79
  return [];
82
80
  }
83
81
  if (this._pendingBackupRebase) {
@@ -105,9 +103,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
105
103
  this._gcHold = null;
106
104
  }
107
105
  }
108
- if (process.env.NODE_ENV !== "production") {
109
- this._isRunning = false;
110
- }
106
+ this._isRunning = false;
111
107
  return this._store.notify(sourceOperation, invalidatedStore);
112
108
  };
113
109
  _proto._publishSourceFromPayload = function _publishSourceFromPayload(pendingPayload) {
@@ -118,7 +114,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
118
114
  var source = payload.source,
119
115
  fieldPayloads = payload.fieldPayloads;
120
116
  var mutator = new RelayRecordSourceMutator(this._store.getSource(), source);
121
- var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, this._handlerProvider, this._missingFieldHandlers);
117
+ var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, this._handlerProvider, this._missingFieldHandlers, this._log);
122
118
  if (fieldPayloads && fieldPayloads.length) {
123
119
  fieldPayloads.forEach(function (fieldPayload) {
124
120
  var handler = _this._handlerProvider && _this._handlerProvider(fieldPayload.handle);
@@ -154,7 +150,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
154
150
  var updater = data.updater;
155
151
  var sink = RelayRecordSource.create();
156
152
  var mutator = new RelayRecordSourceMutator(_this2._store.getSource(), sink);
157
- var recordSourceProxy = new RelayRecordSourceProxy(mutator, _this2._getDataID, _this2._handlerProvider, _this2._missingFieldHandlers);
153
+ var recordSourceProxy = new RelayRecordSourceProxy(mutator, _this2._getDataID, _this2._handlerProvider, _this2._missingFieldHandlers, _this2._log);
158
154
  applyWithGuard(updater, null, [recordSourceProxy], null, 'RelayPublishQueue:commitData');
159
155
  invalidatedStore = invalidatedStore || recordSourceProxy.isStoreMarkedForInvalidation();
160
156
  var idsMarkedForInvalidation = recordSourceProxy.getIDsMarkedForInvalidation();
@@ -168,7 +164,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
168
164
  var _this3 = this;
169
165
  var sink = RelayRecordSource.create();
170
166
  var mutator = new RelayRecordSourceMutator(this._store.getSource(), sink);
171
- var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, this._handlerProvider, this._missingFieldHandlers);
167
+ var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, this._handlerProvider, this._missingFieldHandlers, this._log);
172
168
  var processUpdate = function processUpdate(optimisticUpdate) {
173
169
  if (optimisticUpdate.storeUpdater) {
174
170
  var storeUpdater = optimisticUpdate.storeUpdater;