relay-runtime 13.0.0-rc.2 → 13.0.3
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.
- package/LICENSE +1 -1
- package/README.md +1 -4
- package/index.js +2 -2
- package/index.js.flow +4 -0
- package/lib/index.js +7 -1
- package/lib/mutations/readUpdatableQuery_EXPERIMENTAL.js +22 -17
- package/lib/mutations/validateMutation.js +11 -1
- package/lib/network/RelayNetwork.js +7 -3
- package/lib/query/fetchQuery.js +3 -0
- package/lib/store/RelayConcreteVariables.js +12 -3
- package/lib/store/RelayExperimentalGraphResponseTransform.js +34 -2
- package/lib/store/RelayModernOperationDescriptor.js +1 -1
- package/lib/store/RelayPublishQueue.js +4 -2
- package/lib/store/RelayReader.js +55 -13
- package/lib/store/RelayStoreUtils.js +1 -0
- package/lib/store/ResolverCache.js +10 -2
- package/lib/store/ResolverFragments.js +2 -2
- package/lib/subscription/requestSubscription.js +0 -2
- package/lib/util/withProvidedVariables.js +49 -0
- package/mutations/RelayDeclarativeMutationConfig.js.flow +0 -1
- package/mutations/commitMutation.js.flow +8 -19
- package/mutations/readUpdatableQuery_EXPERIMENTAL.js.flow +47 -49
- package/mutations/validateMutation.js.flow +14 -2
- package/network/RelayNetwork.js.flow +10 -3
- package/network/RelayNetworkTypes.js.flow +1 -1
- package/package.json +6 -2
- package/query/fetchQuery.js.flow +9 -7
- package/relay-runtime.js +2 -2
- package/relay-runtime.min.js +3 -3
- package/store/RelayConcreteVariables.js.flow +12 -2
- package/store/RelayExperimentalGraphResponseTransform.js.flow +35 -1
- package/store/RelayModernOperationDescriptor.js.flow +5 -1
- package/store/RelayModernStore.js.flow +0 -1
- package/store/RelayPublishQueue.js.flow +8 -1
- package/store/RelayReader.js.flow +78 -31
- package/store/RelayStoreTypes.js.flow +3 -2
- package/store/RelayStoreUtils.js.flow +1 -0
- package/store/ResolverCache.js.flow +18 -5
- package/store/ResolverFragments.js.flow +2 -2
- package/subscription/requestSubscription.js.flow +7 -13
- package/util/NormalizationNode.js.flow +16 -16
- package/util/ReaderNode.js.flow +15 -15
- package/util/RelayConcreteNode.js.flow +4 -2
- package/util/withProvidedVariables.js.flow +64 -0
- package/lib/util/getAllRootVariables.js +0 -29
- package/util/getAllRootVariables.js.flow +0 -36
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
3
|
+
Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
Relay Runtime
|
|
2
|
-
---
|
|
1
|
+
## Relay Runtime
|
|
3
2
|
|
|
4
3
|
A set of Relay APIs responsible for data fetching, reading and normalization of
|
|
5
4
|
the GraphQL data.
|
|
@@ -7,7 +6,6 @@ the GraphQL data.
|
|
|
7
6
|
Example:
|
|
8
7
|
|
|
9
8
|
```js
|
|
10
|
-
|
|
11
9
|
// @flow strict-local
|
|
12
10
|
|
|
13
11
|
import type {FetchFunction} from 'relay-runtime';
|
|
@@ -61,7 +59,6 @@ fetchQuery(
|
|
|
61
59
|
console.log(data);
|
|
62
60
|
},
|
|
63
61
|
});
|
|
64
|
-
|
|
65
62
|
```
|
|
66
63
|
|
|
67
64
|
For complete API reference, visit https://relay.dev/.
|
package/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Relay v13.0.
|
|
2
|
+
* Relay v13.0.3
|
|
3
3
|
*
|
|
4
|
-
* Copyright (c)
|
|
4
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
5
5
|
*
|
|
6
6
|
* This source code is licensed under the MIT license found in the
|
|
7
7
|
* LICENSE file in the root directory of this source tree.
|
package/index.js.flow
CHANGED
|
@@ -46,6 +46,7 @@ const RelayModernStore = require('./store/RelayModernStore');
|
|
|
46
46
|
const RelayOperationTracker = require('./store/RelayOperationTracker');
|
|
47
47
|
const RelayRecordSource = require('./store/RelayRecordSource');
|
|
48
48
|
const RelayStoreUtils = require('./store/RelayStoreUtils');
|
|
49
|
+
const ResolverFragments = require('./store/ResolverFragments');
|
|
49
50
|
const ViewerPattern = require('./store/ViewerPattern');
|
|
50
51
|
const requestSubscription = require('./subscription/requestSubscription');
|
|
51
52
|
const createPayloadFor3DField = require('./util/createPayloadFor3DField');
|
|
@@ -69,6 +70,7 @@ const RelayProfiler = require('./util/RelayProfiler');
|
|
|
69
70
|
const RelayReplaySubject = require('./util/RelayReplaySubject');
|
|
70
71
|
const reportMissingRequiredFields = require('./util/reportMissingRequiredFields');
|
|
71
72
|
const stableCopy = require('./util/stableCopy');
|
|
73
|
+
const withProvidedVariables = require('./util/withProvidedVariables');
|
|
72
74
|
|
|
73
75
|
export type {ConnectionMetadata} from './handlers/connection/ConnectionHandler';
|
|
74
76
|
export type {
|
|
@@ -352,6 +354,7 @@ module.exports = {
|
|
|
352
354
|
getPendingOperationsForFragment: getPendingOperationsForFragment,
|
|
353
355
|
getValueAtPath: getValueAtPath,
|
|
354
356
|
__internal: {
|
|
357
|
+
ResolverFragments,
|
|
355
358
|
OperationTracker: RelayOperationTracker,
|
|
356
359
|
createRelayContext: createRelayContext,
|
|
357
360
|
getOperationVariables: RelayConcreteVariables.getOperationVariables,
|
|
@@ -360,5 +363,6 @@ module.exports = {
|
|
|
360
363
|
getPromiseForActiveRequest: fetchQueryInternal.getPromiseForActiveRequest,
|
|
361
364
|
getObservableForActiveRequest:
|
|
362
365
|
fetchQueryInternal.getObservableForActiveRequest,
|
|
366
|
+
withProvidedVariables: withProvidedVariables,
|
|
363
367
|
},
|
|
364
368
|
};
|
package/lib/index.js
CHANGED
|
@@ -73,6 +73,8 @@ var RelayRecordSource = require('./store/RelayRecordSource');
|
|
|
73
73
|
|
|
74
74
|
var RelayStoreUtils = require('./store/RelayStoreUtils');
|
|
75
75
|
|
|
76
|
+
var ResolverFragments = require('./store/ResolverFragments');
|
|
77
|
+
|
|
76
78
|
var ViewerPattern = require('./store/ViewerPattern');
|
|
77
79
|
|
|
78
80
|
var requestSubscription = require('./subscription/requestSubscription');
|
|
@@ -119,6 +121,8 @@ var reportMissingRequiredFields = require('./util/reportMissingRequiredFields');
|
|
|
119
121
|
|
|
120
122
|
var stableCopy = require('./util/stableCopy');
|
|
121
123
|
|
|
124
|
+
var withProvidedVariables = require('./util/withProvidedVariables');
|
|
125
|
+
|
|
122
126
|
// As early as possible, check for the existence of the JavaScript globals which
|
|
123
127
|
// Relay Runtime relies upon, and produce a clear message if they do not exist.
|
|
124
128
|
if (process.env.NODE_ENV !== "production") {
|
|
@@ -230,12 +234,14 @@ module.exports = {
|
|
|
230
234
|
getPendingOperationsForFragment: getPendingOperationsForFragment,
|
|
231
235
|
getValueAtPath: getValueAtPath,
|
|
232
236
|
__internal: {
|
|
237
|
+
ResolverFragments: ResolverFragments,
|
|
233
238
|
OperationTracker: RelayOperationTracker,
|
|
234
239
|
createRelayContext: createRelayContext,
|
|
235
240
|
getOperationVariables: RelayConcreteVariables.getOperationVariables,
|
|
236
241
|
fetchQuery: fetchQueryInternal.fetchQuery,
|
|
237
242
|
fetchQueryDeduped: fetchQueryInternal.fetchQueryDeduped,
|
|
238
243
|
getPromiseForActiveRequest: fetchQueryInternal.getPromiseForActiveRequest,
|
|
239
|
-
getObservableForActiveRequest: fetchQueryInternal.getObservableForActiveRequest
|
|
244
|
+
getObservableForActiveRequest: fetchQueryInternal.getObservableForActiveRequest,
|
|
245
|
+
withProvidedVariables: withProvidedVariables
|
|
240
246
|
}
|
|
241
247
|
};
|
|
@@ -21,7 +21,7 @@ var _require = require('../query/GraphQLTag'),
|
|
|
21
21
|
var _require2 = require('../store/RelayStoreUtils'),
|
|
22
22
|
getArgumentValues = _require2.getArgumentValues;
|
|
23
23
|
|
|
24
|
-
var nonUpdatableKeys = ['id', '__id', '__typename'];
|
|
24
|
+
var nonUpdatableKeys = ['id', '__id', '__typename', 'js'];
|
|
25
25
|
|
|
26
26
|
function readUpdatableQuery_EXPERIMENTAL(query, variables, proxy) {
|
|
27
27
|
// TODO assert that the concrete request is an updatable query
|
|
@@ -37,7 +37,7 @@ function readUpdatableQuery_EXPERIMENTAL(query, variables, proxy) {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
function updateProxyFromSelections(mutableUpdatableProxy, recordProxy, queryVariables, selections, root) {
|
|
40
|
-
var _selection$
|
|
40
|
+
var _selection$alias3;
|
|
41
41
|
|
|
42
42
|
var _iterator = (0, _createForOfIteratorHelper2["default"])(selections),
|
|
43
43
|
_step;
|
|
@@ -48,21 +48,23 @@ function updateProxyFromSelections(mutableUpdatableProxy, recordProxy, queryVari
|
|
|
48
48
|
|
|
49
49
|
switch (selection.kind) {
|
|
50
50
|
case 'LinkedField':
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
51
|
+
if (selection.plural) {
|
|
52
|
+
Object.defineProperty(mutableUpdatableProxy, (_selection$alias = selection.alias) !== null && _selection$alias !== void 0 ? _selection$alias : selection.name, {
|
|
53
|
+
// $FlowFixMe[incompatible-call] these getters and setters have different types on purpose
|
|
54
|
+
get: createGetterForPluralLinkedField(selection, queryVariables, recordProxy, root),
|
|
55
|
+
set: createSetterForPluralLinkedField(selection, queryVariables, recordProxy, root)
|
|
56
|
+
});
|
|
57
|
+
} else {
|
|
58
|
+
Object.defineProperty(mutableUpdatableProxy, (_selection$alias2 = selection.alias) !== null && _selection$alias2 !== void 0 ? _selection$alias2 : selection.name, {
|
|
59
|
+
get: createGetterForSingularLinkedField(selection, queryVariables, recordProxy, root),
|
|
60
|
+
set: createSetterForSingularLinkedField(selection, queryVariables, recordProxy, root)
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
62
64
|
break;
|
|
63
65
|
|
|
64
66
|
case 'ScalarField':
|
|
65
|
-
var scalarFieldName = (_selection$
|
|
67
|
+
var scalarFieldName = (_selection$alias3 = selection.alias) !== null && _selection$alias3 !== void 0 ? _selection$alias3 : selection.name;
|
|
66
68
|
Object.defineProperty(mutableUpdatableProxy, scalarFieldName, {
|
|
67
69
|
get: function get() {
|
|
68
70
|
var _selection$args;
|
|
@@ -106,6 +108,10 @@ function updateProxyFromSelections(mutableUpdatableProxy, recordProxy, queryVari
|
|
|
106
108
|
};
|
|
107
109
|
|
|
108
110
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
111
|
+
var _selection$alias;
|
|
112
|
+
|
|
113
|
+
var _selection$alias2;
|
|
114
|
+
|
|
109
115
|
_loop();
|
|
110
116
|
}
|
|
111
117
|
} catch (err) {
|
|
@@ -122,8 +128,7 @@ function createSetterForPluralLinkedField(selection, queryVariables, recordProxy
|
|
|
122
128
|
var variables = getArgumentValues((_selection$args3 = selection.args) !== null && _selection$args3 !== void 0 ? _selection$args3 : [], queryVariables);
|
|
123
129
|
|
|
124
130
|
if (newValue == null) {
|
|
125
|
-
|
|
126
|
-
recordProxy.setValue(null, selection.name, variables);
|
|
131
|
+
throw new Error('Do not assign null to plural linked fields; assign an empty array instead.');
|
|
127
132
|
} else {
|
|
128
133
|
var recordProxies = newValue.map(function (item) {
|
|
129
134
|
if (item == null) {
|
|
@@ -158,7 +163,7 @@ function createSetterForSingularLinkedField(selection, queryVariables, recordPro
|
|
|
158
163
|
|
|
159
164
|
if (newValue == null) {
|
|
160
165
|
// $FlowFixMe[unclear-type] No good way to type these variables
|
|
161
|
-
recordProxy.setValue(
|
|
166
|
+
recordProxy.setValue(newValue, selection.name, variables);
|
|
162
167
|
} else {
|
|
163
168
|
var __id = newValue.__id;
|
|
164
169
|
|
|
@@ -98,6 +98,7 @@ if (process.env.NODE_ENV !== "production") {
|
|
|
98
98
|
case INLINE_FRAGMENT:
|
|
99
99
|
var type = selection.type;
|
|
100
100
|
var isConcreteType = selection.abstractKey == null;
|
|
101
|
+
validateAbstractKey(context, selection.abstractKey);
|
|
101
102
|
selection.selections.forEach(function (subselection) {
|
|
102
103
|
if (isConcreteType && optimisticResponse.__typename !== type) {
|
|
103
104
|
return;
|
|
@@ -116,11 +117,13 @@ if (process.env.NODE_ENV !== "production") {
|
|
|
116
117
|
case MODULE_IMPORT:
|
|
117
118
|
return validateModuleImport(context);
|
|
118
119
|
|
|
120
|
+
case TYPE_DISCRIMINATOR:
|
|
121
|
+
return validateAbstractKey(context, selection.abstractKey);
|
|
122
|
+
|
|
119
123
|
case LINKED_HANDLE:
|
|
120
124
|
case SCALAR_HANDLE:
|
|
121
125
|
case DEFER:
|
|
122
126
|
case STREAM:
|
|
123
|
-
case TYPE_DISCRIMINATOR:
|
|
124
127
|
{
|
|
125
128
|
// TODO(T35864292) - Add missing validations for these types
|
|
126
129
|
return;
|
|
@@ -136,6 +139,13 @@ if (process.env.NODE_ENV !== "production") {
|
|
|
136
139
|
context.moduleImportPaths.add(context.path);
|
|
137
140
|
};
|
|
138
141
|
|
|
142
|
+
var validateAbstractKey = function validateAbstractKey(context, abstractKey) {
|
|
143
|
+
if (abstractKey != null) {
|
|
144
|
+
var path = "".concat(context.path, ".").concat(abstractKey);
|
|
145
|
+
context.visitedPaths.add(path);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
|
|
139
149
|
var validateField = function validateField(optimisticResponse, field, context) {
|
|
140
150
|
var fieldName = field.alias || field.name;
|
|
141
151
|
var path = "".concat(context.path, ".").concat(fieldName);
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
+
var withProvidedVariables = require('../util/withProvidedVariables');
|
|
14
|
+
|
|
13
15
|
var _require = require('./ConvertToExecuteFunction'),
|
|
14
16
|
convertFetch = _require.convertFetch;
|
|
15
17
|
|
|
@@ -25,22 +27,24 @@ function create(fetchFn, subscribe) {
|
|
|
25
27
|
var observeFetch = convertFetch(fetchFn);
|
|
26
28
|
|
|
27
29
|
function execute(request, variables, cacheConfig, uploadables, logRequestInfo) {
|
|
30
|
+
var operationVariables = withProvidedVariables(variables, request.providedVariables);
|
|
31
|
+
|
|
28
32
|
if (request.operationKind === 'subscription') {
|
|
29
33
|
!subscribe ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayNetwork: This network layer does not support Subscriptions. ' + 'To use Subscriptions, provide a custom network layer.') : invariant(false) : void 0;
|
|
30
34
|
!!uploadables ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayNetwork: Cannot provide uploadables while subscribing.') : invariant(false) : void 0;
|
|
31
|
-
return subscribe(request,
|
|
35
|
+
return subscribe(request, operationVariables, cacheConfig);
|
|
32
36
|
}
|
|
33
37
|
|
|
34
38
|
var pollInterval = cacheConfig.poll;
|
|
35
39
|
|
|
36
40
|
if (pollInterval != null) {
|
|
37
41
|
!!uploadables ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayNetwork: Cannot provide uploadables while polling.') : invariant(false) : void 0;
|
|
38
|
-
return observeFetch(request,
|
|
42
|
+
return observeFetch(request, operationVariables, {
|
|
39
43
|
force: true
|
|
40
44
|
}).poll(pollInterval);
|
|
41
45
|
}
|
|
42
46
|
|
|
43
|
-
return observeFetch(request,
|
|
47
|
+
return observeFetch(request, operationVariables, cacheConfig, uploadables, logRequestInfo);
|
|
44
48
|
}
|
|
45
49
|
|
|
46
50
|
return {
|
package/lib/query/fetchQuery.js
CHANGED
|
@@ -122,6 +122,9 @@ function fetchQuery(environment, query, variables, options) {
|
|
|
122
122
|
if (snapshot.missingRequiredFields != null) {
|
|
123
123
|
reportMissingRequiredFields(environment, snapshot.missingRequiredFields);
|
|
124
124
|
}
|
|
125
|
+
/* $FlowFixMe[incompatible-return] we assume readData returns the right
|
|
126
|
+
* data just having written it from network or checked availability. */
|
|
127
|
+
|
|
125
128
|
|
|
126
129
|
return snapshot.data;
|
|
127
130
|
}
|
|
@@ -68,13 +68,15 @@ function getFragmentVariables(fragment, rootVariables, argumentVariables) {
|
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
70
70
|
* Determines the variables that are in scope for a given operation given values
|
|
71
|
-
* for some/all of its arguments.
|
|
72
|
-
*
|
|
71
|
+
* for some/all of its arguments.
|
|
72
|
+
* - extraneous input variables are filtered from the output
|
|
73
|
+
* - missing variables are set to default values (if given in the
|
|
73
74
|
* operation's definition).
|
|
75
|
+
* - variables with provider modules are added
|
|
74
76
|
*/
|
|
75
77
|
|
|
76
78
|
|
|
77
|
-
function getOperationVariables(operation, variables) {
|
|
79
|
+
function getOperationVariables(operation, providedVariables, variables) {
|
|
78
80
|
var operationVariables = {};
|
|
79
81
|
operation.argumentDefinitions.forEach(function (def) {
|
|
80
82
|
var value = def.defaultValue;
|
|
@@ -85,6 +87,13 @@ function getOperationVariables(operation, variables) {
|
|
|
85
87
|
|
|
86
88
|
operationVariables[def.name] = value;
|
|
87
89
|
});
|
|
90
|
+
|
|
91
|
+
if (providedVariables != null) {
|
|
92
|
+
Object.keys(providedVariables).forEach(function (varName) {
|
|
93
|
+
operationVariables[varName] = providedVariables[varName].get();
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
88
97
|
return operationVariables;
|
|
89
98
|
}
|
|
90
99
|
|
|
@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
8
|
exports.normalizeResponse = normalizeResponse;
|
|
9
|
+
exports.normalizeResponseWithMetadata = normalizeResponseWithMetadata;
|
|
10
|
+
exports.GraphModeNormalizer = void 0;
|
|
9
11
|
|
|
10
12
|
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
|
|
11
13
|
|
|
@@ -30,7 +32,9 @@ var _require = require('../util/RelayConcreteNode'),
|
|
|
30
32
|
FRAGMENT_SPREAD = _require.FRAGMENT_SPREAD,
|
|
31
33
|
INLINE_FRAGMENT = _require.INLINE_FRAGMENT,
|
|
32
34
|
LINKED_FIELD = _require.LINKED_FIELD,
|
|
33
|
-
|
|
35
|
+
LINKED_HANDLE = _require.LINKED_HANDLE,
|
|
36
|
+
SCALAR_FIELD = _require.SCALAR_FIELD,
|
|
37
|
+
SCALAR_HANDLE = _require.SCALAR_HANDLE;
|
|
34
38
|
|
|
35
39
|
var _require2 = require('./RelayConcreteVariables'),
|
|
36
40
|
getLocalVariables = _require2.getLocalVariables;
|
|
@@ -96,6 +100,17 @@ function normalizeResponse(response, selector, options) {
|
|
|
96
100
|
return normalizer.normalizeResponse(node, dataID, response);
|
|
97
101
|
}
|
|
98
102
|
|
|
103
|
+
function normalizeResponseWithMetadata(response, selector, options) {
|
|
104
|
+
var node = selector.node,
|
|
105
|
+
variables = selector.variables,
|
|
106
|
+
dataID = selector.dataID;
|
|
107
|
+
var normalizer = new GraphModeNormalizer(variables, options);
|
|
108
|
+
var chunks = Array.from(normalizer.normalizeResponse(node, dataID, response));
|
|
109
|
+
return [chunks, {
|
|
110
|
+
duplicateFieldsAvoided: normalizer.duplicateFieldsAvoided
|
|
111
|
+
}];
|
|
112
|
+
}
|
|
113
|
+
|
|
99
114
|
var GraphModeNormalizer = /*#__PURE__*/function () {
|
|
100
115
|
function GraphModeNormalizer(variables, options) {
|
|
101
116
|
this._actorIdentifier = options.actorIdentifier;
|
|
@@ -105,6 +120,7 @@ var GraphModeNormalizer = /*#__PURE__*/function () {
|
|
|
105
120
|
this._sentFields = new Map();
|
|
106
121
|
this._nextStreamID = 0;
|
|
107
122
|
this._variables = variables;
|
|
123
|
+
this.duplicateFieldsAvoided = 0;
|
|
108
124
|
}
|
|
109
125
|
|
|
110
126
|
var _proto = GraphModeNormalizer.prototype;
|
|
@@ -218,6 +234,7 @@ var GraphModeNormalizer = /*#__PURE__*/function () {
|
|
|
218
234
|
|
|
219
235
|
|
|
220
236
|
if (sentFields.has(storageKey)) {
|
|
237
|
+
this.duplicateFieldsAvoided++;
|
|
221
238
|
break;
|
|
222
239
|
}
|
|
223
240
|
|
|
@@ -237,6 +254,7 @@ var GraphModeNormalizer = /*#__PURE__*/function () {
|
|
|
237
254
|
|
|
238
255
|
|
|
239
256
|
if (sentFields.has(_storageKey)) {
|
|
257
|
+
this.duplicateFieldsAvoided++;
|
|
240
258
|
break;
|
|
241
259
|
}
|
|
242
260
|
|
|
@@ -310,6 +328,18 @@ var GraphModeNormalizer = /*#__PURE__*/function () {
|
|
|
310
328
|
// over client extensions.
|
|
311
329
|
break;
|
|
312
330
|
|
|
331
|
+
case SCALAR_HANDLE:
|
|
332
|
+
case LINKED_HANDLE:
|
|
333
|
+
// Handles allow us to record information that will be needed to
|
|
334
|
+
// perform additional process when we insert data into the store. For
|
|
335
|
+
// example, connection edges need to be prepended/appended to the
|
|
336
|
+
// pre-existing values.
|
|
337
|
+
//
|
|
338
|
+
// GraphMode will eventually need some replacement for this, but it is
|
|
339
|
+
// not nessesary in order to measure things like response size, so we
|
|
340
|
+
// can ignore these for now.
|
|
341
|
+
break;
|
|
342
|
+
|
|
313
343
|
default:
|
|
314
344
|
throw new Error("Unexpected selection type: ".concat(selection.kind));
|
|
315
345
|
}
|
|
@@ -388,4 +418,6 @@ var GraphModeNormalizer = /*#__PURE__*/function () {
|
|
|
388
418
|
};
|
|
389
419
|
|
|
390
420
|
return GraphModeNormalizer;
|
|
391
|
-
}();
|
|
421
|
+
}();
|
|
422
|
+
|
|
423
|
+
exports.GraphModeNormalizer = GraphModeNormalizer;
|
|
@@ -34,7 +34,7 @@ var _require3 = require('./RelayStoreUtils'),
|
|
|
34
34
|
function createOperationDescriptor(request, variables, cacheConfig) {
|
|
35
35
|
var dataID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ROOT_ID;
|
|
36
36
|
var operation = request.operation;
|
|
37
|
-
var operationVariables = getOperationVariables(operation, variables);
|
|
37
|
+
var operationVariables = getOperationVariables(operation, request.params.providedVariables, variables);
|
|
38
38
|
var requestDescriptor = createRequestDescriptor(request, operationVariables, cacheConfig);
|
|
39
39
|
var operationDescriptor = {
|
|
40
40
|
fragment: createReaderSelector(request.fragment, dataID, operationVariables, requestDescriptor),
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
var _global$ErrorUtils$ap, _global
|
|
13
|
+
var _global$ErrorUtils$ap, _global$ErrorUtils;
|
|
14
14
|
|
|
15
15
|
var RelayRecordSourceMutator = require('../mutations/RelayRecordSourceMutator');
|
|
16
16
|
|
|
@@ -26,7 +26,9 @@ var invariant = require('invariant');
|
|
|
26
26
|
|
|
27
27
|
var warning = require("fbjs/lib/warning");
|
|
28
28
|
|
|
29
|
-
var
|
|
29
|
+
var _global = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : undefined;
|
|
30
|
+
|
|
31
|
+
var applyWithGuard = (_global$ErrorUtils$ap = _global === null || _global === void 0 ? void 0 : (_global$ErrorUtils = _global.ErrorUtils) === null || _global$ErrorUtils === void 0 ? void 0 : _global$ErrorUtils.applyWithGuard) !== null && _global$ErrorUtils$ap !== void 0 ? _global$ErrorUtils$ap : function (callback, context, args, onError, name) {
|
|
30
32
|
return callback.apply(context, args);
|
|
31
33
|
};
|
|
32
34
|
/**
|
package/lib/store/RelayReader.js
CHANGED
|
@@ -90,6 +90,7 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
90
90
|
this._selector = selector;
|
|
91
91
|
this._variables = selector.variables;
|
|
92
92
|
this._resolverCache = resolverCache;
|
|
93
|
+
this._fragmentName = selector.node.name;
|
|
93
94
|
}
|
|
94
95
|
|
|
95
96
|
var _proto = RelayReader.prototype;
|
|
@@ -219,7 +220,7 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
219
220
|
return;
|
|
220
221
|
}
|
|
221
222
|
|
|
222
|
-
var owner = this.
|
|
223
|
+
var owner = this._fragmentName;
|
|
223
224
|
|
|
224
225
|
switch (action) {
|
|
225
226
|
case 'THROW':
|
|
@@ -236,15 +237,21 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
236
237
|
if (this._missingRequiredFields == null) {
|
|
237
238
|
this._missingRequiredFields = {
|
|
238
239
|
action: action,
|
|
239
|
-
fields: [
|
|
240
|
+
fields: [{
|
|
241
|
+
path: fieldPath,
|
|
242
|
+
owner: owner
|
|
243
|
+
}]
|
|
244
|
+
};
|
|
245
|
+
} else {
|
|
246
|
+
this._missingRequiredFields = {
|
|
247
|
+
action: action,
|
|
248
|
+
fields: [].concat((0, _toConsumableArray2["default"])(this._missingRequiredFields.fields), [{
|
|
249
|
+
path: fieldPath,
|
|
250
|
+
owner: owner
|
|
251
|
+
}])
|
|
240
252
|
};
|
|
241
253
|
}
|
|
242
254
|
|
|
243
|
-
this._missingRequiredFields.fields.push({
|
|
244
|
-
path: fieldPath,
|
|
245
|
-
owner: owner
|
|
246
|
-
});
|
|
247
|
-
|
|
248
255
|
return;
|
|
249
256
|
|
|
250
257
|
default:
|
|
@@ -466,9 +473,7 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
466
473
|
throw new Error('Relay Resolver fields are not yet supported.');
|
|
467
474
|
}
|
|
468
475
|
|
|
469
|
-
this._readResolverField(selection.field, record, data);
|
|
470
|
-
|
|
471
|
-
break;
|
|
476
|
+
return this._readResolverField(selection.field, record, data);
|
|
472
477
|
|
|
473
478
|
default:
|
|
474
479
|
selection.field.kind;
|
|
@@ -490,6 +495,8 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
490
495
|
|
|
491
496
|
var fragmentValue;
|
|
492
497
|
var fragmentReaderSelector;
|
|
498
|
+
var fragmentMissingRequiredFields;
|
|
499
|
+
var previousMissingRequriedFields;
|
|
493
500
|
var fragmentSeenRecordIDs = new Set();
|
|
494
501
|
|
|
495
502
|
var getDataForResolverFragment = function getDataForResolverFragment(singularReaderSelector) {
|
|
@@ -508,14 +515,18 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
508
515
|
|
|
509
516
|
_this._seenRecords = fragmentSeenRecordIDs;
|
|
510
517
|
var resolverFragmentData = {};
|
|
518
|
+
previousMissingRequriedFields = _this._missingRequiredFields;
|
|
519
|
+
_this._missingRequiredFields = null;
|
|
511
520
|
|
|
512
521
|
_this._createInlineDataOrResolverFragmentPointer(singularReaderSelector.node, record, resolverFragmentData);
|
|
513
522
|
|
|
523
|
+
fragmentMissingRequiredFields = _this._missingRequiredFields;
|
|
514
524
|
fragmentValue = (_resolverFragmentData = resolverFragmentData[FRAGMENTS_KEY]) === null || _resolverFragmentData === void 0 ? void 0 : _resolverFragmentData[fragment.name];
|
|
515
525
|
!(typeof fragmentValue === 'object' && fragmentValue !== null) ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected reader data to contain a __fragments property with a property for the fragment named ".concat(fragment.name, ", but it is missing.")) : invariant(false) : void 0;
|
|
516
526
|
return fragmentValue;
|
|
517
527
|
} finally {
|
|
518
528
|
_this._seenRecords = existingSeenRecords;
|
|
529
|
+
_this._missingRequiredFields = previousMissingRequriedFields;
|
|
519
530
|
}
|
|
520
531
|
};
|
|
521
532
|
|
|
@@ -537,12 +548,18 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
537
548
|
fragmentValue: fragmentValue,
|
|
538
549
|
resolverID: resolverID,
|
|
539
550
|
seenRecordIDs: fragmentSeenRecordIDs,
|
|
540
|
-
readerSelector: fragmentReaderSelector
|
|
551
|
+
readerSelector: fragmentReaderSelector,
|
|
552
|
+
missingRequiredFields: fragmentMissingRequiredFields
|
|
541
553
|
};
|
|
542
554
|
});
|
|
543
555
|
}, getDataForResolverFragment),
|
|
544
556
|
result = _this$_resolverCache$[0],
|
|
545
|
-
seenRecord = _this$_resolverCache$[1]
|
|
557
|
+
seenRecord = _this$_resolverCache$[1],
|
|
558
|
+
missingRequiredFields = _this$_resolverCache$[2];
|
|
559
|
+
|
|
560
|
+
if (missingRequiredFields != null) {
|
|
561
|
+
this._addMissingRequiredFields(missingRequiredFields);
|
|
562
|
+
}
|
|
546
563
|
|
|
547
564
|
if (seenRecord != null) {
|
|
548
565
|
this._seenRecords.add(seenRecord);
|
|
@@ -550,6 +567,7 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
550
567
|
|
|
551
568
|
var applicationName = (_field$alias = field.alias) !== null && _field$alias !== void 0 ? _field$alias : field.name;
|
|
552
569
|
data[applicationName] = result;
|
|
570
|
+
return result;
|
|
553
571
|
};
|
|
554
572
|
|
|
555
573
|
_proto._readClientEdge = function _readClientEdge(field, record, data) {
|
|
@@ -816,13 +834,37 @@ var RelayReader = /*#__PURE__*/function () {
|
|
|
816
834
|
}
|
|
817
835
|
|
|
818
836
|
var inlineData = {};
|
|
837
|
+
var parentFragmentName = this._fragmentName;
|
|
838
|
+
this._fragmentName = fragmentSpreadOrFragment.name;
|
|
819
839
|
|
|
820
|
-
this._traverseSelections(fragmentSpreadOrFragment.selections, record, inlineData);
|
|
840
|
+
this._traverseSelections(fragmentSpreadOrFragment.selections, record, inlineData);
|
|
821
841
|
|
|
842
|
+
this._fragmentName = parentFragmentName; // $FlowFixMe[cannot-write] - writing into read-only field
|
|
822
843
|
|
|
823
844
|
fragmentPointers[fragmentSpreadOrFragment.name] = inlineData;
|
|
824
845
|
};
|
|
825
846
|
|
|
847
|
+
_proto._addMissingRequiredFields = function _addMissingRequiredFields(additional) {
|
|
848
|
+
if (this._missingRequiredFields == null) {
|
|
849
|
+
this._missingRequiredFields = additional;
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
if (this._missingRequiredFields.action === 'THROW') {
|
|
854
|
+
return;
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
if (additional.action === 'THROW') {
|
|
858
|
+
this._missingRequiredFields = additional;
|
|
859
|
+
return;
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
this._missingRequiredFields = {
|
|
863
|
+
action: 'LOG',
|
|
864
|
+
fields: [].concat((0, _toConsumableArray2["default"])(this._missingRequiredFields.fields), (0, _toConsumableArray2["default"])(additional.fields))
|
|
865
|
+
};
|
|
866
|
+
};
|
|
867
|
+
|
|
826
868
|
return RelayReader;
|
|
827
869
|
}();
|
|
828
870
|
|
|
@@ -211,6 +211,7 @@ var RelayStoreUtils = {
|
|
|
211
211
|
RELAY_RESOLVER_INVALIDATION_KEY: '__resolverValueMayBeInvalid',
|
|
212
212
|
RELAY_RESOLVER_INPUTS_KEY: '__resolverInputValues',
|
|
213
213
|
RELAY_RESOLVER_READER_SELECTOR_KEY: '__resolverReaderSelector',
|
|
214
|
+
RELAY_RESOLVER_MISSING_REQUIRED_FIELDS_KEY: '__resolverMissingRequiredFields',
|
|
214
215
|
formatStorageKey: formatStorageKey,
|
|
215
216
|
getArgumentValue: getArgumentValue,
|
|
216
217
|
getArgumentValues: getArgumentValues,
|
|
@@ -24,6 +24,7 @@ var RelayModernRecord = require('./RelayModernRecord');
|
|
|
24
24
|
var _require2 = require('./RelayStoreUtils'),
|
|
25
25
|
RELAY_RESOLVER_INPUTS_KEY = _require2.RELAY_RESOLVER_INPUTS_KEY,
|
|
26
26
|
RELAY_RESOLVER_INVALIDATION_KEY = _require2.RELAY_RESOLVER_INVALIDATION_KEY,
|
|
27
|
+
RELAY_RESOLVER_MISSING_REQUIRED_FIELDS_KEY = _require2.RELAY_RESOLVER_MISSING_REQUIRED_FIELDS_KEY,
|
|
27
28
|
RELAY_RESOLVER_READER_SELECTOR_KEY = _require2.RELAY_RESOLVER_READER_SELECTOR_KEY,
|
|
28
29
|
RELAY_RESOLVER_VALUE_KEY = _require2.RELAY_RESOLVER_VALUE_KEY,
|
|
29
30
|
getStorageKey = _require2.getStorageKey;
|
|
@@ -39,7 +40,11 @@ var NoopResolverCache = /*#__PURE__*/function () {
|
|
|
39
40
|
var _proto = NoopResolverCache.prototype;
|
|
40
41
|
|
|
41
42
|
_proto.readFromCacheOrEvaluate = function readFromCacheOrEvaluate(record, field, variables, evaluate, getDataForResolverFragment) {
|
|
42
|
-
|
|
43
|
+
var _evaluate = evaluate(),
|
|
44
|
+
resolverResult = _evaluate.resolverResult,
|
|
45
|
+
missingRequiredFields = _evaluate.missingRequiredFields;
|
|
46
|
+
|
|
47
|
+
return [resolverResult, undefined, missingRequiredFields];
|
|
43
48
|
};
|
|
44
49
|
|
|
45
50
|
_proto.invalidateDataIDs = function invalidateDataIDs(updatedDataIDs) {};
|
|
@@ -85,6 +90,7 @@ var RecordResolverCache = /*#__PURE__*/function () {
|
|
|
85
90
|
RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_VALUE_KEY, evaluationResult.resolverResult);
|
|
86
91
|
RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_INPUTS_KEY, evaluationResult.fragmentValue);
|
|
87
92
|
RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_READER_SELECTOR_KEY, evaluationResult.readerSelector);
|
|
93
|
+
RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_MISSING_REQUIRED_FIELDS_KEY, evaluationResult.missingRequiredFields);
|
|
88
94
|
recordSource.set(linkedID, linkedRecord); // Link the resolver value record to the resolver field of the record being read:
|
|
89
95
|
|
|
90
96
|
var nextRecord = RelayModernRecord.clone(record);
|
|
@@ -112,7 +118,9 @@ var RecordResolverCache = /*#__PURE__*/function () {
|
|
|
112
118
|
|
|
113
119
|
|
|
114
120
|
var answer = linkedRecord[RELAY_RESOLVER_VALUE_KEY];
|
|
115
|
-
|
|
121
|
+
var missingRequiredFields = // $FlowFixMe[incompatible-type] - casting mixed
|
|
122
|
+
linkedRecord[RELAY_RESOLVER_MISSING_REQUIRED_FIELDS_KEY];
|
|
123
|
+
return [answer, linkedID, missingRequiredFields];
|
|
116
124
|
};
|
|
117
125
|
|
|
118
126
|
_proto2.invalidateDataIDs = function invalidateDataIDs(updatedDataIDs) {
|
|
@@ -37,9 +37,9 @@ function withResolverContext(context, cb) {
|
|
|
37
37
|
// The declarations ensure that the type of the returned data is:
|
|
38
38
|
// - non-nullable if the provided ref type is non-nullable
|
|
39
39
|
// - nullable if the provided ref type is nullable
|
|
40
|
-
// - array of non-nullable if the
|
|
40
|
+
// - array of non-nullable if the provided ref type is an array of
|
|
41
41
|
// non-nullable refs
|
|
42
|
-
// - array of nullable if the
|
|
42
|
+
// - array of nullable if the provided ref type is an array of nullable refs
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
function readFragment(fragmentInput, fragmentKey) {
|
|
@@ -21,8 +21,6 @@ var _require2 = require('../store/RelayModernOperationDescriptor'),
|
|
|
21
21
|
var _require3 = require('../store/RelayModernSelector'),
|
|
22
22
|
createReaderSelector = _require3.createReaderSelector;
|
|
23
23
|
|
|
24
|
-
var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
25
|
-
|
|
26
24
|
var warning = require("fbjs/lib/warning");
|
|
27
25
|
|
|
28
26
|
function requestSubscription(environment, config) {
|