@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.
- package/.turbo/turbo-compile-libs.log +5 -0
- package/dist/core/FragmentReference.d.ts +17 -8
- package/dist/core/FragmentReference.d.ts.map +1 -1
- package/dist/core/FragmentReference.js +3 -12
- package/dist/core/IsographEnvironment.d.ts +30 -35
- package/dist/core/IsographEnvironment.d.ts.map +1 -1
- package/dist/core/IsographEnvironment.js +4 -0
- package/dist/core/PromiseWrapper.d.ts +6 -7
- package/dist/core/PromiseWrapper.d.ts.map +1 -1
- package/dist/core/PromiseWrapper.js +6 -12
- package/dist/core/areEqualWithDeepComparison.d.ts +1 -3
- package/dist/core/areEqualWithDeepComparison.d.ts.map +1 -1
- package/dist/core/areEqualWithDeepComparison.js +16 -2
- package/dist/core/brand.d.ts +2 -0
- package/dist/core/brand.d.ts.map +1 -0
- package/dist/core/brand.js +2 -0
- package/dist/core/cache.d.ts +16 -24
- package/dist/core/cache.d.ts.map +1 -1
- package/dist/core/cache.js +105 -72
- package/dist/core/check.d.ts +11 -7
- package/dist/core/check.d.ts.map +1 -1
- package/dist/core/check.js +2 -2
- package/dist/core/componentCache.d.ts +1 -1
- package/dist/core/componentCache.d.ts.map +1 -1
- package/dist/core/componentCache.js +27 -31
- package/dist/core/entrypoint.d.ts +43 -28
- package/dist/core/entrypoint.d.ts.map +1 -1
- package/dist/core/garbageCollection.d.ts +5 -6
- package/dist/core/garbageCollection.d.ts.map +1 -1
- package/dist/core/garbageCollection.js +1 -1
- package/dist/core/logging.d.ts +23 -15
- package/dist/core/logging.d.ts.map +1 -1
- package/dist/core/logging.js +8 -5
- package/dist/core/makeNetworkRequest.d.ts +5 -5
- package/dist/core/makeNetworkRequest.d.ts.map +1 -1
- package/dist/core/makeNetworkRequest.js +113 -28
- package/dist/core/read.d.ts +16 -11
- package/dist/core/read.d.ts.map +1 -1
- package/dist/core/read.js +468 -305
- package/dist/core/reader.d.ts +33 -37
- package/dist/core/reader.d.ts.map +1 -1
- package/dist/core/startUpdate.d.ts +8 -0
- package/dist/core/startUpdate.d.ts.map +1 -0
- package/dist/core/startUpdate.js +163 -0
- package/dist/core/util.d.ts +3 -0
- package/dist/core/util.d.ts.map +1 -1
- package/dist/index.d.ts +18 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/loadable-hooks/useClientSideDefer.d.ts +4 -10
- package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
- package/dist/loadable-hooks/useClientSideDefer.js +2 -2
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +8 -15
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
- package/dist/loadable-hooks/useConnectionSpecPagination.js +6 -4
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +1 -2
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -1
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts +4 -6
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -1
- package/dist/loadable-hooks/useImperativeLoadableField.js +1 -1
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts +6 -13
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
- package/dist/loadable-hooks/useSkipLimitPagination.js +11 -9
- package/dist/react/FragmentReader.d.ts +7 -14
- package/dist/react/FragmentReader.d.ts.map +1 -1
- package/dist/react/FragmentReader.js +3 -30
- package/dist/react/FragmentRenderer.d.ts +15 -0
- package/dist/react/FragmentRenderer.d.ts.map +1 -0
- package/dist/react/FragmentRenderer.js +35 -0
- package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -1
- package/dist/react/LoadableFieldReader.d.ts +12 -0
- package/dist/react/LoadableFieldReader.d.ts.map +1 -0
- package/dist/react/LoadableFieldReader.js +10 -0
- package/dist/react/LoadableFieldRenderer.d.ts +13 -0
- package/dist/react/LoadableFieldRenderer.d.ts.map +1 -0
- package/dist/react/LoadableFieldRenderer.js +37 -0
- package/dist/react/useImperativeReference.d.ts +7 -10
- package/dist/react/useImperativeReference.d.ts.map +1 -1
- package/dist/react/useImperativeReference.js +8 -9
- package/dist/react/useLazyReference.d.ts +4 -7
- package/dist/react/useLazyReference.d.ts.map +1 -1
- package/dist/react/useLazyReference.js +26 -5
- package/dist/react/useReadAndSubscribe.d.ts +3 -9
- package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
- package/dist/react/useReadAndSubscribe.js +7 -3
- package/dist/react/useRerenderOnChange.d.ts +1 -1
- package/dist/react/useRerenderOnChange.d.ts.map +1 -1
- package/dist/react/useResult.d.ts +3 -6
- package/dist/react/useResult.d.ts.map +1 -1
- package/dist/react/useResult.js +10 -8
- package/isograph.config.json +1 -0
- package/package.json +6 -6
- package/src/core/FragmentReference.ts +40 -16
- package/src/core/IsographEnvironment.ts +57 -39
- package/src/core/PromiseWrapper.ts +15 -18
- package/src/core/areEqualWithDeepComparison.ts +22 -2
- package/src/core/brand.ts +18 -0
- package/src/core/cache.ts +153 -113
- package/src/core/check.ts +17 -12
- package/src/core/componentCache.ts +47 -50
- package/src/core/entrypoint.ts +66 -21
- package/src/core/garbageCollection.ts +9 -9
- package/src/core/logging.ts +39 -25
- package/src/core/makeNetworkRequest.ts +212 -34
- package/src/core/read.ts +728 -440
- package/src/core/reader.ts +46 -29
- package/src/core/startUpdate.ts +334 -0
- package/src/core/util.ts +4 -0
- package/src/index.ts +89 -8
- package/src/loadable-hooks/useClientSideDefer.ts +11 -10
- package/src/loadable-hooks/useConnectionSpecPagination.ts +27 -13
- package/src/loadable-hooks/useImperativeExposedMutationField.ts +1 -1
- package/src/loadable-hooks/useImperativeLoadableField.ts +10 -12
- package/src/loadable-hooks/useSkipLimitPagination.ts +38 -19
- package/src/react/FragmentReader.tsx +23 -39
- package/src/react/FragmentRenderer.tsx +46 -0
- package/src/react/IsographEnvironmentProvider.tsx +1 -1
- package/src/react/LoadableFieldReader.tsx +40 -0
- package/src/react/LoadableFieldRenderer.tsx +41 -0
- package/src/react/useImperativeReference.ts +49 -27
- package/src/react/useLazyReference.ts +62 -14
- package/src/react/useReadAndSubscribe.ts +17 -9
- package/src/react/useRerenderOnChange.ts +2 -2
- package/src/react/useResult.ts +22 -8
- package/src/tests/__isograph/Economist/link/output_type.ts +2 -0
- package/src/tests/__isograph/Node/asEconomist/resolver_reader.ts +28 -0
- package/src/tests/__isograph/Node/link/output_type.ts +3 -0
- package/src/tests/__isograph/Query/linkedUpdate/entrypoint.ts +31 -0
- package/src/tests/__isograph/Query/linkedUpdate/normalization_ast.ts +95 -0
- package/src/tests/__isograph/Query/linkedUpdate/output_type.ts +3 -0
- package/src/tests/__isograph/Query/linkedUpdate/param_type.ts +51 -0
- package/src/tests/__isograph/Query/linkedUpdate/query_text.ts +20 -0
- package/src/tests/__isograph/Query/linkedUpdate/resolver_reader.ts +93 -0
- package/src/tests/__isograph/Query/meName/entrypoint.ts +8 -29
- package/src/tests/__isograph/Query/meName/normalization_ast.ts +25 -0
- package/src/tests/__isograph/Query/meName/query_text.ts +6 -0
- package/src/tests/__isograph/Query/meName/resolver_reader.ts +5 -0
- package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +8 -67
- package/src/tests/__isograph/Query/meNameSuccessor/normalization_ast.ts +56 -0
- package/src/tests/__isograph/Query/meNameSuccessor/query_text.ts +13 -0
- package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +10 -0
- package/src/tests/__isograph/Query/nodeField/entrypoint.ts +8 -34
- package/src/tests/__isograph/Query/nodeField/normalization_ast.ts +30 -0
- package/src/tests/__isograph/Query/nodeField/query_text.ts +6 -0
- package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +5 -0
- package/src/tests/__isograph/Query/startUpdate/entrypoint.ts +31 -0
- package/src/tests/__isograph/Query/startUpdate/normalization_ast.ts +51 -0
- package/src/tests/__isograph/Query/startUpdate/output_type.ts +3 -0
- package/src/tests/__isograph/Query/startUpdate/param_type.ts +26 -0
- package/src/tests/__isograph/Query/startUpdate/parameters_type.ts +3 -0
- package/src/tests/__isograph/Query/startUpdate/query_text.ts +11 -0
- package/src/tests/__isograph/Query/startUpdate/resolver_reader.ts +55 -0
- package/src/tests/__isograph/Query/subquery/entrypoint.ts +8 -44
- package/src/tests/__isograph/Query/subquery/normalization_ast.ts +38 -0
- package/src/tests/__isograph/Query/subquery/query_text.ts +8 -0
- package/src/tests/__isograph/Query/subquery/resolver_reader.ts +7 -0
- package/src/tests/__isograph/iso.ts +24 -3
- package/src/tests/__isograph/tsconfig.json +8 -0
- package/src/tests/garbageCollection.test.ts +10 -8
- package/src/tests/meNameSuccessor.ts +1 -1
- package/src/tests/nodeQuery.ts +2 -1
- package/src/tests/normalizeData.test.ts +1 -2
- package/src/tests/startUpdate.test.ts +205 -0
- 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 {
|
|
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 {
|
|
21
|
-
import {
|
|
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:
|
|
29
|
-
variables:
|
|
30
|
-
|
|
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(
|
|
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
|
-
|
|
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:
|
|
66
|
-
variables:
|
|
67
|
-
|
|
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 =
|
|
85
|
-
.networkFunction(
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
+
}
|