@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.
@@ -1,4 +1,4 @@
1
1
 
2
- > @isograph/react@0.0.0-main-8821fa52 compile-typescript /Users/runner/work/isograph/isograph/libs/isograph-react
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
 
@@ -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
@@ -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;AAQjB,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,iBAAiB,EACtB,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;AA6dN,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"}
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,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
- // First, we read the data using the refetch reader AST (i.e. read out the
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 usedRefetchQueries = field.usedRefetchQueries;
141
- const resolverRefetchQueries = usedRefetchQueries.map((index) => {
142
- const resolverRefetchQuery = nestedRefetchQueries[index];
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-8821fa52",
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-8821fa52",
24
- "@isograph/react-disposable-state": "0.0.0-main-8821fa52",
25
- "@isograph/reference-counted-pointer": "0.0.0-main-8821fa52"
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
- // First, we read the data using the refetch reader AST (i.e. read out the
215
- // id field).
216
- const data = readData(
216
+ const data = readImperativelyLoadedField(
217
217
  environment,
218
- field.refetchReaderArtifact.readerAst,
218
+ field,
219
219
  root,
220
220
  variables,
221
- // Refetch fields just read the id, and don't need refetch query artifacts
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 usedRefetchQueries = field.usedRefetchQueries;
270
- const resolverRefetchQueries = usedRefetchQueries.map((index) => {
271
- const resolverRefetchQuery = nestedRefetchQueries[index];
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: generateChildVariableMap(variables, field.arguments),
237
+ variables,
238
+ nestedRefetchQueries,
291
239
  networkRequest,
292
- } satisfies FragmentReference<any, any>;
293
-
294
- switch (field.readerArtifact.kind) {
295
- case 'EagerReaderArtifact': {
296
- const data = readData(
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
+ }