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.
- package/index.js +1 -1
- package/lib/{generateRelayClientID.js → ClientID.js} +10 -3
- package/lib/ConvertToExecuteFunction.js +6 -4
- package/lib/DataChecker.js +88 -69
- package/lib/NormalizationNode.js +1 -1
- package/lib/ReaderNode.js +1 -1
- package/lib/RelayCombinedEnvironmentTypes.js +1 -1
- package/lib/RelayConcreteNode.js +5 -2
- package/lib/RelayConcreteVariables.js +15 -9
- package/lib/RelayConnectionHandler.js +27 -20
- package/lib/RelayConnectionInterface.js +4 -2
- package/lib/RelayCore.js +48 -15
- package/lib/RelayDeclarativeMutationConfig.js +16 -15
- package/lib/RelayDefaultHandleKey.js +1 -1
- package/lib/RelayDefaultHandlerProvider.js +7 -6
- package/lib/RelayDefaultMissingFieldHandlers.js +26 -0
- package/lib/RelayError.js +7 -2
- package/lib/RelayFeatureFlags.js +16 -0
- package/lib/RelayInMemoryRecordSource.js +8 -2
- package/lib/RelayModernEnvironment.js +159 -237
- package/lib/RelayModernFragmentOwner.js +72 -0
- package/lib/RelayModernFragmentSpecResolver.js +66 -15
- package/lib/RelayModernGraphQLTag.js +9 -5
- package/lib/RelayModernOperationDescriptor.js +9 -6
- package/lib/RelayModernQueryExecutor.js +791 -0
- package/lib/RelayModernRecord.js +44 -24
- package/lib/RelayModernSelector.js +208 -82
- package/lib/RelayModernStore.js +66 -34
- package/lib/RelayNetwork.js +14 -7
- package/lib/RelayNetworkLogger.js +6 -2
- package/lib/RelayNetworkLoggerTransaction.js +8 -4
- package/lib/RelayNetworkTypes.js +1 -1
- package/lib/RelayObservable.js +72 -41
- package/lib/RelayOperationTracker.js +265 -0
- package/lib/RelayProfiler.js +10 -6
- package/lib/RelayPublishQueue.js +66 -47
- package/lib/RelayQueryResponseCache.js +11 -5
- package/lib/RelayReader.js +135 -126
- package/lib/RelayRecordProxy.js +24 -20
- package/lib/RelayRecordSourceMutator.js +88 -25
- package/lib/RelayRecordSourceProxy.js +38 -19
- package/lib/RelayRecordSourceSelectorProxy.js +10 -7
- package/lib/RelayRecordState.js +1 -1
- package/lib/RelayReferenceMarker.js +66 -55
- package/lib/RelayReplaySubject.js +134 -0
- package/lib/RelayResponseNormalizer.js +245 -134
- package/lib/RelayRuntimeTypes.js +1 -1
- package/lib/RelayStoreUtils.js +55 -16
- package/lib/RelayViewerHandler.js +8 -50
- package/lib/StoreInspector.js +171 -0
- package/lib/applyRelayModernOptimisticMutation.js +8 -2
- package/lib/cloneRelayHandleSourceField.js +17 -7
- package/lib/commitLocalUpdate.js +1 -1
- package/lib/commitRelayModernMutation.js +33 -13
- package/lib/createRelayContext.js +27 -0
- package/lib/createRelayNetworkLogger.js +8 -2
- package/lib/deepFreeze.js +1 -1
- package/lib/defaultGetDataID.js +24 -0
- package/lib/fetchQueryInternal.js +232 -0
- package/lib/fetchRelayModernQuery.js +5 -3
- package/lib/getFragmentIdentifier.js +52 -0
- package/lib/getFragmentSpecIdentifier.js +26 -0
- package/lib/getRelayHandleKey.js +8 -2
- package/lib/getRequestParametersIdentifier.js +26 -0
- package/lib/hasOverlappingIDs.js +1 -1
- package/lib/index.js +155 -53
- package/lib/isPromise.js +1 -1
- package/lib/isScalarAndEqual.js +1 -1
- package/lib/normalizeRelayPayload.js +19 -10
- package/lib/recycleNodesInto.js +23 -5
- package/lib/requestRelaySubscription.js +9 -3
- package/lib/validateMutation.js +13 -6
- package/package.json +2 -2
- package/relay-runtime.js +2 -2
- package/relay-runtime.min.js +2 -2
- package/lib/normalizePayload.js +0 -37
- package/lib/simpleClone.js +0 -27
package/lib/RelayStoreUtils.js
CHANGED
|
@@ -9,14 +9,30 @@
|
|
|
9
9
|
*/
|
|
10
10
|
'use strict';
|
|
11
11
|
|
|
12
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
13
|
+
|
|
14
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
15
|
+
|
|
16
|
+
var RelayConcreteNode = require("./RelayConcreteNode");
|
|
17
|
+
|
|
18
|
+
var getRelayHandleKey = require("./getRelayHandleKey");
|
|
19
|
+
|
|
20
|
+
var invariant = require("fbjs/lib/invariant");
|
|
21
|
+
|
|
22
|
+
var stableCopy = require("./stableCopy");
|
|
23
|
+
|
|
24
|
+
var VARIABLE = RelayConcreteNode.VARIABLE;
|
|
25
|
+
var MODULE_COMPONENT_KEY_PREFIX = '__module_component_';
|
|
26
|
+
var MODULE_OPERATION_KEY_PREFIX = '__module_operation_';
|
|
12
27
|
/**
|
|
13
28
|
* Returns the values of field/fragment arguments as an object keyed by argument
|
|
14
29
|
* names. Guaranteed to return a result with stable ordered nested values.
|
|
15
30
|
*/
|
|
31
|
+
|
|
16
32
|
function getArgumentValues(args, variables) {
|
|
17
33
|
var values = {};
|
|
18
34
|
args.forEach(function (arg) {
|
|
19
|
-
if (arg.kind ===
|
|
35
|
+
if (arg.kind === VARIABLE) {
|
|
20
36
|
// Variables are provided at runtime and are not guaranteed to be stable.
|
|
21
37
|
values[arg.name] = getStableVariableValue(arg.variableName, variables);
|
|
22
38
|
} else {
|
|
@@ -38,22 +54,35 @@ function getArgumentValues(args, variables) {
|
|
|
38
54
|
|
|
39
55
|
|
|
40
56
|
function getHandleStorageKey(handleField, variables) {
|
|
41
|
-
var
|
|
57
|
+
var dynamicKey = handleField.dynamicKey,
|
|
58
|
+
handle = handleField.handle,
|
|
42
59
|
key = handleField.key,
|
|
43
60
|
name = handleField.name,
|
|
44
61
|
args = handleField.args,
|
|
45
62
|
filters = handleField.filters;
|
|
63
|
+
var handleName = getRelayHandleKey(handle, key, name);
|
|
64
|
+
var filterArgs = null;
|
|
65
|
+
|
|
66
|
+
if (args && filters && args.length !== 0 && filters.length !== 0) {
|
|
67
|
+
filterArgs = args.filter(function (arg) {
|
|
68
|
+
return filters.indexOf(arg.name) > -1;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
46
71
|
|
|
47
|
-
|
|
72
|
+
if (dynamicKey) {
|
|
73
|
+
// "Sort" the arguments by argument name: this is done by the compiler for
|
|
74
|
+
// user-supplied arguments but the dynamic argument must also be in sorted
|
|
75
|
+
// order. Note that dynamic key argument name is double-underscore-
|
|
76
|
+
// -prefixed, and a double-underscore prefix is disallowed for user-supplied
|
|
77
|
+
// argument names, so there's no need to actually sort.
|
|
78
|
+
filterArgs = filterArgs != null ? [dynamicKey].concat((0, _toConsumableArray2["default"])(filterArgs)) : [dynamicKey];
|
|
79
|
+
}
|
|
48
80
|
|
|
49
|
-
if (
|
|
81
|
+
if (filterArgs === null) {
|
|
50
82
|
return handleName;
|
|
83
|
+
} else {
|
|
84
|
+
return formatStorageKey(handleName, getArgumentValues(filterArgs, variables));
|
|
51
85
|
}
|
|
52
|
-
|
|
53
|
-
var filterArgs = args.filter(function (arg) {
|
|
54
|
-
return filters.indexOf(arg.name) > -1;
|
|
55
|
-
});
|
|
56
|
-
return formatStorageKey(handleName, getArgumentValues(filterArgs, variables));
|
|
57
86
|
}
|
|
58
87
|
/**
|
|
59
88
|
* Given a field and variable values, returns a key that can be used to
|
|
@@ -87,7 +116,7 @@ function getStorageKey(field, variables) {
|
|
|
87
116
|
|
|
88
117
|
|
|
89
118
|
function getStableStorageKey(name, args) {
|
|
90
|
-
return formatStorageKey(name,
|
|
119
|
+
return formatStorageKey(name, stableCopy(args));
|
|
91
120
|
}
|
|
92
121
|
/**
|
|
93
122
|
* Given a name and argument values, format a storage key.
|
|
@@ -109,6 +138,7 @@ function formatStorageKey(name, argValues) {
|
|
|
109
138
|
var value = argValues[_argName];
|
|
110
139
|
|
|
111
140
|
if (value != null) {
|
|
141
|
+
// $FlowFixMe(>=0.95.0) JSON.stringify can return undefined
|
|
112
142
|
values.push(_argName + ':' + JSON.stringify(value));
|
|
113
143
|
}
|
|
114
144
|
}
|
|
@@ -123,8 +153,16 @@ function formatStorageKey(name, argValues) {
|
|
|
123
153
|
|
|
124
154
|
|
|
125
155
|
function getStableVariableValue(name, variables) {
|
|
126
|
-
!variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ?
|
|
127
|
-
return
|
|
156
|
+
!variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getVariableValue(): Undefined variable `%s`.', name) : invariant(false) : void 0;
|
|
157
|
+
return stableCopy(variables[name]);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function getModuleComponentKey(documentName) {
|
|
161
|
+
return "".concat(MODULE_COMPONENT_KEY_PREFIX).concat(documentName);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function getModuleOperationKey(documentName) {
|
|
165
|
+
return "".concat(MODULE_OPERATION_KEY_PREFIX).concat(documentName);
|
|
128
166
|
}
|
|
129
167
|
/**
|
|
130
168
|
* Constants shared by all implementations of RecordSource/MutableRecordSource/etc.
|
|
@@ -135,10 +173,9 @@ var RelayStoreUtils = {
|
|
|
135
173
|
FRAGMENTS_KEY: '__fragments',
|
|
136
174
|
FRAGMENT_OWNER_KEY: '__fragmentOwner',
|
|
137
175
|
FRAGMENT_PROP_NAME_KEY: '__fragmentPropName',
|
|
138
|
-
|
|
139
|
-
|
|
176
|
+
MODULE_COMPONENT_KEY: '__module_component',
|
|
177
|
+
// alias returned by Reader
|
|
140
178
|
ID_KEY: '__id',
|
|
141
|
-
MODULE_KEY: '__module',
|
|
142
179
|
REF_KEY: '__ref',
|
|
143
180
|
REFS_KEY: '__refs',
|
|
144
181
|
ROOT_ID: 'client:root',
|
|
@@ -153,6 +190,8 @@ var RelayStoreUtils = {
|
|
|
153
190
|
getArgumentValues: getArgumentValues,
|
|
154
191
|
getHandleStorageKey: getHandleStorageKey,
|
|
155
192
|
getStorageKey: getStorageKey,
|
|
156
|
-
getStableStorageKey: getStableStorageKey
|
|
193
|
+
getStableStorageKey: getStableStorageKey,
|
|
194
|
+
getModuleComponentKey: getModuleComponentKey,
|
|
195
|
+
getModuleOperationKey: getModuleOperationKey
|
|
157
196
|
};
|
|
158
197
|
module.exports = RelayStoreUtils;
|
|
@@ -4,62 +4,20 @@
|
|
|
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
|
-
*
|
|
7
|
+
*
|
|
8
8
|
* @format
|
|
9
9
|
*/
|
|
10
10
|
'use strict';
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _require = require("./ClientID"),
|
|
13
|
+
generateClientID = _require.generateClientID;
|
|
13
14
|
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
* A runtime handler for the `viewer` field. The actual viewer record will
|
|
17
|
-
* *never* be accessed at runtime because all fragments that reference it will
|
|
18
|
-
* delegate to the handle field. So in order to prevent GC from having to check
|
|
19
|
-
* both the original server field *and* the handle field (which would be almost
|
|
20
|
-
* duplicate work), the handler copies server fields and then deletes the server
|
|
21
|
-
* record.
|
|
22
|
-
*
|
|
23
|
-
* NOTE: This means other handles may not be added on viewer, since they may
|
|
24
|
-
* execute after this handle when the server record is already deleted.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
function update(store, payload) {
|
|
28
|
-
var record = store.get(payload.dataID);
|
|
29
|
-
|
|
30
|
-
if (!record) {
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
var serverViewer = record.getLinkedRecord(payload.fieldKey);
|
|
35
|
-
|
|
36
|
-
if (!serverViewer) {
|
|
37
|
-
// If `serverViewer` is null, `viewer` key for `client:root` should already
|
|
38
|
-
// be null, so no need to `setValue` again.
|
|
39
|
-
return;
|
|
40
|
-
} // Server data already has viewer data at `client:root:viewer`, so link the
|
|
41
|
-
// handle field to the server viewer record.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (serverViewer.getDataID() === VIEWER_ID) {
|
|
45
|
-
record.setValue(null, payload.fieldKey);
|
|
46
|
-
record.setLinkedRecord(serverViewer, payload.handleKey);
|
|
47
|
-
return;
|
|
48
|
-
} // Other ways to access viewer such as mutations may have a different id for
|
|
49
|
-
// viewer: synthesize a record at the canonical viewer id, copy its fields
|
|
50
|
-
// from the server record, and delete the server record link to speed up GC.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
var clientViewer = store.get(VIEWER_ID) || store.create(VIEWER_ID, VIEWER_TYPE);
|
|
54
|
-
clientViewer.copyFieldsFrom(serverViewer);
|
|
55
|
-
record.setValue(null, payload.fieldKey);
|
|
56
|
-
record.setLinkedRecord(clientViewer, payload.handleKey); // Make sure the root object points to the viewer object as well
|
|
57
|
-
|
|
58
|
-
var root = store.getRoot();
|
|
59
|
-
root.setLinkedRecord(clientViewer, payload.handleKey);
|
|
60
|
-
}
|
|
15
|
+
var _require2 = require("./RelayStoreUtils"),
|
|
16
|
+
ROOT_ID = _require2.ROOT_ID;
|
|
61
17
|
|
|
18
|
+
var VIEWER_ID = generateClientID(ROOT_ID, 'viewer');
|
|
19
|
+
var VIEWER_TYPE = 'Viewer';
|
|
62
20
|
module.exports = {
|
|
63
21
|
VIEWER_ID: VIEWER_ID,
|
|
64
|
-
|
|
22
|
+
VIEWER_TYPE: VIEWER_TYPE
|
|
65
23
|
};
|
|
@@ -0,0 +1,171 @@
|
|
|
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
|
+
*
|
|
8
|
+
* @format
|
|
9
|
+
* @emails oncall+relay
|
|
10
|
+
*/
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
14
|
+
|
|
15
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
|
|
16
|
+
|
|
17
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
18
|
+
|
|
19
|
+
var inspect = function inspect() {};
|
|
20
|
+
|
|
21
|
+
if (process.env.NODE_ENV !== "production") {
|
|
22
|
+
var formattersInstalled = false;
|
|
23
|
+
/**
|
|
24
|
+
* Installs a Chrome Developer Tools custom formatter for Relay proxy objects
|
|
25
|
+
* returned by StoreInspector.inspect.
|
|
26
|
+
*
|
|
27
|
+
* bit.ly/object-formatters
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
var installDevtoolFormatters = function installDevtoolFormatters() {
|
|
31
|
+
var _window$devtoolsForma;
|
|
32
|
+
|
|
33
|
+
if (formattersInstalled) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
formattersInstalled = true;
|
|
38
|
+
|
|
39
|
+
if (window.devtoolsFormatters == null) {
|
|
40
|
+
window.devtoolsFormatters = [];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (!Array.isArray(window.devtoolsFormatters)) {
|
|
44
|
+
return;
|
|
45
|
+
} // eslint-disable-next-line no-console
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
console.info('Make sure to select "Enable custom formatters" in the Chrome ' + 'Developer Tools settings, tab "Preferences" under the "Console" ' + 'section.');
|
|
49
|
+
|
|
50
|
+
(_window$devtoolsForma = window.devtoolsFormatters).push.apply(_window$devtoolsForma, (0, _toConsumableArray2["default"])(createFormatters()));
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
var createFormatters = function createFormatters() {
|
|
54
|
+
var listStyle = {
|
|
55
|
+
style: 'list-style-type: none; padding: 0; margin: 0 0 0 12px; font-style: normal'
|
|
56
|
+
};
|
|
57
|
+
var keyStyle = {
|
|
58
|
+
style: 'rgb(136, 19, 145)'
|
|
59
|
+
};
|
|
60
|
+
var nullStyle = {
|
|
61
|
+
style: 'color: #777'
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
var reference = function reference(object, config) {
|
|
65
|
+
return object == null ? ['span', nullStyle, 'undefined'] : ['object', {
|
|
66
|
+
object: object,
|
|
67
|
+
config: config
|
|
68
|
+
}];
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
var renderRecordHeader = function renderRecordHeader(record) {
|
|
72
|
+
return ['span', {
|
|
73
|
+
style: 'font-style: italic'
|
|
74
|
+
}, record.__typename, ['span', nullStyle, ' {id: "', record.__id, '", …}']];
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
var isRecord = function isRecord(o) {
|
|
78
|
+
return o != null && typeof o.__id === 'string';
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
var RecordEntry = function RecordEntry(key, value) {
|
|
82
|
+
this.key = key;
|
|
83
|
+
this.value = value;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
var renderRecordEntries = function renderRecordEntries(record) {
|
|
87
|
+
var children = Object.keys(record).map(function (key) {
|
|
88
|
+
return ['li', {}, ['object', {
|
|
89
|
+
object: new RecordEntry(key, record[key])
|
|
90
|
+
}]];
|
|
91
|
+
});
|
|
92
|
+
return ['ol', listStyle].concat((0, _toConsumableArray2["default"])(children));
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
var recordFormatter = {
|
|
96
|
+
header: function header(obj) {
|
|
97
|
+
if (!isRecord(obj)) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return renderRecordHeader(obj);
|
|
102
|
+
},
|
|
103
|
+
hasBody: function hasBody(obj) {
|
|
104
|
+
return true;
|
|
105
|
+
},
|
|
106
|
+
body: function body(obj) {
|
|
107
|
+
return renderRecordEntries(obj);
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
var recordEntryFormatter = {
|
|
111
|
+
header: function header(obj) {
|
|
112
|
+
if (obj instanceof RecordEntry) {
|
|
113
|
+
var value = isRecord(obj.value) ? renderRecordHeader(obj.value) : reference(obj.value);
|
|
114
|
+
return ['span', keyStyle, obj.key, ': ', value];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return null;
|
|
118
|
+
},
|
|
119
|
+
hasBody: function hasBody(obj) {
|
|
120
|
+
return isRecord(obj.value);
|
|
121
|
+
},
|
|
122
|
+
body: function body(obj) {
|
|
123
|
+
return renderRecordEntries(obj.value);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
return [recordFormatter, recordEntryFormatter];
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
var getWrappedRecord = function getWrappedRecord(source, dataID) {
|
|
130
|
+
var record = source.get(dataID);
|
|
131
|
+
|
|
132
|
+
if (record == null) {
|
|
133
|
+
return record;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return new Proxy((0, _objectSpread2["default"])({}, record), {
|
|
137
|
+
get: function get(target, prop) {
|
|
138
|
+
var value = target[prop];
|
|
139
|
+
|
|
140
|
+
if (value == null) {
|
|
141
|
+
return value;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (typeof value === 'object') {
|
|
145
|
+
if (typeof value.__ref === 'string') {
|
|
146
|
+
return getWrappedRecord(source, value.__ref);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (Array.isArray(value.__refs)) {
|
|
150
|
+
return value.__refs.map(function (ref) {
|
|
151
|
+
return getWrappedRecord(source, ref);
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return value;
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
inspect = function inspect(environment, dataID) {
|
|
162
|
+
var _dataID;
|
|
163
|
+
|
|
164
|
+
installDevtoolFormatters();
|
|
165
|
+
return getWrappedRecord(environment.getStore().getSource(), (_dataID = dataID) !== null && _dataID !== void 0 ? _dataID : 'client:root');
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
module.exports = {
|
|
170
|
+
inspect: inspect
|
|
171
|
+
};
|
|
@@ -9,12 +9,18 @@
|
|
|
9
9
|
*/
|
|
10
10
|
'use strict';
|
|
11
11
|
|
|
12
|
+
var RelayDeclarativeMutationConfig = require("./RelayDeclarativeMutationConfig");
|
|
13
|
+
|
|
14
|
+
var invariant = require("fbjs/lib/invariant");
|
|
15
|
+
|
|
16
|
+
var isRelayModernEnvironment = require("./isRelayModernEnvironment");
|
|
17
|
+
|
|
12
18
|
/**
|
|
13
19
|
* Higher-level helper function to execute a mutation against a specific
|
|
14
20
|
* environment.
|
|
15
21
|
*/
|
|
16
22
|
function applyRelayModernOptimisticMutation(environment, config) {
|
|
17
|
-
!
|
|
23
|
+
!isRelayModernEnvironment(environment) ? process.env.NODE_ENV !== "production" ? invariant(false, 'commitRelayModernMutation: expected `environment` to be an instance of ' + '`RelayModernEnvironment`.') : invariant(false) : void 0;
|
|
18
24
|
var _environment$unstable = environment.unstable_internal,
|
|
19
25
|
createOperationDescriptor = _environment$unstable.createOperationDescriptor,
|
|
20
26
|
getRequest = _environment$unstable.getRequest;
|
|
@@ -31,7 +37,7 @@ function applyRelayModernOptimisticMutation(environment, config) {
|
|
|
31
37
|
var operation = createOperationDescriptor(mutation, variables);
|
|
32
38
|
|
|
33
39
|
if (configs) {
|
|
34
|
-
var _RelayDeclarativeMuta =
|
|
40
|
+
var _RelayDeclarativeMuta = RelayDeclarativeMutationConfig.convert(configs, mutation, optimisticUpdater);
|
|
35
41
|
|
|
36
42
|
optimisticUpdater = _RelayDeclarativeMuta.optimisticUpdater;
|
|
37
43
|
}
|
|
@@ -4,12 +4,24 @@
|
|
|
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
|
-
*
|
|
7
|
+
*
|
|
8
8
|
* @format
|
|
9
9
|
*/
|
|
10
10
|
'use strict';
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
13
|
+
|
|
14
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
|
|
15
|
+
|
|
16
|
+
var areEqual = require("fbjs/lib/areEqual");
|
|
17
|
+
|
|
18
|
+
var invariant = require("fbjs/lib/invariant");
|
|
19
|
+
|
|
20
|
+
var _require = require("./RelayConcreteNode"),
|
|
21
|
+
LINKED_FIELD = _require.LINKED_FIELD;
|
|
22
|
+
|
|
23
|
+
var _require2 = require("./RelayStoreUtils"),
|
|
24
|
+
getHandleStorageKey = _require2.getHandleStorageKey;
|
|
13
25
|
|
|
14
26
|
/**
|
|
15
27
|
* @private
|
|
@@ -20,12 +32,10 @@ var _objectSpread2 = require("@babel/runtime/helpers/interopRequireDefault")(req
|
|
|
20
32
|
*/
|
|
21
33
|
function cloneRelayHandleSourceField(handleField, selections, variables) {
|
|
22
34
|
var sourceField = selections.find(function (source) {
|
|
23
|
-
return source.kind ===
|
|
35
|
+
return source.kind === LINKED_FIELD && source.name === handleField.name && source.alias === handleField.alias && areEqual(source.args, handleField.args);
|
|
24
36
|
});
|
|
25
|
-
!(sourceField && sourceField.kind ===
|
|
26
|
-
|
|
27
|
-
var handleKey = require("./RelayStoreUtils").getHandleStorageKey(handleField, variables);
|
|
28
|
-
|
|
37
|
+
!(sourceField && sourceField.kind === LINKED_FIELD) ? process.env.NODE_ENV !== "production" ? invariant(false, 'cloneRelayHandleSourceField: Expected a corresponding source field for ' + 'handle `%s`.', handleField.handle) : invariant(false) : void 0;
|
|
38
|
+
var handleKey = getHandleStorageKey(handleField, variables);
|
|
29
39
|
var clonedField = (0, _objectSpread2["default"])({}, sourceField, {
|
|
30
40
|
args: null,
|
|
31
41
|
name: handleKey,
|
package/lib/commitLocalUpdate.js
CHANGED
|
@@ -9,12 +9,26 @@
|
|
|
9
9
|
*/
|
|
10
10
|
'use strict';
|
|
11
11
|
|
|
12
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
13
|
+
|
|
14
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
15
|
+
|
|
16
|
+
var RelayDeclarativeMutationConfig = require("./RelayDeclarativeMutationConfig");
|
|
17
|
+
|
|
18
|
+
var invariant = require("fbjs/lib/invariant");
|
|
19
|
+
|
|
20
|
+
var isRelayModernEnvironment = require("./isRelayModernEnvironment");
|
|
21
|
+
|
|
22
|
+
var validateMutation = require("./validateMutation");
|
|
23
|
+
|
|
24
|
+
var warning = require("fbjs/lib/warning");
|
|
25
|
+
|
|
12
26
|
/**
|
|
13
27
|
* Higher-level helper function to execute a mutation against a specific
|
|
14
28
|
* environment.
|
|
15
29
|
*/
|
|
16
30
|
function commitRelayModernMutation(environment, config) {
|
|
17
|
-
!
|
|
31
|
+
!isRelayModernEnvironment(environment) ? process.env.NODE_ENV !== "production" ? invariant(false, 'commitRelayModernMutation: expected `environment` to be an instance of ' + '`RelayModernEnvironment`.') : invariant(false) : void 0;
|
|
18
32
|
var _environment$unstable = environment.unstable_internal,
|
|
19
33
|
createOperationDescriptor = _environment$unstable.createOperationDescriptor,
|
|
20
34
|
getRequest = _environment$unstable.getRequest;
|
|
@@ -39,42 +53,48 @@ function commitRelayModernMutation(environment, config) {
|
|
|
39
53
|
|
|
40
54
|
if (typeof optimisticResponse === 'function') {
|
|
41
55
|
optimisticResponse = optimisticResponse();
|
|
42
|
-
process.env.NODE_ENV !== "production" ?
|
|
56
|
+
process.env.NODE_ENV !== "production" ? warning(false, 'commitRelayModernMutation: Expected `optimisticResponse` to be an object, ' + 'received a function.') : void 0;
|
|
43
57
|
}
|
|
44
58
|
|
|
45
59
|
if (process.env.NODE_ENV !== "production") {
|
|
46
60
|
if (optimisticResponse instanceof Object) {
|
|
47
|
-
|
|
61
|
+
validateMutation(optimisticResponse, mutation, config.variables);
|
|
48
62
|
}
|
|
49
63
|
}
|
|
50
64
|
|
|
51
65
|
if (configs) {
|
|
52
|
-
var _RelayDeclarativeMuta =
|
|
66
|
+
var _RelayDeclarativeMuta = RelayDeclarativeMutationConfig.convert(configs, mutation, optimisticUpdater, updater);
|
|
53
67
|
|
|
54
68
|
optimisticUpdater = _RelayDeclarativeMuta.optimisticUpdater;
|
|
55
69
|
updater = _RelayDeclarativeMuta.updater;
|
|
56
70
|
}
|
|
57
71
|
|
|
58
|
-
|
|
72
|
+
var errors = [];
|
|
73
|
+
var subscription = environment.executeMutation({
|
|
59
74
|
operation: operation,
|
|
60
75
|
optimisticResponse: optimisticResponse,
|
|
61
76
|
optimisticUpdater: optimisticUpdater,
|
|
62
77
|
updater: updater,
|
|
63
78
|
uploadables: uploadables
|
|
64
|
-
}).
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
79
|
+
}).subscribe({
|
|
80
|
+
next: function next(payload) {
|
|
81
|
+
if (payload.errors) {
|
|
82
|
+
errors.push.apply(errors, (0, _toConsumableArray2["default"])(payload.errors));
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
complete: function complete() {
|
|
69
86
|
var onCompleted = config.onCompleted;
|
|
70
87
|
|
|
71
88
|
if (onCompleted) {
|
|
72
|
-
var snapshot = environment.lookup(operation.fragment);
|
|
73
|
-
onCompleted(snapshot.data,
|
|
89
|
+
var snapshot = environment.lookup(operation.fragment, operation);
|
|
90
|
+
onCompleted(snapshot.data, errors.length !== 0 ? errors : null);
|
|
74
91
|
}
|
|
75
92
|
},
|
|
76
|
-
|
|
93
|
+
error: onError
|
|
77
94
|
});
|
|
95
|
+
return {
|
|
96
|
+
dispose: subscription.unsubscribe
|
|
97
|
+
};
|
|
78
98
|
}
|
|
79
99
|
|
|
80
100
|
module.exports = commitRelayModernMutation;
|
|
@@ -0,0 +1,27 @@
|
|
|
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
|
+
*
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var invariant = require("fbjs/lib/invariant");
|
|
13
|
+
|
|
14
|
+
var relayContext;
|
|
15
|
+
var firstReact;
|
|
16
|
+
|
|
17
|
+
function createRelayContext(react) {
|
|
18
|
+
if (!relayContext) {
|
|
19
|
+
relayContext = react.createContext(null);
|
|
20
|
+
firstReact = react;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
!(react === firstReact) ? process.env.NODE_ENV !== "production" ? invariant(false, '[createRelayContext]: You passing a different instance of React', react.version) : invariant(false) : void 0;
|
|
24
|
+
return relayContext;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
module.exports = createRelayContext;
|
|
@@ -9,17 +9,23 @@
|
|
|
9
9
|
*/
|
|
10
10
|
'use strict';
|
|
11
11
|
|
|
12
|
+
var RelayConcreteNode = require("./RelayConcreteNode");
|
|
13
|
+
|
|
14
|
+
var _require = require("./ConvertToExecuteFunction"),
|
|
15
|
+
convertFetch = _require.convertFetch,
|
|
16
|
+
convertSubscribe = _require.convertSubscribe;
|
|
17
|
+
|
|
12
18
|
function createRelayNetworkLogger(LoggerTransaction) {
|
|
13
19
|
return {
|
|
14
20
|
wrapFetch: function wrapFetch(fetch, graphiQLPrinter) {
|
|
15
21
|
return function (request, variables, cacheConfig, uploadables) {
|
|
16
|
-
var wrapped = wrapExecute(
|
|
22
|
+
var wrapped = wrapExecute(convertFetch(fetch), LoggerTransaction, graphiQLPrinter);
|
|
17
23
|
return wrapped(request, variables, cacheConfig, uploadables);
|
|
18
24
|
};
|
|
19
25
|
},
|
|
20
26
|
wrapSubscribe: function wrapSubscribe(subscribe, graphiQLPrinter) {
|
|
21
27
|
return function (request, variables, cacheConfig) {
|
|
22
|
-
var wrapped = wrapExecute(
|
|
28
|
+
var wrapped = wrapExecute(convertSubscribe(subscribe), LoggerTransaction, graphiQLPrinter);
|
|
23
29
|
return wrapped(request, variables, cacheConfig);
|
|
24
30
|
};
|
|
25
31
|
}
|
package/lib/deepFreeze.js
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
*
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var _require = require("./RelayViewerHandler"),
|
|
13
|
+
VIEWER_ID = _require.VIEWER_ID,
|
|
14
|
+
VIEWER_TYPE = _require.VIEWER_TYPE;
|
|
15
|
+
|
|
16
|
+
function defaultGetDataID(fieldValue, typeName) {
|
|
17
|
+
if (typeName === VIEWER_TYPE) {
|
|
18
|
+
return fieldValue.id == null ? VIEWER_ID : fieldValue.id;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return fieldValue.id;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
module.exports = defaultGetDataID;
|