relay-runtime 1.7.0-rc.1 → 2.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 (72) hide show
  1. package/LICENSE +1 -1
  2. package/index.js +1 -1
  3. package/lib/ConvertToExecuteFunction.js +12 -75
  4. package/lib/DataChecker.js +400 -0
  5. package/lib/NormalizationNode.js +14 -0
  6. package/lib/ReaderNode.js +10 -0
  7. package/lib/RelayCombinedEnvironmentTypes.js +10 -0
  8. package/lib/RelayConcreteNode.js +12 -29
  9. package/lib/RelayConcreteVariables.js +17 -11
  10. package/lib/RelayConnectionHandler.js +98 -42
  11. package/lib/RelayConnectionInterface.js +5 -13
  12. package/lib/RelayCore.js +17 -14
  13. package/lib/RelayDeclarativeMutationConfig.js +69 -34
  14. package/lib/RelayDefaultHandleKey.js +1 -2
  15. package/lib/RelayDefaultHandlerProvider.js +6 -5
  16. package/lib/RelayError.js +6 -9
  17. package/lib/RelayInMemoryRecordSource.js +20 -22
  18. package/lib/RelayModernEnvironment.js +140 -229
  19. package/lib/RelayModernFragmentSpecResolver.js +110 -102
  20. package/lib/RelayModernGraphQLTag.js +53 -15
  21. package/lib/{RelayModernOperationSelector.js → RelayModernOperationDescriptor.js} +9 -8
  22. package/lib/RelayModernQueryExecutor.js +172 -0
  23. package/lib/RelayModernRecord.js +97 -38
  24. package/lib/RelayModernSelector.js +89 -33
  25. package/lib/RelayModernStore.js +301 -0
  26. package/lib/RelayNetwork.js +16 -28
  27. package/lib/RelayNetworkLogger.js +2 -3
  28. package/lib/RelayNetworkLoggerTransaction.js +32 -30
  29. package/lib/RelayNetworkTypes.js +1 -2
  30. package/lib/RelayObservable.js +127 -155
  31. package/lib/RelayProfiler.js +35 -22
  32. package/lib/RelayPublishQueue.js +144 -96
  33. package/lib/RelayQueryResponseCache.js +37 -21
  34. package/lib/RelayReader.js +194 -61
  35. package/lib/RelayRecordProxy.js +50 -31
  36. package/lib/RelayRecordSourceMutator.js +92 -51
  37. package/lib/RelayRecordSourceProxy.js +43 -35
  38. package/lib/RelayRecordSourceSelectorProxy.js +22 -21
  39. package/lib/RelayRecordState.js +1 -3
  40. package/lib/RelayReferenceMarker.js +110 -37
  41. package/lib/RelayResponseNormalizer.js +248 -82
  42. package/lib/RelayRuntimeTypes.js +1 -3
  43. package/lib/RelayStoreTypes.js +1 -2
  44. package/lib/RelayStoreUtils.js +37 -19
  45. package/lib/RelayViewerHandler.js +14 -10
  46. package/lib/applyRelayModernOptimisticMutation.js +8 -8
  47. package/lib/cloneRelayHandleSourceField.js +8 -9
  48. package/lib/commitLocalUpdate.js +1 -2
  49. package/lib/commitRelayModernMutation.js +21 -14
  50. package/lib/createRelayNetworkLogger.js +11 -9
  51. package/lib/deepFreeze.js +2 -3
  52. package/lib/fetchRelayModernQuery.js +10 -12
  53. package/lib/generateRelayClientID.js +4 -2
  54. package/lib/getRelayHandleKey.js +5 -6
  55. package/lib/hasOverlappingIDs.js +3 -2
  56. package/lib/index.js +59 -62
  57. package/lib/isPromise.js +1 -2
  58. package/lib/isRelayModernEnvironment.js +1 -3
  59. package/lib/isScalarAndEqual.js +1 -3
  60. package/lib/normalizePayload.js +17 -15
  61. package/lib/normalizeRelayPayload.js +9 -9
  62. package/lib/recycleNodesInto.js +25 -9
  63. package/lib/requestRelaySubscription.js +25 -58
  64. package/lib/simpleClone.js +2 -3
  65. package/lib/stableCopy.js +5 -3
  66. package/lib/validateMutation.js +146 -0
  67. package/package.json +3 -3
  68. package/relay-runtime.js +4 -0
  69. package/relay-runtime.min.js +9 -0
  70. package/lib/RelayDataLoader.js +0 -302
  71. package/lib/RelayMarkSweepStore.js +0 -242
  72. package/lib/deferrableFragmentKey.js +0 -20
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) 2013-present, Facebook, Inc.
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
3
  *
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.
@@ -7,81 +7,92 @@
7
7
  * strict-local
8
8
  * @format
9
9
  */
10
-
11
10
  'use strict';
12
11
 
13
- var _classCallCheck3 = _interopRequireDefault(require('babel-runtime/helpers/classCallCheck'));
14
-
15
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
16
-
17
- function mark(recordSource, selector, references) {
12
+ function mark(recordSource, selector, references, operationLoader) {
18
13
  var dataID = selector.dataID,
19
14
  node = selector.node,
20
15
  variables = selector.variables;
21
-
22
- var marker = new RelayReferenceMarker(recordSource, variables, references);
16
+ var marker = new RelayReferenceMarker(recordSource, variables, references, operationLoader);
23
17
  marker.mark(node, dataID);
24
18
  }
25
-
26
19
  /**
27
20
  * @private
28
21
  */
29
22
 
30
- var RelayReferenceMarker = function () {
31
- function RelayReferenceMarker(recordSource, variables, references) {
32
- (0, _classCallCheck3['default'])(this, RelayReferenceMarker);
33
23
 
24
+ var RelayReferenceMarker =
25
+ /*#__PURE__*/
26
+ function () {
27
+ function RelayReferenceMarker(recordSource, variables, references, operationLoader) {
28
+ var _operationLoader;
29
+
30
+ this._operationLoader = (_operationLoader = operationLoader) !== null && _operationLoader !== void 0 ? _operationLoader : null;
34
31
  this._references = references;
35
32
  this._recordSource = recordSource;
36
33
  this._variables = variables;
37
34
  }
38
35
 
39
- RelayReferenceMarker.prototype.mark = function mark(node, dataID) {
36
+ var _proto = RelayReferenceMarker.prototype;
37
+
38
+ _proto.mark = function mark(node, dataID) {
40
39
  this._traverse(node, dataID);
41
40
  };
42
41
 
43
- RelayReferenceMarker.prototype._traverse = function _traverse(node, dataID) {
42
+ _proto._traverse = function _traverse(node, dataID) {
44
43
  this._references.add(dataID);
44
+
45
45
  var record = this._recordSource.get(dataID);
46
+
46
47
  if (record == null) {
47
48
  return;
48
49
  }
50
+
49
51
  this._traverseSelections(node.selections, record);
50
52
  };
51
53
 
52
- RelayReferenceMarker.prototype._getVariableValue = function _getVariableValue(name) {
53
- !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== 'production' ? require('fbjs/lib/invariant')(false, 'RelayReferenceMarker(): Undefined variable `%s`.', name) : require('fbjs/lib/invariant')(false) : void 0;
54
+ _proto._getVariableValue = function _getVariableValue(name) {
55
+ !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayReferenceMarker(): Undefined variable `%s`.', name) : require("fbjs/lib/invariant")(false) : void 0;
54
56
  return this._variables[name];
55
57
  };
56
58
 
57
- RelayReferenceMarker.prototype._traverseSelections = function _traverseSelections(selections, record) {
59
+ _proto._traverseSelections = function _traverseSelections(selections, record) {
58
60
  var _this = this;
59
61
 
60
62
  selections.forEach(function (selection) {
61
63
  /* eslint-disable no-fallthrough */
62
64
  switch (selection.kind) {
63
- case require('./RelayConcreteNode').LINKED_FIELD:
65
+ case require("./RelayConcreteNode").LINKED_FIELD:
64
66
  if (selection.plural) {
65
67
  _this._traversePluralLink(selection, record);
66
68
  } else {
67
69
  _this._traverseLink(selection, record);
68
70
  }
71
+
69
72
  break;
70
- case require('./RelayConcreteNode').CONDITION:
73
+
74
+ case require("./RelayConcreteNode").CONDITION:
71
75
  var conditionValue = _this._getVariableValue(selection.condition);
76
+
72
77
  if (conditionValue === selection.passingValue) {
73
78
  _this._traverseSelections(selection.selections, record);
74
79
  }
80
+
75
81
  break;
76
- case require('./RelayConcreteNode').INLINE_FRAGMENT:
77
- var typeName = require('./RelayModernRecord').getType(record);
82
+
83
+ case require("./RelayConcreteNode").INLINE_FRAGMENT:
84
+ var typeName = require("./RelayModernRecord").getType(record);
85
+
78
86
  if (typeName != null && typeName === selection.type) {
79
87
  _this._traverseSelections(selection.selections, record);
80
88
  }
89
+
81
90
  break;
82
- case require('./RelayConcreteNode').FRAGMENT_SPREAD:
83
- !false ? process.env.NODE_ENV !== 'production' ? require('fbjs/lib/invariant')(false, 'RelayReferenceMarker(): Unexpected fragment spread `...%s`, ' + 'expected all fragments to be inlined.', selection.name) : require('fbjs/lib/invariant')(false) : void 0;
84
- case require('./RelayConcreteNode').LINKED_HANDLE:
91
+
92
+ case require("./RelayConcreteNode").FRAGMENT_SPREAD:
93
+ !false ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayReferenceMarker(): Unexpected fragment spread `...%s`, ' + 'expected all fragments to be inlined.', selection.name) : require("fbjs/lib/invariant")(false) : void 0;
94
+
95
+ case require("./RelayConcreteNode").LINKED_HANDLE:
85
96
  // The selections for a "handle" field are the same as those of the
86
97
  // original linked field where the handle was applied. Reference marking
87
98
  // therefore requires traversing the original field selections against
@@ -91,43 +102,103 @@ var RelayReferenceMarker = function () {
91
102
  // the concrete structure to allow shared subtrees, and have the linked
92
103
  // handle directly refer to the same selections as the LinkedField that
93
104
  // it was split from.
94
- var handleField = require('./cloneRelayHandleSourceField')(selection, selections, _this._variables);
105
+ var handleField = require("./cloneRelayHandleSourceField")(selection, selections, _this._variables);
106
+
95
107
  if (handleField.plural) {
96
108
  _this._traversePluralLink(handleField, record);
97
109
  } else {
98
110
  _this._traverseLink(handleField, record);
99
111
  }
112
+
100
113
  break;
101
- case require('./RelayConcreteNode').SCALAR_FIELD:
102
- case require('./RelayConcreteNode').SCALAR_HANDLE:
103
- case require('./RelayConcreteNode').DEFERRABLE_FRAGMENT_SPREAD:
114
+
115
+ case require("./RelayConcreteNode").DEFER:
116
+ case require("./RelayConcreteNode").STREAM:
117
+ _this._traverseSelections(selection.selections, record);
118
+
119
+ break;
120
+
121
+ case require("./RelayConcreteNode").SCALAR_FIELD:
122
+ case require("./RelayConcreteNode").SCALAR_HANDLE:
123
+ break;
124
+
125
+ case require("./RelayConcreteNode").MATCH_FIELD:
126
+ _this._traverseMatch(selection, record);
127
+
104
128
  break;
129
+
105
130
  default:
106
131
  selection;
107
- !false ? process.env.NODE_ENV !== 'production' ? require('fbjs/lib/invariant')(false, 'RelayReferenceMarker: Unknown AST node `%s`.', selection) : require('fbjs/lib/invariant')(false) : void 0;
132
+ !false ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayReferenceMarker: Unknown AST node `%s`.', selection) : require("fbjs/lib/invariant")(false) : void 0;
108
133
  }
109
134
  });
110
135
  };
111
136
 
112
- RelayReferenceMarker.prototype._traverseLink = function _traverseLink(field, record) {
113
- var storageKey = require('./RelayStoreUtils').getStorageKey(field, this._variables);
114
- var linkedID = require('./RelayModernRecord').getLinkedRecordID(record, storageKey);
137
+ _proto._traverseMatch = function _traverseMatch(field, record) {
138
+ var storageKey = require("./RelayStoreUtils").getStorageKey(field, this._variables);
139
+
140
+ var linkedID = require("./RelayModernRecord").getLinkedRecordID(record, storageKey);
115
141
 
116
142
  if (linkedID == null) {
117
143
  return;
118
144
  }
145
+
146
+ this._references.add(linkedID);
147
+
148
+ var linkedRecord = this._recordSource.get(linkedID);
149
+
150
+ if (linkedRecord == null) {
151
+ return;
152
+ }
153
+
154
+ var typeName = require("./RelayModernRecord").getType(linkedRecord);
155
+
156
+ var match = field.matchesByType[typeName];
157
+
158
+ if (match != null) {
159
+ var operationLoader = this._operationLoader;
160
+ !(operationLoader !== null) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayReferenceMarker: Expected an operationLoader to be configured when using `@match`.') : require("fbjs/lib/invariant")(false) : void 0;
161
+
162
+ var operationReference = require("./RelayModernRecord").getValue(linkedRecord, require("./RelayStoreUtils").MATCH_FRAGMENT_KEY);
163
+
164
+ if (operationReference == null) {
165
+ return;
166
+ }
167
+
168
+ var operation = operationLoader.get(operationReference);
169
+
170
+ if (operation != null) {
171
+ this._traverseSelections(operation.selections, linkedRecord);
172
+ } // If the operation is not available, we assume that the data cannot have been
173
+ // processed yet and therefore isn't in the store to begin with.
174
+
175
+ } else {// TODO: warn: store is corrupt: the field should be null if the typename did not match
176
+ }
177
+ };
178
+
179
+ _proto._traverseLink = function _traverseLink(field, record) {
180
+ var storageKey = require("./RelayStoreUtils").getStorageKey(field, this._variables);
181
+
182
+ var linkedID = require("./RelayModernRecord").getLinkedRecordID(record, storageKey);
183
+
184
+ if (linkedID == null) {
185
+ return;
186
+ }
187
+
119
188
  this._traverse(field, linkedID);
120
189
  };
121
190
 
122
- RelayReferenceMarker.prototype._traversePluralLink = function _traversePluralLink(field, record) {
191
+ _proto._traversePluralLink = function _traversePluralLink(field, record) {
123
192
  var _this2 = this;
124
193
 
125
- var storageKey = require('./RelayStoreUtils').getStorageKey(field, this._variables);
126
- var linkedIDs = require('./RelayModernRecord').getLinkedRecordIDs(record, storageKey);
194
+ var storageKey = require("./RelayStoreUtils").getStorageKey(field, this._variables);
195
+
196
+ var linkedIDs = require("./RelayModernRecord").getLinkedRecordIDs(record, storageKey);
127
197
 
128
198
  if (linkedIDs == null) {
129
199
  return;
130
200
  }
201
+
131
202
  linkedIDs.forEach(function (linkedID) {
132
203
  if (linkedID != null) {
133
204
  _this2._traverse(field, linkedID);
@@ -138,4 +209,6 @@ var RelayReferenceMarker = function () {
138
209
  return RelayReferenceMarker;
139
210
  }();
140
211
 
141
- module.exports = { mark: mark };
212
+ module.exports = {
213
+ mark: mark
214
+ };