relay-runtime 9.0.0 → 10.1.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 (142) hide show
  1. package/handlers/RelayDefaultHandlerProvider.js.flow +47 -0
  2. package/handlers/connection/ConnectionHandler.js.flow +549 -0
  3. package/handlers/connection/ConnectionInterface.js.flow +92 -0
  4. package/handlers/connection/MutationHandlers.js.flow +199 -0
  5. package/index.js +1 -1
  6. package/index.js.flow +335 -0
  7. package/lib/handlers/RelayDefaultHandlerProvider.js +20 -0
  8. package/lib/handlers/connection/ConnectionHandler.js +1 -3
  9. package/lib/handlers/connection/MutationHandlers.js +212 -0
  10. package/lib/index.js +14 -2
  11. package/lib/mutations/RelayDeclarativeMutationConfig.js +22 -45
  12. package/lib/mutations/RelayRecordProxy.js +1 -3
  13. package/lib/mutations/RelayRecordSourceMutator.js +1 -3
  14. package/lib/mutations/RelayRecordSourceProxy.js +1 -3
  15. package/lib/mutations/RelayRecordSourceSelectorProxy.js +1 -3
  16. package/lib/mutations/commitMutation.js +2 -3
  17. package/lib/mutations/validateMutation.js +40 -9
  18. package/lib/network/RelayObservable.js +9 -9
  19. package/lib/network/RelayQueryResponseCache.js +8 -6
  20. package/lib/query/GraphQLTag.js +2 -1
  21. package/lib/query/PreloadableQueryRegistry.js +70 -0
  22. package/lib/query/fetchQuery.js +2 -3
  23. package/lib/query/fetchQueryInternal.js +5 -14
  24. package/lib/store/DataChecker.js +200 -71
  25. package/lib/store/RelayConcreteVariables.js +6 -2
  26. package/lib/store/RelayModernEnvironment.js +124 -65
  27. package/lib/store/RelayModernFragmentSpecResolver.js +19 -14
  28. package/lib/store/RelayModernOperationDescriptor.js +6 -5
  29. package/lib/store/RelayModernQueryExecutor.js +122 -73
  30. package/lib/store/RelayModernRecord.js +14 -9
  31. package/lib/store/RelayModernSelector.js +6 -2
  32. package/lib/store/RelayModernStore.js +281 -131
  33. package/lib/store/RelayOperationTracker.js +35 -78
  34. package/lib/store/RelayOptimisticRecordSource.js +7 -5
  35. package/lib/store/RelayPublishQueue.js +2 -4
  36. package/lib/store/RelayReader.js +304 -52
  37. package/lib/store/RelayRecordSource.js +1 -3
  38. package/lib/store/RelayRecordSourceMapImpl.js +13 -18
  39. package/lib/store/RelayReferenceMarker.js +125 -14
  40. package/lib/store/RelayResponseNormalizer.js +261 -66
  41. package/lib/store/RelayStoreReactFlightUtils.js +47 -0
  42. package/lib/store/RelayStoreUtils.js +1 -0
  43. package/lib/store/StoreInspector.js +8 -8
  44. package/lib/store/TypeID.js +28 -0
  45. package/lib/store/cloneRelayScalarHandleSourceField.js +44 -0
  46. package/lib/store/defaultRequiredFieldLogger.js +18 -0
  47. package/lib/store/normalizeRelayPayload.js +6 -2
  48. package/lib/store/readInlineData.js +1 -1
  49. package/lib/subscription/requestSubscription.js +4 -3
  50. package/lib/util/NormalizationNode.js +1 -5
  51. package/lib/util/RelayConcreteNode.js +11 -6
  52. package/lib/util/RelayError.js +39 -9
  53. package/lib/util/RelayFeatureFlags.js +6 -3
  54. package/lib/util/RelayReplaySubject.js +3 -3
  55. package/lib/util/createPayloadFor3DField.js +7 -2
  56. package/lib/util/getFragmentIdentifier.js +12 -3
  57. package/lib/util/getOperation.js +33 -0
  58. package/lib/util/getRequestIdentifier.js +2 -2
  59. package/lib/util/isEmptyObject.js +25 -0
  60. package/lib/util/recycleNodesInto.js +6 -7
  61. package/lib/util/reportMissingRequiredFields.js +48 -0
  62. package/mutations/RelayDeclarativeMutationConfig.js.flow +380 -0
  63. package/mutations/RelayRecordProxy.js.flow +165 -0
  64. package/mutations/RelayRecordSourceMutator.js.flow +238 -0
  65. package/mutations/RelayRecordSourceProxy.js.flow +164 -0
  66. package/mutations/RelayRecordSourceSelectorProxy.js.flow +119 -0
  67. package/mutations/applyOptimisticMutation.js.flow +76 -0
  68. package/mutations/commitLocalUpdate.js.flow +24 -0
  69. package/mutations/commitMutation.js.flow +181 -0
  70. package/mutations/validateMutation.js.flow +242 -0
  71. package/network/ConvertToExecuteFunction.js.flow +49 -0
  72. package/network/RelayNetwork.js.flow +84 -0
  73. package/network/RelayNetworkTypes.js.flow +145 -0
  74. package/network/RelayObservable.js.flow +634 -0
  75. package/network/RelayQueryResponseCache.js.flow +111 -0
  76. package/package.json +2 -2
  77. package/query/GraphQLTag.js.flow +168 -0
  78. package/query/PreloadableQueryRegistry.js.flow +65 -0
  79. package/query/fetchQuery.js.flow +47 -0
  80. package/query/fetchQueryInternal.js.flow +343 -0
  81. package/relay-runtime.js +2 -2
  82. package/relay-runtime.min.js +2 -2
  83. package/store/ClientID.js.flow +43 -0
  84. package/store/DataChecker.js.flow +568 -0
  85. package/store/RelayConcreteVariables.js.flow +96 -0
  86. package/store/RelayModernEnvironment.js.flow +571 -0
  87. package/store/RelayModernFragmentSpecResolver.js.flow +438 -0
  88. package/store/RelayModernOperationDescriptor.js.flow +92 -0
  89. package/store/RelayModernQueryExecutor.js.flow +1345 -0
  90. package/store/RelayModernRecord.js.flow +403 -0
  91. package/store/RelayModernSelector.js.flow +455 -0
  92. package/store/RelayModernStore.js.flow +858 -0
  93. package/store/RelayOperationTracker.js.flow +164 -0
  94. package/store/RelayOptimisticRecordSource.js.flow +119 -0
  95. package/store/RelayPublishQueue.js.flow +401 -0
  96. package/store/RelayReader.js.flow +638 -0
  97. package/store/RelayRecordSource.js.flow +29 -0
  98. package/store/RelayRecordSourceMapImpl.js.flow +87 -0
  99. package/store/RelayRecordState.js.flow +37 -0
  100. package/store/RelayReferenceMarker.js.flow +324 -0
  101. package/store/RelayResponseNormalizer.js.flow +791 -0
  102. package/store/RelayStoreReactFlightUtils.js.flow +64 -0
  103. package/store/RelayStoreTypes.js.flow +958 -0
  104. package/store/RelayStoreUtils.js.flow +219 -0
  105. package/store/StoreInspector.js.flow +171 -0
  106. package/store/TypeID.js.flow +28 -0
  107. package/store/ViewerPattern.js.flow +26 -0
  108. package/store/cloneRelayHandleSourceField.js.flow +66 -0
  109. package/store/cloneRelayScalarHandleSourceField.js.flow +62 -0
  110. package/store/createFragmentSpecResolver.js.flow +55 -0
  111. package/store/createRelayContext.js.flow +44 -0
  112. package/store/defaultGetDataID.js.flow +27 -0
  113. package/store/defaultRequiredFieldLogger.js.flow +23 -0
  114. package/store/hasOverlappingIDs.js.flow +34 -0
  115. package/store/isRelayModernEnvironment.js.flow +27 -0
  116. package/store/normalizeRelayPayload.js.flow +51 -0
  117. package/store/readInlineData.js.flow +75 -0
  118. package/subscription/requestSubscription.js.flow +103 -0
  119. package/util/JSResourceTypes.flow.js.flow +20 -0
  120. package/util/NormalizationNode.js.flow +213 -0
  121. package/util/ReaderNode.js.flow +227 -0
  122. package/util/RelayConcreteNode.js.flow +99 -0
  123. package/util/RelayDefaultHandleKey.js.flow +17 -0
  124. package/util/RelayError.js.flow +62 -0
  125. package/util/RelayFeatureFlags.js.flow +37 -0
  126. package/util/RelayProfiler.js.flow +284 -0
  127. package/util/RelayReplaySubject.js.flow +135 -0
  128. package/util/RelayRuntimeTypes.js.flow +72 -0
  129. package/util/createPayloadFor3DField.js.flow +43 -0
  130. package/util/deepFreeze.js.flow +36 -0
  131. package/util/generateID.js.flow +21 -0
  132. package/util/getFragmentIdentifier.js.flow +76 -0
  133. package/util/getOperation.js.flow +40 -0
  134. package/util/getRelayHandleKey.js.flow +41 -0
  135. package/util/getRequestIdentifier.js.flow +42 -0
  136. package/util/isEmptyObject.js.flow +25 -0
  137. package/util/isPromise.js.flow +21 -0
  138. package/util/isScalarAndEqual.js.flow +26 -0
  139. package/util/recycleNodesInto.js.flow +87 -0
  140. package/util/reportMissingRequiredFields.js.flow +51 -0
  141. package/util/resolveImmediate.js.flow +30 -0
  142. package/util/stableCopy.js.flow +35 -0
@@ -0,0 +1,18 @@
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 defaultRequiredFieldLogger = function defaultRequiredFieldLogger(event) {
13
+ if (process.env.NODE_ENV !== "production" && event.kind === 'missing_field.log') {
14
+ throw new Error('Relay Environment Configuration Error (dev only): `@required(action: LOG)` requires that the Relay Environment be configured with a `requiredFieldLogger`.');
15
+ }
16
+ };
17
+
18
+ module.exports = defaultRequiredFieldLogger;
@@ -12,7 +12,11 @@
12
12
 
13
13
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
15
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
+
17
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
18
+
19
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
16
20
 
17
21
  var RelayModernRecord = require('./RelayModernRecord');
18
22
 
@@ -27,7 +31,7 @@ function normalizeRelayPayload(selector, payload, errors, options) {
27
31
  var source = RelayRecordSource.create();
28
32
  source.set(selector.dataID, RelayModernRecord.create(selector.dataID, ROOT_TYPE));
29
33
  var relayPayload = RelayResponseNormalizer.normalize(source, selector, payload, options);
30
- return (0, _objectSpread2["default"])({}, relayPayload, {
34
+ return _objectSpread(_objectSpread({}, relayPayload), {}, {
31
35
  errors: errors
32
36
  });
33
37
  }
@@ -27,7 +27,7 @@ function readInlineData(fragment, fragmentRef) {
27
27
  return fragmentRef;
28
28
  }
29
29
 
30
- !(typeof fragmentRef === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'readInlineData(): Expected an object, got `%s`.', typeof fragmentRef) : invariant(false) : void 0; // $FlowFixMe
30
+ !(typeof fragmentRef === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'readInlineData(): Expected an object, got `%s`.', typeof fragmentRef) : invariant(false) : void 0; // $FlowFixMe[incompatible-use]
31
31
 
32
32
  var inlineData = (_fragmentRef$FRAGMENT = fragmentRef[FRAGMENTS_KEY]) === null || _fragmentRef$FRAGMENT === void 0 ? void 0 : _fragmentRef$FRAGMENT[inlineDataFragment.name];
33
33
  !(inlineData != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'readInlineData(): Expected fragment `%s` to be spread in the parent ' + 'fragment.', inlineDataFragment.name) : invariant(false) : void 0;
@@ -31,8 +31,9 @@ function requestSubscription(environment, config) {
31
31
  onCompleted = config.onCompleted,
32
32
  onError = config.onError,
33
33
  onNext = config.onNext,
34
- variables = config.variables;
35
- var operation = createOperationDescriptor(subscription, variables);
34
+ variables = config.variables,
35
+ cacheConfig = config.cacheConfig;
36
+ var operation = createOperationDescriptor(subscription, variables, cacheConfig);
36
37
  process.env.NODE_ENV !== "production" ? warning(!(config.updater && configs), 'requestSubscription: Expected only one of `updater` and `configs` to be provided') : void 0;
37
38
 
38
39
  var _ref = configs ? RelayDeclarativeMutationConfig.convert(configs, subscription, null
@@ -44,7 +45,7 @@ function requestSubscription(environment, config) {
44
45
  operation: operation,
45
46
  updater: updater
46
47
  }).map(function () {
47
- var data = environment.lookup(operation.fragment).data; // $FlowFixMe
48
+ var data = environment.lookup(operation.fragment).data; // $FlowFixMe[incompatible-cast]
48
49
 
49
50
  return data;
50
51
  }).subscribe({
@@ -8,8 +8,4 @@
8
8
  * @format
9
9
  */
10
10
  // flowlint ambiguous-object-type:error
11
- 'use strict';
12
- /**
13
- * Represents a single operation used to processing and normalize runtime
14
- * request results.
15
- */
11
+ 'use strict';
@@ -11,21 +11,24 @@
11
11
  'use strict';
12
12
 
13
13
  /**
14
- * Represents a common GraphQL request with `text` (or persisted `id`) can be
15
- * used to execute it, an `operation` containing information to normalize the
16
- * results, and a `fragment` derived from that operation to read the response
17
- * data (masking data from child fragments).
14
+ * Represents a common GraphQL request that can be executed, an `operation`
15
+ * containing information to normalize the results, and a `fragment` derived
16
+ * from that operation to read the response data (masking data from child
17
+ * fragments).
18
18
  */
19
19
 
20
20
  /**
21
- * Contains the `text` (or persisted `id`) required for executing a common
22
- * GraphQL request.
21
+ * Contains the parameters required for executing a GraphQL request.
22
+ * The operation can either be provided as a persisted `id` or `text`. If given
23
+ * in `text` format, a `cacheID` as a hash of the text should be set to be used
24
+ * for local caching.
23
25
  */
24
26
  var RelayConcreteNode = {
25
27
  CONDITION: 'Condition',
26
28
  CLIENT_EXTENSION: 'ClientExtension',
27
29
  DEFER: 'Defer',
28
30
  CONNECTION: 'Connection',
31
+ FLIGHT_FIELD: 'FlightField',
29
32
  FRAGMENT: 'Fragment',
30
33
  FRAGMENT_SPREAD: 'FragmentSpread',
31
34
  INLINE_DATA_FRAGMENT_SPREAD: 'InlineDataFragmentSpread',
@@ -37,6 +40,7 @@ var RelayConcreteNode = {
37
40
  LIST_VALUE: 'ListValue',
38
41
  LOCAL_ARGUMENT: 'LocalArgument',
39
42
  MODULE_IMPORT: 'ModuleImport',
43
+ REQUIRED_FIELD: 'RequiredField',
40
44
  OBJECT_VALUE: 'ObjectValue',
41
45
  OPERATION: 'Operation',
42
46
  REQUEST: 'Request',
@@ -45,6 +49,7 @@ var RelayConcreteNode = {
45
49
  SCALAR_HANDLE: 'ScalarHandle',
46
50
  SPLIT_OPERATION: 'SplitOperation',
47
51
  STREAM: 'Stream',
52
+ TYPE_DISCRIMINATOR: 'TypeDiscriminator',
48
53
  VARIABLE: 'Variable'
49
54
  };
50
55
  module.exports = RelayConcreteNode;
@@ -13,19 +13,49 @@
13
13
  * @private
14
14
  */
15
15
 
16
- function createError(type, name, message) {
17
- var error = new Error(message);
18
- error.name = name;
19
- error.type = type;
20
- error.framesToPop = 2;
16
+ function createError(type, name, messageFormat) {
17
+ for (var _len = arguments.length, messageParams = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
18
+ messageParams[_key - 3] = arguments[_key];
19
+ }
20
+
21
+ var index = 0;
22
+ var message = messageFormat.replace(/%s/g, function () {
23
+ return String(messageParams[index++]);
24
+ });
25
+ var err = new Error(message);
26
+ var error = Object.assign(err, {
27
+ name: name,
28
+ messageFormat: messageFormat,
29
+ messageParams: messageParams,
30
+ type: type,
31
+ taalOpcodes: [2, 2] // skip frame (code=2) twice
32
+
33
+ }); // In V8, Error objects keep the closure scope chain alive until the
34
+ // err.stack property is accessed.
35
+
36
+ if (error.stack === undefined) {
37
+ // IE sets the stack only if error is thrown
38
+ try {
39
+ throw error;
40
+ } catch (_unused) {}
41
+ }
42
+
21
43
  return error;
22
44
  }
23
45
 
24
46
  module.exports = {
25
- create: function create(name, message) {
26
- return createError('error', name, message);
47
+ create: function create(name, messageFormat) {
48
+ for (var _len2 = arguments.length, messageParams = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
49
+ messageParams[_key2 - 2] = arguments[_key2];
50
+ }
51
+
52
+ return createError.apply(void 0, ['error', name, messageFormat].concat(messageParams));
27
53
  },
28
- createWarning: function createWarning(name, message) {
29
- return createError('warn', name, message);
54
+ createWarning: function createWarning(name, messageFormat) {
55
+ for (var _len3 = arguments.length, messageParams = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
56
+ messageParams[_key3 - 2] = arguments[_key3];
57
+ }
58
+
59
+ return createError.apply(void 0, ['warn', name, messageFormat].concat(messageParams));
30
60
  }
31
61
  };
@@ -11,10 +11,13 @@
11
11
  'use strict';
12
12
 
13
13
  var RelayFeatureFlags = {
14
- // T45504512: new connection model
15
14
  ENABLE_VARIABLE_CONNECTION_KEY: false,
16
15
  ENABLE_PARTIAL_RENDERING_DEFAULT: false,
17
- ENABLE_RELAY_CONTAINERS_SUSPENSE: true,
18
- ENABLE_UNIQUE_MUTATION_ROOT: true
16
+ ENABLE_RELAY_CONTAINERS_SUSPENSE: false,
17
+ ENABLE_PRECISE_TYPE_REFINEMENT: false,
18
+ ENABLE_REACT_FLIGHT_COMPONENT_FIELD: false,
19
+ ENABLE_REQUIRED_DIRECTIVES: false,
20
+ ENABLE_GETFRAGMENTIDENTIFIER_OPTIMIZATION: false,
21
+ ENABLE_FRIENDLY_QUERY_NAME_GQL_URL: false
19
22
  };
20
23
  module.exports = RelayFeatureFlags;
@@ -24,9 +24,7 @@ var invariant = require("fbjs/lib/invariant");
24
24
  * Records events provided and synchronously plays them back to new subscribers,
25
25
  * as well as forwarding new asynchronous events.
26
26
  */
27
- var RelayReplaySubject =
28
- /*#__PURE__*/
29
- function () {
27
+ var RelayReplaySubject = /*#__PURE__*/function () {
30
28
  function RelayReplaySubject() {
31
29
  var _this = this;
32
30
 
@@ -130,6 +128,8 @@ function () {
130
128
  _proto.unsubscribe = function unsubscribe() {
131
129
  if (this._subscription) {
132
130
  this._subscription.unsubscribe();
131
+
132
+ this._subscription = null;
133
133
  }
134
134
  };
135
135
 
@@ -13,14 +13,19 @@
13
13
 
14
14
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
15
15
 
16
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
16
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
+
18
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
19
+
20
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
17
21
 
18
22
  var _require = require('../store/RelayStoreUtils'),
19
23
  getModuleComponentKey = _require.getModuleComponentKey,
20
24
  getModuleOperationKey = _require.getModuleOperationKey;
21
25
 
22
26
  function createPayloadFor3DField(name, operation, component, response) {
23
- var data = (0, _objectSpread2["default"])({}, response);
27
+ var data = _objectSpread({}, response);
28
+
24
29
  data[getModuleComponentKey(name)] = component;
25
30
  data[getModuleOperationKey(name)] = operation;
26
31
  return data;
@@ -11,6 +11,10 @@
11
11
  // flowlint ambiguous-object-type:error
12
12
  'use strict';
13
13
 
14
+ var RelayFeatureFlags = require('./RelayFeatureFlags');
15
+
16
+ var isEmptyObject = require('./isEmptyObject');
17
+
14
18
  var stableCopy = require('./stableCopy');
15
19
 
16
20
  var _require = require('../store/RelayModernSelector'),
@@ -19,15 +23,20 @@ var _require = require('../store/RelayModernSelector'),
19
23
  getSelector = _require.getSelector;
20
24
 
21
25
  function getFragmentIdentifier(fragmentNode, fragmentRef) {
22
- var _JSON$stringify;
23
-
24
26
  var selector = getSelector(fragmentNode, fragmentRef);
25
27
  var fragmentOwnerIdentifier = selector == null ? 'null' : selector.kind === 'SingularReaderSelector' ? selector.owner.identifier : '[' + selector.selectors.map(function (sel) {
26
28
  return sel.owner.identifier;
27
29
  }).join(',') + ']';
28
30
  var fragmentVariables = getVariablesFromFragment(fragmentNode, fragmentRef);
29
31
  var dataIDs = getDataIDsFromFragment(fragmentNode, fragmentRef);
30
- return fragmentOwnerIdentifier + '/' + fragmentNode.name + '/' + JSON.stringify(stableCopy(fragmentVariables)) + '/' + ((_JSON$stringify = JSON.stringify(dataIDs)) !== null && _JSON$stringify !== void 0 ? _JSON$stringify : 'missing');
32
+
33
+ if (RelayFeatureFlags.ENABLE_GETFRAGMENTIDENTIFIER_OPTIMIZATION) {
34
+ return fragmentOwnerIdentifier + '/' + fragmentNode.name + '/' + (fragmentVariables == null || isEmptyObject(fragmentVariables) ? '{}' : JSON.stringify(stableCopy(fragmentVariables))) + '/' + (typeof dataIDs === 'undefined' ? 'missing' : dataIDs == null ? 'null' : Array.isArray(dataIDs) ? '[' + dataIDs.join(',') + ']' : dataIDs);
35
+ } else {
36
+ var _JSON$stringify;
37
+
38
+ return fragmentOwnerIdentifier + '/' + fragmentNode.name + '/' + JSON.stringify(stableCopy(fragmentVariables)) + '/' + ((_JSON$stringify = JSON.stringify(dataIDs)) !== null && _JSON$stringify !== void 0 ? _JSON$stringify : 'missing');
39
+ }
31
40
  }
32
41
 
33
42
  module.exports = getFragmentIdentifier;
@@ -0,0 +1,33 @@
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
+ // flowlint ambiguous-object-type:error
12
+ 'use strict';
13
+
14
+ var _require = require('./RelayConcreteNode'),
15
+ REQUEST = _require.REQUEST,
16
+ SPLIT_OPERATION = _require.SPLIT_OPERATION;
17
+
18
+ /**
19
+ * OperationLoaders can return either a NormalizationSplitOperation or
20
+ * ConcreteRequest.
21
+ */
22
+ function getOperation(node) {
23
+ switch (node.kind) {
24
+ case REQUEST:
25
+ return node.operation;
26
+
27
+ case SPLIT_OPERATION:
28
+ default:
29
+ return node;
30
+ }
31
+ }
32
+
33
+ module.exports = getOperation;
@@ -19,8 +19,8 @@ var stableCopy = require('./stableCopy');
19
19
  * variables.
20
20
  */
21
21
  function getRequestIdentifier(parameters, variables) {
22
- var requestID = parameters.id != null ? parameters.id : parameters.text;
23
- !(requestID != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getRequestIdentifier: Expected request `%s` to have either a ' + 'valid `id` or `text` property', parameters.name) : invariant(false) : void 0;
22
+ var requestID = parameters.cacheID != null ? parameters.cacheID : parameters.id;
23
+ !(requestID != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getRequestIdentifier: Expected request `%s` to have either a ' + 'valid `id` or `cacheID` property', parameters.name) : invariant(false) : void 0;
24
24
  return requestID + JSON.stringify(stableCopy(variables));
25
25
  }
26
26
 
@@ -0,0 +1,25 @@
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 hasOwnProperty = Object.prototype.hasOwnProperty;
14
+
15
+ function isEmptyObject(obj) {
16
+ for (var _key in obj) {
17
+ if (hasOwnProperty.call(obj, _key)) {
18
+ return false;
19
+ }
20
+ }
21
+
22
+ return true;
23
+ }
24
+
25
+ module.exports = isEmptyObject;
@@ -9,12 +9,15 @@
9
9
  */
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
+
13
+ var hasWeakSetDefined = typeof WeakSet !== 'undefined';
14
+ var hasWeakMapDefined = typeof WeakMap !== 'undefined';
12
15
  /**
13
16
  * Recycles subtrees from `prevData` by replacing equal subtrees in `nextData`.
14
17
  */
15
18
 
16
19
  function recycleNodesInto(prevData, nextData) {
17
- if (prevData === nextData || typeof prevData !== 'object' || !prevData || typeof nextData !== 'object' || !nextData) {
20
+ if (prevData === nextData || typeof prevData !== 'object' || prevData instanceof Set || prevData instanceof Map || hasWeakSetDefined && prevData instanceof WeakSet || hasWeakMapDefined && prevData instanceof WeakMap || !prevData || typeof nextData !== 'object' || nextData instanceof Set || nextData instanceof Map || hasWeakSetDefined && nextData instanceof WeakSet || hasWeakMapDefined && nextData instanceof WeakMap || !nextData) {
18
21
  return nextData;
19
22
  }
20
23
 
@@ -53,15 +56,11 @@ function recycleNodesInto(prevData, nextData) {
53
56
  if (nextValue !== nextObject[key]) {
54
57
  if (process.env.NODE_ENV !== "production") {
55
58
  if (!Object.isFrozen(nextObject)) {
56
- /* $FlowFixMe(>=0.98.0 site=www,mobile,react_native_fb,oss) This
57
- * comment suppresses an error found when Flow v0.98 was deployed.
58
- * To see the error delete this comment and run Flow. */
59
+ // $FlowFixMe[cannot-write]
59
60
  nextObject[key] = nextValue;
60
61
  }
61
62
  } else {
62
- /* $FlowFixMe(>=0.98.0 site=www,mobile,react_native_fb,oss) This comment
63
- * suppresses an error found when Flow v0.98 was deployed. To see
64
- * the error delete this comment and run Flow. */
63
+ // $FlowFixMe[cannot-write]
65
64
  nextObject[key] = nextValue;
66
65
  }
67
66
  }
@@ -0,0 +1,48 @@
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
+ * @emails oncall+relay
9
+ * @format
10
+ */
11
+ 'use strict';
12
+
13
+ function reportMissingRequiredFields(environment, missingRequiredFields) {
14
+ switch (missingRequiredFields.action) {
15
+ case 'THROW':
16
+ {
17
+ var _missingRequiredField = missingRequiredFields.field,
18
+ path = _missingRequiredField.path,
19
+ owner = _missingRequiredField.owner; // This gives the consumer the chance to throw their own error if they so wish.
20
+
21
+ environment.requiredFieldLogger({
22
+ kind: 'missing_field.throw',
23
+ owner: owner,
24
+ fieldPath: path
25
+ });
26
+ throw new Error("Relay: Missing @required value at path '".concat(path, "' in '").concat(owner, "'."));
27
+ }
28
+
29
+ case 'LOG':
30
+ missingRequiredFields.fields.forEach(function (_ref) {
31
+ var path = _ref.path,
32
+ owner = _ref.owner;
33
+ environment.requiredFieldLogger({
34
+ kind: 'missing_field.log',
35
+ owner: owner,
36
+ fieldPath: path
37
+ });
38
+ });
39
+ break;
40
+
41
+ default:
42
+ {
43
+ missingRequiredFields.action;
44
+ }
45
+ }
46
+ }
47
+
48
+ module.exports = reportMissingRequiredFields;