@isograph/react 0.0.0-main-eeb92fa4 → 0.0.0-main-5354e704

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,5 +1,5 @@
1
1
  ../.. |  WARN  Unsupported engine: wanted: {"node":"22.9.0"} (current: {"node":"v22.20.0","pnpm":"10.15.0"})
2
2
 
3
- > @isograph/react@0.0.0-main-eeb92fa4 compile-libs /home/runner/work/isograph/isograph/libs/isograph-react
3
+ > @isograph/react@0.0.0-main-5354e704 compile-libs /home/runner/work/isograph/isograph/libs/isograph-react
4
4
  > rimraf dist && tsc -p tsconfig.pkg.json
5
5
 
@@ -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 StoreLink, type StoreRecord } from './IsographEnvironment';
5
5
  import { PromiseWrapper } from './PromiseWrapper';
6
- import { ReaderAst, type LoadablySelectedField, type ReaderImperativelyLoadedField, type ReaderLinkedField, type ReaderNonLoadableResolverField, type ReaderScalarField } from './reader';
6
+ import { ReaderAst, type LoadablySelectedField, type ReaderClientPointer, type ReaderImperativelyLoadedField, type ReaderLinkedField, type ReaderNonLoadableResolverField, type ReaderScalarField } from './reader';
7
7
  export type WithEncounteredRecords<T> = {
8
8
  readonly encounteredRecords: EncounteredIds;
9
9
  readonly item: ExtractData<T>;
@@ -23,6 +23,7 @@ export declare function readLoadablySelectedFieldData(environment: IsographEnvir
23
23
  export declare function readResolverFieldData(environment: IsographEnvironment, field: ReaderNonLoadableResolverField, root: StoreLink, variables: Variables, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[], networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions, mutableEncounteredRecords: EncounteredIds): ReadDataResult<unknown>;
24
24
  export declare function readScalarFieldData(field: ReaderScalarField, storeRecord: StoreRecord, root: StoreLink, variables: Variables): ReadDataResult<string | number | boolean | StoreLink | DataTypeValue[] | null>;
25
25
  export declare function readLinkedFieldData(environment: IsographEnvironment, field: ReaderLinkedField, storeRecord: StoreRecord, root: StoreLink, variables: Variables, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[], networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions, readData: <TReadFromStore>(ast: ReaderAst<TReadFromStore>, root: StoreLink) => ReadDataResult<object>): ReadDataResult<unknown>;
26
+ export declare function readClientPointerData(environment: IsographEnvironment, field: ReaderClientPointer, root: StoreLink, variables: Variables, nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[], readData: <TReadFromStore>(ast: ReaderAst<TReadFromStore>, root: StoreLink) => ReadDataResult<object>): ReadDataResult<unknown>;
26
27
  export type NetworkRequestReaderOptions = {
27
28
  suspendIfInFlight: boolean;
28
29
  throwOnNetworkError: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/core/read.ts"],"names":[],"mappings":"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"}
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
@@ -5,6 +5,7 @@ exports.readLoadablySelectedFieldData = readLoadablySelectedFieldData;
5
5
  exports.readResolverFieldData = readResolverFieldData;
6
6
  exports.readScalarFieldData = readScalarFieldData;
7
7
  exports.readLinkedFieldData = readLinkedFieldData;
8
+ exports.readClientPointerData = readClientPointerData;
8
9
  exports.getNetworkRequestOptionsWithDefaults = getNetworkRequestOptionsWithDefaults;
9
10
  exports.readImperativelyLoadedField = readImperativelyLoadedField;
10
11
  const cache_1 = require("./cache");
@@ -378,7 +379,43 @@ function readScalarFieldData(field, storeRecord, root, variables) {
378
379
  }
379
380
  function readLinkedFieldData(environment, field, storeRecord, root, variables, nestedRefetchQueries, networkRequest, networkRequestOptions, readData) {
380
381
  const storeRecordName = (0, cache_1.getParentRecordKey)(field, variables);
381
- const value = storeRecord[storeRecordName];
382
+ let value = storeRecord[storeRecordName];
383
+ if (field.condition) {
384
+ const data = readData(field.condition.readerAst, root);
385
+ if (data.kind === 'MissingData') {
386
+ return {
387
+ kind: 'MissingData',
388
+ reason: 'Missing data for ' + storeRecordName + ' on root ' + root.__link,
389
+ nestedReason: data,
390
+ recordLink: data.recordLink,
391
+ };
392
+ }
393
+ const readerWithRefetchQueries = {
394
+ kind: 'ReaderWithRefetchQueries',
395
+ readerArtifact: field.condition,
396
+ // TODO this is wrong
397
+ // should map field.condition.usedRefetchQueries
398
+ // but it doesn't exist
399
+ nestedRefetchQueries: [],
400
+ };
401
+ const fragment = {
402
+ kind: 'FragmentReference',
403
+ readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)(readerWithRefetchQueries),
404
+ root,
405
+ variables: generateChildVariableMap(variables,
406
+ // TODO this is wrong
407
+ // should use field.arguments
408
+ // but it doesn't exist
409
+ []),
410
+ networkRequest,
411
+ };
412
+ const condition = field.condition.resolver(Object.assign({ data: data.data, parameters: {} }, (field.condition.hasUpdatable
413
+ ? {
414
+ startUpdate: (0, startUpdate_1.getOrCreateCachedStartUpdate)(environment, fragment, readerWithRefetchQueries.readerArtifact.fieldName, networkRequestOptions),
415
+ }
416
+ : undefined)));
417
+ value = condition;
418
+ }
382
419
  if (Array.isArray(value)) {
383
420
  const results = [];
384
421
  for (const item of value) {
@@ -399,6 +436,24 @@ function readLinkedFieldData(environment, field, storeRecord, root, variables, n
399
436
  results.push(null);
400
437
  continue;
401
438
  }
439
+ if (isClientPointer(field)) {
440
+ const result = readClientPointerData(environment, field, link, variables, nestedRefetchQueries, readData);
441
+ if (result.kind === 'MissingData') {
442
+ return {
443
+ kind: 'MissingData',
444
+ reason: 'Missing data for ' +
445
+ storeRecordName +
446
+ ' on root ' +
447
+ root.__link +
448
+ '. Link is ' +
449
+ JSON.stringify(item),
450
+ nestedReason: result,
451
+ recordLink: result.recordLink,
452
+ };
453
+ }
454
+ results.push(result.data);
455
+ continue;
456
+ }
402
457
  const result = readData(field.selections, link);
403
458
  if (result.kind === 'MissingData') {
404
459
  return {
@@ -421,42 +476,6 @@ function readLinkedFieldData(environment, field, storeRecord, root, variables, n
421
476
  };
422
477
  }
423
478
  let link = (0, IsographEnvironment_1.assertLink)(value);
424
- if (field.condition) {
425
- const data = readData(field.condition.readerAst, root);
426
- if (data.kind === 'MissingData') {
427
- return {
428
- kind: 'MissingData',
429
- reason: 'Missing data for ' + storeRecordName + ' on root ' + root.__link,
430
- nestedReason: data,
431
- recordLink: data.recordLink,
432
- };
433
- }
434
- const readerWithRefetchQueries = {
435
- kind: 'ReaderWithRefetchQueries',
436
- readerArtifact: field.condition,
437
- // TODO this is wrong
438
- // should map field.condition.usedRefetchQueries
439
- // but it doesn't exist
440
- nestedRefetchQueries: [],
441
- };
442
- const fragment = {
443
- kind: 'FragmentReference',
444
- readerWithRefetchQueries: (0, PromiseWrapper_1.wrapResolvedValue)(readerWithRefetchQueries),
445
- root,
446
- variables: generateChildVariableMap(variables,
447
- // TODO this is wrong
448
- // should use field.arguments
449
- // but it doesn't exist
450
- []),
451
- networkRequest,
452
- };
453
- const condition = field.condition.resolver(Object.assign({ data: data.data, parameters: {} }, (field.condition.hasUpdatable
454
- ? {
455
- startUpdate: (0, startUpdate_1.getOrCreateCachedStartUpdate)(environment, fragment, readerWithRefetchQueries.readerArtifact.fieldName, networkRequestOptions),
456
- }
457
- : undefined)));
458
- link = condition;
459
- }
460
479
  if (link === undefined) {
461
480
  // TODO make this configurable, and also generated and derived from the schema
462
481
  const missingFieldHandler = environment.missingFieldHandler;
@@ -491,83 +510,19 @@ function readLinkedFieldData(environment, field, storeRecord, root, variables, n
491
510
  data: null,
492
511
  };
493
512
  }
494
- const targetId = link;
495
- const { refetchQueryIndex } = field;
496
- if (refetchQueryIndex != null) {
497
- // if field.refetchQueryIndex is not null, then the field is a client pointer, i.e.
498
- // it is like a loadable field that returns the selections.
499
- const refetchReaderParams = readData([
500
- {
501
- kind: 'Scalar',
502
- fieldName: 'id',
503
- alias: null,
504
- arguments: null,
505
- isUpdatable: false,
506
- },
507
- ], targetId);
508
- if (refetchReaderParams.kind === 'MissingData') {
513
+ if (isClientPointer(field)) {
514
+ const data = readClientPointerData(environment, field, link, variables, nestedRefetchQueries, readData);
515
+ if (data.kind === 'MissingData') {
509
516
  return {
510
517
  kind: 'MissingData',
511
- reason: 'Missing data for ' + field.alias + ' on root ' + targetId.__link,
512
- nestedReason: refetchReaderParams,
513
- recordLink: refetchReaderParams.recordLink,
518
+ reason: 'Missing data for ' + storeRecordName + ' on root ' + root.__link,
519
+ nestedReason: data,
520
+ recordLink: data.recordLink,
514
521
  };
515
522
  }
516
- const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
517
- if (refetchQuery == null) {
518
- throw new Error('refetchQuery is null in RefetchField. This is indicative of a bug in Isograph.');
519
- }
520
- const refetchQueryArtifact = refetchQuery.artifact;
521
- const allowedVariables = refetchQuery.allowedVariables;
522
- return {
523
- kind: 'Success',
524
- data: (args,
525
- // TODO get the associated type for FetchOptions from the loadably selected field
526
- fetchOptions) => {
527
- const includeReadOutData = (variables, readOutData) => {
528
- variables.id = readOutData.id;
529
- return variables;
530
- };
531
- const localVariables = includeReadOutData(args !== null && args !== void 0 ? args : {}, refetchReaderParams.data);
532
- writeQueryArgsToVariables(localVariables, field.arguments, variables);
533
- return [
534
- // Stable id
535
- targetId.__typename +
536
- ':' +
537
- targetId.__link +
538
- '/' +
539
- field.fieldName +
540
- '/' +
541
- stableStringifyArgs(localVariables),
542
- // Fetcher
543
- () => {
544
- const variables = includeReadOutData(filterVariables(Object.assign(Object.assign({}, args), localVariables), allowedVariables), refetchReaderParams.data);
545
- const readerWithRefetchQueries = (0, PromiseWrapper_1.wrapResolvedValue)({
546
- kind: 'ReaderWithRefetchQueries',
547
- readerArtifact: {
548
- kind: 'EagerReaderArtifact',
549
- fieldName: field.fieldName,
550
- readerAst: field.selections,
551
- resolver: ({ data }) => data,
552
- hasUpdatable: false,
553
- },
554
- nestedRefetchQueries,
555
- });
556
- const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, refetchQueryArtifact, variables, readerWithRefetchQueries, fetchOptions !== null && fetchOptions !== void 0 ? fetchOptions : null);
557
- const fragmentReference = {
558
- kind: 'FragmentReference',
559
- readerWithRefetchQueries: readerWithRefetchQueries,
560
- root: targetId,
561
- variables,
562
- networkRequest,
563
- };
564
- return [fragmentReference, disposeNetworkRequest];
565
- },
566
- ];
567
- },
568
- };
523
+ return data;
569
524
  }
570
- const data = readData(field.selections, targetId);
525
+ const data = readData(field.selections, link);
571
526
  if (data.kind === 'MissingData') {
572
527
  return {
573
528
  kind: 'MissingData',
@@ -578,6 +533,81 @@ function readLinkedFieldData(environment, field, storeRecord, root, variables, n
578
533
  }
579
534
  return data;
580
535
  }
536
+ function isClientPointer(field) {
537
+ return field.refetchQueryIndex !== null;
538
+ }
539
+ function readClientPointerData(environment, field, root, variables, nestedRefetchQueries, readData) {
540
+ const refetchReaderParams = readData([
541
+ {
542
+ kind: 'Scalar',
543
+ fieldName: 'id',
544
+ alias: null,
545
+ arguments: null,
546
+ isUpdatable: false,
547
+ },
548
+ ], root);
549
+ if (refetchReaderParams.kind === 'MissingData') {
550
+ return {
551
+ kind: 'MissingData',
552
+ reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
553
+ nestedReason: refetchReaderParams,
554
+ recordLink: refetchReaderParams.recordLink,
555
+ };
556
+ }
557
+ const refetchQuery = nestedRefetchQueries[field.refetchQueryIndex];
558
+ if (refetchQuery == null) {
559
+ throw new Error('refetchQuery is null in RefetchField. This is indicative of a bug in Isograph.');
560
+ }
561
+ const refetchQueryArtifact = refetchQuery.artifact;
562
+ const allowedVariables = refetchQuery.allowedVariables;
563
+ return {
564
+ kind: 'Success',
565
+ data: (args,
566
+ // TODO get the associated type for FetchOptions from the loadably selected field
567
+ fetchOptions) => {
568
+ const includeReadOutData = (variables, readOutData) => {
569
+ variables.id = readOutData.id;
570
+ return variables;
571
+ };
572
+ const localVariables = includeReadOutData(args !== null && args !== void 0 ? args : {}, refetchReaderParams.data);
573
+ writeQueryArgsToVariables(localVariables, field.arguments, variables);
574
+ return [
575
+ // Stable id
576
+ root.__typename +
577
+ ':' +
578
+ root.__link +
579
+ '/' +
580
+ field.fieldName +
581
+ '/' +
582
+ stableStringifyArgs(localVariables),
583
+ // Fetcher
584
+ () => {
585
+ const variables = includeReadOutData(filterVariables(Object.assign(Object.assign({}, args), localVariables), allowedVariables), refetchReaderParams.data);
586
+ const readerWithRefetchQueries = (0, PromiseWrapper_1.wrapResolvedValue)({
587
+ kind: 'ReaderWithRefetchQueries',
588
+ readerArtifact: {
589
+ kind: 'EagerReaderArtifact',
590
+ fieldName: field.fieldName,
591
+ readerAst: field.selections,
592
+ resolver: ({ data }) => data,
593
+ hasUpdatable: false,
594
+ },
595
+ nestedRefetchQueries,
596
+ });
597
+ const [networkRequest, disposeNetworkRequest] = (0, makeNetworkRequest_1.maybeMakeNetworkRequest)(environment, refetchQueryArtifact, variables, readerWithRefetchQueries, fetchOptions !== null && fetchOptions !== void 0 ? fetchOptions : null);
598
+ const fragmentReference = {
599
+ kind: 'FragmentReference',
600
+ readerWithRefetchQueries: readerWithRefetchQueries,
601
+ root,
602
+ variables,
603
+ networkRequest,
604
+ };
605
+ return [fragmentReference, disposeNetworkRequest];
606
+ },
607
+ ];
608
+ },
609
+ };
610
+ }
581
611
  function getNetworkRequestOptionsWithDefaults(networkRequestOptions) {
582
612
  var _a, _b;
583
613
  return {
@@ -51,13 +51,16 @@ export type ReaderLinkedField = {
51
51
  data: any;
52
52
  parameters: any;
53
53
  startUpdate?: StartUpdate<any>;
54
- }, StoreLink | null> | null;
54
+ }, StoreLink | null | (StoreLink | null)[] | StoreLink[]> | null;
55
55
  readonly isUpdatable: boolean;
56
56
  /**
57
57
  * If refetchQueryIndex != null, then the linked field is a client pointer.
58
58
  */
59
59
  readonly refetchQueryIndex: number | null;
60
60
  };
61
+ export interface ReaderClientPointer extends ReaderLinkedField {
62
+ readonly refetchQueryIndex: number;
63
+ }
61
64
  export type ReaderNonLoadableResolverField = {
62
65
  readonly kind: 'Resolver';
63
66
  readonly alias: string;
@@ -1 +1 @@
1
- {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../src/core/reader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../src/core/reader.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isograph/react",
3
- "version": "0.0.0-main-eeb92fa4",
3
+ "version": "0.0.0-main-5354e704",
4
4
  "description": "Use Isograph with React",
5
5
  "homepage": "https://isograph.dev",
6
6
  "main": "dist/index.js",
@@ -19,9 +19,9 @@
19
19
  "iso": "cross-env ISO_PRINT_ABSOLUTE_FILEPATH=1 ../../target/debug/isograph_cli --config ./isograph.config.json"
20
20
  },
21
21
  "dependencies": {
22
- "@isograph/disposable-types": "0.0.0-main-eeb92fa4",
23
- "@isograph/react-disposable-state": "0.0.0-main-eeb92fa4",
24
- "@isograph/reference-counted-pointer": "0.0.0-main-eeb92fa4"
22
+ "@isograph/disposable-types": "0.0.0-main-5354e704",
23
+ "@isograph/react-disposable-state": "0.0.0-main-5354e704",
24
+ "@isograph/reference-counted-pointer": "0.0.0-main-5354e704"
25
25
  },
26
26
  "peerDependencies": {
27
27
  "react": "^18.0.0 || ^19.0.0"
package/src/core/read.ts CHANGED
@@ -39,6 +39,7 @@ import {
39
39
  import {
40
40
  ReaderAst,
41
41
  type LoadablySelectedField,
42
+ type ReaderClientPointer,
42
43
  type ReaderImperativelyLoadedField,
43
44
  type ReaderLinkedField,
44
45
  type ReaderNonLoadableResolverField,
@@ -659,51 +660,7 @@ export function readLinkedFieldData(
659
660
  ) => ReadDataResult<object>,
660
661
  ): ReadDataResult<unknown> {
661
662
  const storeRecordName = getParentRecordKey(field, variables);
662
- const value = storeRecord[storeRecordName];
663
- if (Array.isArray(value)) {
664
- const results = [];
665
- for (const item of value) {
666
- const link = assertLink(item);
667
- if (link === undefined) {
668
- return {
669
- kind: 'MissingData',
670
- reason:
671
- 'No link for ' +
672
- storeRecordName +
673
- ' on root ' +
674
- root.__link +
675
- '. Link is ' +
676
- JSON.stringify(item),
677
- recordLink: root,
678
- };
679
- } else if (link === null) {
680
- results.push(null);
681
- continue;
682
- }
683
-
684
- const result = readData(field.selections, link);
685
- if (result.kind === 'MissingData') {
686
- return {
687
- kind: 'MissingData',
688
- reason:
689
- 'Missing data for ' +
690
- storeRecordName +
691
- ' on root ' +
692
- root.__link +
693
- '. Link is ' +
694
- JSON.stringify(item),
695
- nestedReason: result,
696
- recordLink: result.recordLink,
697
- };
698
- }
699
- results.push(result.data);
700
- }
701
- return {
702
- kind: 'Success',
703
- data: results,
704
- };
705
- }
706
- let link = assertLink(value);
663
+ let value = storeRecord[storeRecordName];
707
664
 
708
665
  if (field.condition) {
709
666
  const data = readData(field.condition.readerAst, root);
@@ -754,9 +711,81 @@ export function readLinkedFieldData(
754
711
  }
755
712
  : undefined),
756
713
  });
757
- link = condition;
714
+ value = condition;
758
715
  }
759
716
 
717
+ if (Array.isArray(value)) {
718
+ const results = [];
719
+ for (const item of value) {
720
+ const link = assertLink(item);
721
+ if (link === undefined) {
722
+ return {
723
+ kind: 'MissingData',
724
+ reason:
725
+ 'No link for ' +
726
+ storeRecordName +
727
+ ' on root ' +
728
+ root.__link +
729
+ '. Link is ' +
730
+ JSON.stringify(item),
731
+ recordLink: root,
732
+ };
733
+ } else if (link === null) {
734
+ results.push(null);
735
+ continue;
736
+ }
737
+
738
+ if (isClientPointer(field)) {
739
+ const result = readClientPointerData(
740
+ environment,
741
+ field,
742
+ link,
743
+ variables,
744
+ nestedRefetchQueries,
745
+ readData,
746
+ );
747
+ if (result.kind === 'MissingData') {
748
+ return {
749
+ kind: 'MissingData',
750
+ reason:
751
+ 'Missing data for ' +
752
+ storeRecordName +
753
+ ' on root ' +
754
+ root.__link +
755
+ '. Link is ' +
756
+ JSON.stringify(item),
757
+ nestedReason: result,
758
+ recordLink: result.recordLink,
759
+ };
760
+ }
761
+ results.push(result.data);
762
+ continue;
763
+ }
764
+
765
+ const result = readData(field.selections, link);
766
+ if (result.kind === 'MissingData') {
767
+ return {
768
+ kind: 'MissingData',
769
+ reason:
770
+ 'Missing data for ' +
771
+ storeRecordName +
772
+ ' on root ' +
773
+ root.__link +
774
+ '. Link is ' +
775
+ JSON.stringify(item),
776
+ nestedReason: result,
777
+ recordLink: result.recordLink,
778
+ };
779
+ }
780
+ results.push(result.data);
781
+ }
782
+ return {
783
+ kind: 'Success',
784
+ data: results,
785
+ };
786
+ }
787
+ let link = assertLink(value);
788
+
760
789
  if (link === undefined) {
761
790
  // TODO make this configurable, and also generated and derived from the schema
762
791
  const missingFieldHandler = environment.missingFieldHandler;
@@ -798,111 +827,28 @@ export function readLinkedFieldData(
798
827
  data: null,
799
828
  };
800
829
  }
801
- const targetId = link;
802
- const { refetchQueryIndex } = field;
803
- if (refetchQueryIndex != null) {
804
- // if field.refetchQueryIndex is not null, then the field is a client pointer, i.e.
805
- // it is like a loadable field that returns the selections.
806
- const refetchReaderParams = readData(
807
- [
808
- {
809
- kind: 'Scalar',
810
- fieldName: 'id',
811
- alias: null,
812
- arguments: null,
813
- isUpdatable: false,
814
- },
815
- ],
816
- targetId,
817
- );
818
830
 
819
- if (refetchReaderParams.kind === 'MissingData') {
831
+ if (isClientPointer(field)) {
832
+ const data = readClientPointerData(
833
+ environment,
834
+ field,
835
+ link,
836
+ variables,
837
+ nestedRefetchQueries,
838
+ readData,
839
+ );
840
+ if (data.kind === 'MissingData') {
820
841
  return {
821
842
  kind: 'MissingData',
822
843
  reason:
823
- 'Missing data for ' + field.alias + ' on root ' + targetId.__link,
824
- nestedReason: refetchReaderParams,
825
- recordLink: refetchReaderParams.recordLink,
844
+ 'Missing data for ' + storeRecordName + ' on root ' + root.__link,
845
+ nestedReason: data,
846
+ recordLink: data.recordLink,
826
847
  };
827
848
  }
828
-
829
- const refetchQuery = nestedRefetchQueries[refetchQueryIndex];
830
- if (refetchQuery == null) {
831
- throw new Error(
832
- 'refetchQuery is null in RefetchField. This is indicative of a bug in Isograph.',
833
- );
834
- }
835
- const refetchQueryArtifact = refetchQuery.artifact;
836
- const allowedVariables = refetchQuery.allowedVariables;
837
-
838
- return {
839
- kind: 'Success',
840
- data: (
841
- args: any,
842
- // TODO get the associated type for FetchOptions from the loadably selected field
843
- fetchOptions?: FetchOptions<any>,
844
- ) => {
845
- const includeReadOutData = (variables: any, readOutData: any) => {
846
- variables.id = readOutData.id;
847
- return variables;
848
- };
849
- const localVariables = includeReadOutData(
850
- args ?? {},
851
- refetchReaderParams.data,
852
- );
853
- writeQueryArgsToVariables(localVariables, field.arguments, variables);
854
-
855
- return [
856
- // Stable id
857
- targetId.__typename +
858
- ':' +
859
- targetId.__link +
860
- '/' +
861
- field.fieldName +
862
- '/' +
863
- stableStringifyArgs(localVariables),
864
- // Fetcher
865
- (): ItemCleanupPair<FragmentReference<any, any>> | undefined => {
866
- const variables = includeReadOutData(
867
- filterVariables({ ...args, ...localVariables }, allowedVariables),
868
- refetchReaderParams.data,
869
- );
870
-
871
- const readerWithRefetchQueries = wrapResolvedValue({
872
- kind: 'ReaderWithRefetchQueries',
873
- readerArtifact: {
874
- kind: 'EagerReaderArtifact',
875
- fieldName: field.fieldName,
876
- readerAst: field.selections,
877
- resolver: ({ data }: { data: any }) => data,
878
- hasUpdatable: false,
879
- },
880
- nestedRefetchQueries,
881
- } as const);
882
-
883
- const [networkRequest, disposeNetworkRequest] =
884
- maybeMakeNetworkRequest(
885
- environment,
886
- refetchQueryArtifact,
887
- variables,
888
- readerWithRefetchQueries,
889
- fetchOptions ?? null,
890
- );
891
-
892
- const fragmentReference: FragmentReference<any, any> = {
893
- kind: 'FragmentReference',
894
- readerWithRefetchQueries: readerWithRefetchQueries,
895
- root: targetId,
896
- variables,
897
- networkRequest,
898
- };
899
- return [fragmentReference, disposeNetworkRequest];
900
- },
901
- ];
902
- },
903
- };
849
+ return data;
904
850
  }
905
- const data = readData(field.selections, targetId);
851
+ const data = readData(field.selections, link);
906
852
  if (data.kind === 'MissingData') {
907
853
  return {
908
854
  kind: 'MissingData',
@@ -914,6 +860,122 @@ export function readLinkedFieldData(
914
860
  return data;
915
861
  }
916
862
 
863
+ function isClientPointer(
864
+ field: ReaderLinkedField,
865
+ ): field is ReaderClientPointer {
866
+ return field.refetchQueryIndex !== null;
867
+ }
868
+
869
+ export function readClientPointerData(
870
+ environment: IsographEnvironment,
871
+ field: ReaderClientPointer,
872
+ root: StoreLink,
873
+ variables: Variables,
874
+ nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],
875
+ readData: <TReadFromStore>(
876
+ ast: ReaderAst<TReadFromStore>,
877
+ root: StoreLink,
878
+ ) => ReadDataResult<object>,
879
+ ): ReadDataResult<unknown> {
880
+ const refetchReaderParams = readData(
881
+ [
882
+ {
883
+ kind: 'Scalar',
884
+ fieldName: 'id',
885
+ alias: null,
886
+ arguments: null,
887
+ isUpdatable: false,
888
+ },
889
+ ],
890
+ root,
891
+ );
892
+
893
+ if (refetchReaderParams.kind === 'MissingData') {
894
+ return {
895
+ kind: 'MissingData',
896
+ reason: 'Missing data for ' + field.alias + ' on root ' + root.__link,
897
+ nestedReason: refetchReaderParams,
898
+ recordLink: refetchReaderParams.recordLink,
899
+ };
900
+ }
901
+
902
+ const refetchQuery = nestedRefetchQueries[field.refetchQueryIndex];
903
+ if (refetchQuery == null) {
904
+ throw new Error(
905
+ 'refetchQuery is null in RefetchField. This is indicative of a bug in Isograph.',
906
+ );
907
+ }
908
+ const refetchQueryArtifact = refetchQuery.artifact;
909
+ const allowedVariables = refetchQuery.allowedVariables;
910
+
911
+ return {
912
+ kind: 'Success',
913
+ data: (
914
+ args: any,
915
+ // TODO get the associated type for FetchOptions from the loadably selected field
916
+ fetchOptions?: FetchOptions<any>,
917
+ ) => {
918
+ const includeReadOutData = (variables: any, readOutData: any) => {
919
+ variables.id = readOutData.id;
920
+ return variables;
921
+ };
922
+ const localVariables = includeReadOutData(
923
+ args ?? {},
924
+ refetchReaderParams.data,
925
+ );
926
+ writeQueryArgsToVariables(localVariables, field.arguments, variables);
927
+
928
+ return [
929
+ // Stable id
930
+ root.__typename +
931
+ ':' +
932
+ root.__link +
933
+ '/' +
934
+ field.fieldName +
935
+ '/' +
936
+ stableStringifyArgs(localVariables),
937
+ // Fetcher
938
+ (): ItemCleanupPair<FragmentReference<any, any>> | undefined => {
939
+ const variables = includeReadOutData(
940
+ filterVariables({ ...args, ...localVariables }, allowedVariables),
941
+ refetchReaderParams.data,
942
+ );
943
+
944
+ const readerWithRefetchQueries = wrapResolvedValue({
945
+ kind: 'ReaderWithRefetchQueries',
946
+ readerArtifact: {
947
+ kind: 'EagerReaderArtifact',
948
+ fieldName: field.fieldName,
949
+ readerAst: field.selections,
950
+ resolver: ({ data }: { data: any }) => data,
951
+ hasUpdatable: false,
952
+ },
953
+ nestedRefetchQueries,
954
+ } as const);
955
+
956
+ const [networkRequest, disposeNetworkRequest] =
957
+ maybeMakeNetworkRequest(
958
+ environment,
959
+ refetchQueryArtifact,
960
+ variables,
961
+ readerWithRefetchQueries,
962
+ fetchOptions ?? null,
963
+ );
964
+
965
+ const fragmentReference: FragmentReference<any, any> = {
966
+ kind: 'FragmentReference',
967
+ readerWithRefetchQueries: readerWithRefetchQueries,
968
+ root,
969
+ variables,
970
+ networkRequest,
971
+ };
972
+ return [fragmentReference, disposeNetworkRequest];
973
+ },
974
+ ];
975
+ },
976
+ };
977
+ }
978
+
917
979
  export type NetworkRequestReaderOptions = {
918
980
  suspendIfInFlight: boolean;
919
981
  throwOnNetworkError: boolean;
@@ -110,7 +110,7 @@ export type ReaderLinkedField = {
110
110
  readonly arguments: Arguments | null;
111
111
  readonly condition: EagerReaderArtifact<
112
112
  { data: any; parameters: any; startUpdate?: StartUpdate<any> },
113
- StoreLink | null
113
+ StoreLink | null | (StoreLink | null)[] | StoreLink[]
114
114
  > | null;
115
115
  readonly isUpdatable: boolean;
116
116
  /**
@@ -119,6 +119,10 @@ export type ReaderLinkedField = {
119
119
  readonly refetchQueryIndex: number | null;
120
120
  };
121
121
 
122
+ export interface ReaderClientPointer extends ReaderLinkedField {
123
+ readonly refetchQueryIndex: number;
124
+ }
125
+
122
126
  export type ReaderNonLoadableResolverField = {
123
127
  readonly kind: 'Resolver';
124
128
  readonly alias: string;