@isograph/react 0.0.0-main-6815ceff → 0.0.0-main-3092d4a2
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-typescript.log +1 -1
- package/dist/core/read.d.ts +2 -1
- package/dist/core/read.d.ts.map +1 -1
- package/dist/core/read.js +103 -95
- package/package.json +4 -4
- package/src/core/read.ts +172 -158
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @isograph/react@0.0.0-main-
|
|
2
|
+
> @isograph/react@0.0.0-main-3092d4a2 compile-typescript /Users/runner/work/isograph/isograph/libs/isograph-react
|
|
3
3
|
> rm -rf dist/* && tsc -p tsconfig.pkg.json
|
|
4
4
|
|
package/dist/core/read.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { RefetchQueryNormalizationArtifactWrapper } from './entrypoint';
|
|
|
3
3
|
import { ExtractData, FragmentReference, Variables, type UnknownTReadFromStore } from './FragmentReference';
|
|
4
4
|
import { IsographEnvironment, type DataTypeValue, type Link, type StoreRecord } from './IsographEnvironment';
|
|
5
5
|
import { PromiseWrapper } from './PromiseWrapper';
|
|
6
|
-
import { ReaderAst, type ReaderImperativelyLoadedField, type ReaderLinkedField, type ReaderNonLoadableResolverField, type ReaderScalarField } from './reader';
|
|
6
|
+
import { ReaderAst, type ReaderImperativelyLoadedField, type ReaderLinkedField, type ReaderLoadableField, type ReaderNonLoadableResolverField, type ReaderScalarField } from './reader';
|
|
7
7
|
export type WithEncounteredRecords<T> = {
|
|
8
8
|
readonly encounteredRecords: EncounteredIds;
|
|
9
9
|
readonly item: ExtractData<T>;
|
|
@@ -19,6 +19,7 @@ export type ReadDataResult<Data> = ReadDataResultSuccess<Data> | {
|
|
|
19
19
|
readonly nestedReason?: ReadDataResult<unknown>;
|
|
20
20
|
readonly recordLink: Link;
|
|
21
21
|
};
|
|
22
|
+
export declare function readLoadablySelectedFieldData(environment: IsographEnvironment, field: ReaderLoadableField, root: Link, variables: Variables, networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions, mutableEncounteredRecords: EncounteredIds): ReadDataResult<unknown>;
|
|
22
23
|
export declare function readResolverFieldData(environment: IsographEnvironment, field: ReaderNonLoadableResolverField, root: Link, variables: Variables, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[], networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions, mutableEncounteredRecords: EncounteredIds): ReadDataResult<unknown>;
|
|
23
24
|
export declare function readScalarFieldData(field: ReaderScalarField, storeRecord: StoreRecord, root: Link, variables: Variables): ReadDataResult<string | number | boolean | Link | DataTypeValue[] | null>;
|
|
24
25
|
export declare function readLinkedFieldData(environment: IsographEnvironment, field: ReaderLinkedField, storeRecord: StoreRecord, root: Link, variables: Variables, networkRequest: PromiseWrapper<void, any>, readData: <TReadFromStore>(ast: ReaderAst<TReadFromStore>, root: Link) => ReadDataResult<object>): ReadDataResult<unknown>;
|
package/dist/core/read.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/core/read.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAEL,wCAAwC,EAEzC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,IAAI,EACT,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAEL,cAAc,EAKf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,KAAK,6BAA6B,EAClC,KAAK,iBAAiB,EACtB,KAAK,8BAA8B,EACnC,KAAK,iBAAiB,EACvB,MAAM,UAAU,CAAC;AAIlB,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI;IACtC,QAAQ,CAAC,kBAAkB,EAAE,cAAc,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;CAC/B,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,cAAc,SAAS,qBAAqB,EAE5C,WAAW,EAAE,mBAAmB,EAChC,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,EAC7D,qBAAqB,EAAE,2BAA2B,GACjD,sBAAsB,CAAC,cAAc,CAAC,CAiExC;AAED,MAAM,MAAM,qBAAqB,CAAC,IAAI,IAAI;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,IAAI,IAC3B,qBAAqB,CAAC,IAAI,CAAC,GAC3B;IACE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;CAC3B,CAAC;
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/core/read.ts"],"names":[],"mappings":"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"}
|
package/dist/core/read.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.readButDoNotEvaluate = readButDoNotEvaluate;
|
|
4
|
+
exports.readLoadablySelectedFieldData = readLoadablySelectedFieldData;
|
|
4
5
|
exports.readResolverFieldData = readResolverFieldData;
|
|
5
6
|
exports.readScalarFieldData = readScalarFieldData;
|
|
6
7
|
exports.readLinkedFieldData = readLinkedFieldData;
|
|
@@ -117,102 +118,11 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, netwo
|
|
|
117
118
|
break;
|
|
118
119
|
}
|
|
119
120
|
case 'LoadablySelectedField': {
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
if (refetchReaderParams.kind === 'MissingData') {
|
|
124
|
-
return {
|
|
125
|
-
kind: 'MissingData',
|
|
126
|
-
reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
127
|
-
nestedReason: refetchReaderParams,
|
|
128
|
-
recordLink: refetchReaderParams.recordLink,
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
target[field.alias] = (args,
|
|
133
|
-
// TODO get the associated type for FetchOptions from the loadably selected field
|
|
134
|
-
fetchOptions) => {
|
|
135
|
-
// TODO we should use the reader AST for this
|
|
136
|
-
const includeReadOutData = (variables, readOutData) => {
|
|
137
|
-
variables.id = readOutData.id;
|
|
138
|
-
return variables;
|
|
139
|
-
};
|
|
140
|
-
const localVariables = includeReadOutData(args !== null && args !== void 0 ? args : {}, refetchReaderParams.data);
|
|
141
|
-
writeQueryArgsToVariables(localVariables, field.queryArguments, variables);
|
|
142
|
-
return [
|
|
143
|
-
// Stable id
|
|
144
|
-
root.__typename +
|
|
145
|
-
':' +
|
|
146
|
-
root.__link +
|
|
147
|
-
'/' +
|
|
148
|
-
field.name +
|
|
149
|
-
'/' +
|
|
150
|
-
stableStringifyArgs(localVariables),
|
|
151
|
-
// Fetcher
|
|
152
|
-
() => {
|
|
153
|
-
const fragmentReferenceAndDisposeFromEntrypoint = (entrypoint) => {
|
|
154
|
-
const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
|
|
155
|
-
const fragmentReference = {
|
|
156
|
-
kind: 'FragmentReference',
|
|
157
|
-
readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)({
|
|
158
|
-
kind: 'ReaderWithRefetchQueries',
|
|
159
|
-
readerArtifact: entrypoint.readerWithRefetchQueries.readerArtifact,
|
|
160
|
-
nestedRefetchQueries: entrypoint.readerWithRefetchQueries
|
|
161
|
-
.nestedRefetchQueries,
|
|
162
|
-
}),
|
|
163
|
-
// TODO localVariables is not guaranteed to have an id field
|
|
164
|
-
root,
|
|
165
|
-
variables: localVariables,
|
|
166
|
-
networkRequest,
|
|
167
|
-
};
|
|
168
|
-
return [fragmentReference, disposeNetworkRequest];
|
|
169
|
-
};
|
|
170
|
-
if (field.entrypoint.kind === 'Entrypoint') {
|
|
171
|
-
return fragmentReferenceAndDisposeFromEntrypoint(field.entrypoint);
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
const isographArtifactPromiseWrapper = (0, IsographEnvironment_1.getOrLoadIsographArtifact)(environment, field.entrypoint.typeAndField, field.entrypoint.loader);
|
|
175
|
-
const state = (0, PromiseWrapper_1.getPromiseState)(isographArtifactPromiseWrapper);
|
|
176
|
-
if (state.kind === 'Ok') {
|
|
177
|
-
return fragmentReferenceAndDisposeFromEntrypoint(state.value);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
// Promise is pending or thrown
|
|
181
|
-
let entrypointLoaderState = { kind: 'EntrypointNotLoaded' };
|
|
182
|
-
const networkRequest = (0, PromiseWrapper_1.wrapPromise)(isographArtifactPromiseWrapper.promise.then((entrypoint) => {
|
|
183
|
-
if (entrypointLoaderState.kind === 'EntrypointNotLoaded') {
|
|
184
|
-
const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
|
|
185
|
-
entrypointLoaderState = {
|
|
186
|
-
kind: 'NetworkRequestStarted',
|
|
187
|
-
disposeNetworkRequest,
|
|
188
|
-
};
|
|
189
|
-
return networkRequest.promise;
|
|
190
|
-
}
|
|
191
|
-
}));
|
|
192
|
-
const readerWithRefetchPromise = isographArtifactPromiseWrapper.promise.then((entrypoint) => entrypoint.readerWithRefetchQueries);
|
|
193
|
-
const fragmentReference = {
|
|
194
|
-
kind: 'FragmentReference',
|
|
195
|
-
readerWithRefetchQueries: (0, PromiseWrapper_1.wrapPromise)(readerWithRefetchPromise),
|
|
196
|
-
// TODO localVariables is not guaranteed to have an id field
|
|
197
|
-
root,
|
|
198
|
-
variables: localVariables,
|
|
199
|
-
networkRequest,
|
|
200
|
-
};
|
|
201
|
-
return [
|
|
202
|
-
fragmentReference,
|
|
203
|
-
() => {
|
|
204
|
-
if (entrypointLoaderState.kind === 'NetworkRequestStarted') {
|
|
205
|
-
entrypointLoaderState.disposeNetworkRequest();
|
|
206
|
-
}
|
|
207
|
-
entrypointLoaderState = { kind: 'Disposed' };
|
|
208
|
-
},
|
|
209
|
-
];
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
},
|
|
213
|
-
];
|
|
214
|
-
};
|
|
121
|
+
const data = readLoadablySelectedFieldData(environment, field, root, variables, networkRequest, networkRequestOptions, mutableEncounteredRecords);
|
|
122
|
+
if (data.kind === 'MissingData') {
|
|
123
|
+
return data;
|
|
215
124
|
}
|
|
125
|
+
target[field.alias] = data.data;
|
|
216
126
|
break;
|
|
217
127
|
}
|
|
218
128
|
default: {
|
|
@@ -228,6 +138,104 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, netwo
|
|
|
228
138
|
data: target,
|
|
229
139
|
};
|
|
230
140
|
}
|
|
141
|
+
function readLoadablySelectedFieldData(environment, field, root, variables, networkRequest, networkRequestOptions, mutableEncounteredRecords) {
|
|
142
|
+
const refetchReaderParams = readData(environment, field.refetchReaderAst, root, variables,
|
|
143
|
+
// Refetch fields just read the id, and don't need refetch query artifacts
|
|
144
|
+
[], networkRequest, networkRequestOptions, mutableEncounteredRecords);
|
|
145
|
+
if (refetchReaderParams.kind === 'MissingData') {
|
|
146
|
+
return {
|
|
147
|
+
kind: 'MissingData',
|
|
148
|
+
reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
149
|
+
nestedReason: refetchReaderParams,
|
|
150
|
+
recordLink: refetchReaderParams.recordLink,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
kind: 'Success',
|
|
155
|
+
data: (args,
|
|
156
|
+
// TODO get the associated type for FetchOptions from the loadably selected field
|
|
157
|
+
fetchOptions) => {
|
|
158
|
+
// TODO we should use the reader AST for this
|
|
159
|
+
const includeReadOutData = (variables, readOutData) => {
|
|
160
|
+
variables.id = readOutData.id;
|
|
161
|
+
return variables;
|
|
162
|
+
};
|
|
163
|
+
const localVariables = includeReadOutData(args !== null && args !== void 0 ? args : {}, refetchReaderParams.data);
|
|
164
|
+
writeQueryArgsToVariables(localVariables, field.queryArguments, variables);
|
|
165
|
+
return [
|
|
166
|
+
// Stable id
|
|
167
|
+
root.__typename +
|
|
168
|
+
':' +
|
|
169
|
+
root.__link +
|
|
170
|
+
'/' +
|
|
171
|
+
field.name +
|
|
172
|
+
'/' +
|
|
173
|
+
stableStringifyArgs(localVariables),
|
|
174
|
+
// Fetcher
|
|
175
|
+
() => {
|
|
176
|
+
const fragmentReferenceAndDisposeFromEntrypoint = (entrypoint) => {
|
|
177
|
+
const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
|
|
178
|
+
const fragmentReference = {
|
|
179
|
+
kind: 'FragmentReference',
|
|
180
|
+
readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)({
|
|
181
|
+
kind: 'ReaderWithRefetchQueries',
|
|
182
|
+
readerArtifact: entrypoint.readerWithRefetchQueries.readerArtifact,
|
|
183
|
+
nestedRefetchQueries: entrypoint.readerWithRefetchQueries.nestedRefetchQueries,
|
|
184
|
+
}),
|
|
185
|
+
// TODO localVariables is not guaranteed to have an id field
|
|
186
|
+
root,
|
|
187
|
+
variables: localVariables,
|
|
188
|
+
networkRequest,
|
|
189
|
+
};
|
|
190
|
+
return [fragmentReference, disposeNetworkRequest];
|
|
191
|
+
};
|
|
192
|
+
if (field.entrypoint.kind === 'Entrypoint') {
|
|
193
|
+
return fragmentReferenceAndDisposeFromEntrypoint(field.entrypoint);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
const isographArtifactPromiseWrapper = (0, IsographEnvironment_1.getOrLoadIsographArtifact)(environment, field.entrypoint.typeAndField, field.entrypoint.loader);
|
|
197
|
+
const state = (0, PromiseWrapper_1.getPromiseState)(isographArtifactPromiseWrapper);
|
|
198
|
+
if (state.kind === 'Ok') {
|
|
199
|
+
return fragmentReferenceAndDisposeFromEntrypoint(state.value);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// Promise is pending or thrown
|
|
203
|
+
let entrypointLoaderState = { kind: 'EntrypointNotLoaded' };
|
|
204
|
+
const networkRequest = (0, PromiseWrapper_1.wrapPromise)(isographArtifactPromiseWrapper.promise.then((entrypoint) => {
|
|
205
|
+
if (entrypointLoaderState.kind === 'EntrypointNotLoaded') {
|
|
206
|
+
const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, entrypoint, localVariables, fetchOptions);
|
|
207
|
+
entrypointLoaderState = {
|
|
208
|
+
kind: 'NetworkRequestStarted',
|
|
209
|
+
disposeNetworkRequest,
|
|
210
|
+
};
|
|
211
|
+
return networkRequest.promise;
|
|
212
|
+
}
|
|
213
|
+
}));
|
|
214
|
+
const readerWithRefetchPromise = isographArtifactPromiseWrapper.promise.then((entrypoint) => entrypoint.readerWithRefetchQueries);
|
|
215
|
+
const fragmentReference = {
|
|
216
|
+
kind: 'FragmentReference',
|
|
217
|
+
readerWithRefetchQueries: (0, PromiseWrapper_1.wrapPromise)(readerWithRefetchPromise),
|
|
218
|
+
// TODO localVariables is not guaranteed to have an id field
|
|
219
|
+
root,
|
|
220
|
+
variables: localVariables,
|
|
221
|
+
networkRequest,
|
|
222
|
+
};
|
|
223
|
+
return [
|
|
224
|
+
fragmentReference,
|
|
225
|
+
() => {
|
|
226
|
+
if (entrypointLoaderState.kind === 'NetworkRequestStarted') {
|
|
227
|
+
entrypointLoaderState.disposeNetworkRequest();
|
|
228
|
+
}
|
|
229
|
+
entrypointLoaderState = { kind: 'Disposed' };
|
|
230
|
+
},
|
|
231
|
+
];
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
];
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
}
|
|
231
239
|
function filterVariables(variables, allowedVariables) {
|
|
232
240
|
const result = {};
|
|
233
241
|
for (const key of allowedVariables) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@isograph/react",
|
|
3
|
-
"version": "0.0.0-main-
|
|
3
|
+
"version": "0.0.0-main-3092d4a2",
|
|
4
4
|
"description": "Use Isograph with React",
|
|
5
5
|
"homepage": "https://isograph.dev",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
"iso-watch": "cross-env ../../target/debug/isograph_cli --config ./isograph.config.json --watch"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@isograph/disposable-types": "0.0.0-main-
|
|
24
|
-
"@isograph/react-disposable-state": "0.0.0-main-
|
|
25
|
-
"@isograph/reference-counted-pointer": "0.0.0-main-
|
|
23
|
+
"@isograph/disposable-types": "0.0.0-main-3092d4a2",
|
|
24
|
+
"@isograph/react-disposable-state": "0.0.0-main-3092d4a2",
|
|
25
|
+
"@isograph/reference-counted-pointer": "0.0.0-main-3092d4a2"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"react": "^18.0.0 || ^19.0.0"
|
package/src/core/read.ts
CHANGED
|
@@ -40,6 +40,7 @@ import {
|
|
|
40
40
|
ReaderAst,
|
|
41
41
|
type ReaderImperativelyLoadedField,
|
|
42
42
|
type ReaderLinkedField,
|
|
43
|
+
type ReaderLoadableField,
|
|
43
44
|
type ReaderNonLoadableResolverField,
|
|
44
45
|
type ReaderScalarField,
|
|
45
46
|
} from './reader';
|
|
@@ -247,172 +248,19 @@ function readData<TReadFromStore>(
|
|
|
247
248
|
break;
|
|
248
249
|
}
|
|
249
250
|
case 'LoadablySelectedField': {
|
|
250
|
-
const
|
|
251
|
+
const data = readLoadablySelectedFieldData(
|
|
251
252
|
environment,
|
|
252
|
-
field
|
|
253
|
+
field,
|
|
253
254
|
root,
|
|
254
255
|
variables,
|
|
255
|
-
// Refetch fields just read the id, and don't need refetch query artifacts
|
|
256
|
-
[],
|
|
257
256
|
networkRequest,
|
|
258
257
|
networkRequestOptions,
|
|
259
258
|
mutableEncounteredRecords,
|
|
260
259
|
);
|
|
261
|
-
if (
|
|
262
|
-
return
|
|
263
|
-
kind: 'MissingData',
|
|
264
|
-
reason:
|
|
265
|
-
'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
266
|
-
nestedReason: refetchReaderParams,
|
|
267
|
-
recordLink: refetchReaderParams.recordLink,
|
|
268
|
-
};
|
|
269
|
-
} else {
|
|
270
|
-
target[field.alias] = (
|
|
271
|
-
args: any,
|
|
272
|
-
// TODO get the associated type for FetchOptions from the loadably selected field
|
|
273
|
-
fetchOptions?: FetchOptions<any>,
|
|
274
|
-
) => {
|
|
275
|
-
// TODO we should use the reader AST for this
|
|
276
|
-
const includeReadOutData = (variables: any, readOutData: any) => {
|
|
277
|
-
variables.id = readOutData.id;
|
|
278
|
-
return variables;
|
|
279
|
-
};
|
|
280
|
-
const localVariables = includeReadOutData(
|
|
281
|
-
args ?? {},
|
|
282
|
-
refetchReaderParams.data,
|
|
283
|
-
);
|
|
284
|
-
writeQueryArgsToVariables(
|
|
285
|
-
localVariables,
|
|
286
|
-
field.queryArguments,
|
|
287
|
-
variables,
|
|
288
|
-
);
|
|
289
|
-
|
|
290
|
-
return [
|
|
291
|
-
// Stable id
|
|
292
|
-
root.__typename +
|
|
293
|
-
':' +
|
|
294
|
-
root.__link +
|
|
295
|
-
'/' +
|
|
296
|
-
field.name +
|
|
297
|
-
'/' +
|
|
298
|
-
stableStringifyArgs(localVariables),
|
|
299
|
-
// Fetcher
|
|
300
|
-
() => {
|
|
301
|
-
const fragmentReferenceAndDisposeFromEntrypoint = (
|
|
302
|
-
entrypoint: IsographEntrypoint<any, any, any>,
|
|
303
|
-
): [FragmentReference<any, any>, CleanupFn] => {
|
|
304
|
-
const [networkRequest, disposeNetworkRequest] =
|
|
305
|
-
maybeMakeNetworkRequest(
|
|
306
|
-
environment,
|
|
307
|
-
entrypoint,
|
|
308
|
-
localVariables,
|
|
309
|
-
fetchOptions,
|
|
310
|
-
);
|
|
311
|
-
|
|
312
|
-
const fragmentReference: FragmentReference<any, any> = {
|
|
313
|
-
kind: 'FragmentReference',
|
|
314
|
-
readerWithRefetchQueries: wrapResolvedValue({
|
|
315
|
-
kind: 'ReaderWithRefetchQueries',
|
|
316
|
-
readerArtifact:
|
|
317
|
-
entrypoint.readerWithRefetchQueries.readerArtifact,
|
|
318
|
-
nestedRefetchQueries:
|
|
319
|
-
entrypoint.readerWithRefetchQueries
|
|
320
|
-
.nestedRefetchQueries,
|
|
321
|
-
} as const),
|
|
322
|
-
|
|
323
|
-
// TODO localVariables is not guaranteed to have an id field
|
|
324
|
-
root,
|
|
325
|
-
variables: localVariables,
|
|
326
|
-
networkRequest,
|
|
327
|
-
};
|
|
328
|
-
return [fragmentReference, disposeNetworkRequest];
|
|
329
|
-
};
|
|
330
|
-
|
|
331
|
-
if (field.entrypoint.kind === 'Entrypoint') {
|
|
332
|
-
return fragmentReferenceAndDisposeFromEntrypoint(
|
|
333
|
-
field.entrypoint,
|
|
334
|
-
);
|
|
335
|
-
} else {
|
|
336
|
-
const isographArtifactPromiseWrapper =
|
|
337
|
-
getOrLoadIsographArtifact(
|
|
338
|
-
environment,
|
|
339
|
-
field.entrypoint.typeAndField,
|
|
340
|
-
field.entrypoint.loader,
|
|
341
|
-
);
|
|
342
|
-
const state = getPromiseState(isographArtifactPromiseWrapper);
|
|
343
|
-
if (state.kind === 'Ok') {
|
|
344
|
-
return fragmentReferenceAndDisposeFromEntrypoint(
|
|
345
|
-
state.value,
|
|
346
|
-
);
|
|
347
|
-
} else {
|
|
348
|
-
// Promise is pending or thrown
|
|
349
|
-
|
|
350
|
-
let entrypointLoaderState:
|
|
351
|
-
| {
|
|
352
|
-
kind: 'EntrypointNotLoaded';
|
|
353
|
-
}
|
|
354
|
-
| {
|
|
355
|
-
kind: 'NetworkRequestStarted';
|
|
356
|
-
disposeNetworkRequest: CleanupFn;
|
|
357
|
-
}
|
|
358
|
-
| { kind: 'Disposed' } = { kind: 'EntrypointNotLoaded' };
|
|
359
|
-
|
|
360
|
-
const networkRequest = wrapPromise(
|
|
361
|
-
isographArtifactPromiseWrapper.promise.then(
|
|
362
|
-
(entrypoint) => {
|
|
363
|
-
if (
|
|
364
|
-
entrypointLoaderState.kind === 'EntrypointNotLoaded'
|
|
365
|
-
) {
|
|
366
|
-
const [networkRequest, disposeNetworkRequest] =
|
|
367
|
-
maybeMakeNetworkRequest(
|
|
368
|
-
environment,
|
|
369
|
-
entrypoint,
|
|
370
|
-
localVariables,
|
|
371
|
-
fetchOptions,
|
|
372
|
-
);
|
|
373
|
-
entrypointLoaderState = {
|
|
374
|
-
kind: 'NetworkRequestStarted',
|
|
375
|
-
disposeNetworkRequest,
|
|
376
|
-
};
|
|
377
|
-
return networkRequest.promise;
|
|
378
|
-
}
|
|
379
|
-
},
|
|
380
|
-
),
|
|
381
|
-
);
|
|
382
|
-
const readerWithRefetchPromise =
|
|
383
|
-
isographArtifactPromiseWrapper.promise.then(
|
|
384
|
-
(entrypoint) => entrypoint.readerWithRefetchQueries,
|
|
385
|
-
);
|
|
386
|
-
|
|
387
|
-
const fragmentReference: FragmentReference<any, any> = {
|
|
388
|
-
kind: 'FragmentReference',
|
|
389
|
-
readerWithRefetchQueries: wrapPromise(
|
|
390
|
-
readerWithRefetchPromise,
|
|
391
|
-
),
|
|
392
|
-
|
|
393
|
-
// TODO localVariables is not guaranteed to have an id field
|
|
394
|
-
root,
|
|
395
|
-
variables: localVariables,
|
|
396
|
-
networkRequest,
|
|
397
|
-
};
|
|
398
|
-
|
|
399
|
-
return [
|
|
400
|
-
fragmentReference,
|
|
401
|
-
() => {
|
|
402
|
-
if (
|
|
403
|
-
entrypointLoaderState.kind === 'NetworkRequestStarted'
|
|
404
|
-
) {
|
|
405
|
-
entrypointLoaderState.disposeNetworkRequest();
|
|
406
|
-
}
|
|
407
|
-
entrypointLoaderState = { kind: 'Disposed' };
|
|
408
|
-
},
|
|
409
|
-
];
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
},
|
|
413
|
-
];
|
|
414
|
-
};
|
|
260
|
+
if (data.kind === 'MissingData') {
|
|
261
|
+
return data;
|
|
415
262
|
}
|
|
263
|
+
target[field.alias] = data.data;
|
|
416
264
|
break;
|
|
417
265
|
}
|
|
418
266
|
|
|
@@ -430,6 +278,172 @@ function readData<TReadFromStore>(
|
|
|
430
278
|
};
|
|
431
279
|
}
|
|
432
280
|
|
|
281
|
+
export function readLoadablySelectedFieldData(
|
|
282
|
+
environment: IsographEnvironment,
|
|
283
|
+
field: ReaderLoadableField,
|
|
284
|
+
root: Link,
|
|
285
|
+
variables: Variables,
|
|
286
|
+
networkRequest: PromiseWrapper<void, any>,
|
|
287
|
+
networkRequestOptions: NetworkRequestReaderOptions,
|
|
288
|
+
mutableEncounteredRecords: EncounteredIds,
|
|
289
|
+
): ReadDataResult<unknown> {
|
|
290
|
+
const refetchReaderParams = readData(
|
|
291
|
+
environment,
|
|
292
|
+
field.refetchReaderAst,
|
|
293
|
+
root,
|
|
294
|
+
variables,
|
|
295
|
+
// Refetch fields just read the id, and don't need refetch query artifacts
|
|
296
|
+
[],
|
|
297
|
+
networkRequest,
|
|
298
|
+
networkRequestOptions,
|
|
299
|
+
mutableEncounteredRecords,
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
if (refetchReaderParams.kind === 'MissingData') {
|
|
303
|
+
return {
|
|
304
|
+
kind: 'MissingData',
|
|
305
|
+
reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
306
|
+
nestedReason: refetchReaderParams,
|
|
307
|
+
recordLink: refetchReaderParams.recordLink,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
return {
|
|
312
|
+
kind: 'Success',
|
|
313
|
+
data: (
|
|
314
|
+
args: any,
|
|
315
|
+
// TODO get the associated type for FetchOptions from the loadably selected field
|
|
316
|
+
fetchOptions?: FetchOptions<any>,
|
|
317
|
+
) => {
|
|
318
|
+
// TODO we should use the reader AST for this
|
|
319
|
+
const includeReadOutData = (variables: any, readOutData: any) => {
|
|
320
|
+
variables.id = readOutData.id;
|
|
321
|
+
return variables;
|
|
322
|
+
};
|
|
323
|
+
const localVariables = includeReadOutData(
|
|
324
|
+
args ?? {},
|
|
325
|
+
refetchReaderParams.data,
|
|
326
|
+
);
|
|
327
|
+
writeQueryArgsToVariables(
|
|
328
|
+
localVariables,
|
|
329
|
+
field.queryArguments,
|
|
330
|
+
variables,
|
|
331
|
+
);
|
|
332
|
+
|
|
333
|
+
return [
|
|
334
|
+
// Stable id
|
|
335
|
+
root.__typename +
|
|
336
|
+
':' +
|
|
337
|
+
root.__link +
|
|
338
|
+
'/' +
|
|
339
|
+
field.name +
|
|
340
|
+
'/' +
|
|
341
|
+
stableStringifyArgs(localVariables),
|
|
342
|
+
// Fetcher
|
|
343
|
+
() => {
|
|
344
|
+
const fragmentReferenceAndDisposeFromEntrypoint = (
|
|
345
|
+
entrypoint: IsographEntrypoint<any, any, any>,
|
|
346
|
+
): [FragmentReference<any, any>, CleanupFn] => {
|
|
347
|
+
const [networkRequest, disposeNetworkRequest] =
|
|
348
|
+
maybeMakeNetworkRequest(
|
|
349
|
+
environment,
|
|
350
|
+
entrypoint,
|
|
351
|
+
localVariables,
|
|
352
|
+
fetchOptions,
|
|
353
|
+
);
|
|
354
|
+
|
|
355
|
+
const fragmentReference: FragmentReference<any, any> = {
|
|
356
|
+
kind: 'FragmentReference',
|
|
357
|
+
readerWithRefetchQueries: wrapResolvedValue({
|
|
358
|
+
kind: 'ReaderWithRefetchQueries',
|
|
359
|
+
readerArtifact:
|
|
360
|
+
entrypoint.readerWithRefetchQueries.readerArtifact,
|
|
361
|
+
nestedRefetchQueries:
|
|
362
|
+
entrypoint.readerWithRefetchQueries.nestedRefetchQueries,
|
|
363
|
+
} as const),
|
|
364
|
+
|
|
365
|
+
// TODO localVariables is not guaranteed to have an id field
|
|
366
|
+
root,
|
|
367
|
+
variables: localVariables,
|
|
368
|
+
networkRequest,
|
|
369
|
+
};
|
|
370
|
+
return [fragmentReference, disposeNetworkRequest];
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
if (field.entrypoint.kind === 'Entrypoint') {
|
|
374
|
+
return fragmentReferenceAndDisposeFromEntrypoint(field.entrypoint);
|
|
375
|
+
} else {
|
|
376
|
+
const isographArtifactPromiseWrapper = getOrLoadIsographArtifact(
|
|
377
|
+
environment,
|
|
378
|
+
field.entrypoint.typeAndField,
|
|
379
|
+
field.entrypoint.loader,
|
|
380
|
+
);
|
|
381
|
+
const state = getPromiseState(isographArtifactPromiseWrapper);
|
|
382
|
+
if (state.kind === 'Ok') {
|
|
383
|
+
return fragmentReferenceAndDisposeFromEntrypoint(state.value);
|
|
384
|
+
} else {
|
|
385
|
+
// Promise is pending or thrown
|
|
386
|
+
|
|
387
|
+
let entrypointLoaderState:
|
|
388
|
+
| {
|
|
389
|
+
kind: 'EntrypointNotLoaded';
|
|
390
|
+
}
|
|
391
|
+
| {
|
|
392
|
+
kind: 'NetworkRequestStarted';
|
|
393
|
+
disposeNetworkRequest: CleanupFn;
|
|
394
|
+
}
|
|
395
|
+
| { kind: 'Disposed' } = { kind: 'EntrypointNotLoaded' };
|
|
396
|
+
|
|
397
|
+
const networkRequest = wrapPromise(
|
|
398
|
+
isographArtifactPromiseWrapper.promise.then((entrypoint) => {
|
|
399
|
+
if (entrypointLoaderState.kind === 'EntrypointNotLoaded') {
|
|
400
|
+
const [networkRequest, disposeNetworkRequest] =
|
|
401
|
+
maybeMakeNetworkRequest(
|
|
402
|
+
environment,
|
|
403
|
+
entrypoint,
|
|
404
|
+
localVariables,
|
|
405
|
+
fetchOptions,
|
|
406
|
+
);
|
|
407
|
+
entrypointLoaderState = {
|
|
408
|
+
kind: 'NetworkRequestStarted',
|
|
409
|
+
disposeNetworkRequest,
|
|
410
|
+
};
|
|
411
|
+
return networkRequest.promise;
|
|
412
|
+
}
|
|
413
|
+
}),
|
|
414
|
+
);
|
|
415
|
+
const readerWithRefetchPromise =
|
|
416
|
+
isographArtifactPromiseWrapper.promise.then(
|
|
417
|
+
(entrypoint) => entrypoint.readerWithRefetchQueries,
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
const fragmentReference: FragmentReference<any, any> = {
|
|
421
|
+
kind: 'FragmentReference',
|
|
422
|
+
readerWithRefetchQueries: wrapPromise(readerWithRefetchPromise),
|
|
423
|
+
|
|
424
|
+
// TODO localVariables is not guaranteed to have an id field
|
|
425
|
+
root,
|
|
426
|
+
variables: localVariables,
|
|
427
|
+
networkRequest,
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
return [
|
|
431
|
+
fragmentReference,
|
|
432
|
+
() => {
|
|
433
|
+
if (entrypointLoaderState.kind === 'NetworkRequestStarted') {
|
|
434
|
+
entrypointLoaderState.disposeNetworkRequest();
|
|
435
|
+
}
|
|
436
|
+
entrypointLoaderState = { kind: 'Disposed' };
|
|
437
|
+
},
|
|
438
|
+
];
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
},
|
|
442
|
+
];
|
|
443
|
+
},
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
|
|
433
447
|
function filterVariables(
|
|
434
448
|
variables: Variables,
|
|
435
449
|
allowedVariables: string[],
|