@apollo/client 4.1.0-alpha.8 → 4.1.0-alpha.9

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 (124) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/__cjs/cache/core/cache.cjs +64 -24
  3. package/__cjs/cache/core/cache.cjs.map +1 -1
  4. package/__cjs/cache/core/cache.d.cts +47 -0
  5. package/__cjs/cache/core/types/Cache.d.cts +38 -0
  6. package/__cjs/cache/inmemory/entityStore.cjs +3 -3
  7. package/__cjs/cache/inmemory/entityStore.cjs.map +1 -1
  8. package/__cjs/cache/inmemory/inMemoryCache.cjs +47 -0
  9. package/__cjs/cache/inmemory/inMemoryCache.cjs.map +1 -1
  10. package/__cjs/cache/inmemory/inMemoryCache.d.cts +47 -0
  11. package/__cjs/cache/inmemory/key-extractor.cjs +1 -1
  12. package/__cjs/cache/inmemory/policies.cjs +14 -5
  13. package/__cjs/cache/inmemory/policies.cjs.map +1 -1
  14. package/__cjs/cache/inmemory/policies.d.cts +5 -0
  15. package/__cjs/cache/inmemory/readFromStore.cjs +3 -3
  16. package/__cjs/cache/inmemory/readFromStore.cjs.map +1 -1
  17. package/__cjs/cache/inmemory/types.d.cts +1 -0
  18. package/__cjs/cache/inmemory/writeToStore.cjs +6 -5
  19. package/__cjs/cache/inmemory/writeToStore.cjs.map +1 -1
  20. package/__cjs/cache/inmemory/writeToStore.d.cts +2 -1
  21. package/__cjs/core/ApolloClient.cjs +14 -14
  22. package/__cjs/core/ApolloClient.cjs.map +1 -1
  23. package/__cjs/core/ApolloClient.d.cts +21 -1
  24. package/__cjs/core/ObservableQuery.cjs +22 -8
  25. package/__cjs/core/ObservableQuery.cjs.map +1 -1
  26. package/__cjs/core/ObservableQuery.d.cts +1 -0
  27. package/__cjs/core/QueryInfo.cjs +3 -0
  28. package/__cjs/core/QueryInfo.cjs.map +1 -1
  29. package/__cjs/core/QueryManager.cjs +27 -17
  30. package/__cjs/core/QueryManager.cjs.map +1 -1
  31. package/__cjs/core/QueryManager.d.cts +18 -2
  32. package/__cjs/invariantErrorCodes.cjs +39 -33
  33. package/__cjs/link/error/index.cjs +1 -1
  34. package/__cjs/link/error/index.cjs.map +1 -1
  35. package/__cjs/link/error/index.d.cts +1 -1
  36. package/__cjs/link/http/parseAndCheckHttpResponse.cjs +1 -1
  37. package/__cjs/link/http/parseAndCheckHttpResponse.cjs.map +1 -1
  38. package/__cjs/react/hooks/useLazyQuery.cjs +1 -0
  39. package/__cjs/react/hooks/useLazyQuery.cjs.map +1 -1
  40. package/__cjs/react/hooks/useQuery.cjs +7 -4
  41. package/__cjs/react/hooks/useQuery.cjs.map +1 -1
  42. package/__cjs/react/hooks/useSuspenseQuery.cjs +2 -0
  43. package/__cjs/react/hooks/useSuspenseQuery.cjs.map +1 -1
  44. package/__cjs/utilities/internal/checkDocument.cjs +2 -4
  45. package/__cjs/utilities/internal/checkDocument.cjs.map +1 -1
  46. package/__cjs/utilities/internal/constants.cjs +21 -0
  47. package/__cjs/utilities/internal/constants.cjs.map +1 -0
  48. package/__cjs/utilities/internal/constants.d.cts +18 -0
  49. package/__cjs/utilities/internal/index.cjs +6 -1
  50. package/__cjs/utilities/internal/index.cjs.map +1 -1
  51. package/__cjs/utilities/internal/index.d.cts +2 -0
  52. package/__cjs/utilities/internal/mapObservableFragment.cjs +27 -0
  53. package/__cjs/utilities/internal/mapObservableFragment.cjs.map +1 -0
  54. package/__cjs/utilities/internal/mapObservableFragment.d.cts +3 -0
  55. package/__cjs/utilities/internal/memoize.cjs +31 -0
  56. package/__cjs/utilities/internal/memoize.cjs.map +1 -0
  57. package/__cjs/utilities/internal/memoize.d.cts +8 -0
  58. package/__cjs/version.cjs +1 -1
  59. package/cache/core/cache.d.ts +47 -0
  60. package/cache/core/cache.js +65 -25
  61. package/cache/core/cache.js.map +1 -1
  62. package/cache/core/types/Cache.d.ts +38 -0
  63. package/cache/core/types/Cache.js.map +1 -1
  64. package/cache/inmemory/entityStore.js +3 -3
  65. package/cache/inmemory/entityStore.js.map +1 -1
  66. package/cache/inmemory/inMemoryCache.d.ts +47 -0
  67. package/cache/inmemory/inMemoryCache.js +47 -0
  68. package/cache/inmemory/inMemoryCache.js.map +1 -1
  69. package/cache/inmemory/key-extractor.js +1 -1
  70. package/cache/inmemory/policies.d.ts +5 -0
  71. package/cache/inmemory/policies.js +14 -5
  72. package/cache/inmemory/policies.js.map +1 -1
  73. package/cache/inmemory/readFromStore.js +3 -3
  74. package/cache/inmemory/readFromStore.js.map +1 -1
  75. package/cache/inmemory/types.d.ts +1 -0
  76. package/cache/inmemory/types.js.map +1 -1
  77. package/cache/inmemory/writeToStore.d.ts +2 -1
  78. package/cache/inmemory/writeToStore.js +6 -5
  79. package/cache/inmemory/writeToStore.js.map +1 -1
  80. package/core/ApolloClient.d.ts +21 -1
  81. package/core/ApolloClient.js +15 -15
  82. package/core/ApolloClient.js.map +1 -1
  83. package/core/ObservableQuery.d.ts +1 -0
  84. package/core/ObservableQuery.js +23 -9
  85. package/core/ObservableQuery.js.map +1 -1
  86. package/core/QueryInfo.js +3 -0
  87. package/core/QueryInfo.js.map +1 -1
  88. package/core/QueryManager.d.ts +18 -2
  89. package/core/QueryManager.js +28 -18
  90. package/core/QueryManager.js.map +1 -1
  91. package/invariantErrorCodes.js +39 -33
  92. package/link/error/index.d.ts +1 -1
  93. package/link/error/index.js +1 -1
  94. package/link/error/index.js.map +1 -1
  95. package/link/http/parseAndCheckHttpResponse.js +1 -1
  96. package/link/http/parseAndCheckHttpResponse.js.map +1 -1
  97. package/package.json +1 -1
  98. package/react/hooks/useLazyQuery.js +2 -1
  99. package/react/hooks/useLazyQuery.js.map +1 -1
  100. package/react/hooks/useQuery.js +8 -5
  101. package/react/hooks/useQuery.js.map +1 -1
  102. package/react/hooks/useSuspenseQuery.js +2 -0
  103. package/react/hooks/useSuspenseQuery.js.map +1 -1
  104. package/react/hooks-compiled/useLazyQuery.js +2 -1
  105. package/react/hooks-compiled/useLazyQuery.js.map +1 -1
  106. package/react/hooks-compiled/useQuery.js +9 -5
  107. package/react/hooks-compiled/useQuery.js.map +1 -1
  108. package/react/hooks-compiled/useSuspenseQuery.js +3 -1
  109. package/react/hooks-compiled/useSuspenseQuery.js.map +1 -1
  110. package/utilities/internal/checkDocument.js +2 -4
  111. package/utilities/internal/checkDocument.js.map +1 -1
  112. package/utilities/internal/constants.d.ts +18 -0
  113. package/utilities/internal/constants.js +18 -0
  114. package/utilities/internal/constants.js.map +1 -0
  115. package/utilities/internal/index.d.ts +2 -0
  116. package/utilities/internal/index.js +2 -0
  117. package/utilities/internal/index.js.map +1 -1
  118. package/utilities/internal/mapObservableFragment.d.ts +3 -0
  119. package/utilities/internal/mapObservableFragment.js +24 -0
  120. package/utilities/internal/mapObservableFragment.js.map +1 -0
  121. package/utilities/internal/memoize.d.ts +8 -0
  122. package/utilities/internal/memoize.js +28 -0
  123. package/utilities/internal/memoize.js.map +1 -0
  124. package/version.js +1 -1
@@ -62,6 +62,8 @@ export { toQueryResult } from "./toQueryResult.cjs";
62
62
  export { filterMap } from "./filterMap.cjs";
63
63
  export { equalByQuery } from "./equalByQuery.cjs";
64
64
  export { canonicalStringify } from "./canonicalStringify.cjs";
65
+ export { mapObservableFragmentMemoized } from "./mapObservableFragment.cjs";
66
+ export { extensionsSymbol, variablesUnknownSymbol } from "./constants.cjs";
65
67
  export { getApolloCacheMemoryInternals, getApolloClientMemoryInternals, getInMemoryCacheMemoryInternals, registerGlobalCache, } from "../internal/getMemoryInternals.cjs";
66
68
  export { AutoCleanedStrongCache, AutoCleanedWeakCache } from "./caches.cjs";
67
69
  export type { ApplyHKT } from "./types/ApplyHKT.cjs";
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapObservableFragmentMemoized = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const memoize_js_1 = require("./memoize.cjs");
6
+ function mapObservableFragment(observable, mapFn) {
7
+ let currentResult;
8
+ let stableMappedResult;
9
+ function toMapped(result) {
10
+ if (result !== currentResult) {
11
+ currentResult = result;
12
+ stableMappedResult = mapFn(currentResult);
13
+ }
14
+ return stableMappedResult;
15
+ }
16
+ return Object.assign(observable.pipe((0, rxjs_1.map)(toMapped), (0, rxjs_1.shareReplay)({ bufferSize: 1, refCount: true })), {
17
+ getCurrentResult: () => toMapped(observable.getCurrentResult()),
18
+ });
19
+ }
20
+ exports.mapObservableFragmentMemoized = (0, memoize_js_1.memoize)(function mapObservableFragmentMemoized(observable,
21
+ /**
22
+ * used together with `observable` as memoization key, `mapFn` is explicitly not used as memoization key
23
+ */
24
+ _cacheKey, mapFn) {
25
+ return mapObservableFragment(observable, mapFn);
26
+ }, { max: 1, makeCacheKey: (args) => args.slice(0, 2) });
27
+ //# sourceMappingURL=mapObservableFragment.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapObservableFragment.cjs","sources":["../../../../src/utilities/internal/mapObservableFragment.ts"],"sourcesContent":["import { map, shareReplay } from \"rxjs\";\n\nimport type { ApolloCache } from \"@apollo/client\";\n\nimport { memoize } from \"./memoize.js\";\n\nfunction mapObservableFragment<From, To>(\n observable: ApolloCache.ObservableFragment<From>,\n mapFn: (\n from: ApolloCache.WatchFragmentResult<From>\n ) => ApolloCache.WatchFragmentResult<To>\n): ApolloCache.ObservableFragment<To> {\n let currentResult: ApolloCache.WatchFragmentResult<From>;\n let stableMappedResult: ApolloCache.WatchFragmentResult<To>;\n\n function toMapped(\n result: ApolloCache.WatchFragmentResult<From>\n ): ApolloCache.WatchFragmentResult<To> {\n if (result !== currentResult) {\n currentResult = result;\n stableMappedResult = mapFn(currentResult);\n }\n return stableMappedResult;\n }\n\n return Object.assign(\n observable.pipe(\n map(toMapped),\n shareReplay({ bufferSize: 1, refCount: true })\n ),\n {\n getCurrentResult: () => toMapped(observable.getCurrentResult()),\n }\n );\n}\n\nexport const mapObservableFragmentMemoized = memoize(\n function mapObservableFragmentMemoized<From, To>(\n observable: ApolloCache.ObservableFragment<From>,\n /**\n * used together with `observable` as memoization key, `mapFn` is explicitly not used as memoization key\n */\n _cacheKey: symbol,\n mapFn: (\n from: ApolloCache.WatchFragmentResult<From>\n ) => ApolloCache.WatchFragmentResult<To>\n ): ApolloCache.ObservableFragment<To> {\n return mapObservableFragment(observable, mapFn);\n },\n { max: 1, makeCacheKey: (args) => args.slice(0, 2) }\n);\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ApolloCache } from "@apollo/client";
2
+ export declare const mapObservableFragmentMemoized: <From, To>(observable: ApolloCache.ObservableFragment<From>, _cacheKey: symbol, mapFn: (from: ApolloCache.WatchFragmentResult<From>) => ApolloCache.WatchFragmentResult<To>) => ApolloCache.ObservableFragment<To>;
3
+ //# sourceMappingURL=mapObservableFragment.d.cts.map
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.memoize = memoize;
4
+ const trie_1 = require("@wry/trie");
5
+ const caches_js_1 = require("./caches.cjs");
6
+ /**
7
+ * Naive alternative to `wrap` without any dependency tracking, potentially avoiding resulting memory leaks.
8
+ */
9
+ function memoize(fn, { max, makeCacheKey = (args) => args, }) {
10
+ const keys = new trie_1.Trie(true);
11
+ const cache = new caches_js_1.AutoCleanedWeakCache(max);
12
+ return (...args) => {
13
+ const cacheKey = keys.lookupArray(makeCacheKey(args));
14
+ const cached = cache.get(cacheKey);
15
+ if (cached) {
16
+ if (cached.error) {
17
+ throw cached.error;
18
+ }
19
+ return cached.result;
20
+ }
21
+ const entry = cache.set(cacheKey, {});
22
+ try {
23
+ return (entry.result = fn(...args));
24
+ }
25
+ catch (error) {
26
+ entry.error = error;
27
+ throw error;
28
+ }
29
+ };
30
+ }
31
+ //# sourceMappingURL=memoize.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoize.cjs","sources":["../../../../src/utilities/internal/memoize.ts"],"sourcesContent":["import { Trie } from \"@wry/trie\";\n\nimport { AutoCleanedWeakCache } from \"./caches.js\";\n\n/**\n * Naive alternative to `wrap` without any dependency tracking, potentially avoiding resulting memory leaks.\n */\nexport function memoize<TArgs extends any[], TResult>(\n fn: (...args: TArgs) => TResult,\n {\n max,\n makeCacheKey = (args) => args,\n }: { max: number; makeCacheKey?: (args: TArgs) => [...any[]] }\n): (...args: TArgs) => TResult {\n const keys = new Trie<{}>(true);\n const cache = new AutoCleanedWeakCache<\n {},\n { result?: TResult; error?: unknown }\n >(max);\n\n return (...args: TArgs): TResult => {\n const cacheKey = keys.lookupArray(makeCacheKey(args));\n const cached = cache.get(cacheKey);\n if (cached) {\n if (cached.error) {\n throw cached.error;\n }\n return cached.result!;\n }\n\n const entry = cache.set(cacheKey, {});\n try {\n return (entry.result = fn(...args));\n } catch (error) {\n entry.error = error;\n throw error;\n }\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Naive alternative to `wrap` without any dependency tracking, potentially avoiding resulting memory leaks.
3
+ */
4
+ export declare function memoize<TArgs extends any[], TResult>(fn: (...args: TArgs) => TResult, { max, makeCacheKey, }: {
5
+ max: number;
6
+ makeCacheKey?: (args: TArgs) => [...any[]];
7
+ }): (...args: TArgs) => TResult;
8
+ //# sourceMappingURL=memoize.d.cts.map
package/__cjs/version.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.build = exports.version = void 0;
4
- exports.version = "4.1.0-alpha.8";
4
+ exports.version = "4.1.0-alpha.9";
5
5
  exports.build = "cjs";
6
6
  //# sourceMappingURL=version.cjs.map
@@ -159,6 +159,53 @@ export declare abstract class ApolloCache {
159
159
  * same as returning `false`.
160
160
  */
161
161
  resolvesClientField?(typename: string, fieldName: string): boolean;
162
+ /**
163
+ * Executes multiple cache operations as a single batch, ensuring that
164
+ * watchers are only notified once after all operations complete. This is
165
+ * useful for improving performance when making multiple cache updates, as it
166
+ * prevents unnecessary re-renders or query refetches between individual
167
+ * operations.
168
+ *
169
+ * The `batch` method supports both optimistic and non-optimistic updates, and
170
+ * provides fine-grained control over which cache layer receives the updates
171
+ * and when watchers are notified.
172
+ *
173
+ * For usage instructions, see [Interacting with cached data: `cache.batch`](https://www.apollographql.com/docs/react/caching/cache-interaction#using-cachebatch).
174
+ *
175
+ * @example
176
+ *
177
+ * ```js
178
+ * cache.batch({
179
+ * update(cache) {
180
+ * cache.writeQuery({
181
+ * query: GET_TODOS,
182
+ * data: { todos: updatedTodos },
183
+ * });
184
+ * cache.evict({ id: "Todo:123" });
185
+ * },
186
+ * });
187
+ * ```
188
+ *
189
+ * @example
190
+ *
191
+ * ```js
192
+ * // Optimistic update with a custom layer ID
193
+ * cache.batch({
194
+ * optimistic: "add-todo-optimistic",
195
+ * update(cache) {
196
+ * cache.modify({
197
+ * fields: {
198
+ * todos(existing = []) {
199
+ * return [...existing, newTodoRef];
200
+ * },
201
+ * },
202
+ * });
203
+ * },
204
+ * });
205
+ * ```
206
+ *
207
+ * @returns The return value of the `update` function.
208
+ */
162
209
  batch<U>(options: Cache.BatchOptions<this, U>): U;
163
210
  abstract performTransaction(transaction: Transaction, optimisticId?: string | null): void;
164
211
  recordOptimisticTransaction(transaction: Transaction, optimisticId: string): void;
@@ -5,7 +5,7 @@ import { wrap } from "optimism";
5
5
  import { distinctUntilChanged, map, Observable, ReplaySubject, share, shareReplay, tap, timer, } from "rxjs";
6
6
  import { cacheSizes, canonicalStringify } from "@apollo/client/utilities";
7
7
  import { __DEV__ } from "@apollo/client/utilities/environment";
8
- import { combineLatestBatched, equalByQuery, getApolloCacheMemoryInternals, getFragmentDefinition, getFragmentQueryDocument, } from "@apollo/client/utilities/internal";
8
+ import { combineLatestBatched, equalByQuery, getApolloCacheMemoryInternals, getFragmentDefinition, getFragmentQueryDocument, mapObservableFragmentMemoized, } from "@apollo/client/utilities/internal";
9
9
  import { invariant } from "@apollo/client/utilities/invariant";
10
10
  export class ApolloCache {
11
11
  assumeImmutableResults = false;
@@ -16,11 +16,53 @@ export class ApolloCache {
16
16
  return null;
17
17
  }
18
18
  // Transactional API
19
- // The batch method is intended to replace/subsume both performTransaction
20
- // and recordOptimisticTransaction, but performTransaction came first, so we
21
- // provide a default batch implementation that's just another way of calling
22
- // performTransaction. Subclasses of ApolloCache (such as InMemoryCache) can
23
- // override the batch method to do more interesting things with its options.
19
+ /**
20
+ * Executes multiple cache operations as a single batch, ensuring that
21
+ * watchers are only notified once after all operations complete. This is
22
+ * useful for improving performance when making multiple cache updates, as it
23
+ * prevents unnecessary re-renders or query refetches between individual
24
+ * operations.
25
+ *
26
+ * The `batch` method supports both optimistic and non-optimistic updates, and
27
+ * provides fine-grained control over which cache layer receives the updates
28
+ * and when watchers are notified.
29
+ *
30
+ * For usage instructions, see [Interacting with cached data: `cache.batch`](https://www.apollographql.com/docs/react/caching/cache-interaction#using-cachebatch).
31
+ *
32
+ * @example
33
+ *
34
+ * ```js
35
+ * cache.batch({
36
+ * update(cache) {
37
+ * cache.writeQuery({
38
+ * query: GET_TODOS,
39
+ * data: { todos: updatedTodos },
40
+ * });
41
+ * cache.evict({ id: "Todo:123" });
42
+ * },
43
+ * });
44
+ * ```
45
+ *
46
+ * @example
47
+ *
48
+ * ```js
49
+ * // Optimistic update with a custom layer ID
50
+ * cache.batch({
51
+ * optimistic: "add-todo-optimistic",
52
+ * update(cache) {
53
+ * cache.modify({
54
+ * fields: {
55
+ * todos(existing = []) {
56
+ * return [...existing, newTodoRef];
57
+ * },
58
+ * },
59
+ * });
60
+ * },
61
+ * });
62
+ * ```
63
+ *
64
+ * @returns The return value of the `update` function.
65
+ */
24
66
  batch(options) {
25
67
  const optimisticId = typeof options.optimistic === "string" ? options.optimistic
26
68
  : options.optimistic === false ? null
@@ -79,7 +121,6 @@ export class ApolloCache {
79
121
  watchFragment(options) {
80
122
  const { fragment, fragmentName, from } = options;
81
123
  const query = this.getFragmentDoc(fragment, fragmentName);
82
- const transformData = options[Symbol.for("apollo.transformData")] ?? ((data) => data);
83
124
  const fromArray = Array.isArray(from) ? from : [from];
84
125
  const ids = fromArray.map((value) => {
85
126
  // While our TypeScript types do not allow for `undefined` as a valid
@@ -92,26 +133,26 @@ export class ApolloCache {
92
133
  if (__DEV__) {
93
134
  const actualFragmentName = fragmentName || getFragmentDefinition(fragment).name.value;
94
135
  if (id === undefined) {
95
- __DEV__ && invariant.warn(112, actualFragmentName);
136
+ __DEV__ && invariant.warn(113, actualFragmentName);
96
137
  }
97
138
  }
98
139
  return id;
99
140
  });
100
141
  if (!Array.isArray(from)) {
101
- return this.watchSingleFragment(ids[0], query, {
102
- ...options,
103
- transformData: (data) =>
104
- // Unfortunately we forgot to allow for `null` on watchFragment in 4.0
105
- // when `from` is a single record. As such, we need to fallback to {}
106
- // when diff.result is null to maintain backwards compatibility. We
107
- // should plan to change this in v5. We do however support `null` if
108
- // `from` is explicitly `null`.
109
- //
110
- // NOTE: Using `from` with an array will maintain `null` properly
111
- // without the need for a similar fallback since watchFragment with
112
- // arrays is new functionality in v4.1.
113
- transformData(from === null ? data : data ?? {}),
114
- });
142
+ const observable = this.watchSingleFragment(ids[0], query, options);
143
+ // Unfortunately we forgot to allow for `null` on watchFragment in 4.0
144
+ // when `from` is a single record. As such, we need to fallback to {}
145
+ // when diff.result is null to maintain backwards compatibility. We
146
+ // should plan to change this in v5. We do however support `null` if
147
+ // `from` is explicitly `null`.
148
+ //
149
+ // NOTE: Using `from` with an array will maintain `null` properly
150
+ // without the need for a similar fallback since watchFragment with
151
+ // arrays is new functionality in v4.1.
152
+ return from === null ? observable : (mapObservableFragmentMemoized(observable, Symbol.for("apollo.transform.individualResult"), (result) => ({
153
+ ...result,
154
+ data: result.data ?? {},
155
+ })));
115
156
  }
116
157
  let currentResult;
117
158
  function toResult(results) {
@@ -129,7 +170,6 @@ export class ApolloCache {
129
170
  dataState: "complete",
130
171
  complete: true,
131
172
  });
132
- result.data = transformData(result.data);
133
173
  if (!equal(currentResult, result)) {
134
174
  currentResult = result;
135
175
  }
@@ -164,7 +204,7 @@ export class ApolloCache {
164
204
  if (id === null) {
165
205
  return nullObservable;
166
206
  }
167
- const { optimistic = true, variables, transformData = (data) => data, } = options;
207
+ const { optimistic = true, variables } = options;
168
208
  const cacheKey = [
169
209
  fragmentQuery,
170
210
  canonicalStringify({ id, optimistic, variables }),
@@ -174,7 +214,7 @@ export class ApolloCache {
174
214
  let subscribed = false;
175
215
  let currentResult;
176
216
  function getNewestResult(diff) {
177
- const data = transformData(diff.result);
217
+ const data = diff.result;
178
218
  if (!currentResult ||
179
219
  !equalByQuery(fragmentQuery, { data: currentResult.data }, { data }, options.variables)) {
180
220
  currentResult = {