relay-runtime 8.0.0 → 10.0.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 (135) hide show
  1. package/handlers/RelayDefaultHandlerProvider.js.flow +41 -0
  2. package/handlers/connection/ConnectionHandler.js.flow +549 -0
  3. package/handlers/connection/ConnectionInterface.js.flow +92 -0
  4. package/handlers/connection/MutationHandlers.js.flow +88 -0
  5. package/index.js +1 -1
  6. package/index.js.flow +320 -0
  7. package/lib/handlers/RelayDefaultHandlerProvider.js +13 -2
  8. package/lib/handlers/connection/{RelayConnectionHandler.js → ConnectionHandler.js} +33 -35
  9. package/lib/handlers/connection/{RelayConnectionInterface.js → ConnectionInterface.js} +2 -2
  10. package/lib/handlers/connection/MutationHandlers.js +86 -0
  11. package/lib/index.js +15 -19
  12. package/lib/mutations/RelayDeclarativeMutationConfig.js +29 -52
  13. package/lib/mutations/RelayRecordProxy.js +1 -3
  14. package/lib/mutations/RelayRecordSourceMutator.js +2 -9
  15. package/lib/mutations/RelayRecordSourceProxy.js +2 -4
  16. package/lib/mutations/RelayRecordSourceSelectorProxy.js +1 -13
  17. package/lib/mutations/commitMutation.js +13 -3
  18. package/lib/mutations/validateMutation.js +16 -9
  19. package/lib/network/RelayObservable.js +9 -9
  20. package/lib/network/RelayQueryResponseCache.js +8 -6
  21. package/lib/query/PreloadableQueryRegistry.js +70 -0
  22. package/lib/query/fetchQueryInternal.js +31 -23
  23. package/lib/store/DataChecker.js +122 -110
  24. package/lib/store/RelayConcreteVariables.js +6 -2
  25. package/lib/store/RelayModernEnvironment.js +121 -67
  26. package/lib/store/RelayModernFragmentSpecResolver.js +12 -16
  27. package/lib/store/RelayModernQueryExecutor.js +389 -314
  28. package/lib/store/RelayModernRecord.js +14 -9
  29. package/lib/store/RelayModernSelector.js +7 -3
  30. package/lib/store/RelayModernStore.js +289 -484
  31. package/lib/store/RelayOperationTracker.js +35 -78
  32. package/lib/store/RelayOptimisticRecordSource.js +7 -5
  33. package/lib/store/RelayPublishQueue.js +6 -33
  34. package/lib/store/RelayReader.js +113 -45
  35. package/lib/store/RelayRecordSource.js +2 -9
  36. package/lib/store/RelayRecordSourceMapImpl.js +13 -18
  37. package/lib/store/RelayReferenceMarker.js +40 -60
  38. package/lib/store/RelayResponseNormalizer.js +158 -193
  39. package/lib/store/RelayStoreUtils.js +1 -0
  40. package/lib/store/StoreInspector.js +8 -8
  41. package/lib/store/TypeID.js +28 -0
  42. package/lib/store/cloneRelayScalarHandleSourceField.js +44 -0
  43. package/lib/store/normalizeRelayPayload.js +6 -2
  44. package/lib/store/readInlineData.js +1 -1
  45. package/lib/subscription/requestSubscription.js +5 -3
  46. package/lib/util/RelayConcreteNode.js +9 -6
  47. package/lib/util/RelayError.js +39 -9
  48. package/lib/util/RelayFeatureFlags.js +2 -5
  49. package/lib/util/RelayReplaySubject.js +3 -3
  50. package/lib/util/createPayloadFor3DField.js +7 -2
  51. package/lib/util/getRequestIdentifier.js +2 -2
  52. package/lib/util/recycleNodesInto.js +2 -6
  53. package/mutations/RelayDeclarativeMutationConfig.js.flow +380 -0
  54. package/mutations/RelayRecordProxy.js.flow +165 -0
  55. package/mutations/RelayRecordSourceMutator.js.flow +238 -0
  56. package/mutations/RelayRecordSourceProxy.js.flow +164 -0
  57. package/mutations/RelayRecordSourceSelectorProxy.js.flow +119 -0
  58. package/mutations/applyOptimisticMutation.js.flow +76 -0
  59. package/mutations/commitLocalUpdate.js.flow +24 -0
  60. package/mutations/commitMutation.js.flow +182 -0
  61. package/mutations/validateMutation.js.flow +213 -0
  62. package/network/ConvertToExecuteFunction.js.flow +49 -0
  63. package/network/RelayNetwork.js.flow +84 -0
  64. package/network/RelayNetworkTypes.js.flow +123 -0
  65. package/network/RelayObservable.js.flow +634 -0
  66. package/network/RelayQueryResponseCache.js.flow +111 -0
  67. package/package.json +1 -1
  68. package/query/GraphQLTag.js.flow +166 -0
  69. package/query/PreloadableQueryRegistry.js.flow +65 -0
  70. package/query/fetchQuery.js.flow +47 -0
  71. package/query/fetchQueryInternal.js.flow +348 -0
  72. package/relay-runtime.js +2 -2
  73. package/relay-runtime.min.js +2 -2
  74. package/store/ClientID.js.flow +43 -0
  75. package/store/DataChecker.js.flow +502 -0
  76. package/store/RelayConcreteVariables.js.flow +96 -0
  77. package/store/RelayModernEnvironment.js.flow +551 -0
  78. package/store/RelayModernFragmentSpecResolver.js.flow +426 -0
  79. package/store/RelayModernOperationDescriptor.js.flow +88 -0
  80. package/store/RelayModernQueryExecutor.js.flow +1321 -0
  81. package/store/RelayModernRecord.js.flow +403 -0
  82. package/store/RelayModernSelector.js.flow +455 -0
  83. package/store/RelayModernStore.js.flow +842 -0
  84. package/store/RelayOperationTracker.js.flow +164 -0
  85. package/store/RelayOptimisticRecordSource.js.flow +119 -0
  86. package/store/RelayPublishQueue.js.flow +401 -0
  87. package/store/RelayReader.js.flow +473 -0
  88. package/store/RelayRecordSource.js.flow +29 -0
  89. package/store/RelayRecordSourceMapImpl.js.flow +87 -0
  90. package/store/RelayRecordState.js.flow +37 -0
  91. package/store/RelayReferenceMarker.js.flow +257 -0
  92. package/store/RelayResponseNormalizer.js.flow +680 -0
  93. package/store/RelayStoreTypes.js.flow +899 -0
  94. package/store/RelayStoreUtils.js.flow +219 -0
  95. package/store/StoreInspector.js.flow +171 -0
  96. package/store/TypeID.js.flow +28 -0
  97. package/store/ViewerPattern.js.flow +26 -0
  98. package/store/cloneRelayHandleSourceField.js.flow +66 -0
  99. package/store/cloneRelayScalarHandleSourceField.js.flow +62 -0
  100. package/store/createFragmentSpecResolver.js.flow +55 -0
  101. package/store/createRelayContext.js.flow +44 -0
  102. package/store/defaultGetDataID.js.flow +27 -0
  103. package/store/hasOverlappingIDs.js.flow +34 -0
  104. package/store/isRelayModernEnvironment.js.flow +27 -0
  105. package/store/normalizeRelayPayload.js.flow +51 -0
  106. package/store/readInlineData.js.flow +75 -0
  107. package/subscription/requestSubscription.js.flow +100 -0
  108. package/util/JSResourceTypes.flow.js.flow +20 -0
  109. package/util/NormalizationNode.js.flow +198 -0
  110. package/util/ReaderNode.js.flow +208 -0
  111. package/util/RelayConcreteNode.js.flow +93 -0
  112. package/util/RelayDefaultHandleKey.js.flow +17 -0
  113. package/util/RelayError.js.flow +62 -0
  114. package/util/RelayFeatureFlags.js.flow +30 -0
  115. package/util/RelayProfiler.js.flow +284 -0
  116. package/util/RelayReplaySubject.js.flow +135 -0
  117. package/util/RelayRuntimeTypes.js.flow +72 -0
  118. package/util/createPayloadFor3DField.js.flow +43 -0
  119. package/util/deepFreeze.js.flow +36 -0
  120. package/util/generateID.js.flow +21 -0
  121. package/util/getFragmentIdentifier.js.flow +52 -0
  122. package/util/getRelayHandleKey.js.flow +41 -0
  123. package/util/getRequestIdentifier.js.flow +42 -0
  124. package/util/isPromise.js.flow +21 -0
  125. package/util/isScalarAndEqual.js.flow +26 -0
  126. package/util/recycleNodesInto.js.flow +76 -0
  127. package/util/resolveImmediate.js.flow +30 -0
  128. package/util/stableCopy.js.flow +35 -0
  129. package/lib/handlers/RelayDefaultMissingFieldHandlers.js +0 -26
  130. package/lib/handlers/getRelayDefaultMissingFieldHandlers.js +0 -36
  131. package/lib/query/RelayModernGraphQLTag.js +0 -104
  132. package/lib/store/RelayConnection.js +0 -37
  133. package/lib/store/RelayConnectionResolver.js +0 -178
  134. package/lib/store/RelayRecordSourceObjectImpl.js +0 -79
  135. package/lib/util/getFragmentSpecIdentifier.js +0 -27
@@ -0,0 +1,257 @@
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
+ * @flow strict-local
8
+ * @format
9
+ */
10
+
11
+ // flowlint ambiguous-object-type:error
12
+
13
+ 'use strict';
14
+
15
+ const RelayConcreteNode = require('../util/RelayConcreteNode');
16
+ const RelayFeatureFlags = require('../util/RelayFeatureFlags');
17
+ const RelayModernRecord = require('./RelayModernRecord');
18
+ const RelayStoreUtils = require('./RelayStoreUtils');
19
+
20
+ const cloneRelayHandleSourceField = require('./cloneRelayHandleSourceField');
21
+ const invariant = require('invariant');
22
+
23
+ const {generateTypeID} = require('./TypeID');
24
+
25
+ import type {
26
+ NormalizationLinkedField,
27
+ NormalizationModuleImport,
28
+ NormalizationNode,
29
+ NormalizationSelection,
30
+ } from '../util/NormalizationNode';
31
+ import type {DataID, Variables} from '../util/RelayRuntimeTypes';
32
+ import type {
33
+ NormalizationSelector,
34
+ OperationLoader,
35
+ Record,
36
+ RecordSource,
37
+ } from './RelayStoreTypes';
38
+
39
+ const {
40
+ CONDITION,
41
+ CLIENT_EXTENSION,
42
+ DEFER,
43
+ FRAGMENT_SPREAD,
44
+ INLINE_FRAGMENT,
45
+ LINKED_FIELD,
46
+ MODULE_IMPORT,
47
+ LINKED_HANDLE,
48
+ SCALAR_FIELD,
49
+ SCALAR_HANDLE,
50
+ STREAM,
51
+ TYPE_DISCRIMINATOR,
52
+ } = RelayConcreteNode;
53
+ const {getStorageKey, getModuleOperationKey} = RelayStoreUtils;
54
+
55
+ function mark(
56
+ recordSource: RecordSource,
57
+ selector: NormalizationSelector,
58
+ references: Set<DataID>,
59
+ operationLoader: ?OperationLoader,
60
+ ): void {
61
+ const {dataID, node, variables} = selector;
62
+ const marker = new RelayReferenceMarker(
63
+ recordSource,
64
+ variables,
65
+ references,
66
+ operationLoader,
67
+ );
68
+ marker.mark(node, dataID);
69
+ }
70
+
71
+ /**
72
+ * @private
73
+ */
74
+ class RelayReferenceMarker {
75
+ _operationLoader: OperationLoader | null;
76
+ _recordSource: RecordSource;
77
+ _references: Set<DataID>;
78
+ _variables: Variables;
79
+
80
+ constructor(
81
+ recordSource: RecordSource,
82
+ variables: Variables,
83
+ references: Set<DataID>,
84
+ operationLoader: ?OperationLoader,
85
+ ) {
86
+ this._operationLoader = operationLoader ?? null;
87
+ this._recordSource = recordSource;
88
+ this._references = references;
89
+ this._variables = variables;
90
+ }
91
+
92
+ mark(node: NormalizationNode, dataID: DataID): void {
93
+ this._traverse(node, dataID);
94
+ }
95
+
96
+ _traverse(node: NormalizationNode, dataID: DataID): void {
97
+ this._references.add(dataID);
98
+ const record = this._recordSource.get(dataID);
99
+ if (record == null) {
100
+ return;
101
+ }
102
+ this._traverseSelections(node.selections, record);
103
+ }
104
+
105
+ _getVariableValue(name: string): mixed {
106
+ invariant(
107
+ this._variables.hasOwnProperty(name),
108
+ 'RelayReferenceMarker(): Undefined variable `%s`.',
109
+ name,
110
+ );
111
+ return this._variables[name];
112
+ }
113
+
114
+ _traverseSelections(
115
+ selections: $ReadOnlyArray<NormalizationSelection>,
116
+ record: Record,
117
+ ): void {
118
+ selections.forEach(selection => {
119
+ /* eslint-disable no-fallthrough */
120
+ switch (selection.kind) {
121
+ case LINKED_FIELD:
122
+ if (selection.plural) {
123
+ this._traversePluralLink(selection, record);
124
+ } else {
125
+ this._traverseLink(selection, record);
126
+ }
127
+ break;
128
+ case CONDITION:
129
+ const conditionValue = this._getVariableValue(selection.condition);
130
+ if (conditionValue === selection.passingValue) {
131
+ this._traverseSelections(selection.selections, record);
132
+ }
133
+ break;
134
+ case INLINE_FRAGMENT:
135
+ if (selection.abstractKey == null) {
136
+ const typeName = RelayModernRecord.getType(record);
137
+ if (typeName != null && typeName === selection.type) {
138
+ this._traverseSelections(selection.selections, record);
139
+ }
140
+ } else if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
141
+ const typeName = RelayModernRecord.getType(record);
142
+ const typeID = generateTypeID(typeName);
143
+ this._references.add(typeID);
144
+ this._traverseSelections(selection.selections, record);
145
+ } else {
146
+ this._traverseSelections(selection.selections, record);
147
+ }
148
+ break;
149
+ case FRAGMENT_SPREAD:
150
+ invariant(
151
+ false,
152
+ 'RelayReferenceMarker(): Unexpected fragment spread `...%s`, ' +
153
+ 'expected all fragments to be inlined.',
154
+ selection.name,
155
+ );
156
+ case LINKED_HANDLE:
157
+ // The selections for a "handle" field are the same as those of the
158
+ // original linked field where the handle was applied. Reference marking
159
+ // therefore requires traversing the original field selections against
160
+ // the synthesized client field.
161
+ //
162
+ // TODO: Instead of finding the source field in `selections`, change
163
+ // the concrete structure to allow shared subtrees, and have the linked
164
+ // handle directly refer to the same selections as the LinkedField that
165
+ // it was split from.
166
+ const handleField = cloneRelayHandleSourceField(
167
+ selection,
168
+ selections,
169
+ this._variables,
170
+ );
171
+ if (handleField.plural) {
172
+ this._traversePluralLink(handleField, record);
173
+ } else {
174
+ this._traverseLink(handleField, record);
175
+ }
176
+ break;
177
+ case DEFER:
178
+ case STREAM:
179
+ this._traverseSelections(selection.selections, record);
180
+ break;
181
+ case SCALAR_FIELD:
182
+ case SCALAR_HANDLE:
183
+ break;
184
+ case TYPE_DISCRIMINATOR: {
185
+ if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
186
+ const typeName = RelayModernRecord.getType(record);
187
+ const typeID = generateTypeID(typeName);
188
+ this._references.add(typeID);
189
+ }
190
+ break;
191
+ }
192
+ case MODULE_IMPORT:
193
+ this._traverseModuleImport(selection, record);
194
+ break;
195
+ case CLIENT_EXTENSION:
196
+ this._traverseSelections(selection.selections, record);
197
+ break;
198
+ default:
199
+ (selection: empty);
200
+ invariant(
201
+ false,
202
+ 'RelayReferenceMarker: Unknown AST node `%s`.',
203
+ selection,
204
+ );
205
+ }
206
+ });
207
+ }
208
+
209
+ _traverseModuleImport(
210
+ moduleImport: NormalizationModuleImport,
211
+ record: Record,
212
+ ): void {
213
+ const operationLoader = this._operationLoader;
214
+ invariant(
215
+ operationLoader !== null,
216
+ 'RelayReferenceMarker: Expected an operationLoader to be configured when using `@module`.',
217
+ );
218
+ const operationKey = getModuleOperationKey(moduleImport.documentName);
219
+ const operationReference = RelayModernRecord.getValue(record, operationKey);
220
+ if (operationReference == null) {
221
+ return;
222
+ }
223
+ const operation = operationLoader.get(operationReference);
224
+ if (operation != null) {
225
+ this._traverseSelections(operation.selections, record);
226
+ }
227
+ // Otherwise, if the operation is not available, we assume that the data
228
+ // cannot have been processed yet and therefore isn't in the store to
229
+ // begin with.
230
+ }
231
+
232
+ _traverseLink(field: NormalizationLinkedField, record: Record): void {
233
+ const storageKey = getStorageKey(field, this._variables);
234
+ const linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
235
+
236
+ if (linkedID == null) {
237
+ return;
238
+ }
239
+ this._traverse(field, linkedID);
240
+ }
241
+
242
+ _traversePluralLink(field: NormalizationLinkedField, record: Record): void {
243
+ const storageKey = getStorageKey(field, this._variables);
244
+ const linkedIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
245
+
246
+ if (linkedIDs == null) {
247
+ return;
248
+ }
249
+ linkedIDs.forEach(linkedID => {
250
+ if (linkedID != null) {
251
+ this._traverse(field, linkedID);
252
+ }
253
+ });
254
+ }
255
+ }
256
+
257
+ module.exports = {mark};