relay-runtime 2.0.0-rc.2 → 5.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 (77) hide show
  1. package/index.js +1 -1
  2. package/lib/{generateRelayClientID.js → ClientID.js} +10 -3
  3. package/lib/ConvertToExecuteFunction.js +6 -4
  4. package/lib/DataChecker.js +88 -69
  5. package/lib/NormalizationNode.js +1 -1
  6. package/lib/ReaderNode.js +1 -1
  7. package/lib/RelayCombinedEnvironmentTypes.js +1 -1
  8. package/lib/RelayConcreteNode.js +5 -2
  9. package/lib/RelayConcreteVariables.js +15 -9
  10. package/lib/RelayConnectionHandler.js +27 -20
  11. package/lib/RelayConnectionInterface.js +4 -2
  12. package/lib/RelayCore.js +48 -15
  13. package/lib/RelayDeclarativeMutationConfig.js +16 -15
  14. package/lib/RelayDefaultHandleKey.js +1 -1
  15. package/lib/RelayDefaultHandlerProvider.js +7 -6
  16. package/lib/RelayDefaultMissingFieldHandlers.js +26 -0
  17. package/lib/RelayError.js +7 -2
  18. package/lib/RelayFeatureFlags.js +16 -0
  19. package/lib/RelayInMemoryRecordSource.js +8 -2
  20. package/lib/RelayModernEnvironment.js +159 -237
  21. package/lib/RelayModernFragmentOwner.js +72 -0
  22. package/lib/RelayModernFragmentSpecResolver.js +66 -15
  23. package/lib/RelayModernGraphQLTag.js +9 -5
  24. package/lib/RelayModernOperationDescriptor.js +9 -6
  25. package/lib/RelayModernQueryExecutor.js +791 -0
  26. package/lib/RelayModernRecord.js +44 -24
  27. package/lib/RelayModernSelector.js +208 -82
  28. package/lib/RelayModernStore.js +66 -34
  29. package/lib/RelayNetwork.js +14 -7
  30. package/lib/RelayNetworkLogger.js +6 -2
  31. package/lib/RelayNetworkLoggerTransaction.js +8 -4
  32. package/lib/RelayNetworkTypes.js +1 -1
  33. package/lib/RelayObservable.js +72 -41
  34. package/lib/RelayOperationTracker.js +265 -0
  35. package/lib/RelayProfiler.js +10 -6
  36. package/lib/RelayPublishQueue.js +66 -47
  37. package/lib/RelayQueryResponseCache.js +11 -5
  38. package/lib/RelayReader.js +135 -126
  39. package/lib/RelayRecordProxy.js +24 -20
  40. package/lib/RelayRecordSourceMutator.js +88 -25
  41. package/lib/RelayRecordSourceProxy.js +38 -19
  42. package/lib/RelayRecordSourceSelectorProxy.js +10 -7
  43. package/lib/RelayRecordState.js +1 -1
  44. package/lib/RelayReferenceMarker.js +66 -55
  45. package/lib/RelayReplaySubject.js +134 -0
  46. package/lib/RelayResponseNormalizer.js +245 -134
  47. package/lib/RelayRuntimeTypes.js +1 -1
  48. package/lib/RelayStoreUtils.js +55 -16
  49. package/lib/RelayViewerHandler.js +8 -50
  50. package/lib/StoreInspector.js +171 -0
  51. package/lib/applyRelayModernOptimisticMutation.js +8 -2
  52. package/lib/cloneRelayHandleSourceField.js +17 -7
  53. package/lib/commitLocalUpdate.js +1 -1
  54. package/lib/commitRelayModernMutation.js +33 -13
  55. package/lib/createRelayContext.js +27 -0
  56. package/lib/createRelayNetworkLogger.js +8 -2
  57. package/lib/deepFreeze.js +1 -1
  58. package/lib/defaultGetDataID.js +24 -0
  59. package/lib/fetchQueryInternal.js +232 -0
  60. package/lib/fetchRelayModernQuery.js +5 -3
  61. package/lib/getFragmentIdentifier.js +52 -0
  62. package/lib/getFragmentSpecIdentifier.js +26 -0
  63. package/lib/getRelayHandleKey.js +8 -2
  64. package/lib/getRequestParametersIdentifier.js +26 -0
  65. package/lib/hasOverlappingIDs.js +1 -1
  66. package/lib/index.js +155 -53
  67. package/lib/isPromise.js +1 -1
  68. package/lib/isScalarAndEqual.js +1 -1
  69. package/lib/normalizeRelayPayload.js +19 -10
  70. package/lib/recycleNodesInto.js +23 -5
  71. package/lib/requestRelaySubscription.js +9 -3
  72. package/lib/validateMutation.js +13 -6
  73. package/package.json +2 -2
  74. package/relay-runtime.js +2 -2
  75. package/relay-runtime.min.js +2 -2
  76. package/lib/normalizePayload.js +0 -37
  77. package/lib/simpleClone.js +0 -27
@@ -9,9 +9,27 @@
9
9
  */
10
10
  'use strict';
11
11
 
12
- var _objectSpread2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/objectSpread"));
12
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
13
13
 
14
- var _defineProperty2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/defineProperty"));
14
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
15
+
16
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
+
18
+ var areEqual = require("fbjs/lib/areEqual");
19
+
20
+ var invariant = require("fbjs/lib/invariant");
21
+
22
+ var isScalarAndEqual = require("./isScalarAndEqual");
23
+
24
+ var _require = require("./RelayModernFragmentOwner"),
25
+ getFragmentOwners = _require.getFragmentOwners;
26
+
27
+ var _require2 = require("./RelayModernSelector"),
28
+ areEqualSelectors = _require2.areEqualSelectors,
29
+ getSelectorsFromObject = _require2.getSelectorsFromObject;
30
+
31
+ var _require3 = require("./RelayStoreUtils"),
32
+ ROOT_ID = _require3.ROOT_ID;
15
33
 
16
34
  /**
17
35
  * A utility for resolving and subscribing to the results of a fragment spec
@@ -89,7 +107,7 @@ function () {
89
107
 
90
108
  var _nextItem = prop !== undefined ? prop : null;
91
109
 
92
- if (nextData || !require("./isScalarAndEqual")(_nextItem, prevItem)) {
110
+ if (nextData || !isScalarAndEqual(_nextItem, prevItem)) {
93
111
  nextData = nextData || (0, _objectSpread2["default"])({}, prevData);
94
112
  nextData[_key2] = _nextItem;
95
113
  }
@@ -109,7 +127,9 @@ function () {
109
127
  };
110
128
 
111
129
  _proto.setProps = function setProps(props) {
112
- var ownedSelectors = require("./RelayModernSelector").getSelectorsFromObject(this._context.variables, this._fragments, props);
130
+ var ownedSelectors = getSelectorsFromObject( // NOTE: We pass empty operationVariables because we want to prefer
131
+ // the variables from the fragment owner
132
+ {}, this._fragments, props, getFragmentOwners(this._fragments, props));
113
133
 
114
134
  for (var _key3 in ownedSelectors) {
115
135
  if (ownedSelectors.hasOwnProperty(_key3)) {
@@ -126,14 +146,14 @@ function () {
126
146
  if (resolver == null) {
127
147
  resolver = new SelectorListResolver(this._context.environment, ownedSelector, this._onChange);
128
148
  } else {
129
- !(resolver instanceof SelectorListResolver) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayModernFragmentSpecResolver: Expected prop `%s` to always be an array.', _key3) : require("fbjs/lib/invariant")(false) : void 0;
149
+ !(resolver instanceof SelectorListResolver) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernFragmentSpecResolver: Expected prop `%s` to always be an array.', _key3) : invariant(false) : void 0;
130
150
  resolver.setSelectors(ownedSelector);
131
151
  }
132
152
  } else {
133
153
  if (resolver == null) {
134
154
  resolver = new SelectorResolver(this._context.environment, ownedSelector, this._onChange);
135
155
  } else {
136
- !(resolver instanceof SelectorResolver) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayModernFragmentSpecResolver: Expected prop `%s` to always be an object.', _key3) : require("fbjs/lib/invariant")(false) : void 0;
156
+ !(resolver instanceof SelectorResolver) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernFragmentSpecResolver: Expected prop `%s` to always be an object.', _key3) : invariant(false) : void 0;
137
157
  resolver.setSelector(ownedSelector);
138
158
  }
139
159
  }
@@ -146,13 +166,13 @@ function () {
146
166
  this._stale = true;
147
167
  };
148
168
 
149
- _proto.setVariables = function setVariables(variables) {
169
+ _proto.setVariables = function setVariables(variables, request) {
150
170
  for (var _key4 in this._resolvers) {
151
171
  if (this._resolvers.hasOwnProperty(_key4)) {
152
172
  var resolver = this._resolvers[_key4];
153
173
 
154
174
  if (resolver) {
155
- resolver.setVariables(variables);
175
+ resolver.setVariables(variables, request);
156
176
  }
157
177
  }
158
178
  }
@@ -179,7 +199,7 @@ function () {
179
199
  _this2._callback();
180
200
  });
181
201
 
182
- var _snapshot = environment.lookup(ownedSelector.selector);
202
+ var _snapshot = environment.lookup(ownedSelector.selector, ownedSelector.owner);
183
203
 
184
204
  this._callback = callback;
185
205
  this._data = _snapshot.data;
@@ -203,22 +223,53 @@ function () {
203
223
  };
204
224
 
205
225
  _proto2.setSelector = function setSelector(ownedSelector) {
206
- if (this._subscription != null && require("./RelayModernSelector").areEqualSelectors(ownedSelector, this._ownedSelector)) {
226
+ if (this._subscription != null && areEqualSelectors(ownedSelector, this._ownedSelector)) {
207
227
  return;
208
228
  }
209
229
 
210
230
  this.dispose();
211
231
 
212
- var snapshot = this._environment.lookup(ownedSelector.selector);
232
+ var snapshot = this._environment.lookup(ownedSelector.selector, ownedSelector.owner);
213
233
 
214
234
  this._data = snapshot.data;
215
235
  this._ownedSelector = ownedSelector;
216
236
  this._subscription = this._environment.subscribe(snapshot, this._onChange);
217
237
  };
218
238
 
219
- _proto2.setVariables = function setVariables(variables) {
239
+ _proto2.setVariables = function setVariables(variables, request) {
240
+ if (areEqual(variables, this._ownedSelector.selector.variables)) {
241
+ // If we're not actually setting new variables, we don't actually want
242
+ // to create a new fragment owner, since areEqualSelectors relies on
243
+ // owner identity when fragment ownership is enabled.
244
+ // In fact, we don't even need to try to attempt to set a new selector.
245
+ // When fragment ownership is not enabled, setSelector will also bail
246
+ // out since the selector doesn't really change, so we're doing it here
247
+ // earlier.
248
+ return;
249
+ }
250
+
220
251
  var ownedSelector = {
221
- owner: null,
252
+ owner: request ? // NOTE: We manually create the operation descriptor here instead of
253
+ // calling createOperationDescriptor() because we want to set a
254
+ // descriptor with *unaltered* variables as the fragment owner.
255
+ // This is a hack that allows us to preserve exisiting (broken)
256
+ // behavior of RelayModern containers while using fragment ownership
257
+ // to propagate variables instead of Context.
258
+ // For more details, see the summary of D13999308
259
+ {
260
+ fragment: {
261
+ dataID: ROOT_ID,
262
+ node: request.fragment,
263
+ variables: variables
264
+ },
265
+ node: request,
266
+ root: {
267
+ dataID: ROOT_ID,
268
+ node: request.operation,
269
+ variables: variables
270
+ },
271
+ variables: variables
272
+ } : null,
222
273
  selector: (0, _objectSpread2["default"])({}, this._ownedSelector.selector, {
223
274
  variables: variables
224
275
  })
@@ -305,9 +356,9 @@ function () {
305
356
  this._stale = true;
306
357
  };
307
358
 
308
- _proto3.setVariables = function setVariables(variables) {
359
+ _proto3.setVariables = function setVariables(variables, request) {
309
360
  this._resolvers.forEach(function (resolver) {
310
- return resolver.setVariables(variables);
361
+ return resolver.setVariables(variables, request);
311
362
  });
312
363
 
313
364
  this._stale = true;
@@ -9,12 +9,16 @@
9
9
  */
10
10
  'use strict';
11
11
 
12
+ var RelayConcreteNode = require("./RelayConcreteNode");
13
+
14
+ var invariant = require("fbjs/lib/invariant");
15
+
12
16
  /**
13
17
  * Runtime function to correspond to the `graphql` tagged template function.
14
18
  * All calls to this function should be transformed by the plugin.
15
19
  */
16
20
  function graphql(strings) {
17
- !false ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'graphql: Unexpected invocation at runtime. Either the Babel transform ' + 'was not set up, or it failed to identify this call site. Make sure it ' + 'is being used verbatim as `graphql`.') : require("fbjs/lib/invariant")(false) : void 0;
21
+ !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'graphql: Unexpected invocation at runtime. Either the Babel transform ' + 'was not set up, or it failed to identify this call site. Make sure it ' + 'is being used verbatim as `graphql`.') : invariant(false) : void 0;
18
22
  }
19
23
 
20
24
  function getNode(taggedNode) {
@@ -31,17 +35,17 @@ function getNode(taggedNode) {
31
35
 
32
36
  function isFragment(node) {
33
37
  var fragment = getNode(node);
34
- return typeof fragment === 'object' && fragment !== null && fragment.kind === require("./RelayConcreteNode").FRAGMENT;
38
+ return typeof fragment === 'object' && fragment !== null && fragment.kind === RelayConcreteNode.FRAGMENT;
35
39
  }
36
40
 
37
41
  function isRequest(node) {
38
42
  var request = getNode(node);
39
- return typeof request === 'object' && request !== null && request.kind === require("./RelayConcreteNode").REQUEST;
43
+ return typeof request === 'object' && request !== null && request.kind === RelayConcreteNode.REQUEST;
40
44
  }
41
45
 
42
46
  function getFragment(taggedNode) {
43
47
  var fragment = getNode(taggedNode);
44
- !isFragment(fragment) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayModernGraphQLTag: Expected a fragment, got `%s`.', JSON.stringify(fragment)) : require("fbjs/lib/invariant")(false) : void 0;
48
+ !isFragment(fragment) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernGraphQLTag: Expected a fragment, got `%s`.', JSON.stringify(fragment)) : invariant(false) : void 0;
45
49
  return fragment;
46
50
  }
47
51
 
@@ -74,7 +78,7 @@ function getRefetchableFragment(taggedNode) {
74
78
 
75
79
  function getRequest(taggedNode) {
76
80
  var request = getNode(taggedNode);
77
- !isRequest(request) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayModernGraphQLTag: Expected a request, got `%s`.', JSON.stringify(request)) : require("fbjs/lib/invariant")(false) : void 0;
81
+ !isRequest(request) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernGraphQLTag: Expected a request, got `%s`.', JSON.stringify(request)) : invariant(false) : void 0;
78
82
  return request;
79
83
  }
80
84
 
@@ -4,11 +4,17 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * strict-local
7
+ *
8
8
  * @format
9
9
  */
10
10
  'use strict';
11
11
 
12
+ var _require = require("./RelayConcreteVariables"),
13
+ getOperationVariables = _require.getOperationVariables;
14
+
15
+ var _require2 = require("./RelayStoreUtils"),
16
+ ROOT_ID = _require2.ROOT_ID;
17
+
12
18
  /**
13
19
  * Creates an instance of the `OperationDescriptor` type defined in
14
20
  * `RelayStoreTypes` given an operation and some variables. The input variables
@@ -17,11 +23,8 @@
17
23
  */
18
24
  function createOperationDescriptor(request, variables) {
19
25
  var operation = request.operation;
20
-
21
- var operationVariables = require("./RelayConcreteVariables").getOperationVariables(operation, variables);
22
-
23
- var dataID = require("./RelayStoreUtils").ROOT_ID;
24
-
26
+ var operationVariables = getOperationVariables(operation, variables);
27
+ var dataID = ROOT_ID;
25
28
  return {
26
29
  fragment: {
27
30
  dataID: dataID,