relay-runtime 11.0.1 → 13.0.0-rc.1

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 -17
  3. package/handlers/connection/MutationHandlers.js.flow +7 -11
  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 +13 -19
  8. package/lib/handlers/connection/MutationHandlers.js +4 -7
  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 +10 -5
  25. package/lib/network/ConvertToExecuteFunction.js +2 -1
  26. package/lib/network/RelayNetwork.js +3 -2
  27. package/lib/network/RelayQueryResponseCache.js +21 -5
  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 +123 -54
  35. package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +518 -200
  36. package/lib/store/RelayConcreteVariables.js +26 -8
  37. package/lib/store/RelayExperimentalGraphResponseHandler.js +153 -0
  38. package/lib/store/RelayExperimentalGraphResponseTransform.js +391 -0
  39. package/lib/store/RelayModernEnvironment.js +175 -240
  40. package/lib/store/RelayModernFragmentSpecResolver.js +52 -26
  41. package/lib/store/RelayModernOperationDescriptor.js +2 -1
  42. package/lib/store/RelayModernRecord.js +47 -12
  43. package/lib/store/RelayModernSelector.js +14 -8
  44. package/lib/store/RelayModernStore.js +56 -28
  45. package/lib/store/RelayOperationTracker.js +34 -24
  46. package/lib/store/RelayPublishQueue.js +41 -13
  47. package/lib/store/RelayReader.js +288 -48
  48. package/lib/store/RelayRecordSource.js +87 -3
  49. package/lib/store/RelayReferenceMarker.js +34 -22
  50. package/lib/store/RelayResponseNormalizer.js +211 -110
  51. package/lib/store/RelayStoreReactFlightUtils.js +4 -10
  52. package/lib/store/RelayStoreSubscriptions.js +14 -9
  53. package/lib/store/RelayStoreUtils.js +12 -7
  54. package/lib/store/ResolverCache.js +213 -0
  55. package/lib/store/ResolverFragments.js +61 -0
  56. package/lib/store/cloneRelayHandleSourceField.js +5 -4
  57. package/lib/store/cloneRelayScalarHandleSourceField.js +5 -4
  58. package/lib/store/createRelayContext.js +4 -2
  59. package/lib/store/readInlineData.js +6 -2
  60. package/lib/subscription/requestSubscription.js +34 -25
  61. package/lib/util/RelayConcreteNode.js +3 -0
  62. package/lib/util/RelayFeatureFlags.js +10 -4
  63. package/lib/util/RelayProfiler.js +17 -187
  64. package/lib/util/RelayReplaySubject.js +22 -7
  65. package/lib/util/RelayRuntimeTypes.js +0 -6
  66. package/lib/util/StringInterner.js +71 -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 +26 -16
  95. package/network/ConvertToExecuteFunction.js.flow +2 -2
  96. package/network/RelayNetwork.js.flow +4 -5
  97. package/network/RelayNetworkTypes.js.flow +5 -4
  98. package/network/RelayObservable.js.flow +1 -1
  99. package/network/RelayQueryResponseCache.js.flow +34 -21
  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 +141 -59
  111. package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +605 -303
  112. package/store/RelayConcreteVariables.js.flow +27 -8
  113. package/store/RelayExperimentalGraphResponseHandler.js.flow +124 -0
  114. package/store/RelayExperimentalGraphResponseTransform.js.flow +475 -0
  115. package/store/RelayModernEnvironment.js.flow +173 -240
  116. package/store/RelayModernFragmentSpecResolver.js.flow +55 -31
  117. package/store/RelayModernOperationDescriptor.js.flow +12 -7
  118. package/store/RelayModernRecord.js.flow +67 -11
  119. package/store/RelayModernSelector.js.flow +24 -14
  120. package/store/RelayModernStore.js.flow +66 -36
  121. package/store/RelayOperationTracker.js.flow +59 -43
  122. package/store/RelayOptimisticRecordSource.js.flow +2 -2
  123. package/store/RelayPublishQueue.js.flow +79 -34
  124. package/store/RelayReader.js.flow +351 -73
  125. package/store/RelayRecordSource.js.flow +72 -6
  126. package/store/RelayReferenceMarker.js.flow +40 -26
  127. package/store/RelayResponseNormalizer.js.flow +258 -99
  128. package/store/RelayStoreReactFlightUtils.js.flow +4 -11
  129. package/store/RelayStoreSubscriptions.js.flow +19 -11
  130. package/store/RelayStoreTypes.js.flow +209 -43
  131. package/store/RelayStoreUtils.js.flow +24 -11
  132. package/store/ResolverCache.js.flow +249 -0
  133. package/store/ResolverFragments.js.flow +121 -0
  134. package/store/StoreInspector.js.flow +2 -2
  135. package/store/TypeID.js.flow +1 -1
  136. package/store/ViewerPattern.js.flow +2 -2
  137. package/store/cloneRelayHandleSourceField.js.flow +5 -6
  138. package/store/cloneRelayScalarHandleSourceField.js.flow +5 -6
  139. package/store/createFragmentSpecResolver.js.flow +3 -4
  140. package/store/createRelayContext.js.flow +3 -3
  141. package/store/normalizeRelayPayload.js.flow +6 -7
  142. package/store/readInlineData.js.flow +7 -8
  143. package/subscription/requestSubscription.js.flow +53 -41
  144. package/util/NormalizationNode.js.flow +10 -3
  145. package/util/ReaderNode.js.flow +38 -2
  146. package/util/RelayConcreteNode.js.flow +5 -0
  147. package/util/RelayFeatureFlags.js.flow +24 -10
  148. package/util/RelayProfiler.js.flow +22 -194
  149. package/util/RelayReplaySubject.js.flow +9 -9
  150. package/util/RelayRuntimeTypes.js.flow +72 -3
  151. package/util/StringInterner.js.flow +69 -0
  152. package/util/createPayloadFor3DField.js.flow +3 -3
  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 +1 -0
  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
@@ -12,17 +12,83 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- const RelayRecordSourceMapImpl = require('./RelayRecordSourceMapImpl');
15
+ import type {DataID} from '../util/RelayRuntimeTypes';
16
+ import type {RecordState} from './RelayRecordState';
17
+ import type {
18
+ MutableRecordSource,
19
+ Record,
20
+ RecordObjectMap,
21
+ } from './RelayStoreTypes';
16
22
 
17
- import type {MutableRecordSource, RecordObjectMap} from './RelayStoreTypes';
23
+ const RelayRecordState = require('./RelayRecordState');
18
24
 
19
- class RelayRecordSource {
20
- constructor(records?: RecordObjectMap): MutableRecordSource {
21
- return RelayRecordSource.create(records);
25
+ const {EXISTENT, NONEXISTENT, UNKNOWN} = RelayRecordState;
26
+
27
+ /**
28
+ * An implementation of the `MutableRecordSource` interface (defined in
29
+ * `RelayStoreTypes`) that holds all records in memory (JS Map).
30
+ */
31
+ class RelayRecordSource implements MutableRecordSource {
32
+ _records: Map<DataID, ?Record>;
33
+
34
+ constructor(records?: RecordObjectMap) {
35
+ this._records = new Map();
36
+ if (records != null) {
37
+ Object.keys(records).forEach(key => {
38
+ this._records.set(key, records[key]);
39
+ });
40
+ }
22
41
  }
23
42
 
24
43
  static create(records?: RecordObjectMap): MutableRecordSource {
25
- return new RelayRecordSourceMapImpl(records);
44
+ return new RelayRecordSource(records);
45
+ }
46
+
47
+ clear(): void {
48
+ this._records = new Map();
49
+ }
50
+
51
+ delete(dataID: DataID): void {
52
+ this._records.set(dataID, null);
53
+ }
54
+
55
+ get(dataID: DataID): ?Record {
56
+ return this._records.get(dataID);
57
+ }
58
+
59
+ getRecordIDs(): Array<DataID> {
60
+ return Array.from(this._records.keys());
61
+ }
62
+
63
+ getStatus(dataID: DataID): RecordState {
64
+ if (!this._records.has(dataID)) {
65
+ return UNKNOWN;
66
+ }
67
+ return this._records.get(dataID) == null ? NONEXISTENT : EXISTENT;
68
+ }
69
+
70
+ has(dataID: DataID): boolean {
71
+ return this._records.has(dataID);
72
+ }
73
+
74
+ remove(dataID: DataID): void {
75
+ this._records.delete(dataID);
76
+ }
77
+
78
+ set(dataID: DataID, record: Record): void {
79
+ this._records.set(dataID, record);
80
+ }
81
+
82
+ size(): number {
83
+ return this._records.size;
84
+ }
85
+
86
+ toJSON(): {[DataID]: ?Record, ...} {
87
+ const obj = {};
88
+ for (const [key, value] of this._records) {
89
+ obj[key] = value;
90
+ }
91
+ return obj;
26
92
  }
27
93
  }
28
94
 
@@ -12,18 +12,6 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- const RelayConcreteNode = require('../util/RelayConcreteNode');
16
- const RelayFeatureFlags = require('../util/RelayFeatureFlags');
17
- const RelayModernRecord = require('./RelayModernRecord');
18
- const RelayStoreReactFlightUtils = require('./RelayStoreReactFlightUtils');
19
- const RelayStoreUtils = require('./RelayStoreUtils');
20
-
21
- const cloneRelayHandleSourceField = require('./cloneRelayHandleSourceField');
22
- const getOperation = require('../util/getOperation');
23
- const invariant = require('invariant');
24
-
25
- const {generateTypeID} = require('./TypeID');
26
-
27
15
  import type {
28
16
  NormalizationFlightField,
29
17
  NormalizationLinkedField,
@@ -36,12 +24,24 @@ import type {
36
24
  DataIDSet,
37
25
  NormalizationSelector,
38
26
  OperationLoader,
27
+ ReactFlightReachableExecutableDefinitions,
39
28
  Record,
40
29
  RecordSource,
41
- ReactFlightReachableExecutableDefinitions,
42
30
  } from './RelayStoreTypes';
43
31
 
32
+ const getOperation = require('../util/getOperation');
33
+ const RelayConcreteNode = require('../util/RelayConcreteNode');
34
+ const RelayFeatureFlags = require('../util/RelayFeatureFlags');
35
+ const cloneRelayHandleSourceField = require('./cloneRelayHandleSourceField');
36
+ const {getLocalVariables} = require('./RelayConcreteVariables');
37
+ const RelayModernRecord = require('./RelayModernRecord');
38
+ const RelayStoreReactFlightUtils = require('./RelayStoreReactFlightUtils');
39
+ const RelayStoreUtils = require('./RelayStoreUtils');
40
+ const {generateTypeID} = require('./TypeID');
41
+ const invariant = require('invariant');
42
+
44
43
  const {
44
+ ACTOR_CHANGE,
45
45
  CONDITION,
46
46
  CLIENT_COMPONENT,
47
47
  CLIENT_EXTENSION,
@@ -125,7 +125,6 @@ class RelayReferenceMarker {
125
125
  'RelayReferenceMarker(): Undefined variable `%s`.',
126
126
  name,
127
127
  );
128
- // $FlowFixMe[cannot-write]
129
128
  return this._variables[name];
130
129
  }
131
130
 
@@ -136,6 +135,10 @@ class RelayReferenceMarker {
136
135
  selections.forEach(selection => {
137
136
  /* eslint-disable no-fallthrough */
138
137
  switch (selection.kind) {
138
+ case ACTOR_CHANGE:
139
+ // TODO: T89695151 Support multi-actor record sources in RelayReferenceMarker.js
140
+ this._traverseLink(selection.linkedField, record);
141
+ break;
139
142
  case LINKED_FIELD:
140
143
  if (selection.plural) {
141
144
  this._traversePluralLink(selection, record);
@@ -144,7 +147,9 @@ class RelayReferenceMarker {
144
147
  }
145
148
  break;
146
149
  case CONDITION:
147
- const conditionValue = this._getVariableValue(selection.condition);
150
+ const conditionValue = Boolean(
151
+ this._getVariableValue(selection.condition),
152
+ );
148
153
  if (conditionValue === selection.passingValue) {
149
154
  this._traverseSelections(selection.selections, record);
150
155
  }
@@ -155,18 +160,22 @@ class RelayReferenceMarker {
155
160
  if (typeName != null && typeName === selection.type) {
156
161
  this._traverseSelections(selection.selections, record);
157
162
  }
158
- } else if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
163
+ } else {
159
164
  const typeName = RelayModernRecord.getType(record);
160
165
  const typeID = generateTypeID(typeName);
161
166
  this._references.add(typeID);
162
167
  this._traverseSelections(selection.selections, record);
163
- } else {
164
- this._traverseSelections(selection.selections, record);
165
168
  }
166
169
  break;
167
- // $FlowFixMe[incompatible-type]
168
170
  case FRAGMENT_SPREAD:
171
+ const prevVariables = this._variables;
172
+ this._variables = getLocalVariables(
173
+ this._variables,
174
+ selection.fragment.argumentDefinitions,
175
+ selection.args,
176
+ );
169
177
  this._traverseSelections(selection.fragment.selections, record);
178
+ this._variables = prevVariables;
170
179
  break;
171
180
  case LINKED_HANDLE:
172
181
  // The selections for a "handle" field are the same as those of the
@@ -197,11 +206,9 @@ class RelayReferenceMarker {
197
206
  case SCALAR_HANDLE:
198
207
  break;
199
208
  case TYPE_DISCRIMINATOR: {
200
- if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
201
- const typeName = RelayModernRecord.getType(record);
202
- const typeID = generateTypeID(typeName);
203
- this._references.add(typeID);
204
- }
209
+ const typeName = RelayModernRecord.getType(record);
210
+ const typeID = generateTypeID(typeName);
211
+ this._references.add(typeID);
205
212
  break;
206
213
  }
207
214
  case MODULE_IMPORT:
@@ -253,8 +260,15 @@ class RelayReferenceMarker {
253
260
  }
254
261
  const normalizationRootNode = operationLoader.get(operationReference);
255
262
  if (normalizationRootNode != null) {
256
- const selections = getOperation(normalizationRootNode).selections;
257
- this._traverseSelections(selections, record);
263
+ const operation = getOperation(normalizationRootNode);
264
+ const prevVariables = this._variables;
265
+ this._variables = getLocalVariables(
266
+ this._variables,
267
+ operation.argumentDefinitions,
268
+ moduleImport.args,
269
+ );
270
+ this._traverseSelections(operation.selections, record);
271
+ this._variables = prevVariables;
258
272
  }
259
273
  // Otherwise, if the operation is not available, we assume that the data
260
274
  // cannot have been processed yet and therefore isn't in the store to