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.
Files changed (46) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -4
  3. package/index.js +2 -2
  4. package/index.js.flow +4 -0
  5. package/lib/index.js +7 -1
  6. package/lib/mutations/readUpdatableQuery_EXPERIMENTAL.js +22 -17
  7. package/lib/mutations/validateMutation.js +11 -1
  8. package/lib/network/RelayNetwork.js +7 -3
  9. package/lib/query/fetchQuery.js +3 -0
  10. package/lib/store/RelayConcreteVariables.js +12 -3
  11. package/lib/store/RelayExperimentalGraphResponseTransform.js +34 -2
  12. package/lib/store/RelayModernOperationDescriptor.js +1 -1
  13. package/lib/store/RelayPublishQueue.js +4 -2
  14. package/lib/store/RelayReader.js +55 -13
  15. package/lib/store/RelayStoreUtils.js +1 -0
  16. package/lib/store/ResolverCache.js +10 -2
  17. package/lib/store/ResolverFragments.js +2 -2
  18. package/lib/subscription/requestSubscription.js +0 -2
  19. package/lib/util/withProvidedVariables.js +49 -0
  20. package/mutations/RelayDeclarativeMutationConfig.js.flow +0 -1
  21. package/mutations/commitMutation.js.flow +8 -19
  22. package/mutations/readUpdatableQuery_EXPERIMENTAL.js.flow +47 -49
  23. package/mutations/validateMutation.js.flow +14 -2
  24. package/network/RelayNetwork.js.flow +10 -3
  25. package/network/RelayNetworkTypes.js.flow +1 -1
  26. package/package.json +6 -2
  27. package/query/fetchQuery.js.flow +9 -7
  28. package/relay-runtime.js +2 -2
  29. package/relay-runtime.min.js +3 -3
  30. package/store/RelayConcreteVariables.js.flow +12 -2
  31. package/store/RelayExperimentalGraphResponseTransform.js.flow +35 -1
  32. package/store/RelayModernOperationDescriptor.js.flow +5 -1
  33. package/store/RelayModernStore.js.flow +0 -1
  34. package/store/RelayPublishQueue.js.flow +8 -1
  35. package/store/RelayReader.js.flow +78 -31
  36. package/store/RelayStoreTypes.js.flow +3 -2
  37. package/store/RelayStoreUtils.js.flow +1 -0
  38. package/store/ResolverCache.js.flow +18 -5
  39. package/store/ResolverFragments.js.flow +2 -2
  40. package/subscription/requestSubscription.js.flow +7 -13
  41. package/util/NormalizationNode.js.flow +16 -16
  42. package/util/ReaderNode.js.flow +15 -15
  43. package/util/RelayConcreteNode.js.flow +4 -2
  44. package/util/withProvidedVariables.js.flow +64 -0
  45. package/lib/util/getAllRootVariables.js +0 -29
  46. package/util/getAllRootVariables.js.flow +0 -36
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) Facebook, Inc. and its affiliates.
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.0-rc.2
2
+ * Relay v13.0.3
3
3
  *
4
- * Copyright (c) Facebook, Inc. and its affiliates.
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$alias, _selection$alias2;
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
- // Linked fields are assignable if they contain fragment spreads or
52
- // read-only otherwise.
53
- var isAssignable = selection.selections.some(function (item) {
54
- return item.kind === 'FragmentSpread';
55
- });
56
- var set = !isAssignable ? undefined : selection.plural ? createSetterForPluralLinkedField(selection, queryVariables, recordProxy, root) : createSetterForSingularLinkedField(selection, queryVariables, recordProxy, root);
57
- var get = selection.plural ? createGetterForPluralLinkedField(selection, queryVariables, recordProxy, root) : createGetterForSingularLinkedField(selection, queryVariables, recordProxy, root);
58
- Object.defineProperty(mutableUpdatableProxy, (_selection$alias = selection.alias) !== null && _selection$alias !== void 0 ? _selection$alias : selection.name, {
59
- get: get,
60
- set: set
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$alias2 = selection.alias) !== null && _selection$alias2 !== void 0 ? _selection$alias2 : selection.name;
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
- // $FlowFixMe[unclear-type] No good way to type these variables
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(null, selection.name, variables);
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, variables, cacheConfig);
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, variables, {
42
+ return observeFetch(request, operationVariables, {
39
43
  force: true
40
44
  }).poll(pollInterval);
41
45
  }
42
46
 
43
- return observeFetch(request, variables, cacheConfig, uploadables, logRequestInfo);
47
+ return observeFetch(request, operationVariables, cacheConfig, uploadables, logRequestInfo);
44
48
  }
45
49
 
46
50
  return {
@@ -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. Extraneous input variables are filtered from
72
- * the output, and missing variables are set to default values (if given in the
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
- SCALAR_FIELD = _require.SCALAR_FIELD;
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, _global$ErrorUtils;
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 applyWithGuard = (_global$ErrorUtils$ap = (_global = 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) {
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
  /**
@@ -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._selector.node.name;
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); // $FlowFixMe[cannot-write] - writing into read-only field
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
- return [evaluate().resolverResult, undefined];
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
- return [answer, linkedID];
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 privoided ref type is an array of
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 privoided ref type is an array of nullable refs
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) {