relay-runtime 11.0.0-rc.0 → 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 (128) hide show
  1. package/handlers/connection/ConnectionHandler.js.flow +7 -0
  2. package/handlers/connection/MutationHandlers.js.flow +28 -0
  3. package/index.js +1 -1
  4. package/index.js.flow +20 -3
  5. package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
  6. package/lib/handlers/connection/ConnectionHandler.js +12 -6
  7. package/lib/handlers/connection/MutationHandlers.js +67 -8
  8. package/lib/index.js +15 -0
  9. package/lib/multi-actor-environment/ActorIdentifier.js +33 -0
  10. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +148 -0
  11. package/lib/multi-actor-environment/ActorUtils.js +27 -0
  12. package/lib/multi-actor-environment/MultiActorEnvironment.js +406 -0
  13. package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +11 -0
  14. package/lib/multi-actor-environment/index.js +21 -0
  15. package/lib/mutations/RelayRecordProxy.js +1 -1
  16. package/lib/mutations/RelayRecordSourceMutator.js +1 -1
  17. package/lib/mutations/RelayRecordSourceProxy.js +1 -1
  18. package/lib/mutations/RelayRecordSourceSelectorProxy.js +7 -2
  19. package/lib/mutations/applyOptimisticMutation.js +1 -1
  20. package/lib/mutations/commitMutation.js +5 -2
  21. package/lib/mutations/validateMutation.js +39 -17
  22. package/lib/network/RelayNetwork.js +1 -1
  23. package/lib/network/RelayObservable.js +3 -1
  24. package/lib/network/RelayQueryResponseCache.js +20 -3
  25. package/lib/network/wrapNetworkWithLogObserver.js +78 -0
  26. package/lib/query/GraphQLTag.js +1 -1
  27. package/lib/query/fetchQuery.js +1 -1
  28. package/lib/query/fetchQueryInternal.js +1 -1
  29. package/lib/store/DataChecker.js +132 -50
  30. package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +524 -187
  31. package/lib/store/RelayConcreteVariables.js +29 -4
  32. package/lib/store/RelayModernEnvironment.js +137 -220
  33. package/lib/store/RelayModernFragmentSpecResolver.js +49 -23
  34. package/lib/store/RelayModernRecord.js +36 -2
  35. package/lib/store/RelayModernSelector.js +1 -1
  36. package/lib/store/RelayModernStore.js +53 -22
  37. package/lib/store/RelayOperationTracker.js +34 -24
  38. package/lib/store/RelayPublishQueue.js +30 -8
  39. package/lib/store/RelayReader.js +177 -29
  40. package/lib/store/RelayRecordSource.js +87 -3
  41. package/lib/store/RelayReferenceMarker.js +53 -28
  42. package/lib/store/RelayResponseNormalizer.js +247 -108
  43. package/lib/store/RelayStoreReactFlightUtils.js +7 -11
  44. package/lib/store/RelayStoreSubscriptions.js +8 -5
  45. package/lib/store/RelayStoreUtils.js +10 -4
  46. package/lib/store/ResolverCache.js +213 -0
  47. package/lib/store/ResolverFragments.js +57 -0
  48. package/lib/store/cloneRelayHandleSourceField.js +1 -1
  49. package/lib/store/cloneRelayScalarHandleSourceField.js +1 -1
  50. package/lib/store/createRelayContext.js +2 -2
  51. package/lib/store/defaultGetDataID.js +3 -1
  52. package/lib/store/readInlineData.js +1 -1
  53. package/lib/subscription/requestSubscription.js +32 -6
  54. package/lib/util/RelayConcreteNode.js +3 -0
  55. package/lib/util/RelayFeatureFlags.js +5 -4
  56. package/lib/util/RelayProfiler.js +17 -187
  57. package/lib/util/RelayReplaySubject.js +22 -7
  58. package/lib/util/deepFreeze.js +1 -0
  59. package/lib/util/getPaginationMetadata.js +41 -0
  60. package/lib/util/getPaginationVariables.js +67 -0
  61. package/lib/util/getPendingOperationsForFragment.js +55 -0
  62. package/lib/util/getRefetchMetadata.js +36 -0
  63. package/lib/util/getRelayHandleKey.js +1 -1
  64. package/lib/util/getRequestIdentifier.js +1 -1
  65. package/lib/util/getValueAtPath.js +51 -0
  66. package/lib/util/isEmptyObject.js +1 -1
  67. package/lib/util/registerEnvironmentWithDevTools.js +26 -0
  68. package/lib/util/withDuration.js +31 -0
  69. package/multi-actor-environment/ActorIdentifier.js.flow +43 -0
  70. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +217 -0
  71. package/multi-actor-environment/ActorUtils.js.flow +33 -0
  72. package/multi-actor-environment/MultiActorEnvironment.js.flow +485 -0
  73. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +245 -0
  74. package/multi-actor-environment/index.js.flow +27 -0
  75. package/mutations/RelayRecordSourceSelectorProxy.js.flow +7 -2
  76. package/mutations/commitMutation.js.flow +3 -1
  77. package/mutations/validateMutation.js.flow +42 -16
  78. package/network/RelayNetworkTypes.js.flow +17 -8
  79. package/network/RelayObservable.js.flow +2 -0
  80. package/network/RelayQueryResponseCache.js.flow +31 -17
  81. package/network/wrapNetworkWithLogObserver.js.flow +99 -0
  82. package/package.json +3 -2
  83. package/relay-runtime.js +2 -2
  84. package/relay-runtime.min.js +2 -2
  85. package/store/ClientID.js.flow +5 -1
  86. package/store/DataChecker.js.flow +148 -44
  87. package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +578 -237
  88. package/store/RelayConcreteVariables.js.flow +31 -1
  89. package/store/RelayModernEnvironment.js.flow +132 -220
  90. package/store/RelayModernFragmentSpecResolver.js.flow +40 -14
  91. package/store/RelayModernOperationDescriptor.js.flow +9 -3
  92. package/store/RelayModernRecord.js.flow +49 -0
  93. package/store/RelayModernStore.js.flow +57 -17
  94. package/store/RelayOperationTracker.js.flow +56 -34
  95. package/store/RelayPublishQueue.js.flow +37 -11
  96. package/store/RelayReader.js.flow +186 -27
  97. package/store/RelayRecordSource.js.flow +72 -6
  98. package/store/RelayReferenceMarker.js.flow +51 -21
  99. package/store/RelayResponseNormalizer.js.flow +251 -67
  100. package/store/RelayStoreReactFlightUtils.js.flow +6 -9
  101. package/store/RelayStoreSubscriptions.js.flow +10 -3
  102. package/store/RelayStoreTypes.js.flow +144 -21
  103. package/store/RelayStoreUtils.js.flow +19 -4
  104. package/store/ResolverCache.js.flow +247 -0
  105. package/store/ResolverFragments.js.flow +128 -0
  106. package/store/createRelayContext.js.flow +1 -1
  107. package/store/defaultGetDataID.js.flow +3 -1
  108. package/subscription/requestSubscription.js.flow +43 -8
  109. package/util/NormalizationNode.js.flow +16 -3
  110. package/util/ReaderNode.js.flow +29 -2
  111. package/util/RelayConcreteNode.js.flow +3 -0
  112. package/util/RelayFeatureFlags.js.flow +10 -6
  113. package/util/RelayProfiler.js.flow +22 -194
  114. package/util/RelayReplaySubject.js.flow +7 -6
  115. package/util/RelayRuntimeTypes.js.flow +4 -2
  116. package/util/deepFreeze.js.flow +2 -1
  117. package/util/getPaginationMetadata.js.flow +74 -0
  118. package/util/getPaginationVariables.js.flow +112 -0
  119. package/util/getPendingOperationsForFragment.js.flow +62 -0
  120. package/util/getRefetchMetadata.js.flow +80 -0
  121. package/util/getValueAtPath.js.flow +46 -0
  122. package/util/isEmptyObject.js.flow +2 -1
  123. package/util/registerEnvironmentWithDevTools.js.flow +33 -0
  124. package/util/withDuration.js.flow +32 -0
  125. package/lib/store/RelayRecordSourceMapImpl.js +0 -107
  126. package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +0 -318
  127. package/store/RelayRecordSourceMapImpl.js.flow +0 -91
  128. package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +0 -283
@@ -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,
@@ -18,7 +18,7 @@ var RelayConcreteNode = require('../util/RelayConcreteNode');
18
18
 
19
19
  var getRelayHandleKey = require('../util/getRelayHandleKey');
20
20
 
21
- var invariant = require("fbjs/lib/invariant");
21
+ var invariant = require('invariant');
22
22
 
23
23
  var stableCopy = require('../util/stableCopy');
24
24
 
@@ -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
  /**
@@ -175,7 +175,8 @@ function formatStorageKey(name, argValues) {
175
175
 
176
176
 
177
177
  function getStableVariableValue(name, variables) {
178
- !variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getVariableValue(): Undefined variable `%s`.', name) : invariant(false) : void 0;
178
+ !variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getVariableValue(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
179
+
179
180
  return stableCopy(variables[name]);
180
181
  }
181
182
 
@@ -192,6 +193,7 @@ function getModuleOperationKey(documentName) {
192
193
 
193
194
 
194
195
  var RelayStoreUtils = {
196
+ ACTOR_IDENTIFIER_KEY: '__actorIdentifier',
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 RelayModernRecord = require('./RelayModernRecord');
18
+
19
+ var recycleNodesInto = require('../util/recycleNodesInto');
20
+
21
+ var warning = require("fbjs/lib/warning");
22
+
23
+ var _require = require('./ClientID'),
24
+ generateClientID = _require.generateClientID;
25
+
26
+ var _require2 = require('./RelayStoreUtils'),
27
+ RELAY_RESOLVER_VALUE_KEY = _require2.RELAY_RESOLVER_VALUE_KEY,
28
+ RELAY_RESOLVER_INVALIDATION_KEY = _require2.RELAY_RESOLVER_INVALIDATION_KEY,
29
+ RELAY_RESOLVER_INPUTS_KEY = _require2.RELAY_RESOLVER_INPUTS_KEY,
30
+ RELAY_RESOLVER_READER_SELECTOR_KEY = _require2.RELAY_RESOLVER_READER_SELECTOR_KEY,
31
+ getStorageKey = _require2.getStorageKey;
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,57 @@
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 invariant = require('invariant');
14
+
15
+ var _require = require('../query/GraphQLTag'),
16
+ getFragment = _require.getFragment;
17
+
18
+ var _require2 = require('./RelayModernSelector'),
19
+ getSelector = _require2.getSelector;
20
+
21
+ var contextStack = [];
22
+
23
+ function withResolverContext(context, cb) {
24
+ contextStack.push(context);
25
+
26
+ try {
27
+ return cb();
28
+ } finally {
29
+ contextStack.pop();
30
+ }
31
+ } // NOTE: these declarations are copied from 'useFragment'; it would be good
32
+ // to figure out how to share the same type signature between the two functions.
33
+ // The declarations ensure that the type of the returned data is:
34
+ // - non-nullable if the provided ref type is non-nullable
35
+ // - nullable if the provided ref type is nullable
36
+ // - array of non-nullable if the privoided ref type is an array of
37
+ // non-nullable refs
38
+ // - array of nullable if the privoided ref type is an array of nullable refs
39
+
40
+
41
+ function readFragment(fragmentInput, fragmentRef) {
42
+ if (!contextStack.length) {
43
+ throw new Error('readFragment should be called only from within a Relay Resolver function.');
44
+ }
45
+
46
+ var context = contextStack[contextStack.length - 1];
47
+ var fragmentNode = getFragment(fragmentInput);
48
+ var fragmentSelector = getSelector(fragmentNode, fragmentRef);
49
+ !(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;
50
+ !(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;
51
+ return context.getDataForResolverFragment(fragmentSelector, fragmentRef);
52
+ }
53
+
54
+ module.exports = {
55
+ readFragment: readFragment,
56
+ withResolverContext: withResolverContext
57
+ };
@@ -12,7 +12,7 @@
12
12
 
13
13
  var areEqual = require("fbjs/lib/areEqual");
14
14
 
15
- var invariant = require("fbjs/lib/invariant");
15
+ var invariant = require('invariant');
16
16
 
17
17
  var _require = require('../util/RelayConcreteNode'),
18
18
  LINKED_FIELD = _require.LINKED_FIELD;
@@ -12,7 +12,7 @@
12
12
 
13
13
  var areEqual = require("fbjs/lib/areEqual");
14
14
 
15
- var invariant = require("fbjs/lib/invariant");
15
+ var invariant = require('invariant');
16
16
 
17
17
  var _require = require('../util/RelayConcreteNode'),
18
18
  SCALAR_FIELD = _require.SCALAR_FIELD;
@@ -10,7 +10,7 @@
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');
14
14
 
15
15
  var relayContext;
16
16
  var firstReact;
@@ -26,7 +26,7 @@ function createRelayContext(react) {
26
26
  firstReact = react;
27
27
  }
28
28
 
29
- !(react === firstReact) ? process.env.NODE_ENV !== "production" ? invariant(false, '[createRelayContext]: You passing a different instance of React', react.version) : invariant(false) : void 0;
29
+ !(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
30
  return relayContext;
31
31
  }
32
32
 
@@ -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,7 +10,7 @@
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');
14
14
 
15
15
  var _require = require('../query/GraphQLTag'),
16
16
  getInlineDataFragment = _require.getInlineDataFragment;
@@ -12,6 +12,8 @@
12
12
 
13
13
  var RelayDeclarativeMutationConfig = require('../mutations/RelayDeclarativeMutationConfig');
14
14
 
15
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
16
+
15
17
  var warning = require("fbjs/lib/warning");
16
18
 
17
19
  var _require = require('../query/GraphQLTag'),
@@ -20,6 +22,9 @@ var _require = require('../query/GraphQLTag'),
20
22
  var _require2 = require('../store/RelayModernOperationDescriptor'),
21
23
  createOperationDescriptor = _require2.createOperationDescriptor;
22
24
 
25
+ var _require3 = require('../store/RelayModernSelector'),
26
+ createReaderSelector = _require3.createReaderSelector;
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
51
  var sub = environment.execute({
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,9 @@
24
24
  * for local caching.
25
25
  */
26
26
  var RelayConcreteNode = {
27
+ ACTOR_CHANGE: 'ActorChange',
27
28
  CONDITION: 'Condition',
29
+ CLIENT_COMPONENT: 'ClientComponent',
28
30
  CLIENT_EXTENSION: 'ClientExtension',
29
31
  DEFER: 'Defer',
30
32
  CONNECTION: 'Connection',
@@ -40,6 +42,7 @@ var RelayConcreteNode = {
40
42
  LIST_VALUE: 'ListValue',
41
43
  LOCAL_ARGUMENT: 'LocalArgument',
42
44
  MODULE_IMPORT: 'ModuleImport',
45
+ RELAY_RESOLVER: 'RelayResolver',
43
46
  REQUIRED_FIELD: 'RequiredField',
44
47
  OBJECT_VALUE: 'ObjectValue',
45
48
  OPERATION: 'Operation',
@@ -13,15 +13,16 @@
13
13
  var RelayFeatureFlags = {
14
14
  ENABLE_VARIABLE_CONNECTION_KEY: false,
15
15
  ENABLE_PARTIAL_RENDERING_DEFAULT: true,
16
- ENABLE_RELAY_CONTAINERS_SUSPENSE: true,
17
- ENABLE_PRECISE_TYPE_REFINEMENT: false,
18
16
  ENABLE_REACT_FLIGHT_COMPONENT_FIELD: false,
19
17
  ENABLE_REQUIRED_DIRECTIVES: false,
18
+ ENABLE_RELAY_RESOLVERS: false,
20
19
  ENABLE_GETFRAGMENTIDENTIFIER_OPTIMIZATION: false,
21
20
  ENABLE_FRIENDLY_QUERY_NAME_GQL_URL: false,
22
- ENABLE_STORE_SUBSCRIPTIONS_REFACTOR: false,
23
21
  ENABLE_LOAD_QUERY_REQUEST_DEDUPING: true,
24
22
  ENABLE_DO_NOT_WRAP_LIVE_QUERY: false,
25
- ENABLE_NOTIFY_SUBSCRIPTION: false
23
+ ENABLE_NOTIFY_SUBSCRIPTION: false,
24
+ BATCH_ASYNC_MODULE_UPDATES_FN: null,
25
+ ENABLE_CONTAINERS_SUBSCRIBE_ON_COMMIT: false,
26
+ ENABLE_QUERY_RENDERER_OFFSCREEN_SUPPORT: false
26
27
  };
27
28
  module.exports = RelayFeatureFlags;