relay-runtime 11.0.0 → 13.0.0-rc.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 (169) hide show
  1. package/handlers/RelayDefaultHandlerProvider.js.flow +2 -2
  2. package/handlers/connection/ConnectionHandler.js.flow +8 -10
  3. package/handlers/connection/MutationHandlers.js.flow +31 -7
  4. package/index.js +1 -1
  5. package/index.js.flow +60 -36
  6. package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
  7. package/lib/handlers/connection/ConnectionHandler.js +8 -8
  8. package/lib/handlers/connection/MutationHandlers.js +61 -5
  9. package/lib/index.js +58 -43
  10. package/lib/multi-actor-environment/ActorIdentifier.js +33 -0
  11. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +152 -0
  12. package/lib/multi-actor-environment/ActorUtils.js +27 -0
  13. package/lib/multi-actor-environment/MultiActorEnvironment.js +419 -0
  14. package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +11 -0
  15. package/lib/multi-actor-environment/index.js +21 -0
  16. package/lib/mutations/RelayDeclarativeMutationConfig.js +4 -1
  17. package/lib/mutations/RelayRecordProxy.js +3 -2
  18. package/lib/mutations/RelayRecordSourceMutator.js +3 -2
  19. package/lib/mutations/RelayRecordSourceProxy.js +12 -4
  20. package/lib/mutations/RelayRecordSourceSelectorProxy.js +18 -5
  21. package/lib/mutations/applyOptimisticMutation.js +6 -6
  22. package/lib/mutations/commitMutation.js +14 -10
  23. package/lib/mutations/readUpdatableQuery_EXPERIMENTAL.js +238 -0
  24. package/lib/mutations/validateMutation.js +12 -5
  25. package/lib/network/ConvertToExecuteFunction.js +2 -1
  26. package/lib/network/RelayNetwork.js +3 -2
  27. package/lib/network/RelayQueryResponseCache.js +21 -4
  28. package/lib/network/wrapNetworkWithLogObserver.js +79 -0
  29. package/lib/query/GraphQLTag.js +3 -2
  30. package/lib/query/fetchQuery.js +6 -5
  31. package/lib/query/fetchQueryInternal.js +1 -1
  32. package/lib/query/fetchQuery_DEPRECATED.js +2 -1
  33. package/lib/store/ClientID.js +7 -1
  34. package/lib/store/DataChecker.js +141 -60
  35. package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +532 -195
  36. package/lib/store/RelayConcreteVariables.js +24 -4
  37. package/lib/store/RelayModernEnvironment.js +175 -234
  38. package/lib/store/RelayModernFragmentSpecResolver.js +52 -26
  39. package/lib/store/RelayModernOperationDescriptor.js +2 -1
  40. package/lib/store/RelayModernRecord.js +47 -12
  41. package/lib/store/RelayModernSelector.js +14 -8
  42. package/lib/store/RelayModernStore.js +58 -29
  43. package/lib/store/RelayOperationTracker.js +34 -24
  44. package/lib/store/RelayPublishQueue.js +41 -13
  45. package/lib/store/RelayReader.js +287 -46
  46. package/lib/store/RelayRecordSource.js +87 -3
  47. package/lib/store/RelayReferenceMarker.js +55 -31
  48. package/lib/store/RelayResponseNormalizer.js +250 -108
  49. package/lib/store/RelayStoreReactFlightUtils.js +8 -12
  50. package/lib/store/RelayStoreSubscriptions.js +14 -9
  51. package/lib/store/RelayStoreUtils.js +11 -5
  52. package/lib/store/ResolverCache.js +213 -0
  53. package/lib/store/ResolverFragments.js +61 -0
  54. package/lib/store/cloneRelayHandleSourceField.js +5 -4
  55. package/lib/store/cloneRelayScalarHandleSourceField.js +5 -4
  56. package/lib/store/createRelayContext.js +4 -2
  57. package/lib/store/defaultGetDataID.js +3 -1
  58. package/lib/store/readInlineData.js +6 -2
  59. package/lib/subscription/requestSubscription.js +35 -9
  60. package/lib/util/RelayConcreteNode.js +4 -0
  61. package/lib/util/RelayFeatureFlags.js +11 -4
  62. package/lib/util/RelayProfiler.js +17 -187
  63. package/lib/util/RelayReplaySubject.js +22 -7
  64. package/lib/util/RelayRuntimeTypes.js +0 -6
  65. package/lib/util/StringInterner.js +71 -0
  66. package/lib/util/deepFreeze.js +1 -0
  67. package/lib/util/getFragmentIdentifier.js +15 -7
  68. package/lib/util/getOperation.js +2 -1
  69. package/lib/util/getPaginationMetadata.js +41 -0
  70. package/lib/util/getPaginationVariables.js +66 -0
  71. package/lib/util/getPendingOperationsForFragment.js +55 -0
  72. package/lib/util/getRefetchMetadata.js +36 -0
  73. package/lib/util/getRelayHandleKey.js +2 -2
  74. package/lib/util/getRequestIdentifier.js +2 -2
  75. package/lib/util/getValueAtPath.js +51 -0
  76. package/lib/util/isEmptyObject.js +1 -1
  77. package/lib/util/registerEnvironmentWithDevTools.js +26 -0
  78. package/lib/util/withDuration.js +31 -0
  79. package/multi-actor-environment/ActorIdentifier.js.flow +43 -0
  80. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +225 -0
  81. package/multi-actor-environment/ActorUtils.js.flow +33 -0
  82. package/multi-actor-environment/MultiActorEnvironment.js.flow +506 -0
  83. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +261 -0
  84. package/multi-actor-environment/index.js.flow +26 -0
  85. package/mutations/RelayDeclarativeMutationConfig.js.flow +32 -26
  86. package/mutations/RelayRecordProxy.js.flow +4 -5
  87. package/mutations/RelayRecordSourceMutator.js.flow +4 -6
  88. package/mutations/RelayRecordSourceProxy.js.flow +19 -10
  89. package/mutations/RelayRecordSourceSelectorProxy.js.flow +22 -7
  90. package/mutations/applyOptimisticMutation.js.flow +13 -14
  91. package/mutations/commitLocalUpdate.js.flow +1 -1
  92. package/mutations/commitMutation.js.flow +35 -46
  93. package/mutations/readUpdatableQuery_EXPERIMENTAL.js.flow +309 -0
  94. package/mutations/validateMutation.js.flow +28 -16
  95. package/network/ConvertToExecuteFunction.js.flow +2 -2
  96. package/network/RelayNetwork.js.flow +4 -5
  97. package/network/RelayNetworkTypes.js.flow +17 -8
  98. package/network/RelayObservable.js.flow +1 -1
  99. package/network/RelayQueryResponseCache.js.flow +34 -20
  100. package/network/wrapNetworkWithLogObserver.js.flow +100 -0
  101. package/package.json +3 -2
  102. package/query/GraphQLTag.js.flow +9 -9
  103. package/query/PreloadableQueryRegistry.js.flow +2 -1
  104. package/query/fetchQuery.js.flow +11 -13
  105. package/query/fetchQueryInternal.js.flow +6 -9
  106. package/query/fetchQuery_DEPRECATED.js.flow +6 -6
  107. package/relay-runtime.js +2 -2
  108. package/relay-runtime.min.js +2 -2
  109. package/store/ClientID.js.flow +14 -3
  110. package/store/DataChecker.js.flow +162 -67
  111. package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +616 -283
  112. package/store/RelayConcreteVariables.js.flow +27 -5
  113. package/store/RelayModernEnvironment.js.flow +176 -235
  114. package/store/RelayModernFragmentSpecResolver.js.flow +55 -31
  115. package/store/RelayModernOperationDescriptor.js.flow +12 -7
  116. package/store/RelayModernRecord.js.flow +67 -11
  117. package/store/RelayModernSelector.js.flow +24 -14
  118. package/store/RelayModernStore.js.flow +72 -36
  119. package/store/RelayOperationTracker.js.flow +59 -43
  120. package/store/RelayOptimisticRecordSource.js.flow +2 -2
  121. package/store/RelayPublishQueue.js.flow +79 -34
  122. package/store/RelayReader.js.flow +351 -72
  123. package/store/RelayRecordSource.js.flow +72 -6
  124. package/store/RelayReferenceMarker.js.flow +60 -33
  125. package/store/RelayResponseNormalizer.js.flow +288 -102
  126. package/store/RelayStoreReactFlightUtils.js.flow +9 -13
  127. package/store/RelayStoreSubscriptions.js.flow +19 -11
  128. package/store/RelayStoreTypes.js.flow +210 -44
  129. package/store/RelayStoreUtils.js.flow +25 -11
  130. package/store/ResolverCache.js.flow +249 -0
  131. package/store/ResolverFragments.js.flow +121 -0
  132. package/store/StoreInspector.js.flow +2 -2
  133. package/store/TypeID.js.flow +1 -1
  134. package/store/ViewerPattern.js.flow +2 -2
  135. package/store/cloneRelayHandleSourceField.js.flow +5 -6
  136. package/store/cloneRelayScalarHandleSourceField.js.flow +5 -6
  137. package/store/createFragmentSpecResolver.js.flow +3 -4
  138. package/store/createRelayContext.js.flow +3 -3
  139. package/store/defaultGetDataID.js.flow +3 -1
  140. package/store/normalizeRelayPayload.js.flow +6 -7
  141. package/store/readInlineData.js.flow +7 -8
  142. package/subscription/requestSubscription.js.flow +54 -27
  143. package/util/NormalizationNode.js.flow +16 -3
  144. package/util/ReaderNode.js.flow +38 -2
  145. package/util/RelayConcreteNode.js.flow +4 -0
  146. package/util/RelayFeatureFlags.js.flow +24 -8
  147. package/util/RelayProfiler.js.flow +22 -194
  148. package/util/RelayReplaySubject.js.flow +9 -9
  149. package/util/RelayRuntimeTypes.js.flow +73 -4
  150. package/util/StringInterner.js.flow +69 -0
  151. package/util/createPayloadFor3DField.js.flow +3 -3
  152. package/util/deepFreeze.js.flow +2 -1
  153. package/util/getFragmentIdentifier.js.flow +27 -15
  154. package/util/getOperation.js.flow +2 -2
  155. package/util/getPaginationMetadata.js.flow +72 -0
  156. package/util/getPaginationVariables.js.flow +108 -0
  157. package/util/getPendingOperationsForFragment.js.flow +62 -0
  158. package/util/getRefetchMetadata.js.flow +79 -0
  159. package/util/getRelayHandleKey.js.flow +1 -2
  160. package/util/getRequestIdentifier.js.flow +3 -3
  161. package/util/getValueAtPath.js.flow +46 -0
  162. package/util/isEmptyObject.js.flow +2 -1
  163. package/util/registerEnvironmentWithDevTools.js.flow +33 -0
  164. package/util/resolveImmediate.js.flow +1 -1
  165. package/util/withDuration.js.flow +32 -0
  166. package/lib/store/RelayRecordSourceMapImpl.js +0 -107
  167. package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +0 -318
  168. package/store/RelayRecordSourceMapImpl.js.flow +0 -91
  169. package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +0 -283
@@ -10,20 +10,21 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var RelayFeatureFlags = require('../util/RelayFeatureFlags');
13
+ var deepFreeze = require('../util/deepFreeze');
14
14
 
15
- var RelayReader = require('./RelayReader');
15
+ var recycleNodesInto = require('../util/recycleNodesInto');
16
16
 
17
- var deepFreeze = require('../util/deepFreeze');
17
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
18
18
 
19
19
  var hasOverlappingIDs = require('./hasOverlappingIDs');
20
20
 
21
- var recycleNodesInto = require('../util/recycleNodesInto');
21
+ var RelayReader = require('./RelayReader');
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
 
@@ -90,6 +93,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
90
93
  subscription.snapshot = {
91
94
  data: subscription.snapshot.data,
92
95
  isMissingData: backup.isMissingData,
96
+ missingClientEdges: backup.missingClientEdges,
93
97
  seenRecords: backup.seenRecords,
94
98
  selector: backup.selector,
95
99
  missingRequiredFields: backup.missingRequiredFields
@@ -101,12 +105,12 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
101
105
  };
102
106
 
103
107
  _proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners, sourceOperation) {
104
- var _this2 = this;
108
+ var _this3 = this;
105
109
 
106
110
  var hasUpdatedRecords = updatedRecordIDs.size !== 0;
107
111
 
108
112
  this._subscriptions.forEach(function (subscription) {
109
- var owner = _this2._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation);
113
+ var owner = _this3._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation);
110
114
 
111
115
  if (owner != null) {
112
116
  updatedOwners.push(owner);
@@ -134,11 +138,12 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
134
138
  return;
135
139
  }
136
140
 
137
- var nextSnapshot = hasOverlappingUpdates || !backup ? RelayReader.read(source, snapshot.selector) : backup;
141
+ var nextSnapshot = hasOverlappingUpdates || !backup ? RelayReader.read(source, snapshot.selector, this._resolverCache) : backup;
138
142
  var nextData = recycleNodesInto(snapshot.data, nextSnapshot.data);
139
143
  nextSnapshot = {
140
144
  data: nextData,
141
145
  isMissingData: nextSnapshot.isMissingData,
146
+ missingClientEdges: nextSnapshot.missingClientEdges,
142
147
  seenRecords: nextSnapshot.seenRecords,
143
148
  selector: nextSnapshot.selector,
144
149
  missingRequiredFields: nextSnapshot.missingRequiredFields
@@ -14,14 +14,14 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
14
14
 
15
15
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
16
16
 
17
- var RelayConcreteNode = require('../util/RelayConcreteNode');
18
-
19
17
  var getRelayHandleKey = require('../util/getRelayHandleKey');
20
18
 
21
- var invariant = require("fbjs/lib/invariant");
19
+ var RelayConcreteNode = require('../util/RelayConcreteNode');
22
20
 
23
21
  var stableCopy = require('../util/stableCopy');
24
22
 
23
+ var invariant = require('invariant');
24
+
25
25
  var VARIABLE = RelayConcreteNode.VARIABLE,
26
26
  LITERAL = RelayConcreteNode.LITERAL,
27
27
  OBJECT_VALUE = RelayConcreteNode.OBJECT_VALUE,
@@ -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
  /**
@@ -192,6 +192,8 @@ function getModuleOperationKey(documentName) {
192
192
 
193
193
 
194
194
  var RelayStoreUtils = {
195
+ ACTOR_IDENTIFIER_KEY: '__actorIdentifier',
196
+ CLIENT_EDGE_TRAVERSAL_PATH: '__clientEdgeTraversalPath',
195
197
  FRAGMENTS_KEY: '__fragments',
196
198
  FRAGMENT_OWNER_KEY: '__fragmentOwner',
197
199
  FRAGMENT_PROP_NAME_KEY: '__fragmentPropName',
@@ -205,6 +207,10 @@ var RelayStoreUtils = {
205
207
  TYPENAME_KEY: '__typename',
206
208
  INVALIDATED_AT_KEY: '__invalidated_at',
207
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',
208
214
  formatStorageKey: formatStorageKey,
209
215
  getArgumentValue: getArgumentValue,
210
216
  getArgumentValues: getArgumentValues,
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ *
8
+ * @format
9
+ */
10
+ // flowlint ambiguous-object-type:error
11
+ 'use strict';
12
+
13
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
+
15
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
16
+
17
+ var recycleNodesInto = require('../util/recycleNodesInto');
18
+
19
+ var _require = require('./ClientID'),
20
+ generateClientID = _require.generateClientID;
21
+
22
+ var RelayModernRecord = require('./RelayModernRecord');
23
+
24
+ var _require2 = require('./RelayStoreUtils'),
25
+ RELAY_RESOLVER_INPUTS_KEY = _require2.RELAY_RESOLVER_INPUTS_KEY,
26
+ RELAY_RESOLVER_INVALIDATION_KEY = _require2.RELAY_RESOLVER_INVALIDATION_KEY,
27
+ RELAY_RESOLVER_READER_SELECTOR_KEY = _require2.RELAY_RESOLVER_READER_SELECTOR_KEY,
28
+ RELAY_RESOLVER_VALUE_KEY = _require2.RELAY_RESOLVER_VALUE_KEY,
29
+ getStorageKey = _require2.getStorageKey;
30
+
31
+ var warning = require("fbjs/lib/warning");
32
+
33
+ // $FlowFixMe[unclear-type] - will always be empty
34
+ var emptySet = new Set();
35
+
36
+ var NoopResolverCache = /*#__PURE__*/function () {
37
+ function NoopResolverCache() {}
38
+
39
+ var _proto = NoopResolverCache.prototype;
40
+
41
+ _proto.readFromCacheOrEvaluate = function readFromCacheOrEvaluate(record, field, variables, evaluate, getDataForResolverFragment) {
42
+ return [evaluate().resolverResult, undefined];
43
+ };
44
+
45
+ _proto.invalidateDataIDs = function invalidateDataIDs(updatedDataIDs) {};
46
+
47
+ return NoopResolverCache;
48
+ }();
49
+
50
+ function addDependencyEdge(edges, from, to) {
51
+ var set = edges.get(from);
52
+
53
+ if (!set) {
54
+ set = new Set();
55
+ edges.set(from, set);
56
+ }
57
+
58
+ set.add(to);
59
+ }
60
+
61
+ var RecordResolverCache = /*#__PURE__*/function () {
62
+ function RecordResolverCache(getRecordSource) {
63
+ this._resolverIDToRecordIDs = new Map();
64
+ this._recordIDToResolverIDs = new Map();
65
+ this._getRecordSource = getRecordSource;
66
+ }
67
+
68
+ var _proto2 = RecordResolverCache.prototype;
69
+
70
+ _proto2.readFromCacheOrEvaluate = function readFromCacheOrEvaluate(record, field, variables, evaluate, getDataForResolverFragment) {
71
+ var recordSource = this._getRecordSource();
72
+
73
+ var recordID = RelayModernRecord.getDataID(record);
74
+ var storageKey = getStorageKey(field, variables);
75
+ var linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
76
+ var linkedRecord = linkedID == null ? null : recordSource.get(linkedID);
77
+
78
+ if (linkedRecord == null || this._isInvalid(linkedRecord, getDataForResolverFragment)) {
79
+ var _linkedID;
80
+
81
+ // Cache miss; evaluate the selector and store the result in a new record:
82
+ linkedID = (_linkedID = linkedID) !== null && _linkedID !== void 0 ? _linkedID : generateClientID(recordID, storageKey);
83
+ linkedRecord = RelayModernRecord.create(linkedID, '__RELAY_RESOLVER__');
84
+ var evaluationResult = evaluate();
85
+ RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_VALUE_KEY, evaluationResult.resolverResult);
86
+ RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_INPUTS_KEY, evaluationResult.fragmentValue);
87
+ RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_READER_SELECTOR_KEY, evaluationResult.readerSelector);
88
+ recordSource.set(linkedID, linkedRecord); // Link the resolver value record to the resolver field of the record being read:
89
+
90
+ var nextRecord = RelayModernRecord.clone(record);
91
+ RelayModernRecord.setLinkedRecordID(nextRecord, storageKey, linkedID);
92
+ recordSource.set(RelayModernRecord.getDataID(nextRecord), nextRecord); // Put records observed by the resolver into the dependency graph:
93
+
94
+ var resolverID = evaluationResult.resolverID;
95
+ addDependencyEdge(this._resolverIDToRecordIDs, resolverID, linkedID);
96
+ addDependencyEdge(this._recordIDToResolverIDs, recordID, resolverID);
97
+
98
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(evaluationResult.seenRecordIDs),
99
+ _step;
100
+
101
+ try {
102
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
103
+ var seenRecordID = _step.value;
104
+ addDependencyEdge(this._recordIDToResolverIDs, seenRecordID, resolverID);
105
+ }
106
+ } catch (err) {
107
+ _iterator.e(err);
108
+ } finally {
109
+ _iterator.f();
110
+ }
111
+ } // $FlowFixMe[incompatible-type] - will always be empty
112
+
113
+
114
+ var answer = linkedRecord[RELAY_RESOLVER_VALUE_KEY];
115
+ return [answer, linkedID];
116
+ };
117
+
118
+ _proto2.invalidateDataIDs = function invalidateDataIDs(updatedDataIDs) {
119
+ var recordSource = this._getRecordSource();
120
+
121
+ var visited = new Set();
122
+ var recordsToVisit = Array.from(updatedDataIDs);
123
+
124
+ while (recordsToVisit.length) {
125
+ var recordID = recordsToVisit.pop();
126
+ updatedDataIDs.add(recordID);
127
+
128
+ var _iterator2 = (0, _createForOfIteratorHelper2["default"])((_this$_recordIDToReso = this._recordIDToResolverIDs.get(recordID)) !== null && _this$_recordIDToReso !== void 0 ? _this$_recordIDToReso : emptySet),
129
+ _step2;
130
+
131
+ try {
132
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
133
+ var _this$_recordIDToReso;
134
+
135
+ var fragment = _step2.value;
136
+
137
+ if (!visited.has(fragment)) {
138
+ var _iterator3 = (0, _createForOfIteratorHelper2["default"])((_this$_resolverIDToRe = this._resolverIDToRecordIDs.get(fragment)) !== null && _this$_resolverIDToRe !== void 0 ? _this$_resolverIDToRe : emptySet),
139
+ _step3;
140
+
141
+ try {
142
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
143
+ var _this$_resolverIDToRe;
144
+
145
+ var anotherRecordID = _step3.value;
146
+
147
+ this._markInvalidatedResolverRecord(anotherRecordID, recordSource, updatedDataIDs);
148
+
149
+ if (!visited.has(anotherRecordID)) {
150
+ recordsToVisit.push(anotherRecordID);
151
+ }
152
+ }
153
+ } catch (err) {
154
+ _iterator3.e(err);
155
+ } finally {
156
+ _iterator3.f();
157
+ }
158
+ }
159
+ }
160
+ } catch (err) {
161
+ _iterator2.e(err);
162
+ } finally {
163
+ _iterator2.f();
164
+ }
165
+ }
166
+ };
167
+
168
+ _proto2._markInvalidatedResolverRecord = function _markInvalidatedResolverRecord(dataID, recordSource, // Written to
169
+ updatedDataIDs) // Mutated in place
170
+ {
171
+ var record = recordSource.get(dataID);
172
+
173
+ if (!record) {
174
+ process.env.NODE_ENV !== "production" ? warning(false, 'Expected a resolver record with ID %s, but it was missing.', dataID) : void 0;
175
+ return;
176
+ }
177
+
178
+ var nextRecord = RelayModernRecord.clone(record);
179
+ RelayModernRecord.setValue(nextRecord, RELAY_RESOLVER_INVALIDATION_KEY, true);
180
+ recordSource.set(dataID, nextRecord);
181
+ };
182
+
183
+ _proto2._isInvalid = function _isInvalid(record, getDataForResolverFragment) {
184
+ if (!RelayModernRecord.getValue(record, RELAY_RESOLVER_INVALIDATION_KEY)) {
185
+ return false;
186
+ }
187
+
188
+ var originalInputs = RelayModernRecord.getValue(record, RELAY_RESOLVER_INPUTS_KEY); // $FlowFixMe[incompatible-type] - storing values in records is not typed
189
+
190
+ var readerSelector = RelayModernRecord.getValue(record, RELAY_RESOLVER_READER_SELECTOR_KEY);
191
+
192
+ if (originalInputs == null || readerSelector == null) {
193
+ 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;
194
+ return true;
195
+ }
196
+
197
+ var latestValues = getDataForResolverFragment(readerSelector);
198
+ var recycled = recycleNodesInto(originalInputs, latestValues);
199
+
200
+ if (recycled !== originalInputs) {
201
+ return true;
202
+ }
203
+
204
+ return false;
205
+ };
206
+
207
+ return RecordResolverCache;
208
+ }();
209
+
210
+ module.exports = {
211
+ NoopResolverCache: NoopResolverCache,
212
+ RecordResolverCache: RecordResolverCache
213
+ };
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ *
8
+ * @format
9
+ */
10
+ // flowlint ambiguous-object-type:error
11
+ 'use strict';
12
+
13
+ var _require = require('../query/GraphQLTag'),
14
+ getFragment = _require.getFragment;
15
+
16
+ var _require2 = require('./RelayModernSelector'),
17
+ getSelector = _require2.getSelector;
18
+
19
+ var invariant = require('invariant'); // When we call the user-supplied resolver function, it will in turn call
20
+ // `readFragment`, but that's a global function -- it needs information
21
+ // about what resolver is being executed, which is supplied by putting the
22
+ // info on this stack before we call the resolver function.
23
+
24
+
25
+ var contextStack = [];
26
+
27
+ function withResolverContext(context, cb) {
28
+ contextStack.push(context);
29
+
30
+ try {
31
+ return cb();
32
+ } finally {
33
+ contextStack.pop();
34
+ }
35
+ } // NOTE: these declarations are copied from 'useFragment'; it would be good
36
+ // to figure out how to share the same type signature between the two functions.
37
+ // The declarations ensure that the type of the returned data is:
38
+ // - non-nullable if the provided ref type is non-nullable
39
+ // - nullable if the provided ref type is nullable
40
+ // - array of non-nullable if the privoided ref type is an array of
41
+ // non-nullable refs
42
+ // - array of nullable if the privoided ref type is an array of nullable refs
43
+
44
+
45
+ function readFragment(fragmentInput, fragmentKey) {
46
+ if (!contextStack.length) {
47
+ throw new Error('readFragment should be called only from within a Relay Resolver function.');
48
+ }
49
+
50
+ var context = contextStack[contextStack.length - 1];
51
+ var fragmentNode = getFragment(fragmentInput);
52
+ var fragmentSelector = getSelector(fragmentNode, fragmentKey);
53
+ !(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected a selector for the fragment of the resolver ".concat(fragmentNode.name, ", but got null.")) : invariant(false) : void 0;
54
+ !(fragmentSelector.kind === 'SingularReaderSelector') ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected a singular reader selector for the fragment of the resolver ".concat(fragmentNode.name, ", but it was plural.")) : invariant(false) : void 0;
55
+ return context.getDataForResolverFragment(fragmentSelector, fragmentKey);
56
+ }
57
+
58
+ module.exports = {
59
+ readFragment: readFragment,
60
+ withResolverContext: withResolverContext
61
+ };
@@ -10,16 +10,15 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var areEqual = require("fbjs/lib/areEqual");
14
-
15
- var invariant = require("fbjs/lib/invariant");
16
-
17
13
  var _require = require('../util/RelayConcreteNode'),
18
14
  LINKED_FIELD = _require.LINKED_FIELD;
19
15
 
20
16
  var _require2 = require('./RelayStoreUtils'),
21
17
  getHandleStorageKey = _require2.getHandleStorageKey;
22
18
 
19
+ var areEqual = require("fbjs/lib/areEqual");
20
+
21
+ var invariant = require('invariant');
23
22
  /**
24
23
  * @private
25
24
  *
@@ -27,6 +26,8 @@ var _require2 = require('./RelayStoreUtils'),
27
26
  * field (on which the handle was declared) among the sibling `selections`, and
28
27
  * copying its selections into the clone.
29
28
  */
29
+
30
+
30
31
  function cloneRelayHandleSourceField(handleField, selections, variables) {
31
32
  var sourceField = selections.find(function (source) {
32
33
  return source.kind === LINKED_FIELD && source.name === handleField.name && source.alias === handleField.alias && areEqual(source.args, handleField.args);
@@ -10,22 +10,23 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var areEqual = require("fbjs/lib/areEqual");
14
-
15
- var invariant = require("fbjs/lib/invariant");
16
-
17
13
  var _require = require('../util/RelayConcreteNode'),
18
14
  SCALAR_FIELD = _require.SCALAR_FIELD;
19
15
 
20
16
  var _require2 = require('./RelayStoreUtils'),
21
17
  getHandleStorageKey = _require2.getHandleStorageKey;
22
18
 
19
+ var areEqual = require("fbjs/lib/areEqual");
20
+
21
+ var invariant = require('invariant');
23
22
  /**
24
23
  * @private
25
24
  *
26
25
  * Creates a clone of the supplied `handleField` by finding the original scalar
27
26
  * field (on which the handle was declared) among the sibling `selections`.
28
27
  */
28
+
29
+
29
30
  function cloneRelayScalarHandleSourceField(handleField, selections, variables) {
30
31
  var sourceField = selections.find(function (source) {
31
32
  return source.kind === SCALAR_FIELD && source.name === handleField.name && source.alias === handleField.alias && areEqual(source.args, handleField.args);
@@ -10,7 +10,9 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var invariant = require("fbjs/lib/invariant");
13
+ var invariant = require('invariant'); // Ideally, we'd just import the type of the react module, but this causes Flow
14
+ // problems.
15
+
14
16
 
15
17
  var relayContext;
16
18
  var firstReact;
@@ -26,7 +28,7 @@ function createRelayContext(react) {
26
28
  firstReact = react;
27
29
  }
28
30
 
29
- !(react === firstReact) ? process.env.NODE_ENV !== "production" ? invariant(false, '[createRelayContext]: You passing a different instance of React', react.version) : invariant(false) : void 0;
31
+ !(react === firstReact) ? process.env.NODE_ENV !== "production" ? invariant(false, '[createRelayContext]: You are passing a different instance of React', react.version) : invariant(false) : void 0;
30
32
  return relayContext;
31
33
  }
32
34
 
@@ -16,8 +16,10 @@ var _require = require('./ViewerPattern'),
16
16
 
17
17
  function defaultGetDataID(fieldValue, typeName) {
18
18
  if (typeName === VIEWER_TYPE) {
19
+ // $FlowFixMe[prop-missing]
19
20
  return fieldValue.id == null ? VIEWER_ID : fieldValue.id;
20
- }
21
+ } // $FlowFixMe[prop-missing]
22
+
21
23
 
22
24
  return fieldValue.id;
23
25
  }
@@ -10,14 +10,18 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var invariant = require("fbjs/lib/invariant");
14
-
15
13
  var _require = require('../query/GraphQLTag'),
16
14
  getInlineDataFragment = _require.getInlineDataFragment;
17
15
 
18
16
  var _require2 = require('./RelayStoreUtils'),
19
17
  FRAGMENTS_KEY = _require2.FRAGMENTS_KEY;
20
18
 
19
+ var invariant = require('invariant');
20
+ /**
21
+ * Reads an @inline data fragment that was spread into the parent fragment.
22
+ */
23
+
24
+
21
25
  function readInlineData(fragment, fragmentRef) {
22
26
  var _fragmentRef$FRAGMENT;
23
27
 
@@ -12,14 +12,19 @@
12
12
 
13
13
  var RelayDeclarativeMutationConfig = require('../mutations/RelayDeclarativeMutationConfig');
14
14
 
15
- var warning = require("fbjs/lib/warning");
16
-
17
15
  var _require = require('../query/GraphQLTag'),
18
16
  getRequest = _require.getRequest;
19
17
 
20
18
  var _require2 = require('../store/RelayModernOperationDescriptor'),
21
19
  createOperationDescriptor = _require2.createOperationDescriptor;
22
20
 
21
+ var _require3 = require('../store/RelayModernSelector'),
22
+ createReaderSelector = _require3.createReaderSelector;
23
+
24
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
25
+
26
+ var warning = require("fbjs/lib/warning");
27
+
23
28
  function requestSubscription(environment, config) {
24
29
  var subscription = getRequest(config.subscription);
25
30
 
@@ -38,18 +43,39 @@ function requestSubscription(environment, config) {
38
43
 
39
44
  var _ref = configs ? RelayDeclarativeMutationConfig.convert(configs, subscription, null
40
45
  /* optimisticUpdater */
41
- , config.updater) : config,
46
+ ,
47
+ /* optimisticUpdater */
48
+ config.updater) : config,
42
49
  updater = _ref.updater;
43
50
 
44
- var sub = environment.execute({
51
+ var sub = environment.executeSubscription({
45
52
  operation: operation,
46
53
  updater: updater
47
- }).map(function () {
48
- var data = environment.lookup(operation.fragment).data; // $FlowFixMe[incompatible-cast]
49
-
50
- return data;
51
54
  }).subscribe({
52
- next: onNext,
55
+ next: function next(responses) {
56
+ if (onNext != null) {
57
+ var selector = operation.fragment;
58
+ var nextID;
59
+
60
+ if (Array.isArray(responses)) {
61
+ var _responses$, _responses$$extension;
62
+
63
+ nextID = (_responses$ = responses[0]) === null || _responses$ === void 0 ? void 0 : (_responses$$extension = _responses$.extensions) === null || _responses$$extension === void 0 ? void 0 : _responses$$extension.__relay_subscription_root_id;
64
+ } else {
65
+ var _responses$extensions;
66
+
67
+ nextID = (_responses$extensions = responses.extensions) === null || _responses$extensions === void 0 ? void 0 : _responses$extensions.__relay_subscription_root_id;
68
+ }
69
+
70
+ if (typeof nextID === 'string') {
71
+ selector = createReaderSelector(selector.node, nextID, selector.variables, selector.owner);
72
+ }
73
+
74
+ var data = environment.lookup(selector).data; // $FlowFixMe[incompatible-cast]
75
+
76
+ onNext(data);
77
+ }
78
+ },
53
79
  error: onError,
54
80
  complete: onCompleted
55
81
  });
@@ -24,7 +24,10 @@
24
24
  * for local caching.
25
25
  */
26
26
  var RelayConcreteNode = {
27
+ ACTOR_CHANGE: 'ActorChange',
27
28
  CONDITION: 'Condition',
29
+ CLIENT_COMPONENT: 'ClientComponent',
30
+ CLIENT_EDGE: 'ClientEdge',
28
31
  CLIENT_EXTENSION: 'ClientExtension',
29
32
  DEFER: 'Defer',
30
33
  CONNECTION: 'Connection',
@@ -40,6 +43,7 @@ var RelayConcreteNode = {
40
43
  LIST_VALUE: 'ListValue',
41
44
  LOCAL_ARGUMENT: 'LocalArgument',
42
45
  MODULE_IMPORT: 'ModuleImport',
46
+ RELAY_RESOLVER: 'RelayResolver',
43
47
  REQUIRED_FIELD: 'RequiredField',
44
48
  OBJECT_VALUE: 'ObjectValue',
45
49
  OPERATION: 'Operation',
@@ -11,17 +11,24 @@
11
11
  'use strict';
12
12
 
13
13
  var RelayFeatureFlags = {
14
+ DELAY_CLEANUP_OF_PENDING_PRELOAD_QUERIES: false,
15
+ ENABLE_CLIENT_EDGES: false,
14
16
  ENABLE_VARIABLE_CONNECTION_KEY: false,
15
17
  ENABLE_PARTIAL_RENDERING_DEFAULT: true,
16
- ENABLE_RELAY_CONTAINERS_SUSPENSE: true,
17
- ENABLE_PRECISE_TYPE_REFINEMENT: false,
18
18
  ENABLE_REACT_FLIGHT_COMPONENT_FIELD: false,
19
19
  ENABLE_REQUIRED_DIRECTIVES: false,
20
+ ENABLE_RELAY_RESOLVERS: false,
20
21
  ENABLE_GETFRAGMENTIDENTIFIER_OPTIMIZATION: false,
21
22
  ENABLE_FRIENDLY_QUERY_NAME_GQL_URL: false,
22
- ENABLE_STORE_SUBSCRIPTIONS_REFACTOR: false,
23
23
  ENABLE_LOAD_QUERY_REQUEST_DEDUPING: true,
24
24
  ENABLE_DO_NOT_WRAP_LIVE_QUERY: false,
25
- ENABLE_NOTIFY_SUBSCRIPTION: false
25
+ ENABLE_NOTIFY_SUBSCRIPTION: false,
26
+ BATCH_ASYNC_MODULE_UPDATES_FN: null,
27
+ ENABLE_CONTAINERS_SUBSCRIBE_ON_COMMIT: false,
28
+ ENABLE_QUERY_RENDERER_OFFSCREEN_SUPPORT: false,
29
+ MAX_DATA_ID_LENGTH: null,
30
+ REFACTOR_SUSPENSE_RESOURCE: true,
31
+ STRING_INTERN_LEVEL: 0,
32
+ USE_REACT_CACHE: false
26
33
  };
27
34
  module.exports = RelayFeatureFlags;