@isograph/react 0.0.0-main-8821fa52 → 0.0.0-main-aa925b7c
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 +4 -1
- package/dist/core/read.d.ts.map +1 -1
- package/dist/core/read.js +106 -86
- package/package.json +4 -4
- package/src/core/read.ts +174 -117
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @isograph/react@0.0.0-main-
|
|
2
|
+
> @isograph/react@0.0.0-main-aa925b7c 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
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type EncounteredIds } from './cache';
|
|
2
|
+
import { RefetchQueryNormalizationArtifactWrapper } from './entrypoint';
|
|
2
3
|
import { ExtractData, FragmentReference, Variables, type UnknownTReadFromStore } from './FragmentReference';
|
|
3
4
|
import { IsographEnvironment, type DataTypeValue, type Link, type StoreRecord } from './IsographEnvironment';
|
|
4
5
|
import { PromiseWrapper } from './PromiseWrapper';
|
|
5
|
-
import { ReaderAst, type ReaderLinkedField, type ReaderScalarField } from './reader';
|
|
6
|
+
import { ReaderAst, type ReaderImperativelyLoadedField, type ReaderLinkedField, type ReaderNonLoadableResolverField, type ReaderScalarField } from './reader';
|
|
6
7
|
export type WithEncounteredRecords<T> = {
|
|
7
8
|
readonly encounteredRecords: EncounteredIds;
|
|
8
9
|
readonly item: ExtractData<T>;
|
|
@@ -18,6 +19,7 @@ export type ReadDataResult<Data> = ReadDataResultSuccess<Data> | {
|
|
|
18
19
|
readonly nestedReason?: ReadDataResult<unknown>;
|
|
19
20
|
readonly recordLink: Link;
|
|
20
21
|
};
|
|
22
|
+
export declare function readResolverFieldData(environment: IsographEnvironment, field: ReaderNonLoadableResolverField, root: Link, variables: Variables, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[], networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions, mutableEncounteredRecords: EncounteredIds): ReadDataResult<unknown>;
|
|
21
23
|
export declare function readScalarFieldData(field: ReaderScalarField, storeRecord: StoreRecord, root: Link, variables: Variables): ReadDataResult<string | number | boolean | Link | DataTypeValue[] | null>;
|
|
22
24
|
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>;
|
|
23
25
|
export type NetworkRequestReaderOptions = {
|
|
@@ -25,4 +27,5 @@ export type NetworkRequestReaderOptions = {
|
|
|
25
27
|
throwOnNetworkError: boolean;
|
|
26
28
|
};
|
|
27
29
|
export declare function getNetworkRequestOptionsWithDefaults(networkRequestOptions?: Partial<NetworkRequestReaderOptions> | void): NetworkRequestReaderOptions;
|
|
30
|
+
export declare function readImperativelyLoadedField(environment: IsographEnvironment, field: ReaderImperativelyLoadedField, root: Link, variables: Variables, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[], networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions, mutableEncounteredRecords: EncounteredIds): ReadDataResult<unknown>;
|
|
28
31
|
//# sourceMappingURL=read.d.ts.map
|
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;
|
|
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;AAwXN,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,mBAAmB,EAChC,KAAK,EAAE,8BAA8B,EACrC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,EACpB,oBAAoB,EAAE,wCAAwC,EAAE,EAChE,cAAc,EAAE,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,EACzC,qBAAqB,EAAE,2BAA2B,EAClD,yBAAyB,EAAE,cAAc,GACxC,cAAc,CAAC,OAAO,CAAC,CA+EzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,GACnB,cAAc,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,aAAa,EAAE,GAAG,IAAI,CAAC,CAa3E;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,mBAAmB,EAChC,KAAK,EAAE,iBAAiB,EACxB,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,EAEzC,QAAQ,EAAE,CAAC,cAAc,EACvB,GAAG,EAAE,SAAS,CAAC,cAAc,CAAC,EAC9B,IAAI,EAAE,IAAI,KACP,cAAc,CAAC,MAAM,CAAC,GAC1B,cAAc,CAAC,OAAO,CAAC,CA6JzB;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,wBAAgB,oCAAoC,CAClD,qBAAqB,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,GAAG,IAAI,GAClE,2BAA2B,CAK7B;AAiBD,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,mBAAmB,EAChC,KAAK,EAAE,6BAA6B,EACpC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,EACpB,oBAAoB,EAAE,wCAAwC,EAAE,EAChE,cAAc,EAAE,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,EACzC,qBAAqB,EAAE,2BAA2B,EAClD,yBAAyB,EAAE,cAAc,GACxC,cAAc,CAAC,OAAO,CAAC,CAuDzB"}
|
package/dist/core/read.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.readButDoNotEvaluate = readButDoNotEvaluate;
|
|
4
|
+
exports.readResolverFieldData = readResolverFieldData;
|
|
4
5
|
exports.readScalarFieldData = readScalarFieldData;
|
|
5
6
|
exports.readLinkedFieldData = readLinkedFieldData;
|
|
6
7
|
exports.getNetworkRequestOptionsWithDefaults = getNetworkRequestOptionsWithDefaults;
|
|
8
|
+
exports.readImperativelyLoadedField = readImperativelyLoadedField;
|
|
7
9
|
const cache_1 = require("./cache");
|
|
8
10
|
const componentCache_1 = require("./componentCache");
|
|
9
11
|
const IsographEnvironment_1 = require("./IsographEnvironment");
|
|
@@ -99,98 +101,19 @@ function readData(environment, ast, root, variables, nestedRefetchQueries, netwo
|
|
|
99
101
|
break;
|
|
100
102
|
}
|
|
101
103
|
case 'ImperativelyLoadedField': {
|
|
102
|
-
|
|
103
|
-
// id field).
|
|
104
|
-
const data = readData(environment, field.refetchReaderArtifact.readerAst, root, variables,
|
|
105
|
-
// Refetch fields just read the id, and don't need refetch query artifacts
|
|
106
|
-
[],
|
|
107
|
-
// This is probably indicative of the fact that we are doing redundant checks
|
|
108
|
-
// on the status of this network request...
|
|
109
|
-
networkRequest, networkRequestOptions, mutableEncounteredRecords);
|
|
104
|
+
const data = readImperativelyLoadedField(environment, field, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords);
|
|
110
105
|
if (data.kind === 'MissingData') {
|
|
111
|
-
return
|
|
112
|
-
kind: 'MissingData',
|
|
113
|
-
reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
114
|
-
nestedReason: data,
|
|
115
|
-
recordLink: data.recordLink,
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
const refetchQueryIndex = field.refetchQuery;
|
|
120
|
-
const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
|
|
121
|
-
if (refetchQuery == null) {
|
|
122
|
-
throw new Error('refetchQuery is null in RefetchField. This is indicative of a bug in Isograph.');
|
|
123
|
-
}
|
|
124
|
-
const refetchQueryArtifact = refetchQuery.artifact;
|
|
125
|
-
const allowedVariables = refetchQuery.allowedVariables;
|
|
126
|
-
// Second, we allow the user to call the resolver, which will ultimately
|
|
127
|
-
// use the resolver reader AST to get the resolver parameters.
|
|
128
|
-
target[field.alias] = (args) => [
|
|
129
|
-
// Stable id
|
|
130
|
-
root.__link + '__' + field.name,
|
|
131
|
-
// Fetcher
|
|
132
|
-
field.refetchReaderArtifact.resolver(environment, refetchQueryArtifact, data.data, filterVariables(Object.assign(Object.assign({}, args), variables), allowedVariables), root,
|
|
133
|
-
// TODO these params should be removed
|
|
134
|
-
null, []),
|
|
135
|
-
];
|
|
106
|
+
return data;
|
|
136
107
|
}
|
|
108
|
+
target[field.alias] = data.data;
|
|
137
109
|
break;
|
|
138
110
|
}
|
|
139
111
|
case 'Resolver': {
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
if (resolverRefetchQuery == null) {
|
|
144
|
-
throw new Error('resolverRefetchQuery is null in Resolver. This is indicative of a bug in Isograph.');
|
|
145
|
-
}
|
|
146
|
-
return resolverRefetchQuery;
|
|
147
|
-
});
|
|
148
|
-
const readerWithRefetchQueries = {
|
|
149
|
-
kind: 'ReaderWithRefetchQueries',
|
|
150
|
-
readerArtifact: field.readerArtifact,
|
|
151
|
-
nestedRefetchQueries: resolverRefetchQueries,
|
|
152
|
-
};
|
|
153
|
-
const fragment = {
|
|
154
|
-
kind: 'FragmentReference',
|
|
155
|
-
readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)(readerWithRefetchQueries),
|
|
156
|
-
root,
|
|
157
|
-
variables: generateChildVariableMap(variables, field.arguments),
|
|
158
|
-
networkRequest,
|
|
159
|
-
};
|
|
160
|
-
switch (field.readerArtifact.kind) {
|
|
161
|
-
case 'EagerReaderArtifact': {
|
|
162
|
-
const data = readData(environment, field.readerArtifact.readerAst, root, generateChildVariableMap(variables, field.arguments), resolverRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords);
|
|
163
|
-
if (data.kind === 'MissingData') {
|
|
164
|
-
return {
|
|
165
|
-
kind: 'MissingData',
|
|
166
|
-
reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
167
|
-
nestedReason: data,
|
|
168
|
-
recordLink: data.recordLink,
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
const firstParameter = {
|
|
173
|
-
data: data.data,
|
|
174
|
-
parameters: variables,
|
|
175
|
-
startUpdate: field.readerArtifact.hasUpdatable
|
|
176
|
-
? (0, startUpdate_1.getOrCreateCachedStartUpdate)(environment, fragment, readerWithRefetchQueries.readerArtifact.fieldName)
|
|
177
|
-
: undefined,
|
|
178
|
-
};
|
|
179
|
-
target[field.alias] =
|
|
180
|
-
field.readerArtifact.resolver(firstParameter);
|
|
181
|
-
}
|
|
182
|
-
break;
|
|
183
|
-
}
|
|
184
|
-
case 'ComponentReaderArtifact': {
|
|
185
|
-
target[field.alias] = (0, componentCache_1.getOrCreateCachedComponent)(environment, field.readerArtifact.fieldName, fragment, networkRequestOptions);
|
|
186
|
-
break;
|
|
187
|
-
}
|
|
188
|
-
default: {
|
|
189
|
-
let _ = field.readerArtifact;
|
|
190
|
-
_;
|
|
191
|
-
throw new Error('Unexpected kind');
|
|
192
|
-
}
|
|
112
|
+
const data = readResolverFieldData(environment, field, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords);
|
|
113
|
+
if (data.kind === 'MissingData') {
|
|
114
|
+
return data;
|
|
193
115
|
}
|
|
116
|
+
target[field.alias] = data.data;
|
|
194
117
|
break;
|
|
195
118
|
}
|
|
196
119
|
case 'LoadablySelectedField': {
|
|
@@ -370,6 +293,63 @@ function writeQueryArgsToVariables(targetVariables, queryArgs, variables) {
|
|
|
370
293
|
}
|
|
371
294
|
}
|
|
372
295
|
}
|
|
296
|
+
function readResolverFieldData(environment, field, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords) {
|
|
297
|
+
const usedRefetchQueries = field.usedRefetchQueries;
|
|
298
|
+
const resolverRefetchQueries = usedRefetchQueries.map((index) => {
|
|
299
|
+
const resolverRefetchQuery = nestedRefetchQueries[index];
|
|
300
|
+
if (resolverRefetchQuery == null) {
|
|
301
|
+
throw new Error('resolverRefetchQuery is null in Resolver. This is indicative of a bug in Isograph.');
|
|
302
|
+
}
|
|
303
|
+
return resolverRefetchQuery;
|
|
304
|
+
});
|
|
305
|
+
const readerWithRefetchQueries = {
|
|
306
|
+
kind: 'ReaderWithRefetchQueries',
|
|
307
|
+
readerArtifact: field.readerArtifact,
|
|
308
|
+
nestedRefetchQueries: resolverRefetchQueries,
|
|
309
|
+
};
|
|
310
|
+
const fragment = {
|
|
311
|
+
kind: 'FragmentReference',
|
|
312
|
+
readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)(readerWithRefetchQueries),
|
|
313
|
+
root,
|
|
314
|
+
variables: generateChildVariableMap(variables, field.arguments),
|
|
315
|
+
networkRequest,
|
|
316
|
+
};
|
|
317
|
+
switch (field.readerArtifact.kind) {
|
|
318
|
+
case 'EagerReaderArtifact': {
|
|
319
|
+
const data = readData(environment, field.readerArtifact.readerAst, root, generateChildVariableMap(variables, field.arguments), resolverRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords);
|
|
320
|
+
if (data.kind === 'MissingData') {
|
|
321
|
+
return {
|
|
322
|
+
kind: 'MissingData',
|
|
323
|
+
reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
324
|
+
nestedReason: data,
|
|
325
|
+
recordLink: data.recordLink,
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
const firstParameter = {
|
|
329
|
+
data: data.data,
|
|
330
|
+
parameters: variables,
|
|
331
|
+
startUpdate: field.readerArtifact.hasUpdatable
|
|
332
|
+
? (0, startUpdate_1.getOrCreateCachedStartUpdate)(environment, fragment, readerWithRefetchQueries.readerArtifact.fieldName)
|
|
333
|
+
: undefined,
|
|
334
|
+
};
|
|
335
|
+
return {
|
|
336
|
+
kind: 'Success',
|
|
337
|
+
data: field.readerArtifact.resolver(firstParameter),
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
case 'ComponentReaderArtifact': {
|
|
341
|
+
return {
|
|
342
|
+
kind: 'Success',
|
|
343
|
+
data: (0, componentCache_1.getOrCreateCachedComponent)(environment, field.readerArtifact.fieldName, fragment, networkRequestOptions),
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
default: {
|
|
347
|
+
let _ = field.readerArtifact;
|
|
348
|
+
_;
|
|
349
|
+
throw new Error('Unexpected kind');
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
373
353
|
function readScalarFieldData(field, storeRecord, root, variables) {
|
|
374
354
|
const storeRecordName = (0, cache_1.getParentRecordKey)(field, variables);
|
|
375
355
|
const value = storeRecord[storeRecordName];
|
|
@@ -540,3 +520,43 @@ function stableStringifyArgs(args) {
|
|
|
540
520
|
}
|
|
541
521
|
return s;
|
|
542
522
|
}
|
|
523
|
+
function readImperativelyLoadedField(environment, field, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, mutableEncounteredRecords) {
|
|
524
|
+
// First, we read the data using the refetch reader AST (i.e. read out the
|
|
525
|
+
// id field).
|
|
526
|
+
const data = readData(environment, field.refetchReaderArtifact.readerAst, root, variables,
|
|
527
|
+
// Refetch fields just read the id, and don't need refetch query artifacts
|
|
528
|
+
[],
|
|
529
|
+
// This is probably indicative of the fact that we are doing redundant checks
|
|
530
|
+
// on the status of this network request...
|
|
531
|
+
networkRequest, networkRequestOptions, mutableEncounteredRecords);
|
|
532
|
+
if (data.kind === 'MissingData') {
|
|
533
|
+
return {
|
|
534
|
+
kind: 'MissingData',
|
|
535
|
+
reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
536
|
+
nestedReason: data,
|
|
537
|
+
recordLink: data.recordLink,
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
const refetchQueryIndex = field.refetchQuery;
|
|
542
|
+
const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
|
|
543
|
+
if (refetchQuery == null) {
|
|
544
|
+
throw new Error('refetchQuery is null in RefetchField. This is indicative of a bug in Isograph.');
|
|
545
|
+
}
|
|
546
|
+
const refetchQueryArtifact = refetchQuery.artifact;
|
|
547
|
+
const allowedVariables = refetchQuery.allowedVariables;
|
|
548
|
+
// Second, we allow the user to call the resolver, which will ultimately
|
|
549
|
+
// use the resolver reader AST to get the resolver parameters.
|
|
550
|
+
return {
|
|
551
|
+
kind: 'Success',
|
|
552
|
+
data: (args) => [
|
|
553
|
+
// Stable id
|
|
554
|
+
root.__link + '__' + field.name,
|
|
555
|
+
// Fetcher
|
|
556
|
+
field.refetchReaderArtifact.resolver(environment, refetchQueryArtifact, data.data, filterVariables(Object.assign(Object.assign({}, args), variables), allowedVariables), root,
|
|
557
|
+
// TODO these params should be removed
|
|
558
|
+
null, []),
|
|
559
|
+
],
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
}
|
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-aa925b7c",
|
|
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-aa925b7c",
|
|
24
|
+
"@isograph/react-disposable-state": "0.0.0-main-aa925b7c",
|
|
25
|
+
"@isograph/reference-counted-pointer": "0.0.0-main-aa925b7c"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"react": "^18.0.0 || ^19.0.0"
|
package/src/core/read.ts
CHANGED
|
@@ -38,7 +38,9 @@ import {
|
|
|
38
38
|
} from './PromiseWrapper';
|
|
39
39
|
import {
|
|
40
40
|
ReaderAst,
|
|
41
|
+
type ReaderImperativelyLoadedField,
|
|
41
42
|
type ReaderLinkedField,
|
|
43
|
+
type ReaderNonLoadableResolverField,
|
|
42
44
|
type ReaderScalarField,
|
|
43
45
|
} from './reader';
|
|
44
46
|
import { getOrCreateCachedStartUpdate } from './startUpdate';
|
|
@@ -211,138 +213,37 @@ function readData<TReadFromStore>(
|
|
|
211
213
|
break;
|
|
212
214
|
}
|
|
213
215
|
case 'ImperativelyLoadedField': {
|
|
214
|
-
|
|
215
|
-
// id field).
|
|
216
|
-
const data = readData(
|
|
216
|
+
const data = readImperativelyLoadedField(
|
|
217
217
|
environment,
|
|
218
|
-
field
|
|
218
|
+
field,
|
|
219
219
|
root,
|
|
220
220
|
variables,
|
|
221
|
-
|
|
222
|
-
[],
|
|
223
|
-
// This is probably indicative of the fact that we are doing redundant checks
|
|
224
|
-
// on the status of this network request...
|
|
221
|
+
nestedRefetchQueries,
|
|
225
222
|
networkRequest,
|
|
226
223
|
networkRequestOptions,
|
|
227
224
|
mutableEncounteredRecords,
|
|
228
225
|
);
|
|
229
226
|
if (data.kind === 'MissingData') {
|
|
230
|
-
return
|
|
231
|
-
kind: 'MissingData',
|
|
232
|
-
reason:
|
|
233
|
-
'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
234
|
-
nestedReason: data,
|
|
235
|
-
recordLink: data.recordLink,
|
|
236
|
-
};
|
|
237
|
-
} else {
|
|
238
|
-
const refetchQueryIndex = field.refetchQuery;
|
|
239
|
-
const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
|
|
240
|
-
if (refetchQuery == null) {
|
|
241
|
-
throw new Error(
|
|
242
|
-
'refetchQuery is null in RefetchField. This is indicative of a bug in Isograph.',
|
|
243
|
-
);
|
|
244
|
-
}
|
|
245
|
-
const refetchQueryArtifact = refetchQuery.artifact;
|
|
246
|
-
const allowedVariables = refetchQuery.allowedVariables;
|
|
247
|
-
|
|
248
|
-
// Second, we allow the user to call the resolver, which will ultimately
|
|
249
|
-
// use the resolver reader AST to get the resolver parameters.
|
|
250
|
-
target[field.alias] = (args: any) => [
|
|
251
|
-
// Stable id
|
|
252
|
-
root.__link + '__' + field.name,
|
|
253
|
-
// Fetcher
|
|
254
|
-
field.refetchReaderArtifact.resolver(
|
|
255
|
-
environment,
|
|
256
|
-
refetchQueryArtifact,
|
|
257
|
-
data.data,
|
|
258
|
-
filterVariables({ ...args, ...variables }, allowedVariables),
|
|
259
|
-
root,
|
|
260
|
-
// TODO these params should be removed
|
|
261
|
-
null,
|
|
262
|
-
[],
|
|
263
|
-
),
|
|
264
|
-
];
|
|
227
|
+
return data;
|
|
265
228
|
}
|
|
229
|
+
target[field.alias] = data.data;
|
|
266
230
|
break;
|
|
267
231
|
}
|
|
268
232
|
case 'Resolver': {
|
|
269
|
-
const
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
if (resolverRefetchQuery == null) {
|
|
273
|
-
throw new Error(
|
|
274
|
-
'resolverRefetchQuery is null in Resolver. This is indicative of a bug in Isograph.',
|
|
275
|
-
);
|
|
276
|
-
}
|
|
277
|
-
return resolverRefetchQuery;
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
const readerWithRefetchQueries = {
|
|
281
|
-
kind: 'ReaderWithRefetchQueries',
|
|
282
|
-
readerArtifact: field.readerArtifact,
|
|
283
|
-
nestedRefetchQueries: resolverRefetchQueries,
|
|
284
|
-
} satisfies ReaderWithRefetchQueries<any, any>;
|
|
285
|
-
|
|
286
|
-
const fragment = {
|
|
287
|
-
kind: 'FragmentReference',
|
|
288
|
-
readerWithRefetchQueries: wrapResolvedValue(readerWithRefetchQueries),
|
|
233
|
+
const data = readResolverFieldData(
|
|
234
|
+
environment,
|
|
235
|
+
field,
|
|
289
236
|
root,
|
|
290
|
-
variables
|
|
237
|
+
variables,
|
|
238
|
+
nestedRefetchQueries,
|
|
291
239
|
networkRequest,
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
environment,
|
|
298
|
-
field.readerArtifact.readerAst,
|
|
299
|
-
root,
|
|
300
|
-
generateChildVariableMap(variables, field.arguments),
|
|
301
|
-
resolverRefetchQueries,
|
|
302
|
-
networkRequest,
|
|
303
|
-
networkRequestOptions,
|
|
304
|
-
mutableEncounteredRecords,
|
|
305
|
-
);
|
|
306
|
-
if (data.kind === 'MissingData') {
|
|
307
|
-
return {
|
|
308
|
-
kind: 'MissingData',
|
|
309
|
-
reason:
|
|
310
|
-
'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
311
|
-
nestedReason: data,
|
|
312
|
-
recordLink: data.recordLink,
|
|
313
|
-
};
|
|
314
|
-
} else {
|
|
315
|
-
const firstParameter = {
|
|
316
|
-
data: data.data,
|
|
317
|
-
parameters: variables,
|
|
318
|
-
startUpdate: field.readerArtifact.hasUpdatable
|
|
319
|
-
? getOrCreateCachedStartUpdate(
|
|
320
|
-
environment,
|
|
321
|
-
fragment,
|
|
322
|
-
readerWithRefetchQueries.readerArtifact.fieldName,
|
|
323
|
-
)
|
|
324
|
-
: undefined,
|
|
325
|
-
};
|
|
326
|
-
target[field.alias] =
|
|
327
|
-
field.readerArtifact.resolver(firstParameter);
|
|
328
|
-
}
|
|
329
|
-
break;
|
|
330
|
-
}
|
|
331
|
-
case 'ComponentReaderArtifact': {
|
|
332
|
-
target[field.alias] = getOrCreateCachedComponent(
|
|
333
|
-
environment,
|
|
334
|
-
field.readerArtifact.fieldName,
|
|
335
|
-
fragment,
|
|
336
|
-
networkRequestOptions,
|
|
337
|
-
);
|
|
338
|
-
break;
|
|
339
|
-
}
|
|
340
|
-
default: {
|
|
341
|
-
let _: never = field.readerArtifact;
|
|
342
|
-
_;
|
|
343
|
-
throw new Error('Unexpected kind');
|
|
344
|
-
}
|
|
240
|
+
networkRequestOptions,
|
|
241
|
+
mutableEncounteredRecords,
|
|
242
|
+
);
|
|
243
|
+
if (data.kind === 'MissingData') {
|
|
244
|
+
return data;
|
|
345
245
|
}
|
|
246
|
+
target[field.alias] = data.data;
|
|
346
247
|
break;
|
|
347
248
|
}
|
|
348
249
|
case 'LoadablySelectedField': {
|
|
@@ -611,6 +512,96 @@ function writeQueryArgsToVariables(
|
|
|
611
512
|
}
|
|
612
513
|
}
|
|
613
514
|
|
|
515
|
+
export function readResolverFieldData(
|
|
516
|
+
environment: IsographEnvironment,
|
|
517
|
+
field: ReaderNonLoadableResolverField,
|
|
518
|
+
root: Link,
|
|
519
|
+
variables: Variables,
|
|
520
|
+
nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],
|
|
521
|
+
networkRequest: PromiseWrapper<void, any>,
|
|
522
|
+
networkRequestOptions: NetworkRequestReaderOptions,
|
|
523
|
+
mutableEncounteredRecords: EncounteredIds,
|
|
524
|
+
): ReadDataResult<unknown> {
|
|
525
|
+
const usedRefetchQueries = field.usedRefetchQueries;
|
|
526
|
+
const resolverRefetchQueries = usedRefetchQueries.map((index) => {
|
|
527
|
+
const resolverRefetchQuery = nestedRefetchQueries[index];
|
|
528
|
+
if (resolverRefetchQuery == null) {
|
|
529
|
+
throw new Error(
|
|
530
|
+
'resolverRefetchQuery is null in Resolver. This is indicative of a bug in Isograph.',
|
|
531
|
+
);
|
|
532
|
+
}
|
|
533
|
+
return resolverRefetchQuery;
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
const readerWithRefetchQueries = {
|
|
537
|
+
kind: 'ReaderWithRefetchQueries',
|
|
538
|
+
readerArtifact: field.readerArtifact,
|
|
539
|
+
nestedRefetchQueries: resolverRefetchQueries,
|
|
540
|
+
} satisfies ReaderWithRefetchQueries<any, any>;
|
|
541
|
+
|
|
542
|
+
const fragment = {
|
|
543
|
+
kind: 'FragmentReference',
|
|
544
|
+
readerWithRefetchQueries: wrapResolvedValue(readerWithRefetchQueries),
|
|
545
|
+
root,
|
|
546
|
+
variables: generateChildVariableMap(variables, field.arguments),
|
|
547
|
+
networkRequest,
|
|
548
|
+
} satisfies FragmentReference<any, any>;
|
|
549
|
+
|
|
550
|
+
switch (field.readerArtifact.kind) {
|
|
551
|
+
case 'EagerReaderArtifact': {
|
|
552
|
+
const data = readData(
|
|
553
|
+
environment,
|
|
554
|
+
field.readerArtifact.readerAst,
|
|
555
|
+
root,
|
|
556
|
+
generateChildVariableMap(variables, field.arguments),
|
|
557
|
+
resolverRefetchQueries,
|
|
558
|
+
networkRequest,
|
|
559
|
+
networkRequestOptions,
|
|
560
|
+
mutableEncounteredRecords,
|
|
561
|
+
);
|
|
562
|
+
if (data.kind === 'MissingData') {
|
|
563
|
+
return {
|
|
564
|
+
kind: 'MissingData',
|
|
565
|
+
reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
566
|
+
nestedReason: data,
|
|
567
|
+
recordLink: data.recordLink,
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
const firstParameter = {
|
|
571
|
+
data: data.data,
|
|
572
|
+
parameters: variables,
|
|
573
|
+
startUpdate: field.readerArtifact.hasUpdatable
|
|
574
|
+
? getOrCreateCachedStartUpdate(
|
|
575
|
+
environment,
|
|
576
|
+
fragment,
|
|
577
|
+
readerWithRefetchQueries.readerArtifact.fieldName,
|
|
578
|
+
)
|
|
579
|
+
: undefined,
|
|
580
|
+
};
|
|
581
|
+
return {
|
|
582
|
+
kind: 'Success',
|
|
583
|
+
data: field.readerArtifact.resolver(firstParameter),
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
case 'ComponentReaderArtifact': {
|
|
587
|
+
return {
|
|
588
|
+
kind: 'Success',
|
|
589
|
+
data: getOrCreateCachedComponent(
|
|
590
|
+
environment,
|
|
591
|
+
field.readerArtifact.fieldName,
|
|
592
|
+
fragment,
|
|
593
|
+
networkRequestOptions,
|
|
594
|
+
),
|
|
595
|
+
};
|
|
596
|
+
}
|
|
597
|
+
default: {
|
|
598
|
+
let _: never = field.readerArtifact;
|
|
599
|
+
_;
|
|
600
|
+
throw new Error('Unexpected kind');
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
|
|
614
605
|
export function readScalarFieldData(
|
|
615
606
|
field: ReaderScalarField,
|
|
616
607
|
storeRecord: StoreRecord,
|
|
@@ -830,3 +821,69 @@ function stableStringifyArgs(args: object) {
|
|
|
830
821
|
}
|
|
831
822
|
return s;
|
|
832
823
|
}
|
|
824
|
+
|
|
825
|
+
export function readImperativelyLoadedField(
|
|
826
|
+
environment: IsographEnvironment,
|
|
827
|
+
field: ReaderImperativelyLoadedField,
|
|
828
|
+
root: Link,
|
|
829
|
+
variables: Variables,
|
|
830
|
+
nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],
|
|
831
|
+
networkRequest: PromiseWrapper<void, any>,
|
|
832
|
+
networkRequestOptions: NetworkRequestReaderOptions,
|
|
833
|
+
mutableEncounteredRecords: EncounteredIds,
|
|
834
|
+
): ReadDataResult<unknown> {
|
|
835
|
+
// First, we read the data using the refetch reader AST (i.e. read out the
|
|
836
|
+
// id field).
|
|
837
|
+
const data = readData(
|
|
838
|
+
environment,
|
|
839
|
+
field.refetchReaderArtifact.readerAst,
|
|
840
|
+
root,
|
|
841
|
+
variables,
|
|
842
|
+
// Refetch fields just read the id, and don't need refetch query artifacts
|
|
843
|
+
[],
|
|
844
|
+
// This is probably indicative of the fact that we are doing redundant checks
|
|
845
|
+
// on the status of this network request...
|
|
846
|
+
networkRequest,
|
|
847
|
+
networkRequestOptions,
|
|
848
|
+
mutableEncounteredRecords,
|
|
849
|
+
);
|
|
850
|
+
if (data.kind === 'MissingData') {
|
|
851
|
+
return {
|
|
852
|
+
kind: 'MissingData',
|
|
853
|
+
reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
|
|
854
|
+
nestedReason: data,
|
|
855
|
+
recordLink: data.recordLink,
|
|
856
|
+
};
|
|
857
|
+
} else {
|
|
858
|
+
const refetchQueryIndex = field.refetchQuery;
|
|
859
|
+
const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
|
|
860
|
+
if (refetchQuery == null) {
|
|
861
|
+
throw new Error(
|
|
862
|
+
'refetchQuery is null in RefetchField. This is indicative of a bug in Isograph.',
|
|
863
|
+
);
|
|
864
|
+
}
|
|
865
|
+
const refetchQueryArtifact = refetchQuery.artifact;
|
|
866
|
+
const allowedVariables = refetchQuery.allowedVariables;
|
|
867
|
+
|
|
868
|
+
// Second, we allow the user to call the resolver, which will ultimately
|
|
869
|
+
// use the resolver reader AST to get the resolver parameters.
|
|
870
|
+
return {
|
|
871
|
+
kind: 'Success',
|
|
872
|
+
data: (args: any) => [
|
|
873
|
+
// Stable id
|
|
874
|
+
root.__link + '__' + field.name,
|
|
875
|
+
// Fetcher
|
|
876
|
+
field.refetchReaderArtifact.resolver(
|
|
877
|
+
environment,
|
|
878
|
+
refetchQueryArtifact,
|
|
879
|
+
data.data,
|
|
880
|
+
filterVariables({ ...args, ...variables }, allowedVariables),
|
|
881
|
+
root,
|
|
882
|
+
// TODO these params should be removed
|
|
883
|
+
null,
|
|
884
|
+
[],
|
|
885
|
+
),
|
|
886
|
+
],
|
|
887
|
+
};
|
|
888
|
+
}
|
|
889
|
+
}
|