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.
Files changed (77) hide show
  1. package/index.js +1 -1
  2. package/lib/{generateRelayClientID.js → ClientID.js} +10 -3
  3. package/lib/ConvertToExecuteFunction.js +6 -4
  4. package/lib/DataChecker.js +88 -69
  5. package/lib/NormalizationNode.js +1 -1
  6. package/lib/ReaderNode.js +1 -1
  7. package/lib/RelayCombinedEnvironmentTypes.js +1 -1
  8. package/lib/RelayConcreteNode.js +5 -2
  9. package/lib/RelayConcreteVariables.js +15 -9
  10. package/lib/RelayConnectionHandler.js +27 -20
  11. package/lib/RelayConnectionInterface.js +4 -2
  12. package/lib/RelayCore.js +48 -15
  13. package/lib/RelayDeclarativeMutationConfig.js +16 -15
  14. package/lib/RelayDefaultHandleKey.js +1 -1
  15. package/lib/RelayDefaultHandlerProvider.js +7 -6
  16. package/lib/RelayDefaultMissingFieldHandlers.js +26 -0
  17. package/lib/RelayError.js +7 -2
  18. package/lib/RelayFeatureFlags.js +16 -0
  19. package/lib/RelayInMemoryRecordSource.js +8 -2
  20. package/lib/RelayModernEnvironment.js +159 -237
  21. package/lib/RelayModernFragmentOwner.js +72 -0
  22. package/lib/RelayModernFragmentSpecResolver.js +66 -15
  23. package/lib/RelayModernGraphQLTag.js +9 -5
  24. package/lib/RelayModernOperationDescriptor.js +9 -6
  25. package/lib/RelayModernQueryExecutor.js +791 -0
  26. package/lib/RelayModernRecord.js +44 -24
  27. package/lib/RelayModernSelector.js +208 -82
  28. package/lib/RelayModernStore.js +66 -34
  29. package/lib/RelayNetwork.js +14 -7
  30. package/lib/RelayNetworkLogger.js +6 -2
  31. package/lib/RelayNetworkLoggerTransaction.js +8 -4
  32. package/lib/RelayNetworkTypes.js +1 -1
  33. package/lib/RelayObservable.js +72 -41
  34. package/lib/RelayOperationTracker.js +265 -0
  35. package/lib/RelayProfiler.js +10 -6
  36. package/lib/RelayPublishQueue.js +66 -47
  37. package/lib/RelayQueryResponseCache.js +11 -5
  38. package/lib/RelayReader.js +135 -126
  39. package/lib/RelayRecordProxy.js +24 -20
  40. package/lib/RelayRecordSourceMutator.js +88 -25
  41. package/lib/RelayRecordSourceProxy.js +38 -19
  42. package/lib/RelayRecordSourceSelectorProxy.js +10 -7
  43. package/lib/RelayRecordState.js +1 -1
  44. package/lib/RelayReferenceMarker.js +66 -55
  45. package/lib/RelayReplaySubject.js +134 -0
  46. package/lib/RelayResponseNormalizer.js +245 -134
  47. package/lib/RelayRuntimeTypes.js +1 -1
  48. package/lib/RelayStoreUtils.js +55 -16
  49. package/lib/RelayViewerHandler.js +8 -50
  50. package/lib/StoreInspector.js +171 -0
  51. package/lib/applyRelayModernOptimisticMutation.js +8 -2
  52. package/lib/cloneRelayHandleSourceField.js +17 -7
  53. package/lib/commitLocalUpdate.js +1 -1
  54. package/lib/commitRelayModernMutation.js +33 -13
  55. package/lib/createRelayContext.js +27 -0
  56. package/lib/createRelayNetworkLogger.js +8 -2
  57. package/lib/deepFreeze.js +1 -1
  58. package/lib/defaultGetDataID.js +24 -0
  59. package/lib/fetchQueryInternal.js +232 -0
  60. package/lib/fetchRelayModernQuery.js +5 -3
  61. package/lib/getFragmentIdentifier.js +52 -0
  62. package/lib/getFragmentSpecIdentifier.js +26 -0
  63. package/lib/getRelayHandleKey.js +8 -2
  64. package/lib/getRequestParametersIdentifier.js +26 -0
  65. package/lib/hasOverlappingIDs.js +1 -1
  66. package/lib/index.js +155 -53
  67. package/lib/isPromise.js +1 -1
  68. package/lib/isScalarAndEqual.js +1 -1
  69. package/lib/normalizeRelayPayload.js +19 -10
  70. package/lib/recycleNodesInto.js +23 -5
  71. package/lib/requestRelaySubscription.js +9 -3
  72. package/lib/validateMutation.js +13 -6
  73. package/package.json +2 -2
  74. package/relay-runtime.js +2 -2
  75. package/relay-runtime.min.js +2 -2
  76. package/lib/normalizePayload.js +0 -37
  77. package/lib/simpleClone.js +0 -27
@@ -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 === require("./RelayConcreteNode").VARIABLE) {
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 handle = handleField.handle,
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
- var handleName = require("./getRelayHandleKey")(handle, key, name);
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 (!args || !filters || args.length === 0 || filters.length === 0) {
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, require("./stableCopy")(args));
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" ? require("fbjs/lib/invariant")(false, 'getVariableValue(): Undefined variable `%s`.', name) : require("fbjs/lib/invariant")(false) : void 0;
127
- return require("./stableCopy")(variables[name]);
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
- MATCH_COMPONENT_KEY: '__match_component',
139
- MATCH_FRAGMENT_KEY: '__match_fragment',
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
- * strict-local
7
+ *
8
8
  * @format
9
9
  */
10
10
  'use strict';
11
11
 
12
- var VIEWER_ID = require("./generateRelayClientID")(require("./RelayStoreUtils").ROOT_ID, 'viewer');
12
+ var _require = require("./ClientID"),
13
+ generateClientID = _require.generateClientID;
13
14
 
14
- var VIEWER_TYPE = 'Viewer';
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
- update: update
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
- !require("./isRelayModernEnvironment")(environment) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'commitRelayModernMutation: expected `environment` to be an instance of ' + '`RelayModernEnvironment`.\n' + 'When using Relay Modern and Relay Classic in the same ' + 'application, ensure mutations use Relay Compat to work in ' + 'both environments.\n' + 'See: http://facebook.github.io/relay/docs/relay-compat.html') : require("fbjs/lib/invariant")(false) : void 0;
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 = require("./RelayDeclarativeMutationConfig").convert(configs, mutation, optimisticUpdater);
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
- * strict-local
7
+ *
8
8
  * @format
9
9
  */
10
10
  'use strict';
11
11
 
12
- var _objectSpread2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/objectSpread"));
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 === require("./RelayConcreteNode").LINKED_FIELD && source.name === handleField.name && source.alias === handleField.alias && require("fbjs/lib/areEqual")(source.args, handleField.args);
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 === require("./RelayConcreteNode").LINKED_FIELD) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'cloneRelayHandleSourceField: Expected a corresponding source field for ' + 'handle `%s`.', handleField.handle) : require("fbjs/lib/invariant")(false) : void 0;
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,
@@ -4,7 +4,7 @@
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
- * strict-local
7
+ *
8
8
  * @format
9
9
  */
10
10
  'use strict';
@@ -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
- !require("./isRelayModernEnvironment")(environment) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'commitRelayModernMutation: expected `environment` to be an instance of ' + '`RelayModernEnvironment`.\n' + 'When using Relay Modern and Relay Classic in the same ' + 'application, ensure mutations use Relay Compat to work in ' + 'both environments.\n' + 'See: http://facebook.github.io/relay/docs/relay-compat.html') : require("fbjs/lib/invariant")(false) : void 0;
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" ? require("fbjs/lib/warning")(false, 'commitRelayModernMutation: Expected `optimisticResponse` to be an object, ' + 'received a function.') : void 0;
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
- require("./validateMutation")(optimisticResponse, mutation, config.variables);
61
+ validateMutation(optimisticResponse, mutation, config.variables);
48
62
  }
49
63
  }
50
64
 
51
65
  if (configs) {
52
- var _RelayDeclarativeMuta = require("./RelayDeclarativeMutationConfig").convert(configs, mutation, optimisticUpdater, updater);
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
- return environment.executeMutation({
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
- }).subscribeLegacy({
65
- onNext: function onNext(payload) {
66
- // NOTE: commitRelayModernMutation has a non-standard use of
67
- // onCompleted() by calling it on every next value. It may be called
68
- // multiple times if a network request produces multiple responses.
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, payload.errors);
89
+ var snapshot = environment.lookup(operation.fragment, operation);
90
+ onCompleted(snapshot.data, errors.length !== 0 ? errors : null);
74
91
  }
75
92
  },
76
- onError: onError
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(require("./ConvertToExecuteFunction").convertFetch(fetch), LoggerTransaction, graphiQLPrinter);
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(require("./ConvertToExecuteFunction").convertSubscribe(subscribe), LoggerTransaction, graphiQLPrinter);
28
+ var wrapped = wrapExecute(convertSubscribe(subscribe), LoggerTransaction, graphiQLPrinter);
23
29
  return wrapped(request, variables, cacheConfig);
24
30
  };
25
31
  }
package/lib/deepFreeze.js CHANGED
@@ -4,7 +4,7 @@
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
- * strict
7
+ *
8
8
  * @format
9
9
  */
10
10
  'use strict';
@@ -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;