react-relay 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 (166) hide show
  1. package/index.js +2 -2
  2. package/lib/ReactRelayContext.js +6 -3
  3. package/lib/ReactRelayFragmentContainer.js +48 -46
  4. package/lib/ReactRelayFragmentMockRenderer.js +5 -1
  5. package/lib/ReactRelayPaginationContainer.js +102 -68
  6. package/lib/ReactRelayQueryFetcher.js +54 -28
  7. package/lib/ReactRelayQueryRenderer.js +28 -20
  8. package/lib/ReactRelayRefetchContainer.js +70 -58
  9. package/lib/ReactRelayTestMocker.js +56 -43
  10. package/lib/ReactRelayTypes.js +1 -1
  11. package/lib/RelayContext.js +8 -2
  12. package/lib/assertFragmentMap.js +9 -7
  13. package/lib/buildReactRelayContainer.js +32 -23
  14. package/lib/index.js +41 -0
  15. package/lib/isRelayEnvironment.js +1 -1
  16. package/lib/isRelayVariables.js +1 -1
  17. package/lib/readContext.js +7 -4
  18. package/package.json +4 -4
  19. package/react-relay.js +2 -2
  20. package/react-relay.min.js +2 -2
  21. package/classic.js +0 -10
  22. package/compat.js +0 -10
  23. package/lib/ConcreteQuery.js +0 -10
  24. package/lib/GraphQLQueryRunner.js +0 -264
  25. package/lib/GraphQLRange.js +0 -1124
  26. package/lib/GraphQLSegment.js +0 -743
  27. package/lib/GraphQLStoreChangeEmitter.js +0 -141
  28. package/lib/GraphQLStoreQueryResolver.js +0 -288
  29. package/lib/GraphQLStoreRangeUtils.js +0 -126
  30. package/lib/QueryBuilder.js +0 -228
  31. package/lib/ReactRelayClassicExports.js +0 -29
  32. package/lib/ReactRelayCompatContainerBuilder.js +0 -175
  33. package/lib/ReactRelayCompatPublic.js +0 -28
  34. package/lib/ReactRelayContainerProfiler.js +0 -30
  35. package/lib/ReactRelayFragmentContainer-flowtest.js +0 -201
  36. package/lib/ReactRelayPaginationContainer-flowtest.js +0 -213
  37. package/lib/ReactRelayPublic.js +0 -29
  38. package/lib/ReactRelayRefetchContainer-flowtest.js +0 -191
  39. package/lib/RelayCacheProcessor.js +0 -196
  40. package/lib/RelayChangeTracker.js +0 -83
  41. package/lib/RelayClassicContainerUtils.js +0 -49
  42. package/lib/RelayClassicCore.js +0 -34
  43. package/lib/RelayClassicRecordState.js +0 -31
  44. package/lib/RelayCompatContainer.js +0 -25
  45. package/lib/RelayCompatEnvironment.js +0 -27
  46. package/lib/RelayCompatMutations.js +0 -133
  47. package/lib/RelayCompatPaginationContainer.js +0 -27
  48. package/lib/RelayCompatRefetchContainer.js +0 -27
  49. package/lib/RelayCompatTypes.js +0 -10
  50. package/lib/RelayContainer.js +0 -889
  51. package/lib/RelayContainerComparators.js +0 -75
  52. package/lib/RelayContainerProxy.js +0 -21
  53. package/lib/RelayDefaultNetworkLayer.js +0 -192
  54. package/lib/RelayEnvironment.js +0 -449
  55. package/lib/RelayEnvironmentTypes.js +0 -10
  56. package/lib/RelayFetchMode.js +0 -17
  57. package/lib/RelayFragmentPointer.js +0 -161
  58. package/lib/RelayFragmentReference.js +0 -249
  59. package/lib/RelayFragmentSpecResolver.js +0 -305
  60. package/lib/RelayGraphQLMutation.js +0 -288
  61. package/lib/RelayGraphQLTag.js +0 -42
  62. package/lib/RelayInternalTypes.js +0 -15
  63. package/lib/RelayInternals.js +0 -24
  64. package/lib/RelayMetaRoute.js +0 -35
  65. package/lib/RelayMockRenderer.js +0 -71
  66. package/lib/RelayModern-flowtest.js +0 -342
  67. package/lib/RelayModernFlowtest_badref.graphql.js +0 -10
  68. package/lib/RelayModernFlowtest_notref.graphql.js +0 -10
  69. package/lib/RelayModernFlowtest_user.graphql.js +0 -10
  70. package/lib/RelayModernFlowtest_users.graphql.js +0 -10
  71. package/lib/RelayMutation.js +0 -322
  72. package/lib/RelayMutationDebugPrinter.js +0 -47
  73. package/lib/RelayMutationQuery.js +0 -558
  74. package/lib/RelayMutationQueue.js +0 -530
  75. package/lib/RelayMutationRequest.js +0 -103
  76. package/lib/RelayMutationTracker.js +0 -113
  77. package/lib/RelayMutationTransaction.js +0 -92
  78. package/lib/RelayMutationTransactionStatus.js +0 -55
  79. package/lib/RelayNetworkDebug.js +0 -131
  80. package/lib/RelayNetworkLayer.js +0 -185
  81. package/lib/RelayNodeInterface.js +0 -104
  82. package/lib/RelayOperationDescriptor.js +0 -40
  83. package/lib/RelayOptimisticMutationUtils.js +0 -208
  84. package/lib/RelayPendingQueryTracker.js +0 -166
  85. package/lib/RelayPropTypes.js +0 -57
  86. package/lib/RelayPublic.js +0 -44
  87. package/lib/RelayQL.js +0 -128
  88. package/lib/RelayQuery.js +0 -1584
  89. package/lib/RelayQueryCaching.js +0 -33
  90. package/lib/RelayQueryConfig.js +0 -58
  91. package/lib/RelayQueryPath.js +0 -204
  92. package/lib/RelayQueryRequest.js +0 -103
  93. package/lib/RelayQueryTracker.js +0 -86
  94. package/lib/RelayQueryTransform.js +0 -91
  95. package/lib/RelayQueryVisitor.js +0 -93
  96. package/lib/RelayQueryWriter.js +0 -573
  97. package/lib/RelayReadyState.js +0 -83
  98. package/lib/RelayReadyStateRenderer.js +0 -145
  99. package/lib/RelayRecord.js +0 -75
  100. package/lib/RelayRecordStatusMap.js +0 -57
  101. package/lib/RelayRecordStore.js +0 -433
  102. package/lib/RelayRecordWriter.js +0 -601
  103. package/lib/RelayRefQueryDescriptor.js +0 -27
  104. package/lib/RelayRenderer.js +0 -268
  105. package/lib/RelayRootContainer.js +0 -125
  106. package/lib/RelayRoute.js +0 -92
  107. package/lib/RelayRouteFragment.js +0 -44
  108. package/lib/RelaySelector.js +0 -201
  109. package/lib/RelayShallowMock.js +0 -69
  110. package/lib/RelayStaticContainer.js +0 -38
  111. package/lib/RelayStore.js +0 -12
  112. package/lib/RelayStoreConstants.js +0 -20
  113. package/lib/RelayStoreData.js +0 -660
  114. package/lib/RelayTaskQueue.js +0 -189
  115. package/lib/RelayTypes.js +0 -13
  116. package/lib/RelayVariable.js +0 -32
  117. package/lib/RelayVariables.js +0 -92
  118. package/lib/buildRQL.js +0 -160
  119. package/lib/callsFromGraphQL.js +0 -74
  120. package/lib/callsToGraphQL.js +0 -34
  121. package/lib/checkRelayQueryData.js +0 -250
  122. package/lib/createRelayQuery.js +0 -17
  123. package/lib/dedent.js +0 -49
  124. package/lib/diffRelayQuery.js +0 -757
  125. package/lib/directivesToGraphQL.js +0 -39
  126. package/lib/filterRelayQuery.js +0 -29
  127. package/lib/findRelayQueryLeaves.js +0 -293
  128. package/lib/flattenRelayQuery.js +0 -121
  129. package/lib/flattenSplitRelayQueries.js +0 -44
  130. package/lib/forEachRootCallArg.js +0 -40
  131. package/lib/fromGraphQL.js +0 -48
  132. package/lib/generateClientEdgeID.js +0 -22
  133. package/lib/generateClientID.js +0 -27
  134. package/lib/generateConcreteFragmentID.js +0 -30
  135. package/lib/generateForceIndex.js +0 -24
  136. package/lib/generateRQLFieldAlias.js +0 -39
  137. package/lib/getRangeBehavior.js +0 -58
  138. package/lib/getRelayQueries.js +0 -83
  139. package/lib/intersectRelayQuery.js +0 -149
  140. package/lib/isClassicRelayContext.js +0 -20
  141. package/lib/isClassicRelayEnvironment.js +0 -20
  142. package/lib/isCompatibleRelayFragmentType.js +0 -27
  143. package/lib/isRelayContainer.js +0 -16
  144. package/lib/makeLegacyStringishComponentRef.js +0 -52
  145. package/lib/printRelayOSSQuery.js +0 -329
  146. package/lib/printRelayQuery.js +0 -26
  147. package/lib/rangeOperationToMetadataKey.js +0 -25
  148. package/lib/readRelayQueryData.js +0 -551
  149. package/lib/relayUnstableBatchedUpdates.js +0 -12
  150. package/lib/relayUnstableBatchedUpdates.native.js +0 -11
  151. package/lib/restoreRelayCacheData.js +0 -188
  152. package/lib/serializeRelayQueryCall.js +0 -42
  153. package/lib/splitDeferredRelayQueries.js +0 -298
  154. package/lib/stableStringify.js +0 -85
  155. package/lib/testEditDistance.js +0 -112
  156. package/lib/throwFailedPromise.js +0 -26
  157. package/lib/toGraphQL.js +0 -94
  158. package/lib/transformRelayQueryPayload.js +0 -145
  159. package/lib/validateMutationConfig.js +0 -117
  160. package/lib/validateRelayReadQuery.js +0 -112
  161. package/lib/writeRelayQueryPayload.js +0 -44
  162. package/lib/writeRelayUpdatePayload.js +0 -513
  163. package/react-relay-classic.js +0 -4
  164. package/react-relay-classic.min.js +0 -9
  165. package/react-relay-compat.js +0 -4
  166. package/react-relay-compat.min.js +0 -9
@@ -1,145 +0,0 @@
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 _objectSpread2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/objectSpread"));
13
-
14
- var _inheritsLoose2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/inheritsLoose"));
15
-
16
- /**
17
- * @public
18
- *
19
- * RelayReadyStateRenderer synchronously renders a container and query config
20
- * given `readyState`. The `readyState` must be an accurate representation of
21
- * the data that currently resides in the supplied `environment`. If you need
22
- * data to be fetched in addition to rendering, please use `RelayRenderer`.
23
- *
24
- * If `readyState` is not supplied, the previously rendered `readyState` will
25
- * continue to be rendered (or null if there is no previous `readyState`).
26
- */
27
- var RelayReadyStateRenderer =
28
- /*#__PURE__*/
29
- function (_React$Component) {
30
- (0, _inheritsLoose2["default"])(RelayReadyStateRenderer, _React$Component);
31
-
32
- // TODO t16225453
33
- function RelayReadyStateRenderer(props, context) {
34
- var _this;
35
-
36
- _this = _React$Component.call(this, props, context) || this;
37
- _this._relay = {
38
- environment: props.environment,
39
- variables: props.queryConfig.params,
40
- route: props.queryConfig
41
- };
42
- _this.state = {
43
- getContainerProps: createContainerPropsFactory()
44
- };
45
- return _this;
46
- }
47
-
48
- var _proto = RelayReadyStateRenderer.prototype;
49
-
50
- _proto.UNSAFE_componentWillReceiveProps = function UNSAFE_componentWillReceiveProps(nextProps) {
51
- if (this.props.environment !== nextProps.environment || this.props.queryConfig !== nextProps.queryConfig) {
52
- this._relay = {
53
- environment: nextProps.environment,
54
- variables: nextProps.queryConfig.params,
55
- route: nextProps.queryConfig
56
- };
57
- }
58
- };
59
- /**
60
- * Avoid updating when we have fetched data but are still not ready.
61
- */
62
-
63
-
64
- _proto.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {
65
- var prevProps = this.props;
66
-
67
- if (prevProps.Container !== nextProps.Container || prevProps.environment !== nextProps.environment || prevProps.queryConfig !== nextProps.queryConfig || prevProps.render !== nextProps.render || prevProps.retry !== nextProps.retry) {
68
- return true;
69
- }
70
-
71
- var prevReadyState = prevProps.readyState;
72
- var nextReadyState = nextProps.readyState;
73
-
74
- if (prevReadyState == null || nextReadyState == null) {
75
- return true;
76
- }
77
-
78
- if (prevReadyState.aborted !== nextReadyState.aborted || prevReadyState.done !== nextReadyState.done || prevReadyState.error !== nextReadyState.error || prevReadyState.ready !== nextReadyState.ready || prevReadyState.stale !== nextReadyState.stale) {
79
- return true;
80
- }
81
-
82
- return nextReadyState.ready;
83
- };
84
-
85
- _proto.render = function render() {
86
- var children;
87
- var shouldUpdate = false;
88
- var _this$props = this.props,
89
- readyState = _this$props.readyState,
90
- render = _this$props.render;
91
-
92
- if (readyState) {
93
- if (render) {
94
- children = render({
95
- done: readyState.done,
96
- error: readyState.error,
97
- events: readyState.events,
98
- props: readyState.ready ? this.state.getContainerProps(this.props) : null,
99
- retry: this.props.retry,
100
- stale: readyState.stale
101
- });
102
- } else if (readyState.ready) {
103
- var Container = this.props.Container;
104
- children = require("react").createElement(Container, this.state.getContainerProps(this.props));
105
- }
106
-
107
- shouldUpdate = true;
108
- }
109
-
110
- if (children === undefined) {
111
- children = null;
112
- shouldUpdate = false;
113
- }
114
-
115
- return require("react").createElement(require("./ReactRelayContext").Provider, {
116
- value: this._relay
117
- }, require("react").createElement(require("./RelayStaticContainer"), {
118
- shouldUpdate: shouldUpdate
119
- }, children));
120
- };
121
-
122
- return RelayReadyStateRenderer;
123
- }(require("react").Component);
124
-
125
- function createContainerPropsFactory() {
126
- var prevProps;
127
- var querySet;
128
- return function (nextProps) {
129
- if (!querySet || !prevProps || prevProps.Container !== nextProps.Container || prevProps.queryConfig !== nextProps.queryConfig) {
130
- querySet = require("./getRelayQueries")(nextProps.Container, nextProps.queryConfig);
131
- }
132
-
133
- var containerProps = (0, _objectSpread2["default"])({}, nextProps.queryConfig.params, require("fbjs/lib/mapObject")(querySet, function (query) {
134
- return createFragmentPointerForRoot(nextProps.environment, query);
135
- }));
136
- prevProps = nextProps;
137
- return containerProps;
138
- };
139
- }
140
-
141
- function createFragmentPointerForRoot(environment, query) {
142
- return query ? require("./RelayFragmentPointer").createForRoot(environment.getStoreData().getQueuedStore(), query) : null;
143
- }
144
-
145
- module.exports = RelayReadyStateRenderer;
@@ -1,75 +0,0 @@
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 _objectSpread2 = require("@babel/runtime/helpers/interopRequireDefault")(require("@babel/runtime/helpers/objectSpread"));
13
-
14
- var MetadataKey = {
15
- DATA_ID: '__dataID__',
16
- FILTER_CALLS: '__filterCalls__',
17
- FORCE_INDEX: '__forceIndex__',
18
- MUTATION_IDS: '__mutationIDs__',
19
- MUTATION_STATUS: '__mutationStatus__',
20
- PATH: '__path__',
21
- RANGE: '__range__',
22
- RESOLVED_DEFERRED_FRAGMENTS: '__resolvedDeferredFragments__',
23
- RESOLVED_FRAGMENT_MAP: '__resolvedFragmentMap__',
24
- RESOLVED_FRAGMENT_MAP_GENERATION: '__resolvedFragmentMapGeneration__',
25
- STATUS: '__status__'
26
- };
27
- var metadataKeyLookup = {};
28
- Object.keys(MetadataKey).forEach(function (name) {
29
- metadataKeyLookup[MetadataKey[name]] = true;
30
- });
31
- /**
32
- * Records are plain objects with special metadata properties.
33
- */
34
-
35
- var RelayRecord = {
36
- MetadataKey: MetadataKey,
37
- create: function create(dataID) {
38
- return {
39
- __dataID__: dataID
40
- };
41
- },
42
- createWithFields: function createWithFields(dataID, fields) {
43
- return (0, _objectSpread2["default"])({
44
- __dataID__: dataID
45
- }, fields);
46
- },
47
- isRecord: function isRecord(maybeRecord) {
48
- return typeof maybeRecord === 'object' && maybeRecord != null && !Array.isArray(maybeRecord) && typeof maybeRecord.__dataID__ === 'string';
49
- },
50
- getRecord: function getRecord(maybeRecord) {
51
- if (RelayRecord.isRecord(maybeRecord)) {
52
- return maybeRecord;
53
- } else {
54
- return null;
55
- }
56
- },
57
- getDataID: function getDataID(record) {
58
- return record.__dataID__;
59
- },
60
- getDataIDForObject: function getDataIDForObject(maybeRecord) {
61
- return maybeRecord.__dataID__;
62
- },
63
-
64
- /**
65
- * Checks whether the given ID was created on the client, as opposed to an ID
66
- * that's understood by the server as well.
67
- */
68
- isClientID: function isClientID(dataID) {
69
- return dataID.indexOf('client:') === 0;
70
- },
71
- isMetadataKey: function isMetadataKey(key) {
72
- return metadataKeyLookup.hasOwnProperty(key);
73
- }
74
- };
75
- module.exports = RelayRecord;
@@ -1,57 +0,0 @@
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
- * Record might contain data from optimistic update.
13
- */
14
-
15
- var OPTIMISTIC_MASK = 0x01;
16
- /**
17
- * The subtree of data from this record contains partial data.
18
- */
19
-
20
- var PARTIAL_MASK = 0x04;
21
-
22
- function set(status, value, mask) {
23
- status = status || 0;
24
-
25
- if (value) {
26
- return status | mask; // eslint-disable-line no-bitwise
27
- } else {
28
- return status & ~mask; // eslint-disable-line no-bitwise
29
- }
30
- }
31
-
32
- function check(status, mask) {
33
- return ((status || 0) & mask) !== 0; // eslint-disable-line no-bitwise
34
- }
35
- /**
36
- * A set of functions for modifying `__status__` on records inside of
37
- * RelayStore.
38
- */
39
-
40
-
41
- var RelayRecordStatusMap = {
42
- setOptimisticStatus: function setOptimisticStatus(status, value) {
43
- return set(status, value, OPTIMISTIC_MASK);
44
- },
45
- isOptimisticStatus: function isOptimisticStatus(status) {
46
- return check(status, OPTIMISTIC_MASK);
47
- },
48
- // Should only be used on records read out from RelayRecordStore
49
- // by `readRelayQueryData`.
50
- setPartialStatus: function setPartialStatus(status, value) {
51
- return set(status, value, PARTIAL_MASK);
52
- },
53
- isPartialStatus: function isPartialStatus(status) {
54
- return check(status, PARTIAL_MASK);
55
- }
56
- };
57
- module.exports = RelayRecordStatusMap;
@@ -1,433 +0,0 @@
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 EMPTY = '';
13
-
14
- var FILTER_CALLS = require("./RelayRecord").MetadataKey.FILTER_CALLS,
15
- FORCE_INDEX = require("./RelayRecord").MetadataKey.FORCE_INDEX,
16
- MUTATION_IDS = require("./RelayRecord").MetadataKey.MUTATION_IDS,
17
- PATH = require("./RelayRecord").MetadataKey.PATH,
18
- RANGE = require("./RelayRecord").MetadataKey.RANGE,
19
- RESOLVED_FRAGMENT_MAP = require("./RelayRecord").MetadataKey.RESOLVED_FRAGMENT_MAP;
20
- /**
21
- * @internal
22
- *
23
- * `RelayRecordStore` is the central repository for all data fetched by the
24
- * client. Data is stored as a map from IDs to Records. Records are shapes of
25
- * data with globally unique "data IDs".
26
- */
27
-
28
-
29
- var RelayRecordStore =
30
- /*#__PURE__*/
31
- function () {
32
- function RelayRecordStore(records, rootCallMaps, nodeConnectionMap) {
33
- this._cachedRecords = records.cachedRecords;
34
- this._cachedRootCallMap = rootCallMaps && rootCallMaps.cachedRootCallMap || {};
35
- this._queuedRecords = records.queuedRecords;
36
- this._nodeConnectionMap = nodeConnectionMap || {};
37
- this._records = records.records;
38
- this._rootCallMap = rootCallMaps && rootCallMaps.rootCallMap || {};
39
- this._storage = [];
40
-
41
- if (this._queuedRecords) {
42
- this._storage.push(this._queuedRecords);
43
- }
44
-
45
- if (this._records) {
46
- this._storage.push(this._records);
47
- }
48
-
49
- if (this._cachedRecords) {
50
- this._storage.push(this._cachedRecords);
51
- }
52
- }
53
- /**
54
- * Get the data ID associated with a storage key (and optionally an
55
- * identifying argument value) for a root query.
56
- */
57
-
58
-
59
- var _proto = RelayRecordStore.prototype;
60
-
61
- _proto.getDataID = function getDataID(storageKey, identifyingArgValue) {
62
- if (require("./RelayNodeInterface").isNodeRootCall(storageKey)) {
63
- !(identifyingArgValue != null) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayRecordStore.getDataID(): Argument to `%s()` ' + 'cannot be null or undefined.', storageKey) : require("fbjs/lib/invariant")(false) : void 0;
64
- return identifyingArgValue;
65
- }
66
-
67
- if (identifyingArgValue == null) {
68
- identifyingArgValue = EMPTY;
69
- }
70
-
71
- if (this._rootCallMap.hasOwnProperty(storageKey) && this._rootCallMap[storageKey].hasOwnProperty(identifyingArgValue)) {
72
- return this._rootCallMap[storageKey][identifyingArgValue];
73
- } else if (this._cachedRootCallMap.hasOwnProperty(storageKey)) {
74
- return this._cachedRootCallMap[storageKey][identifyingArgValue];
75
- }
76
- };
77
- /**
78
- * Returns the status of the record stored at `dataID`.
79
- */
80
-
81
-
82
- _proto.getRecordState = function getRecordState(dataID) {
83
- var record = this._getRecord(dataID);
84
-
85
- if (record === null) {
86
- return require("./RelayClassicRecordState").NONEXISTENT;
87
- } else if (record === undefined) {
88
- return require("./RelayClassicRecordState").UNKNOWN;
89
- }
90
-
91
- return require("./RelayClassicRecordState").EXISTENT;
92
- };
93
- /**
94
- * Returns the path to a non-refetchable record.
95
- */
96
-
97
-
98
- _proto.getPathToRecord = function getPathToRecord(dataID) {
99
- var path = this._getField(dataID, PATH);
100
-
101
- return path;
102
- };
103
- /**
104
- * Returns whether a given record is affected by an optimistic update.
105
- */
106
-
107
-
108
- _proto.hasOptimisticUpdate = function hasOptimisticUpdate(dataID) {
109
- var queuedRecords = this._queuedRecords;
110
- return queuedRecords ? queuedRecords.hasOwnProperty(dataID) : false;
111
- };
112
- /**
113
- * Returns a list of client mutation IDs for queued mutations whose optimistic
114
- * updates are affecting the record corresponding the given dataID. Returns
115
- * null if the record isn't affected by any optimistic updates.
116
- */
117
-
118
-
119
- _proto.getClientMutationIDs = function getClientMutationIDs(dataID) {
120
- var queuedRecords = this._queuedRecords;
121
-
122
- if (queuedRecords) {
123
- var record = queuedRecords[dataID];
124
-
125
- if (record) {
126
- return record[MUTATION_IDS];
127
- }
128
- }
129
-
130
- return null;
131
- };
132
- /**
133
- * Check whether a given record has received data for a deferred fragment.
134
- */
135
-
136
-
137
- _proto.hasFragmentData = function hasFragmentData(dataID, fragmentID) {
138
- var resolvedFragmentMap = this._getField(dataID, RESOLVED_FRAGMENT_MAP);
139
-
140
- !(typeof resolvedFragmentMap === 'object' || resolvedFragmentMap == null) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayRecordStore.hasFragmentData(): Expected the map of ' + 'resolved deferred fragments associated with record `%s` to be null or ' + 'an object. Found a(n) `%s`.', dataID, typeof resolvedFragmentMap) : require("fbjs/lib/invariant")(false) : void 0;
141
- return !!(resolvedFragmentMap && resolvedFragmentMap[fragmentID]);
142
- };
143
-
144
- _proto.getType = function getType(dataID) {
145
- // `__typename` property is typed as `string`
146
- return this._getField(dataID, '__typename');
147
- };
148
- /**
149
- * Returns the value of the field for the given dataID.
150
- */
151
-
152
-
153
- _proto.getField = function getField(dataID, storageKey) {
154
- return this._getField(dataID, storageKey);
155
- };
156
- /**
157
- * Returns the Data ID of a linked record (eg the ID of the `address` record
158
- * in `actor{address}`).
159
- */
160
-
161
-
162
- _proto.getLinkedRecordID = function getLinkedRecordID(dataID, storageKey) {
163
- var field = this._getField(dataID, storageKey);
164
-
165
- if (field == null) {
166
- return field;
167
- }
168
-
169
- var record = require("./RelayRecord").getRecord(field);
170
-
171
- !record ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayRecordStore.getLinkedRecordID(): Expected field `%s` for record ' + '`%s` to have a linked record.', storageKey, dataID) : require("fbjs/lib/invariant")(false) : void 0;
172
- return require("./RelayRecord").getDataID(record);
173
- };
174
- /**
175
- * Returns an array of Data ID for a plural linked field (eg the actor IDs of
176
- * the `likers` in `story{likers}`).
177
- */
178
-
179
-
180
- _proto.getLinkedRecordIDs = function getLinkedRecordIDs(dataID, storageKey) {
181
- var field = this._getField(dataID, storageKey);
182
-
183
- if (field == null) {
184
- return field;
185
- }
186
-
187
- !Array.isArray(field) ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayRecordStore.getLinkedRecordIDs(): Expected field `%s` for ' + 'record `%s` to have an array of linked records.', storageKey, dataID) : require("fbjs/lib/invariant")(false) : void 0;
188
- return field.map(function (element, ii) {
189
- var record = require("./RelayRecord").getRecord(element);
190
-
191
- !record ? process.env.NODE_ENV !== "production" ? require("fbjs/lib/invariant")(false, 'RelayRecordStore.getLinkedRecordIDs(): Expected element at index %s ' + 'in field `%s` for record `%s` to be a linked record.', ii, storageKey, dataID) : require("fbjs/lib/invariant")(false) : void 0;
192
- return require("./RelayRecord").getDataID(record);
193
- });
194
- };
195
- /**
196
- * Gets the connectionIDs for all the connections that contain the given
197
- * record as a `node`, or null if the record does not appear as a `node` in
198
- * any connection.
199
- */
200
-
201
-
202
- _proto.getConnectionIDsForRecord = function getConnectionIDsForRecord(dataID) {
203
- var connectionIDs = this._nodeConnectionMap[dataID];
204
-
205
- if (connectionIDs) {
206
- return Object.keys(connectionIDs);
207
- }
208
-
209
- return null;
210
- };
211
- /**
212
- * Gets the connectionIDs for all variations of calls for the given base
213
- * schema name (Ex: `posts.orderby(recent)` and `posts.orderby(likes)`).
214
- */
215
-
216
-
217
- _proto.getConnectionIDsForField = function getConnectionIDsForField(dataID, schemaName) {
218
- // ignore queued records because not all range fields may be present there
219
- var record = this._records[dataID];
220
-
221
- if (record == null) {
222
- return record;
223
- }
224
-
225
- var connectionIDs;
226
-
227
- require("fbjs/lib/forEachObject")(record, function (datum, key) {
228
- if (datum && getFieldNameFromKey(key) === schemaName) {
229
- // $FlowFixMe(site=www,mobile) forEachObject is only typed in www
230
- var connectionID = require("./RelayRecord").getDataIDForObject(datum);
231
-
232
- if (connectionID) {
233
- connectionIDs = connectionIDs || [];
234
- connectionIDs.push(connectionID);
235
- }
236
- }
237
- });
238
-
239
- return connectionIDs;
240
- };
241
- /**
242
- * Get the force index associated with the range at `connectionID`.
243
- */
244
-
245
-
246
- _proto.getRangeForceIndex = function getRangeForceIndex(connectionID) {
247
- var forceIndex = this._getField(connectionID, FORCE_INDEX);
248
-
249
- if (forceIndex === null) {
250
- return -1;
251
- }
252
-
253
- return forceIndex || 0;
254
- };
255
- /**
256
- * Get the condition calls that were used to fetch the given connection.
257
- * Ex: for a field `photos.orderby(recent)`, this would be
258
- * [{name: 'orderby', value: 'recent'}]
259
- */
260
-
261
-
262
- _proto.getRangeFilterCalls = function getRangeFilterCalls(connectionID) {
263
- return this._getField(connectionID, FILTER_CALLS);
264
- };
265
- /**
266
- * Returns range information for the given connection field:
267
- * - `filteredEdges`: any edges already fetched for the given `calls`.
268
- * - `diffCalls`: an array of calls describing the difference
269
- * between the given `calls` and already fetched data. Includes conditional
270
- * calls (`orderby`) and range/offset calls (`first`, `after`).
271
- * - `filterCalls`: the subset of `calls` that are condition calls
272
- * (`orderby`).
273
- */
274
-
275
-
276
- _proto.getRangeMetadata = function getRangeMetadata(connectionID, calls) {
277
- var _this = this;
278
-
279
- if (connectionID == null) {
280
- return connectionID;
281
- }
282
-
283
- var range = this._getField(connectionID, RANGE);
284
-
285
- if (range == null) {
286
- if (range === null) {
287
- process.env.NODE_ENV !== "production" ? require("fbjs/lib/warning")(false, 'RelayRecordStore.getRangeMetadata(): Expected range to exist if ' + '`edges` has been fetched.') : void 0;
288
- }
289
-
290
- return undefined;
291
- }
292
-
293
- var filterCalls = getFilterCalls(calls); // Edges can only be fetched if a range call (first/last/find) is given.
294
- // Otherwise return diffCalls/filterCalls with empty edges.
295
-
296
- if (calls.length === filterCalls.length) {
297
- return {
298
- diffCalls: calls,
299
- filterCalls: filterCalls,
300
- pageInfo: undefined,
301
- requestedEdgeIDs: [],
302
- filteredEdges: []
303
- };
304
- }
305
-
306
- var queuedRecord = this._queuedRecords ? this._queuedRecords[connectionID] : null;
307
- var rangeInfo = range.retrieveRangeInfoForQuery(calls, queuedRecord);
308
- var diffCalls = rangeInfo.diffCalls;
309
- var pageInfo = rangeInfo.pageInfo,
310
- requestedEdgeIDs = rangeInfo.requestedEdgeIDs;
311
-
312
- if (diffCalls && diffCalls.length) {
313
- diffCalls = filterCalls.concat(diffCalls);
314
- } else {
315
- diffCalls = [];
316
- }
317
-
318
- var filteredEdges;
319
-
320
- if (requestedEdgeIDs) {
321
- var _ConnectionInterface$ = require("relay-runtime").ConnectionInterface.get(),
322
- NODE = _ConnectionInterface$.NODE;
323
-
324
- filteredEdges = requestedEdgeIDs.map(function (edgeID) {
325
- return {
326
- edgeID: edgeID,
327
- nodeID: _this.getLinkedRecordID(edgeID, NODE)
328
- };
329
- }).filter(function (edge) {
330
- return _this._getRecord(edge.nodeID);
331
- });
332
- } else {
333
- filteredEdges = [];
334
- }
335
-
336
- return {
337
- diffCalls: diffCalls,
338
- filterCalls: filterCalls,
339
- pageInfo: pageInfo,
340
- requestedEdgeIDs: requestedEdgeIDs,
341
- filteredEdges: filteredEdges
342
- };
343
- };
344
- /**
345
- * Returns whether there is a range at `connectionID`.
346
- */
347
-
348
-
349
- _proto.hasRange = function hasRange(connectionID) {
350
- return !!this._getField(connectionID, RANGE);
351
- };
352
- /**
353
- * Completely removes the record identified by `dataID` from the store.
354
- * This is only used by garbage collection.
355
- */
356
-
357
-
358
- _proto.removeRecord = function removeRecord(dataID) {
359
- delete this._records[dataID];
360
-
361
- if (this._queuedRecords) {
362
- delete this._queuedRecords[dataID];
363
- }
364
-
365
- if (this._cachedRecords) {
366
- delete this._cachedRecords[dataID];
367
- }
368
-
369
- delete this._nodeConnectionMap[dataID];
370
- };
371
- /**
372
- * Gets the first version of the record from the available caches.
373
- */
374
-
375
-
376
- _proto._getRecord = function _getRecord(dataID) {
377
- if (this._queuedRecords && this._queuedRecords.hasOwnProperty(dataID)) {
378
- return this._queuedRecords[dataID];
379
- } else if (this._records.hasOwnProperty(dataID)) {
380
- return this._records[dataID];
381
- } else if (this._cachedRecords) {
382
- return this._cachedRecords[dataID];
383
- }
384
- };
385
- /**
386
- * Get the value of the field from the first version of the record for which
387
- * the field is defined, returning `null` if the record has been deleted or
388
- * `undefined` if the record has not been fetched.
389
- */
390
-
391
-
392
- _proto._getField = function _getField(dataID, storageKey) {
393
- var storage = this._storage;
394
-
395
- for (var ii = 0; ii < storage.length; ii++) {
396
- var record = storage[ii][dataID];
397
-
398
- if (record === null) {
399
- return null;
400
- } else if (record && record.hasOwnProperty(storageKey)) {
401
- return record[storageKey];
402
- }
403
- }
404
-
405
- return undefined;
406
- };
407
-
408
- return RelayRecordStore;
409
- }();
410
- /**
411
- * Filter calls to only those that specify conditions on the returned results
412
- * (ex: `orderby(TOP_STORIES)`), removing generic calls (ex: `first`, `find`).
413
- */
414
-
415
-
416
- function getFilterCalls(calls) {
417
- return calls.filter(function (call) {
418
- return !require("relay-runtime").ConnectionInterface.isConnectionCall(call);
419
- });
420
- }
421
- /**
422
- * Returns the field name based on the object key used to store the data in
423
- * nodeData. It returns the field name without any calls. For example, the
424
- * field name for 'profile_picture{size:"50"}' will be 'profile_picture'
425
- */
426
-
427
-
428
- function getFieldNameFromKey(key) {
429
- // This is based on the GraphQL spec for what constitutes a valid field name.
430
- return key.split(/(?![_A-Za-z][_0-9A-Za-z]*)/, 1)[0];
431
- }
432
-
433
- module.exports = RelayRecordStore;