@isograph/react 0.3.0 → 0.4.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 (164) hide show
  1. package/.turbo/turbo-compile-libs.log +5 -0
  2. package/dist/core/FragmentReference.d.ts +17 -8
  3. package/dist/core/FragmentReference.d.ts.map +1 -1
  4. package/dist/core/FragmentReference.js +3 -12
  5. package/dist/core/IsographEnvironment.d.ts +30 -35
  6. package/dist/core/IsographEnvironment.d.ts.map +1 -1
  7. package/dist/core/IsographEnvironment.js +4 -0
  8. package/dist/core/PromiseWrapper.d.ts +6 -7
  9. package/dist/core/PromiseWrapper.d.ts.map +1 -1
  10. package/dist/core/PromiseWrapper.js +6 -12
  11. package/dist/core/areEqualWithDeepComparison.d.ts +1 -3
  12. package/dist/core/areEqualWithDeepComparison.d.ts.map +1 -1
  13. package/dist/core/areEqualWithDeepComparison.js +16 -2
  14. package/dist/core/brand.d.ts +2 -0
  15. package/dist/core/brand.d.ts.map +1 -0
  16. package/dist/core/brand.js +2 -0
  17. package/dist/core/cache.d.ts +16 -24
  18. package/dist/core/cache.d.ts.map +1 -1
  19. package/dist/core/cache.js +105 -72
  20. package/dist/core/check.d.ts +11 -7
  21. package/dist/core/check.d.ts.map +1 -1
  22. package/dist/core/check.js +2 -2
  23. package/dist/core/componentCache.d.ts +1 -1
  24. package/dist/core/componentCache.d.ts.map +1 -1
  25. package/dist/core/componentCache.js +27 -31
  26. package/dist/core/entrypoint.d.ts +43 -28
  27. package/dist/core/entrypoint.d.ts.map +1 -1
  28. package/dist/core/garbageCollection.d.ts +5 -6
  29. package/dist/core/garbageCollection.d.ts.map +1 -1
  30. package/dist/core/garbageCollection.js +1 -1
  31. package/dist/core/logging.d.ts +23 -15
  32. package/dist/core/logging.d.ts.map +1 -1
  33. package/dist/core/logging.js +8 -5
  34. package/dist/core/makeNetworkRequest.d.ts +5 -5
  35. package/dist/core/makeNetworkRequest.d.ts.map +1 -1
  36. package/dist/core/makeNetworkRequest.js +113 -28
  37. package/dist/core/read.d.ts +16 -11
  38. package/dist/core/read.d.ts.map +1 -1
  39. package/dist/core/read.js +468 -305
  40. package/dist/core/reader.d.ts +33 -37
  41. package/dist/core/reader.d.ts.map +1 -1
  42. package/dist/core/startUpdate.d.ts +8 -0
  43. package/dist/core/startUpdate.d.ts.map +1 -0
  44. package/dist/core/startUpdate.js +163 -0
  45. package/dist/core/util.d.ts +3 -0
  46. package/dist/core/util.d.ts.map +1 -1
  47. package/dist/index.d.ts +18 -15
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +9 -1
  50. package/dist/loadable-hooks/useClientSideDefer.d.ts +4 -10
  51. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
  52. package/dist/loadable-hooks/useClientSideDefer.js +2 -2
  53. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +8 -15
  54. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
  55. package/dist/loadable-hooks/useConnectionSpecPagination.js +6 -4
  56. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +1 -2
  57. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -1
  58. package/dist/loadable-hooks/useImperativeLoadableField.d.ts +4 -6
  59. package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -1
  60. package/dist/loadable-hooks/useImperativeLoadableField.js +1 -1
  61. package/dist/loadable-hooks/useSkipLimitPagination.d.ts +6 -13
  62. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
  63. package/dist/loadable-hooks/useSkipLimitPagination.js +11 -9
  64. package/dist/react/FragmentReader.d.ts +7 -14
  65. package/dist/react/FragmentReader.d.ts.map +1 -1
  66. package/dist/react/FragmentReader.js +3 -30
  67. package/dist/react/FragmentRenderer.d.ts +15 -0
  68. package/dist/react/FragmentRenderer.d.ts.map +1 -0
  69. package/dist/react/FragmentRenderer.js +35 -0
  70. package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -1
  71. package/dist/react/LoadableFieldReader.d.ts +12 -0
  72. package/dist/react/LoadableFieldReader.d.ts.map +1 -0
  73. package/dist/react/LoadableFieldReader.js +10 -0
  74. package/dist/react/LoadableFieldRenderer.d.ts +13 -0
  75. package/dist/react/LoadableFieldRenderer.d.ts.map +1 -0
  76. package/dist/react/LoadableFieldRenderer.js +37 -0
  77. package/dist/react/useImperativeReference.d.ts +7 -10
  78. package/dist/react/useImperativeReference.d.ts.map +1 -1
  79. package/dist/react/useImperativeReference.js +8 -9
  80. package/dist/react/useLazyReference.d.ts +4 -7
  81. package/dist/react/useLazyReference.d.ts.map +1 -1
  82. package/dist/react/useLazyReference.js +26 -5
  83. package/dist/react/useReadAndSubscribe.d.ts +3 -9
  84. package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
  85. package/dist/react/useReadAndSubscribe.js +7 -3
  86. package/dist/react/useRerenderOnChange.d.ts +1 -1
  87. package/dist/react/useRerenderOnChange.d.ts.map +1 -1
  88. package/dist/react/useResult.d.ts +3 -6
  89. package/dist/react/useResult.d.ts.map +1 -1
  90. package/dist/react/useResult.js +10 -8
  91. package/isograph.config.json +1 -0
  92. package/package.json +6 -6
  93. package/src/core/FragmentReference.ts +40 -16
  94. package/src/core/IsographEnvironment.ts +57 -39
  95. package/src/core/PromiseWrapper.ts +15 -18
  96. package/src/core/areEqualWithDeepComparison.ts +22 -2
  97. package/src/core/brand.ts +18 -0
  98. package/src/core/cache.ts +153 -113
  99. package/src/core/check.ts +17 -12
  100. package/src/core/componentCache.ts +47 -50
  101. package/src/core/entrypoint.ts +66 -21
  102. package/src/core/garbageCollection.ts +9 -9
  103. package/src/core/logging.ts +39 -25
  104. package/src/core/makeNetworkRequest.ts +212 -34
  105. package/src/core/read.ts +728 -440
  106. package/src/core/reader.ts +46 -29
  107. package/src/core/startUpdate.ts +334 -0
  108. package/src/core/util.ts +4 -0
  109. package/src/index.ts +89 -8
  110. package/src/loadable-hooks/useClientSideDefer.ts +11 -10
  111. package/src/loadable-hooks/useConnectionSpecPagination.ts +27 -13
  112. package/src/loadable-hooks/useImperativeExposedMutationField.ts +1 -1
  113. package/src/loadable-hooks/useImperativeLoadableField.ts +10 -12
  114. package/src/loadable-hooks/useSkipLimitPagination.ts +38 -19
  115. package/src/react/FragmentReader.tsx +23 -39
  116. package/src/react/FragmentRenderer.tsx +46 -0
  117. package/src/react/IsographEnvironmentProvider.tsx +1 -1
  118. package/src/react/LoadableFieldReader.tsx +40 -0
  119. package/src/react/LoadableFieldRenderer.tsx +41 -0
  120. package/src/react/useImperativeReference.ts +49 -27
  121. package/src/react/useLazyReference.ts +62 -14
  122. package/src/react/useReadAndSubscribe.ts +17 -9
  123. package/src/react/useRerenderOnChange.ts +2 -2
  124. package/src/react/useResult.ts +22 -8
  125. package/src/tests/__isograph/Economist/link/output_type.ts +2 -0
  126. package/src/tests/__isograph/Node/asEconomist/resolver_reader.ts +28 -0
  127. package/src/tests/__isograph/Node/link/output_type.ts +3 -0
  128. package/src/tests/__isograph/Query/linkedUpdate/entrypoint.ts +31 -0
  129. package/src/tests/__isograph/Query/linkedUpdate/normalization_ast.ts +95 -0
  130. package/src/tests/__isograph/Query/linkedUpdate/output_type.ts +3 -0
  131. package/src/tests/__isograph/Query/linkedUpdate/param_type.ts +51 -0
  132. package/src/tests/__isograph/Query/linkedUpdate/query_text.ts +20 -0
  133. package/src/tests/__isograph/Query/linkedUpdate/resolver_reader.ts +93 -0
  134. package/src/tests/__isograph/Query/meName/entrypoint.ts +8 -29
  135. package/src/tests/__isograph/Query/meName/normalization_ast.ts +25 -0
  136. package/src/tests/__isograph/Query/meName/query_text.ts +6 -0
  137. package/src/tests/__isograph/Query/meName/resolver_reader.ts +5 -0
  138. package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +8 -67
  139. package/src/tests/__isograph/Query/meNameSuccessor/normalization_ast.ts +56 -0
  140. package/src/tests/__isograph/Query/meNameSuccessor/query_text.ts +13 -0
  141. package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +10 -0
  142. package/src/tests/__isograph/Query/nodeField/entrypoint.ts +8 -34
  143. package/src/tests/__isograph/Query/nodeField/normalization_ast.ts +30 -0
  144. package/src/tests/__isograph/Query/nodeField/query_text.ts +6 -0
  145. package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +5 -0
  146. package/src/tests/__isograph/Query/startUpdate/entrypoint.ts +31 -0
  147. package/src/tests/__isograph/Query/startUpdate/normalization_ast.ts +51 -0
  148. package/src/tests/__isograph/Query/startUpdate/output_type.ts +3 -0
  149. package/src/tests/__isograph/Query/startUpdate/param_type.ts +26 -0
  150. package/src/tests/__isograph/Query/startUpdate/parameters_type.ts +3 -0
  151. package/src/tests/__isograph/Query/startUpdate/query_text.ts +11 -0
  152. package/src/tests/__isograph/Query/startUpdate/resolver_reader.ts +55 -0
  153. package/src/tests/__isograph/Query/subquery/entrypoint.ts +8 -44
  154. package/src/tests/__isograph/Query/subquery/normalization_ast.ts +38 -0
  155. package/src/tests/__isograph/Query/subquery/query_text.ts +8 -0
  156. package/src/tests/__isograph/Query/subquery/resolver_reader.ts +7 -0
  157. package/src/tests/__isograph/iso.ts +24 -3
  158. package/src/tests/__isograph/tsconfig.json +8 -0
  159. package/src/tests/garbageCollection.test.ts +10 -8
  160. package/src/tests/meNameSuccessor.ts +1 -1
  161. package/src/tests/nodeQuery.ts +2 -1
  162. package/src/tests/normalizeData.test.ts +1 -2
  163. package/src/tests/startUpdate.test.ts +205 -0
  164. package/tsconfig.pkg.json +1 -2
@@ -1,51 +1,86 @@
1
1
  import { ItemCleanupPair } from '@isograph/disposable-types';
2
+ import { normalizeData } from './cache';
3
+ import { check, DEFAULT_SHOULD_FETCH_VALUE, FetchOptions } from './check';
4
+ import { getOrCreateCachedComponent } from './componentCache';
2
5
  import {
3
6
  IsographEntrypoint,
7
+ ReaderWithRefetchQueries,
4
8
  RefetchQueryNormalizationArtifact,
9
+ type NormalizationAst,
10
+ type NormalizationAstLoader,
5
11
  } from './entrypoint';
6
- import { Variables } from './FragmentReference';
12
+ import {
13
+ ExtractParameters,
14
+ type FragmentReference,
15
+ type UnknownTReadFromStore,
16
+ } from './FragmentReference';
7
17
  import {
8
18
  garbageCollectEnvironment,
9
19
  RetainedQuery,
10
20
  retainQuery,
11
21
  unretainQuery,
12
22
  } from './garbageCollection';
13
- import { IsographEnvironment, ROOT_ID } from './IsographEnvironment';
23
+ import { IsographEnvironment, ROOT_ID, StoreLink } from './IsographEnvironment';
24
+ import { logMessage } from './logging';
14
25
  import {
15
26
  AnyError,
16
27
  PromiseWrapper,
17
28
  wrapPromise,
18
29
  wrapResolvedValue,
19
30
  } from './PromiseWrapper';
20
- import { normalizeData } from './cache';
21
- import { logMessage } from './logging';
22
- import { check, DEFAULT_SHOULD_FETCH_VALUE, FetchOptions } from './check';
31
+ import { readButDoNotEvaluate } from './read';
32
+ import { getOrCreateCachedStartUpdate } from './startUpdate';
23
33
 
24
34
  let networkRequestId = 0;
25
35
 
26
- export function maybeMakeNetworkRequest(
36
+ export function maybeMakeNetworkRequest<
37
+ TReadFromStore extends UnknownTReadFromStore,
38
+ TClientFieldValue,
39
+ TArtifact extends
40
+ | RefetchQueryNormalizationArtifact
41
+ | IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst>,
42
+ TNormalizationAst extends NormalizationAst | NormalizationAstLoader,
43
+ >(
27
44
  environment: IsographEnvironment,
28
- artifact: RefetchQueryNormalizationArtifact | IsographEntrypoint<any, any>,
29
- variables: Variables,
30
- fetchOptions?: FetchOptions,
45
+ artifact: TArtifact,
46
+ variables: ExtractParameters<TReadFromStore>,
47
+ readerWithRefetchQueries: PromiseWrapper<
48
+ ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>
49
+ > | null,
50
+ fetchOptions: FetchOptions<TClientFieldValue> | null,
31
51
  ): ItemCleanupPair<PromiseWrapper<void, AnyError>> {
32
52
  switch (fetchOptions?.shouldFetch ?? DEFAULT_SHOULD_FETCH_VALUE) {
33
53
  case 'Yes': {
34
- return makeNetworkRequest(environment, artifact, variables, fetchOptions);
54
+ return makeNetworkRequest(
55
+ environment,
56
+ artifact,
57
+ variables,
58
+ readerWithRefetchQueries,
59
+ fetchOptions,
60
+ );
35
61
  }
36
62
  case 'No': {
37
63
  return [wrapResolvedValue(undefined), () => {}];
38
64
  }
39
65
  case 'IfNecessary': {
66
+ if (
67
+ artifact.networkRequestInfo.normalizationAst.kind ===
68
+ 'NormalizationAstLoader'
69
+ ) {
70
+ throw new Error(
71
+ 'Using lazy loaded normalizationAst with shouldFetch: "IfNecessary" is not supported as it will lead to slower initial load time.',
72
+ );
73
+ }
40
74
  const result = check(
41
75
  environment,
42
- artifact.networkRequestInfo.normalizationAst,
76
+ artifact.networkRequestInfo.normalizationAst.selections,
43
77
  variables,
44
78
  {
45
79
  __link: ROOT_ID,
46
80
  __typename: artifact.concreteType,
47
81
  },
48
82
  );
83
+
49
84
  if (result.kind === 'EnoughData') {
50
85
  return [wrapResolvedValue(undefined), () => {}];
51
86
  } else {
@@ -53,6 +88,7 @@ export function maybeMakeNetworkRequest(
53
88
  environment,
54
89
  artifact,
55
90
  variables,
91
+ readerWithRefetchQueries,
56
92
  fetchOptions,
57
93
  );
58
94
  }
@@ -60,60 +96,85 @@ export function maybeMakeNetworkRequest(
60
96
  }
61
97
  }
62
98
 
63
- export function makeNetworkRequest(
99
+ function loadNormalizationAst(
100
+ normalizationAst: NormalizationAstLoader | NormalizationAst,
101
+ ) {
102
+ switch (normalizationAst.kind) {
103
+ case 'NormalizationAst': {
104
+ return normalizationAst;
105
+ }
106
+ case 'NormalizationAstLoader': {
107
+ return normalizationAst.loader();
108
+ }
109
+ }
110
+ }
111
+
112
+ export function makeNetworkRequest<
113
+ TReadFromStore extends UnknownTReadFromStore,
114
+ TClientFieldValue,
115
+ TArtifact extends
116
+ | RefetchQueryNormalizationArtifact
117
+ | IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst>,
118
+ TNormalizationAst extends NormalizationAst | NormalizationAstLoader,
119
+ >(
64
120
  environment: IsographEnvironment,
65
- artifact: RefetchQueryNormalizationArtifact | IsographEntrypoint<any, any>,
66
- variables: Variables,
67
- fetchOptions?: FetchOptions,
121
+ artifact: TArtifact,
122
+ variables: ExtractParameters<TReadFromStore>,
123
+ readerWithRefetchQueries: PromiseWrapper<
124
+ ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>
125
+ > | null,
126
+ fetchOptions: FetchOptions<TClientFieldValue> | null,
68
127
  ): ItemCleanupPair<PromiseWrapper<void, AnyError>> {
69
128
  // TODO this should be a DataId and stored in the store
70
129
  const myNetworkRequestId = networkRequestId + '';
71
130
  networkRequestId++;
72
131
 
73
- logMessage(environment, {
132
+ logMessage(environment, () => ({
74
133
  kind: 'MakeNetworkRequest',
75
134
  artifact,
76
135
  variables,
77
136
  networkRequestId: myNetworkRequestId,
78
- });
137
+ }));
79
138
 
80
139
  let status: NetworkRequestStatus = {
81
140
  kind: 'UndisposedIncomplete',
82
141
  };
83
142
  // This should be an observable, not a promise
84
- const promise = environment
85
- .networkFunction(artifact.networkRequestInfo.queryText, variables)
86
- .then((networkResponse) => {
87
- logMessage(environment, {
143
+ const promise = Promise.all([
144
+ environment.networkFunction(
145
+ artifact.networkRequestInfo.operation,
146
+ variables,
147
+ ),
148
+ loadNormalizationAst(artifact.networkRequestInfo.normalizationAst),
149
+ readerWithRefetchQueries?.promise,
150
+ ])
151
+ .then(([networkResponse, normalizationAst, readerWithRefetchQueries]) => {
152
+ logMessage(environment, () => ({
88
153
  kind: 'ReceivedNetworkResponse',
89
154
  networkResponse,
90
155
  networkRequestId: myNetworkRequestId,
91
- });
156
+ }));
92
157
 
93
158
  if (networkResponse.errors != null) {
94
159
  try {
95
160
  fetchOptions?.onError?.();
96
161
  } catch {}
97
- // @ts-expect-error Why are we getting the wrong constructor here?
98
162
  throw new Error('GraphQL network response had errors', {
99
163
  cause: networkResponse,
100
164
  });
101
165
  }
102
166
 
167
+ const root = { __link: ROOT_ID, __typename: artifact.concreteType };
103
168
  if (status.kind === 'UndisposedIncomplete') {
104
- const root = { __link: ROOT_ID, __typename: artifact.concreteType };
105
169
  normalizeData(
106
170
  environment,
107
- artifact.networkRequestInfo.normalizationAst,
171
+ normalizationAst.selections,
108
172
  networkResponse.data ?? {},
109
173
  variables,
110
- artifact.kind === 'Entrypoint'
111
- ? artifact.readerWithRefetchQueries.nestedRefetchQueries
112
- : [],
113
174
  root,
114
175
  );
115
176
  const retainedQuery = {
116
- normalizationAst: artifact.networkRequestInfo.normalizationAst,
177
+ normalizationAst: normalizationAst.selections,
117
178
  variables,
118
179
  root,
119
180
  };
@@ -124,16 +185,31 @@ export function makeNetworkRequest(
124
185
  retainQuery(environment, retainedQuery);
125
186
  }
126
187
 
127
- try {
128
- fetchOptions?.onComplete?.();
129
- } catch {}
188
+ const onComplete = fetchOptions?.onComplete;
189
+ if (onComplete != null) {
190
+ let data = readDataForOnComplete(
191
+ artifact,
192
+ environment,
193
+ root,
194
+ variables,
195
+ readerWithRefetchQueries,
196
+ );
197
+
198
+ try {
199
+ // @ts-expect-error this problem will be fixed when we remove RefetchQueryNormalizationArtifact
200
+ // (or we can fix this by having a single param of type { kind: 'Entrypoint', entrypoint,
201
+ // fetchOptions: FetchOptions<TReadFromStore> } | { kind: 'RefetchQuery', refetchQuery,
202
+ // fetchOptions: FetchOptions<void> }).
203
+ onComplete(data);
204
+ } catch {}
205
+ }
130
206
  })
131
207
  .catch((e) => {
132
- logMessage(environment, {
208
+ logMessage(environment, () => ({
133
209
  kind: 'ReceivedNetworkError',
134
210
  networkRequestId: myNetworkRequestId,
135
211
  error: e,
136
- });
212
+ }));
137
213
  try {
138
214
  fetchOptions?.onError?.();
139
215
  } catch {}
@@ -173,3 +249,105 @@ type NetworkRequestStatus =
173
249
  readonly kind: 'UndisposedComplete';
174
250
  readonly retainedQuery: RetainedQuery;
175
251
  };
252
+
253
+ function readDataForOnComplete<
254
+ TReadFromStore extends UnknownTReadFromStore,
255
+ TClientFieldValue,
256
+ TArtifact extends
257
+ | RefetchQueryNormalizationArtifact
258
+ | IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst>,
259
+ TNormalizationAst extends NormalizationAst | NormalizationAstLoader,
260
+ >(
261
+ artifact: TArtifact,
262
+ environment: IsographEnvironment,
263
+ root: StoreLink,
264
+ variables: ExtractParameters<TReadFromStore>,
265
+ readerWithRefetchQueries:
266
+ | ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>
267
+ | undefined,
268
+ ): TClientFieldValue | null {
269
+ // An entrypoint, but not a RefetchQueryNormalizationArtifact, has a reader ASTs.
270
+ // So, we can only pass data to onComplete if makeNetworkRequest was passed an entrypoint.
271
+ // This is awkward, since we don't express that in the types of the parameters
272
+ // (i.e. FetchOptions could be passed, along with a RefetchQueryNormalizationArtifact).
273
+ //
274
+ // However, this isn't a big deal: RefetchQueryNormalizationArtifact is going away.
275
+ if (artifact.kind === 'Entrypoint') {
276
+ // TODO this is a smell!
277
+ const fakeNetworkRequest = wrapResolvedValue(undefined);
278
+ // TODO this is a smell — we know the network response is not in flight,
279
+ // so we don't really care!
280
+ const fakeNetworkRequestOptions = {
281
+ suspendIfInFlight: false,
282
+ throwOnNetworkError: false,
283
+ };
284
+ const resolvedReaderWithRefetchQueries =
285
+ readerWithRefetchQueries as ReaderWithRefetchQueries<
286
+ TReadFromStore,
287
+ TClientFieldValue
288
+ >;
289
+
290
+ const fragment: FragmentReference<TReadFromStore, TClientFieldValue> = {
291
+ kind: 'FragmentReference',
292
+ // TODO this smells.
293
+ readerWithRefetchQueries: wrapResolvedValue(
294
+ resolvedReaderWithRefetchQueries,
295
+ ),
296
+ root,
297
+ variables,
298
+ networkRequest: fakeNetworkRequest,
299
+ };
300
+ const fragmentResult = readButDoNotEvaluate(
301
+ environment,
302
+ fragment,
303
+ fakeNetworkRequestOptions,
304
+ ).item;
305
+ const readerArtifact = resolvedReaderWithRefetchQueries.readerArtifact;
306
+ switch (readerArtifact.kind) {
307
+ case 'ComponentReaderArtifact': {
308
+ // @ts-expect-error We should find a way to encode this in the type system:
309
+ // if we have a ComponentReaderArtifact, we will necessarily have a
310
+ // TClientFieldValue which is a React.FC<...>
311
+ return getOrCreateCachedComponent(
312
+ environment,
313
+ readerArtifact.fieldName,
314
+ {
315
+ kind: 'FragmentReference',
316
+ readerWithRefetchQueries: wrapResolvedValue({
317
+ kind: 'ReaderWithRefetchQueries',
318
+ readerArtifact: readerArtifact,
319
+ nestedRefetchQueries:
320
+ resolvedReaderWithRefetchQueries.nestedRefetchQueries,
321
+ }),
322
+ root,
323
+ variables,
324
+ networkRequest: fakeNetworkRequest,
325
+ } as const,
326
+ fakeNetworkRequestOptions,
327
+ );
328
+ }
329
+ case 'EagerReaderArtifact': {
330
+ return readerArtifact.resolver({
331
+ data: fragmentResult,
332
+ parameters: variables,
333
+ ...(readerArtifact.hasUpdatable
334
+ ? {
335
+ startUpdate: getOrCreateCachedStartUpdate(
336
+ environment,
337
+ fragment,
338
+ resolvedReaderWithRefetchQueries.readerArtifact.fieldName,
339
+ fakeNetworkRequestOptions,
340
+ ),
341
+ }
342
+ : undefined),
343
+ });
344
+ }
345
+ default: {
346
+ const _: never = readerArtifact;
347
+ _;
348
+ throw new Error('Expected case');
349
+ }
350
+ }
351
+ }
352
+ return null;
353
+ }