relay-runtime 20.1.1 → 21.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 (262) hide show
  1. package/experimental.js +1 -1
  2. package/experimental.js.flow +8 -8
  3. package/handlers/connection/ConnectionHandler.js.flow +5 -5
  4. package/handlers/connection/ConnectionInterface.js.flow +1 -1
  5. package/index.js +1 -1
  6. package/index.js.flow +125 -62
  7. package/lib/experimental.js +3 -3
  8. package/lib/index.js +105 -57
  9. package/lib/multi-actor-environment/ActorIdentifier.js +2 -2
  10. package/lib/multi-actor-environment/MultiActorEnvironment.js +3 -1
  11. package/lib/mutations/commitMutation.js +8 -8
  12. package/lib/mutations/validateMutation.js +4 -4
  13. package/lib/query/GraphQLTag.js +3 -3
  14. package/lib/query/fetchQuery.js +15 -3
  15. package/lib/store/DataChecker.js +38 -4
  16. package/lib/store/NormalizationEngine.js +373 -0
  17. package/lib/store/OperationExecutor.js +172 -113
  18. package/lib/store/RelayConcreteVariables.js +1 -1
  19. package/lib/store/RelayErrorTrie.js +2 -2
  20. package/lib/store/RelayExperimentalGraphResponseTransform.js +8 -8
  21. package/lib/store/RelayModernEnvironment.js +26 -19
  22. package/lib/store/RelayModernRecord.js +18 -8
  23. package/lib/store/RelayModernSelector.js +9 -9
  24. package/lib/store/RelayModernStore.js +152 -43
  25. package/lib/store/RelayPublishQueue.js +1 -1
  26. package/lib/store/RelayReader.js +76 -38
  27. package/lib/store/RelayRecordSource.js +6 -0
  28. package/lib/store/RelayReferenceMarker.js +2 -1
  29. package/lib/store/RelayResponseNormalizer.js +88 -55
  30. package/lib/store/RelayStoreSubscriptions.js +34 -10
  31. package/lib/store/RelayStoreUtils.js +8 -1
  32. package/lib/store/ResolverFragments.js +2 -2
  33. package/lib/store/live-resolvers/LiveResolverCache.js +25 -9
  34. package/lib/store/observeFragmentExperimental.js +17 -1
  35. package/lib/store/observeQueryExperimental.js +2 -2
  36. package/lib/subscription/requestSubscription.js +3 -3
  37. package/lib/util/RelayError.js +3 -0
  38. package/lib/util/RelayFeatureFlags.js +6 -2
  39. package/lib/util/RelayReplaySubject.js +4 -4
  40. package/lib/util/handlePotentialSnapshotErrors.js +2 -2
  41. package/lib/util/stableCopy.js +2 -2
  42. package/llm-docs/api-reference/entrypoint-apis/entrypoint-container.mdx +38 -0
  43. package/llm-docs/api-reference/entrypoint-apis/load-entrypoint.mdx +77 -0
  44. package/llm-docs/api-reference/entrypoint-apis/use-entrypoint-loader.mdx +99 -0
  45. package/llm-docs/api-reference/graphql/graphql-directives.mdx +378 -0
  46. package/llm-docs/api-reference/hooks/_use-lazy-load-query-extra.mdx +16 -0
  47. package/llm-docs/api-reference/hooks/load-query.mdx +84 -0
  48. package/llm-docs/api-reference/hooks/relay-environment-provider.mdx +78 -0
  49. package/llm-docs/api-reference/hooks/use-client-query.mdx +65 -0
  50. package/llm-docs/api-reference/hooks/use-fragment.mdx +69 -0
  51. package/llm-docs/api-reference/hooks/use-lazy-load-query.mdx +62 -0
  52. package/llm-docs/api-reference/hooks/use-mutation.mdx +94 -0
  53. package/llm-docs/api-reference/hooks/use-pagination-fragment.mdx +166 -0
  54. package/llm-docs/api-reference/hooks/use-prefetchable-forward-pagination-fragment.mdx +134 -0
  55. package/llm-docs/api-reference/hooks/use-preloaded-query.mdx +84 -0
  56. package/llm-docs/api-reference/hooks/use-query-loader.mdx +95 -0
  57. package/llm-docs/api-reference/hooks/use-refetchable-fragment.mdx +122 -0
  58. package/llm-docs/api-reference/hooks/use-relay-environment.mdx +37 -0
  59. package/llm-docs/api-reference/hooks/use-subscription.mdx +66 -0
  60. package/llm-docs/api-reference/relay-resolvers/docblock-format.mdx +321 -0
  61. package/llm-docs/api-reference/relay-resolvers/runtime-functions.mdx +94 -0
  62. package/llm-docs/api-reference/relay-runtime/commit-mutation.mdx +65 -0
  63. package/llm-docs/api-reference/relay-runtime/fetch-query.mdx +113 -0
  64. package/llm-docs/api-reference/relay-runtime/field-logger.mdx +170 -0
  65. package/llm-docs/api-reference/relay-runtime/observe-fragment.mdx +92 -0
  66. package/llm-docs/api-reference/relay-runtime/relay-environment.mdx +53 -0
  67. package/llm-docs/api-reference/relay-runtime/request-subscription.mdx +54 -0
  68. package/llm-docs/api-reference/relay-runtime/runtime-configuration.mdx +52 -0
  69. package/llm-docs/api-reference/relay-runtime/store.mdx +734 -0
  70. package/llm-docs/api-reference/relay-runtime/wait-for-fragment-data.mdx +89 -0
  71. package/llm-docs/api-reference/types/CacheConfig.mdx +8 -0
  72. package/llm-docs/api-reference/types/Disposable.mdx +4 -0
  73. package/llm-docs/api-reference/types/GraphQLSubscriptionConfig.mdx +17 -0
  74. package/llm-docs/api-reference/types/MutationConfig.mdx +31 -0
  75. package/llm-docs/api-reference/types/SelectorStoreUpdater.mdx +6 -0
  76. package/llm-docs/api-reference/types/UploadableMap.mdx +3 -0
  77. package/llm-docs/community/learning-resources.mdx +64 -0
  78. package/llm-docs/debugging/declarative-mutation-directives.mdx +34 -0
  79. package/llm-docs/debugging/disallowed-id-types-error.mdx +43 -0
  80. package/llm-docs/debugging/inconsistent-typename-error.mdx +47 -0
  81. package/llm-docs/debugging/relay-devtools.mdx +73 -0
  82. package/llm-docs/debugging/why-null.mdx +116 -0
  83. package/llm-docs/editor-support.mdx +55 -0
  84. package/llm-docs/error-reference/unknown-field.mdx +36 -0
  85. package/llm-docs/getting-started/babel-plugin.mdx +31 -0
  86. package/llm-docs/getting-started/compiler-config.mdx +25 -0
  87. package/llm-docs/getting-started/compiler.mdx +82 -0
  88. package/llm-docs/getting-started/lint-rules.mdx +87 -0
  89. package/llm-docs/getting-started/production.mdx +30 -0
  90. package/llm-docs/getting-started/quick-start.mdx +213 -0
  91. package/llm-docs/glossary/glossary.mdx +1040 -0
  92. package/llm-docs/guided-tour/list-data/advanced-pagination.mdx +157 -0
  93. package/llm-docs/guided-tour/list-data/connections.mdx +81 -0
  94. package/llm-docs/guided-tour/list-data/pagination.mdx +193 -0
  95. package/llm-docs/guided-tour/list-data/rendering-connections.mdx +112 -0
  96. package/llm-docs/guided-tour/list-data/streaming-pagination.mdx +87 -0
  97. package/llm-docs/guided-tour/managing-data-outside-react/retaining-queries.mdx +51 -0
  98. package/llm-docs/guided-tour/refetching/refetching-queries-with-different-data.mdx +337 -0
  99. package/llm-docs/guided-tour/refetching/refreshing-queries.mdx +350 -0
  100. package/llm-docs/guided-tour/rendering/environment.mdx +59 -0
  101. package/llm-docs/guided-tour/rendering/error-states.mdx +295 -0
  102. package/llm-docs/guided-tour/rendering/fragments.mdx +354 -0
  103. package/llm-docs/guided-tour/rendering/loading-states.mdx +245 -0
  104. package/llm-docs/guided-tour/rendering/queries.mdx +261 -0
  105. package/llm-docs/guided-tour/rendering/variables.mdx +233 -0
  106. package/llm-docs/guided-tour/reusing-cached-data/fetch-policies.mdx +56 -0
  107. package/llm-docs/guided-tour/reusing-cached-data/filling-in-missing-data.mdx +102 -0
  108. package/llm-docs/guided-tour/reusing-cached-data/introduction.mdx +22 -0
  109. package/llm-docs/guided-tour/reusing-cached-data/presence-of-data.mdx +93 -0
  110. package/llm-docs/guided-tour/reusing-cached-data/rendering-partially-cached-data.mdx +175 -0
  111. package/llm-docs/guided-tour/reusing-cached-data/staleness-of-data.mdx +116 -0
  112. package/llm-docs/guided-tour/updating-data/client-only-data.mdx +115 -0
  113. package/llm-docs/guided-tour/updating-data/graphql-mutations.mdx +334 -0
  114. package/llm-docs/guided-tour/updating-data/graphql-subscriptions.mdx +279 -0
  115. package/llm-docs/guided-tour/updating-data/imperatively-modifying-linked-fields.mdx +511 -0
  116. package/llm-docs/guided-tour/updating-data/imperatively-modifying-store-data-legacy.mdx +142 -0
  117. package/llm-docs/guided-tour/updating-data/imperatively-modifying-store-data.mdx +275 -0
  118. package/llm-docs/guided-tour/updating-data/introduction.mdx +25 -0
  119. package/llm-docs/guided-tour/updating-data/local-data-updates.mdx +71 -0
  120. package/llm-docs/guided-tour/updating-data/typesafe-updaters-faq.mdx +83 -0
  121. package/llm-docs/guided-tour/updating-data/updating-connections.mdx +592 -0
  122. package/llm-docs/guides/alias-directive.mdx +160 -0
  123. package/llm-docs/guides/catch-directive.mdx +167 -0
  124. package/llm-docs/guides/client-schema-extensions.mdx +208 -0
  125. package/llm-docs/guides/codemods.mdx +66 -0
  126. package/llm-docs/guides/data-driven-dependencies/client-3d.mdx +255 -0
  127. package/llm-docs/guides/data-driven-dependencies/configuration.mdx +127 -0
  128. package/llm-docs/guides/data-driven-dependencies/introduction.mdx +39 -0
  129. package/llm-docs/guides/data-driven-dependencies/server-3d.mdx +664 -0
  130. package/llm-docs/guides/document-comparison.mdx +106 -0
  131. package/llm-docs/guides/graphql-server-specification.mdx +453 -0
  132. package/llm-docs/guides/network-layer.mdx +69 -0
  133. package/llm-docs/guides/persisted-queries.mdx +328 -0
  134. package/llm-docs/guides/relay-resolvers/context.mdx +99 -0
  135. package/llm-docs/guides/relay-resolvers/defining-fields.mdx +151 -0
  136. package/llm-docs/guides/relay-resolvers/defining-types.mdx +164 -0
  137. package/llm-docs/guides/relay-resolvers/deprecated.mdx +27 -0
  138. package/llm-docs/guides/relay-resolvers/derived-fields.mdx +127 -0
  139. package/llm-docs/guides/relay-resolvers/descriptions.mdx +44 -0
  140. package/llm-docs/guides/relay-resolvers/enabling.mdx +41 -0
  141. package/llm-docs/guides/relay-resolvers/errors.mdx +64 -0
  142. package/llm-docs/guides/relay-resolvers/field-arguments.mdx +63 -0
  143. package/llm-docs/guides/relay-resolvers/introduction.mdx +62 -0
  144. package/llm-docs/guides/relay-resolvers/limitations.mdx +30 -0
  145. package/llm-docs/guides/relay-resolvers/live-fields.mdx +164 -0
  146. package/llm-docs/guides/relay-resolvers/return-types.mdx +161 -0
  147. package/llm-docs/guides/relay-resolvers/suspense.mdx +41 -0
  148. package/llm-docs/guides/required-directive.mdx +240 -0
  149. package/llm-docs/guides/semantic-nullability.mdx +93 -0
  150. package/llm-docs/guides/testing-relay-components.mdx +642 -0
  151. package/llm-docs/guides/testing-relay-with-preloaded-queries.mdx +160 -0
  152. package/llm-docs/guides/throw-on-field-error-directive.mdx +58 -0
  153. package/llm-docs/guides/type-emission.mdx +414 -0
  154. package/llm-docs/home.mdx +32 -0
  155. package/llm-docs/principles-and-architecture/architecture-overview.mdx +24 -0
  156. package/llm-docs/principles-and-architecture/compiler-architecture.mdx +106 -0
  157. package/llm-docs/principles-and-architecture/runtime-architecture.mdx +249 -0
  158. package/llm-docs/principles-and-architecture/thinking-in-graphql.mdx +309 -0
  159. package/llm-docs/principles-and-architecture/thinking-in-relay.mdx +104 -0
  160. package/llm-docs/principles-and-architecture/videos.mdx +50 -0
  161. package/llm-docs/tutorial/arrays-lists.mdx +126 -0
  162. package/llm-docs/tutorial/fragments-1.mdx +487 -0
  163. package/llm-docs/tutorial/graphql.mdx +172 -0
  164. package/llm-docs/tutorial/interfaces-polymorphism.mdx +161 -0
  165. package/llm-docs/tutorial/intro.mdx +58 -0
  166. package/llm-docs/tutorial/mutations-updates.mdx +624 -0
  167. package/llm-docs/tutorial/organizing-mutations-queries-and-subscriptions.mdx +13 -0
  168. package/llm-docs/tutorial/queries-1.mdx +267 -0
  169. package/llm-docs/tutorial/queries-2.mdx +389 -0
  170. package/llm-docs/tutorial/refetchable-fragments.mdx +352 -0
  171. package/multi-actor-environment/ActorIdentifier.js.flow +2 -2
  172. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +7 -7
  173. package/multi-actor-environment/ActorUtils.js.flow +1 -1
  174. package/multi-actor-environment/MultiActorEnvironment.js.flow +12 -8
  175. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +3 -3
  176. package/mutations/RelayDeclarativeMutationConfig.js.flow +9 -9
  177. package/mutations/RelayRecordProxy.js.flow +8 -11
  178. package/mutations/RelayRecordSourceMutator.js.flow +4 -4
  179. package/mutations/RelayRecordSourceProxy.js.flow +4 -4
  180. package/mutations/RelayRecordSourceSelectorProxy.js.flow +6 -6
  181. package/mutations/applyOptimisticMutation.js.flow +2 -2
  182. package/mutations/commitMutation.js.flow +20 -16
  183. package/mutations/createUpdatableProxy.js.flow +19 -19
  184. package/mutations/readUpdatableFragment.js.flow +3 -3
  185. package/mutations/readUpdatableQuery.js.flow +3 -3
  186. package/mutations/validateMutation.js.flow +7 -7
  187. package/network/RelayNetworkTypes.js.flow +4 -4
  188. package/network/RelayObservable.js.flow +16 -14
  189. package/network/RelayQueryResponseCache.js.flow +3 -3
  190. package/network/wrapNetworkWithLogObserver.js.flow +1 -1
  191. package/package.json +2 -1
  192. package/query/GraphQLTag.js.flow +22 -10
  193. package/query/fetchQuery.js.flow +23 -10
  194. package/query/fetchQuery_DEPRECATED.js.flow +1 -1
  195. package/store/DataChecker.js.flow +43 -9
  196. package/store/NormalizationEngine.js.flow +779 -0
  197. package/store/OperationExecutor.js.flow +173 -70
  198. package/store/RelayConcreteVariables.js.flow +5 -5
  199. package/store/RelayErrorTrie.js.flow +12 -12
  200. package/store/RelayExperimentalGraphResponseHandler.js.flow +3 -3
  201. package/store/RelayExperimentalGraphResponseTransform.js.flow +10 -10
  202. package/store/RelayModernEnvironment.js.flow +41 -26
  203. package/store/RelayModernFragmentSpecResolver.js.flow +1 -1
  204. package/store/RelayModernOperationDescriptor.js.flow +1 -1
  205. package/store/RelayModernRecord.js.flow +44 -20
  206. package/store/RelayModernSelector.js.flow +21 -21
  207. package/store/RelayModernStore.js.flow +219 -58
  208. package/store/RelayOperationTracker.js.flow +2 -2
  209. package/store/RelayOptimisticRecordSource.js.flow +2 -2
  210. package/store/RelayPublishQueue.js.flow +21 -12
  211. package/store/RelayReader.js.flow +129 -57
  212. package/store/RelayRecordSource.js.flow +10 -0
  213. package/store/RelayRecordState.js.flow +1 -1
  214. package/store/RelayReferenceMarker.js.flow +5 -4
  215. package/store/RelayResponseNormalizer.js.flow +125 -57
  216. package/store/RelayStoreSubscriptions.js.flow +52 -8
  217. package/store/RelayStoreTypes.js.flow +153 -64
  218. package/store/RelayStoreUtils.js.flow +15 -7
  219. package/store/ResolverCache.js.flow +2 -2
  220. package/store/ResolverFragments.js.flow +12 -12
  221. package/store/StoreInspector.js.flow +6 -7
  222. package/store/cloneRelayHandleSourceField.js.flow +1 -1
  223. package/store/cloneRelayScalarHandleSourceField.js.flow +1 -1
  224. package/store/createRelayContext.js.flow +1 -1
  225. package/store/createRelayLoggingContext.js.flow +4 -4
  226. package/store/defaultGetDataID.js.flow +2 -2
  227. package/store/isRelayModernEnvironment.js.flow +4 -2
  228. package/store/live-resolvers/LiveResolverCache.js.flow +55 -20
  229. package/store/live-resolvers/LiveResolverSuspenseSentinel.js.flow +3 -3
  230. package/store/live-resolvers/getOutputTypeRecordIDs.js.flow +1 -1
  231. package/store/live-resolvers/isLiveStateValue.js.flow +2 -2
  232. package/store/live-resolvers/resolverDataInjector.js.flow +8 -5
  233. package/store/observeFragmentExperimental.js.flow +49 -20
  234. package/store/observeQueryExperimental.js.flow +5 -5
  235. package/store/readInlineData.js.flow +4 -4
  236. package/store/waitForFragmentExperimental.js.flow +3 -3
  237. package/subscription/requestSubscription.js.flow +7 -7
  238. package/util/NormalizationNode.js.flow +34 -32
  239. package/util/ReaderNode.js.flow +32 -30
  240. package/util/RelayConcreteNode.js.flow +5 -5
  241. package/util/RelayError.js.flow +4 -1
  242. package/util/RelayFeatureFlags.js.flow +21 -1
  243. package/util/RelayProfiler.js.flow +1 -1
  244. package/util/RelayReplaySubject.js.flow +3 -3
  245. package/util/RelayRuntimeTypes.js.flow +11 -11
  246. package/util/createPayloadFor3DField.js.flow +9 -5
  247. package/util/deepFreeze.js.flow +2 -2
  248. package/util/getFragmentIdentifier.js.flow +1 -1
  249. package/util/getPaginationMetadata.js.flow +1 -1
  250. package/util/getPaginationVariables.js.flow +1 -1
  251. package/util/getPendingOperationsForFragment.js.flow +2 -2
  252. package/util/getRefetchMetadata.js.flow +6 -5
  253. package/util/getValueAtPath.js.flow +3 -3
  254. package/util/handlePotentialSnapshotErrors.js.flow +5 -5
  255. package/util/isEmptyObject.js.flow +1 -1
  256. package/util/isPromise.js.flow +2 -2
  257. package/util/isScalarAndEqual.js.flow +1 -1
  258. package/util/recycleNodesInto.js.flow +2 -2
  259. package/util/registerEnvironmentWithDevTools.js.flow +1 -1
  260. package/util/shallowFreeze.js.flow +1 -1
  261. package/util/stableCopy.js.flow +5 -5
  262. package/util/withProvidedVariables.js.flow +14 -10
@@ -120,6 +120,6 @@ function getNestedErrorTrieByKey(trie, key) {
120
120
  module.exports = {
121
121
  SELF: SELF,
122
122
  buildErrorTrie: buildErrorTrie,
123
- getNestedErrorTrieByKey: getNestedErrorTrieByKey,
124
- getErrorsByKey: getErrorsByKey
123
+ getErrorsByKey: getErrorsByKey,
124
+ getNestedErrorTrieByKey: getNestedErrorTrieByKey
125
125
  };
@@ -89,10 +89,10 @@ var GraphModeNormalizer = /*#__PURE__*/function () {
89
89
  yield* this._traverseSelections(node, data, rootFields, dataID, new Set());
90
90
  var $streamID = this._getStreamID();
91
91
  yield (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, rootFields), {}, {
92
- $kind: 'Record',
93
- $streamID: $streamID,
94
92
  __id: dataID,
95
- __typename: ROOT_TYPE
93
+ __typename: ROOT_TYPE,
94
+ $kind: 'Record',
95
+ $streamID: $streamID
96
96
  });
97
97
  yield {
98
98
  $kind: 'Complete'
@@ -104,9 +104,9 @@ var GraphModeNormalizer = /*#__PURE__*/function () {
104
104
  if (maybeStreamID == null) {
105
105
  this._cacheKeyToStreamID.set(cacheKey, $streamID);
106
106
  yield (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, fields), {}, {
107
- $kind: 'Record',
108
- __typename: typename,
109
107
  __id: cacheKey,
108
+ __typename: typename,
109
+ $kind: 'Record',
110
110
  $streamID: $streamID
111
111
  });
112
112
  } else if (Object.keys(fields).length > 0) {
@@ -190,13 +190,13 @@ var GraphModeNormalizer = /*#__PURE__*/function () {
190
190
  yield* this._traverseSelections(selection, data, parentFields, parentID, sentFields);
191
191
  } else {
192
192
  this._incrementalPlaceholders.push({
193
- kind: 'defer',
193
+ actorIdentifier: this._actorIdentifier,
194
194
  data: data,
195
+ kind: 'defer',
195
196
  label: selection.label,
196
197
  path: (0, _toConsumableArray2["default"])(this._path),
197
198
  selector: createNormalizationSelector(selection, parentID, this._variables),
198
- typeName: this._getObjectType(data),
199
- actorIdentifier: this._actorIdentifier
199
+ typeName: this._getObjectType(data)
200
200
  });
201
201
  }
202
202
  break;
@@ -24,6 +24,7 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
24
24
  var _config$store, _config$log, _config$relayFieldLog, _config$UNSTABLE_defa, _config$getDataID, _config$missingFieldH, _config$handlerProvid, _config$scheduler, _config$isServer, _config$normalizeResp, _config$operationTrac;
25
25
  this.configName = config.configName;
26
26
  this._treatMissingFieldsAsNull = config.treatMissingFieldsAsNull === true;
27
+ this._deferDeduplicatedFields = config.deferDeduplicatedFields === true;
27
28
  var operationLoader = config.operationLoader;
28
29
  if (process.env.NODE_ENV !== "production") {
29
30
  if (operationLoader != null) {
@@ -31,9 +32,9 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
31
32
  }
32
33
  }
33
34
  var store = (_config$store = config.store) !== null && _config$store !== void 0 ? _config$store : new RelayModernStore(new RelayRecordSource(), {
35
+ getDataID: config.getDataID,
34
36
  log: config.log,
35
37
  operationLoader: config.operationLoader,
36
- getDataID: config.getDataID,
37
38
  shouldProcessClientComponents: config.shouldProcessClientComponents
38
39
  });
39
40
  this.__log = (_config$log = config.log) !== null && _config$log !== void 0 ? _config$log : emptyFunction;
@@ -166,6 +167,11 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
166
167
  _proto.retain = function retain(operation) {
167
168
  return this._store.retain(operation);
168
169
  };
170
+ _proto.experimental_batchUpdates = function experimental_batchUpdates(callback) {
171
+ var batchFn = this._store.experimental_batchUpdates;
172
+ !(typeof batchFn === 'function') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernEnvironment: The current store does not support experimental_batchUpdates.') : invariant(false) : void 0;
173
+ batchFn.call(this._store, callback);
174
+ };
169
175
  _proto.isServer = function isServer() {
170
176
  return this._isServer;
171
177
  };
@@ -174,7 +180,6 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
174
180
  var target = RelayRecordSource.create();
175
181
  var source = this._store.getSource();
176
182
  var result = this._store.check(operation, {
177
- handlers: handlers,
178
183
  defaultActorIdentifier: INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE,
179
184
  getSourceForActor: function getSourceForActor(actorIdentifier) {
180
185
  assertInternalActorIdentifier(actorIdentifier);
@@ -183,7 +188,8 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
183
188
  getTargetForActor: function getTargetForActor(actorIdentifier) {
184
189
  assertInternalActorIdentifier(actorIdentifier);
185
190
  return target;
186
- }
191
+ },
192
+ handlers: handlers
187
193
  });
188
194
  if (target.size() > 0) {
189
195
  this._scheduleUpdates(function () {
@@ -275,7 +281,7 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
275
281
  return "RelayModernEnvironment(".concat((_this$configName = this.configName) !== null && _this$configName !== void 0 ? _this$configName : '', ")");
276
282
  };
277
283
  _proto._execute = function _execute(_ref5) {
278
- var _this10 = this;
284
+ var _this0 = this;
279
285
  var createSource = _ref5.createSource,
280
286
  isClientPayload = _ref5.isClientPayload,
281
287
  operation = _ref5.operation,
@@ -286,29 +292,30 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
286
292
  return RelayObservable.create(function (sink) {
287
293
  var executor = OperationExecutor.execute({
288
294
  actorIdentifier: INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE,
289
- getDataID: _this10._getDataID,
290
- isClientPayload: isClientPayload,
291
- log: _this10.__log,
292
- operation: operation,
293
- operationExecutions: _this10._operationExecutions,
294
- operationLoader: _this10._operationLoader,
295
- operationTracker: _this10._operationTracker,
296
- optimisticConfig: optimisticConfig,
295
+ getDataID: _this0._getDataID,
297
296
  getPublishQueue: function getPublishQueue(actorIdentifier) {
298
297
  assertInternalActorIdentifier(actorIdentifier);
299
298
  return publishQueue;
300
299
  },
301
- scheduler: _this10._scheduler,
302
- shouldProcessClientComponents: _this10._shouldProcessClientComponents,
303
- sink: sink,
304
- source: createSource(),
305
300
  getStore: function getStore(actorIdentifier) {
306
301
  assertInternalActorIdentifier(actorIdentifier);
307
302
  return store;
308
303
  },
309
- treatMissingFieldsAsNull: _this10._treatMissingFieldsAsNull,
310
- updater: updater,
311
- normalizeResponse: _this10._normalizeResponse
304
+ isClientPayload: isClientPayload,
305
+ log: _this0.__log,
306
+ normalizeResponse: _this0._normalizeResponse,
307
+ operation: operation,
308
+ operationExecutions: _this0._operationExecutions,
309
+ operationLoader: _this0._operationLoader,
310
+ operationTracker: _this0._operationTracker,
311
+ optimisticConfig: optimisticConfig,
312
+ scheduler: _this0._scheduler,
313
+ shouldProcessClientComponents: _this0._shouldProcessClientComponents,
314
+ sink: sink,
315
+ source: createSource(),
316
+ treatMissingFieldsAsNull: _this0._treatMissingFieldsAsNull,
317
+ deferDeduplicatedFields: _this0._deferDeduplicatedFields,
318
+ updater: updater
312
319
  });
313
320
  return function () {
314
321
  return executor.cancel();
@@ -292,6 +292,15 @@ function getResolverLinkedRecordIDs(record, typeName) {
292
292
  return generateClientObjectClientID(typeName, id);
293
293
  });
294
294
  }
295
+ function hasFieldChanged(prevRecord, nextRecord, storageKey) {
296
+ var _prevRecord$ERRORS_KE, _nextRecord$ERRORS_KE;
297
+ if (!areEqual(prevRecord[storageKey], nextRecord[storageKey])) {
298
+ return true;
299
+ }
300
+ var prevErrors = (_prevRecord$ERRORS_KE = prevRecord[ERRORS_KEY]) === null || _prevRecord$ERRORS_KE === void 0 ? void 0 : _prevRecord$ERRORS_KE[storageKey];
301
+ var nextErrors = (_nextRecord$ERRORS_KE = nextRecord[ERRORS_KEY]) === null || _nextRecord$ERRORS_KE === void 0 ? void 0 : _nextRecord$ERRORS_KE[storageKey];
302
+ return !areEqual(prevErrors, nextErrors);
303
+ }
295
304
  function toJSON(record) {
296
305
  return record;
297
306
  }
@@ -301,26 +310,27 @@ module.exports = {
301
310
  create: create,
302
311
  freeze: freeze,
303
312
  fromObject: fromObject,
313
+ getActorLinkedRecordID: getActorLinkedRecordID,
304
314
  getDataID: getDataID,
305
315
  getErrors: getErrors,
306
316
  getFields: getFields,
307
317
  getInvalidationEpoch: getInvalidationEpoch,
308
318
  getLinkedRecordID: getLinkedRecordID,
309
319
  getLinkedRecordIDs: getLinkedRecordIDs,
320
+ getResolverLinkedRecordID: getResolverLinkedRecordID,
321
+ getResolverLinkedRecordIDs: getResolverLinkedRecordIDs,
310
322
  getType: getType,
311
323
  getValue: getValue,
312
- hasValue: hasValue,
324
+ hasFieldChanged: hasFieldChanged,
313
325
  hasLinkedRecordID: hasLinkedRecordID,
314
326
  hasLinkedRecordIDs: hasLinkedRecordIDs,
327
+ hasValue: hasValue,
315
328
  merge: merge,
329
+ setActorLinkedRecordID: setActorLinkedRecordID,
316
330
  setErrors: setErrors,
317
- setValue: setValue,
318
331
  setLinkedRecordID: setLinkedRecordID,
319
332
  setLinkedRecordIDs: setLinkedRecordIDs,
320
- update: update,
321
- getActorLinkedRecordID: getActorLinkedRecordID,
322
- setActorLinkedRecordID: setActorLinkedRecordID,
323
- getResolverLinkedRecordID: getResolverLinkedRecordID,
324
- getResolverLinkedRecordIDs: getResolverLinkedRecordIDs,
325
- toJSON: toJSON
333
+ setValue: setValue,
334
+ toJSON: toJSON,
335
+ update: update
326
336
  };
@@ -210,13 +210,13 @@ function createReaderSelector(fragment, dataID, variables, request) {
210
210
  var isWithinUnmatchedTypeRefinement = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
211
211
  var clientEdgeTraversalPath = arguments.length > 5 ? arguments[5] : undefined;
212
212
  return {
213
- kind: 'SingularReaderSelector',
213
+ clientEdgeTraversalPath: clientEdgeTraversalPath !== null && clientEdgeTraversalPath !== void 0 ? clientEdgeTraversalPath : null,
214
214
  dataID: dataID,
215
215
  isWithinUnmatchedTypeRefinement: isWithinUnmatchedTypeRefinement,
216
- clientEdgeTraversalPath: clientEdgeTraversalPath !== null && clientEdgeTraversalPath !== void 0 ? clientEdgeTraversalPath : null,
216
+ kind: 'SingularReaderSelector',
217
217
  node: fragment,
218
- variables: variables,
219
- owner: request
218
+ owner: request,
219
+ variables: variables
220
220
  };
221
221
  }
222
222
  function createNormalizationSelector(node, dataID, variables) {
@@ -228,16 +228,16 @@ function createNormalizationSelector(node, dataID, variables) {
228
228
  }
229
229
  module.exports = {
230
230
  areEqualSelectors: areEqualSelectors,
231
- createReaderSelector: createReaderSelector,
232
231
  createNormalizationSelector: createNormalizationSelector,
232
+ createReaderSelector: createReaderSelector,
233
233
  getDataIDsFromFragment: getDataIDsFromFragment,
234
234
  getDataIDsFromObject: getDataIDsFromObject,
235
- getSingularSelector: getSingularSelector,
236
235
  getPluralSelector: getPluralSelector,
237
236
  getSelector: getSelector,
238
237
  getSelectorsFromObject: getSelectorsFromObject,
239
- getVariablesFromSingularFragment: getVariablesFromSingularFragment,
240
- getVariablesFromPluralFragment: getVariablesFromPluralFragment,
238
+ getSingularSelector: getSingularSelector,
241
239
  getVariablesFromFragment: getVariablesFromFragment,
242
- getVariablesFromObject: getVariablesFromObject
240
+ getVariablesFromObject: getVariablesFromObject,
241
+ getVariablesFromPluralFragment: getVariablesFromPluralFragment,
242
+ getVariablesFromSingularFragment: getVariablesFromSingularFragment
243
243
  };
@@ -7,6 +7,7 @@ var _require = require('../multi-actor-environment/ActorIdentifier'),
7
7
  INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE = _require.INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE,
8
8
  assertInternalActorIdentifier = _require.assertInternalActorIdentifier;
9
9
  var deepFreeze = require('../util/deepFreeze');
10
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
10
11
  var resolveImmediate = require('../util/resolveImmediate');
11
12
  var DataChecker = require('./DataChecker');
12
13
  var defaultGetDataID = require('./defaultGetDataID');
@@ -21,14 +22,16 @@ var RelayReferenceMarker = require('./RelayReferenceMarker');
21
22
  var RelayStoreSubscriptions = require('./RelayStoreSubscriptions');
22
23
  var RelayStoreUtils = require('./RelayStoreUtils');
23
24
  var _require3 = require('./RelayStoreUtils'),
25
+ FIELD_GRANULAR_NOTIFICATIONS_KEY = _require3.FIELD_GRANULAR_NOTIFICATIONS_KEY,
24
26
  ROOT_ID = _require3.ROOT_ID,
25
- ROOT_TYPE = _require3.ROOT_TYPE;
27
+ ROOT_TYPE = _require3.ROOT_TYPE,
28
+ getFieldNotificationKey = _require3.getFieldNotificationKey;
26
29
  var invariant = require('invariant');
27
30
  var DEFAULT_RELEASE_BUFFER_SIZE = 10;
28
31
  var RelayModernStore = /*#__PURE__*/function () {
29
32
  function RelayModernStore(source, options) {
30
33
  var _this = this;
31
- var _options$gcReleaseBuf, _options$shouldRetain, _options$gcScheduler, _options$getDataID, _options$log, _options$operationLoa, _options$shouldProces, _options$treatMissing;
34
+ var _options$gcReleaseBuf, _options$shouldRetain, _options$gcScheduler, _options$getDataID, _options$log, _options$operationLoa, _options$shouldProces, _options$treatMissing, _options$deferDedupli;
32
35
  (0, _defineProperty2["default"])(this, "_gcStep", function () {
33
36
  if (_this._gcRun) {
34
37
  if (_this._gcRun.next().done) {
@@ -73,7 +76,9 @@ var RelayModernStore = /*#__PURE__*/function () {
73
76
  this._updatedRecordIDs = new Set();
74
77
  this._shouldProcessClientComponents = (_options$shouldProces = options === null || options === void 0 ? void 0 : options.shouldProcessClientComponents) !== null && _options$shouldProces !== void 0 ? _options$shouldProces : false;
75
78
  this._treatMissingFieldsAsNull = (_options$treatMissing = options === null || options === void 0 ? void 0 : options.treatMissingFieldsAsNull) !== null && _options$treatMissing !== void 0 ? _options$treatMissing : false;
79
+ this._deferDeduplicatedFields = (_options$deferDedupli = options === null || options === void 0 ? void 0 : options.deferDeduplicatedFields) !== null && _options$deferDedupli !== void 0 ? _options$deferDedupli : false;
76
80
  this._actorIdentifier = options === null || options === void 0 ? void 0 : options.actorIdentifier;
81
+ this._batch = null;
77
82
  initializeRecordSource(this._recordSource);
78
83
  }
79
84
  var _proto = RelayModernStore.prototype;
@@ -107,6 +112,65 @@ var RelayModernStore = /*#__PURE__*/function () {
107
112
  }
108
113
  }
109
114
  };
115
+ _proto.experimental_batchUpdates = function experimental_batchUpdates(callback) {
116
+ if (this._batch != null) {
117
+ throw new Error('RelayModernStore: Cannot batch updates while already batching updates.');
118
+ }
119
+ var log = this.__log;
120
+ if (log != null) {
121
+ log({
122
+ name: 'store.batch.start'
123
+ });
124
+ }
125
+ var batch = {
126
+ sourceOperations: [],
127
+ invalidateStore: false
128
+ };
129
+ this._batch = batch;
130
+ try {
131
+ callback();
132
+ } finally {
133
+ this._batch = null;
134
+ this.notify(undefined, batch.invalidateStore);
135
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(batch.sourceOperations),
136
+ _step;
137
+ try {
138
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
139
+ var sourceOperation = _step.value;
140
+ this._recordSourceOperation(sourceOperation);
141
+ }
142
+ } catch (err) {
143
+ _iterator.e(err);
144
+ } finally {
145
+ _iterator.f();
146
+ }
147
+ if (log != null) {
148
+ log({
149
+ name: 'store.batch.complete',
150
+ sourceOperations: batch.sourceOperations,
151
+ invalidateStore: batch.invalidateStore
152
+ });
153
+ }
154
+ }
155
+ };
156
+ _proto.batchLiveStateUpdatesWithoutNotify = function batchLiveStateUpdatesWithoutNotify(callback) {
157
+ if (this.__log != null) {
158
+ this.__log({
159
+ name: 'liveresolver.batch.start'
160
+ });
161
+ }
162
+ var hasPublished = false;
163
+ try {
164
+ hasPublished = this._resolverCache.batchLiveStateUpdatesWithoutNotify(callback);
165
+ } finally {
166
+ if (this.__log != null) {
167
+ this.__log({
168
+ name: 'liveresolver.batch.end'
169
+ });
170
+ }
171
+ }
172
+ return hasPublished;
173
+ };
110
174
  _proto.check = function check(operation, options) {
111
175
  var _ref, _operation$request$no, _operation$request$no2, _options$handlers, _options$getSourceFor, _options$getTargetFor, _options$defaultActor;
112
176
  var selector = operation.root;
@@ -197,7 +261,7 @@ var RelayModernStore = /*#__PURE__*/function () {
197
261
  });
198
262
  }
199
263
  var source = this.getSource();
200
- var snapshot = RelayReader.read(source, selector, this._resolverCache, this._resolverContext);
264
+ var snapshot = RelayReader.read(source, selector, log, this._resolverCache, this._resolverContext);
201
265
  if (process.env.NODE_ENV !== "production") {
202
266
  deepFreeze(snapshot);
203
267
  }
@@ -211,6 +275,16 @@ var RelayModernStore = /*#__PURE__*/function () {
211
275
  };
212
276
  _proto.notify = function notify(sourceOperation, invalidateStore) {
213
277
  var _this3 = this;
278
+ var batch = this._batch;
279
+ if (batch != null) {
280
+ if (sourceOperation != null) {
281
+ batch.sourceOperations.push(sourceOperation);
282
+ }
283
+ if (invalidateStore === true) {
284
+ batch.invalidateStore = true;
285
+ }
286
+ return [];
287
+ }
214
288
  var log = this.__log;
215
289
  if (log != null) {
216
290
  log({
@@ -218,34 +292,36 @@ var RelayModernStore = /*#__PURE__*/function () {
218
292
  sourceOperation: sourceOperation
219
293
  });
220
294
  }
221
- this._currentWriteEpoch++;
222
- if (invalidateStore === true) {
223
- this._globalInvalidationEpoch = this._currentWriteEpoch;
295
+ if (!RelayFeatureFlags.OPTIMIZE_NOTIFY) {
296
+ this._currentWriteEpoch++;
297
+ if (invalidateStore === true) {
298
+ this._globalInvalidationEpoch = this._currentWriteEpoch;
299
+ }
300
+ }
301
+ if (!RelayFeatureFlags.OPTIMIZE_NOTIFY || this._updatedRecordIDs.size > 0) {
302
+ this._resolverCache.invalidateDataIDs(this._updatedRecordIDs);
224
303
  }
225
- this._resolverCache.invalidateDataIDs(this._updatedRecordIDs);
226
304
  var source = this.getSource();
227
305
  var updatedOwners = [];
228
- this._storeSubscriptions.updateSubscriptions(source, this._updatedRecordIDs, updatedOwners, sourceOperation);
229
- this._invalidationSubscriptions.forEach(function (subscription) {
230
- _this3._updateInvalidationSubscription(subscription, invalidateStore === true);
231
- });
232
- if (sourceOperation != null) {
233
- var id = sourceOperation.request.identifier;
234
- var rootEntry = this._roots.get(id);
235
- if (rootEntry != null) {
236
- rootEntry.epoch = this._currentWriteEpoch;
237
- rootEntry.fetchTime = Date.now();
238
- } else if (sourceOperation.request.node.params.operationKind === 'query' && this._gcReleaseBufferSize > 0 && this._releaseBuffer.length < this._gcReleaseBufferSize) {
239
- var temporaryRootEntry = {
240
- operation: sourceOperation,
241
- refCount: 0,
242
- epoch: this._currentWriteEpoch,
243
- fetchTime: Date.now()
244
- };
245
- this._releaseBuffer.push(id);
246
- this._roots.set(id, temporaryRootEntry);
306
+ if (!RelayFeatureFlags.OPTIMIZE_NOTIFY || this._updatedRecordIDs.size > 0) {
307
+ this._storeSubscriptions.updateSubscriptions(source, this._updatedRecordIDs, updatedOwners, sourceOperation);
308
+ } else {
309
+ this._storeSubscriptions.updateStaleSubscriptions(source, this._updatedRecordIDs, updatedOwners, sourceOperation);
310
+ }
311
+ if (RelayFeatureFlags.OPTIMIZE_NOTIFY && (this._updatedRecordIDs.size > 0 || updatedOwners.length > 0 || this._invalidatedRecordIDs.size > 0 || invalidateStore === true || this._globalInvalidationEpoch === this._currentWriteEpoch)) {
312
+ this._currentWriteEpoch++;
313
+ if (invalidateStore === true) {
314
+ this._globalInvalidationEpoch = this._currentWriteEpoch;
247
315
  }
248
316
  }
317
+ if (!RelayFeatureFlags.OPTIMIZE_NOTIFY || this._invalidatedRecordIDs.size > 0 || invalidateStore === true) {
318
+ this._invalidationSubscriptions.forEach(function (subscription) {
319
+ _this3._updateInvalidationSubscription(subscription, invalidateStore === true);
320
+ });
321
+ }
322
+ if (sourceOperation != null) {
323
+ this._recordSourceOperation(sourceOperation);
324
+ }
249
325
  if (log != null) {
250
326
  log({
251
327
  name: 'store.notify.complete',
@@ -260,6 +336,23 @@ var RelayModernStore = /*#__PURE__*/function () {
260
336
  this._invalidatedRecordIDs.clear();
261
337
  return updatedOwners;
262
338
  };
339
+ _proto._recordSourceOperation = function _recordSourceOperation(sourceOperation) {
340
+ var id = sourceOperation.request.identifier;
341
+ var rootEntry = this._roots.get(id);
342
+ if (rootEntry != null) {
343
+ rootEntry.epoch = this._currentWriteEpoch;
344
+ rootEntry.fetchTime = Date.now();
345
+ } else if (sourceOperation.request.node.params.operationKind === 'query' && this._gcReleaseBufferSize > 0 && this._releaseBuffer.length < this._gcReleaseBufferSize) {
346
+ var temporaryRootEntry = {
347
+ operation: sourceOperation,
348
+ refCount: 0,
349
+ epoch: this._currentWriteEpoch,
350
+ fetchTime: Date.now()
351
+ };
352
+ this._releaseBuffer.push(id);
353
+ this._roots.set(id, temporaryRootEntry);
354
+ }
355
+ };
263
356
  _proto.publish = function publish(source, idsMarkedForInvalidation) {
264
357
  var target = this._getMutableRecordSource();
265
358
  updateTargetFromSource(target, source, this._currentWriteEpoch + 1, idsMarkedForInvalidation, this._updatedRecordIDs, this._invalidatedRecordIDs);
@@ -325,19 +418,19 @@ var RelayModernStore = /*#__PURE__*/function () {
325
418
  if (currentInvalidations.get('global') !== prevInvalidations.get('global')) {
326
419
  return true;
327
420
  }
328
- var _iterator = (0, _createForOfIteratorHelper2["default"])(prevInvalidationState.dataIDs),
329
- _step;
421
+ var _iterator2 = (0, _createForOfIteratorHelper2["default"])(prevInvalidationState.dataIDs),
422
+ _step2;
330
423
  try {
331
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
332
- var dataID = _step.value;
424
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
425
+ var dataID = _step2.value;
333
426
  if (currentInvalidations.get(dataID) !== prevInvalidations.get(dataID)) {
334
427
  return true;
335
428
  }
336
429
  }
337
430
  } catch (err) {
338
- _iterator.e(err);
431
+ _iterator2.e(err);
339
432
  } finally {
340
- _iterator.f();
433
+ _iterator2.f();
341
434
  }
342
435
  return false;
343
436
  };
@@ -432,17 +525,17 @@ var RelayModernStore = /*#__PURE__*/function () {
432
525
  }
433
526
  var startEpoch = this._currentWriteEpoch;
434
527
  var references = new Set();
435
- var _iterator2 = (0, _createForOfIteratorHelper2["default"])(this._roots.entries()),
436
- _step2;
528
+ var _iterator3 = (0, _createForOfIteratorHelper2["default"])(this._roots.entries()),
529
+ _step3;
437
530
  try {
438
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
531
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
439
532
  var _ref2, _operation$request$no3, _operation$request$no4;
440
- var _step2$value = _step2.value,
441
- _dataID = _step2$value[0],
442
- _step2$value$ = _step2$value[1],
443
- operation = _step2$value$.operation,
444
- refCount = _step2$value$.refCount,
445
- fetchTime = _step2$value$.fetchTime;
533
+ var _step3$value = _step3.value,
534
+ _dataID = _step3$value[0],
535
+ _step3$value$ = _step3$value[1],
536
+ operation = _step3$value$.operation,
537
+ refCount = _step3$value$.refCount,
538
+ fetchTime = _step3$value$.fetchTime;
446
539
  if (this._shouldRetainWithinTTL_EXPERIMENTAL) {
447
540
  var _queryCacheExpirationTime = this._queryCacheExpirationTime;
448
541
  !(_queryCacheExpirationTime != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Query cache expiration time should be non-null if executing GC') : invariant(false) : void 0;
@@ -466,9 +559,9 @@ var RelayModernStore = /*#__PURE__*/function () {
466
559
  }
467
560
  }
468
561
  } catch (err) {
469
- _iterator2.e(err);
562
+ _iterator3.e(err);
470
563
  } finally {
471
- _iterator2.f();
564
+ _iterator3.f();
472
565
  }
473
566
  var storeIDs = this._recordSource.getRecordIDs();
474
567
  for (var ii = 0; ii < storeIDs.length; ii++) {
@@ -502,6 +595,7 @@ var RelayModernStore = /*#__PURE__*/function () {
502
595
  getDataID: this._getDataID,
503
596
  log: this.__log,
504
597
  treatMissingFieldsAsNull: this._treatMissingFieldsAsNull,
598
+ deferDeduplicatedFields: this._deferDeduplicatedFields,
505
599
  shouldProcessClientComponents: this._shouldProcessClientComponents,
506
600
  actorIdentifier: this._actorIdentifier
507
601
  };
@@ -518,6 +612,9 @@ var RelayModernStore = /*#__PURE__*/function () {
518
612
  function initializeRecordSource(target) {
519
613
  if (!target.has(ROOT_ID)) {
520
614
  var rootRecord = RelayModernRecord.create(ROOT_ID, ROOT_TYPE);
615
+ if (RelayFeatureFlags.ENABLE_FIELD_GRANULAR_NOTIFICATIONS) {
616
+ RelayModernRecord.setValue(rootRecord, FIELD_GRANULAR_NOTIFICATIONS_KEY, true);
617
+ }
521
618
  target.set(ROOT_ID, rootRecord);
522
619
  }
523
620
  }
@@ -561,6 +658,18 @@ function updateTargetFromSource(target, source, currentWriteEpoch, idsMarkedForI
561
658
  }
562
659
  updatedRecordIDs.add(dataID);
563
660
  target.set(dataID, nextRecord);
661
+ if (RelayModernRecord.getValue(nextRecord, FIELD_GRANULAR_NOTIFICATIONS_KEY)) {
662
+ var fields = RelayModernRecord.getFields(nextRecord);
663
+ for (var jj = 0; jj < fields.length; jj++) {
664
+ var storageKey = fields[jj];
665
+ if (storageKey.startsWith('__')) {
666
+ continue;
667
+ }
668
+ if (RelayModernRecord.hasFieldChanged(targetRecord, nextRecord, storageKey)) {
669
+ updatedRecordIDs.add(getFieldNotificationKey(dataID, storageKey));
670
+ }
671
+ }
672
+ }
564
673
  }
565
674
  } else if (sourceRecord === null) {
566
675
  target["delete"](dataID);
@@ -203,7 +203,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
203
203
  return RelayPublishQueue;
204
204
  }();
205
205
  function lookupSelector(source, selector) {
206
- var selectorData = RelayReader.read(source, selector).data;
206
+ var selectorData = RelayReader.read(source, selector, null, undefined, undefined).data;
207
207
  if (process.env.NODE_ENV !== "production") {
208
208
  var deepFreeze = require('../util/deepFreeze');
209
209
  if (selectorData) {