@isograph/react 0.0.0-main-d4700c2e → 0.0.0-main-0365bd75

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.
Files changed (43) hide show
  1. package/.turbo/turbo-compile-libs.log +2 -2
  2. package/.turbo/turbo-tsc.log +1 -1
  3. package/dist/core/IsographEnvironment.d.mts.map +1 -1
  4. package/dist/core/IsographEnvironment.d.ts.map +1 -1
  5. package/dist/core/IsographEnvironment.js +16 -6
  6. package/dist/core/IsographEnvironment.mjs +16 -6
  7. package/dist/core/IsographEnvironment.mjs.map +1 -1
  8. package/dist/core/cache.js +1 -3
  9. package/dist/core/cache.mjs +1 -3
  10. package/dist/core/cache.mjs.map +1 -1
  11. package/dist/core/entrypoint.d.mts +7 -2
  12. package/dist/core/entrypoint.d.mts.map +1 -1
  13. package/dist/core/entrypoint.d.ts +7 -2
  14. package/dist/core/entrypoint.d.ts.map +1 -1
  15. package/dist/core/entrypoint.mjs.map +1 -1
  16. package/dist/core/logging.d.ts.map +1 -1
  17. package/dist/core/makeNetworkRequest.js +6 -6
  18. package/dist/core/makeNetworkRequest.mjs +6 -6
  19. package/dist/core/makeNetworkRequest.mjs.map +1 -1
  20. package/dist/core/read.d.mts.map +1 -1
  21. package/dist/core/read.d.ts.map +1 -1
  22. package/dist/core/read.js +19 -17
  23. package/dist/core/read.mjs +19 -17
  24. package/dist/core/read.mjs.map +1 -1
  25. package/dist/core/reader.d.mts +3 -3
  26. package/dist/core/reader.d.mts.map +1 -1
  27. package/dist/core/reader.d.ts +3 -3
  28. package/dist/core/reader.d.ts.map +1 -1
  29. package/package.json +4 -4
  30. package/src/core/IsographEnvironment.ts +18 -5
  31. package/src/core/cache.ts +1 -9
  32. package/src/core/entrypoint.ts +16 -2
  33. package/src/core/makeNetworkRequest.ts +10 -12
  34. package/src/core/read.ts +15 -14
  35. package/src/core/reader.ts +7 -5
  36. package/src/tests/__isograph/Node/asEconomist/resolver_reader.ts +3 -3
  37. package/src/tests/__isograph/Query/linkedUpdate/resolver_reader.ts +3 -3
  38. package/src/tests/__isograph/Query/meName/resolver_reader.ts +3 -3
  39. package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +3 -3
  40. package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +3 -3
  41. package/src/tests/__isograph/Query/normalizeUndefinedField/resolver_reader.ts +3 -3
  42. package/src/tests/__isograph/Query/startUpdate/resolver_reader.ts +3 -3
  43. package/src/tests/__isograph/Query/subquery/resolver_reader.ts +3 -3
@@ -5,6 +5,7 @@ import type {
5
5
  IsographEntrypoint,
6
6
  IsographOperation,
7
7
  IsographPersistedOperation,
8
+ RawReaderWithRefetchQueries,
8
9
  ReaderWithRefetchQueries,
9
10
  ReaderWithRefetchQueriesLoader,
10
11
  } from './entrypoint';
@@ -250,7 +251,7 @@ export function getOrLoadIsographArtifact(
250
251
  export function getOrLoadReaderWithRefetchQueries(
251
252
  _environment: IsographEnvironment,
252
253
  readerWithRefetchQueries:
253
- | ReaderWithRefetchQueries<any, any>
254
+ | RawReaderWithRefetchQueries<any, any>
254
255
  | ReaderWithRefetchQueriesLoader<any, any>,
255
256
  ): {
256
257
  readerWithRefetchQueries: PromiseWrapper<ReaderWithRefetchQueries<any, any>>;
@@ -259,16 +260,28 @@ export function getOrLoadReaderWithRefetchQueries(
259
260
  } {
260
261
  switch (readerWithRefetchQueries.kind) {
261
262
  case 'ReaderWithRefetchQueries':
263
+ const readerArtifact = readerWithRefetchQueries.readerArtifact();
262
264
  return {
263
- readerWithRefetchQueries: wrapResolvedValue(readerWithRefetchQueries),
264
- fieldName: readerWithRefetchQueries.readerArtifact.fieldName,
265
- readerArtifactKind: readerWithRefetchQueries.readerArtifact.kind,
265
+ readerWithRefetchQueries: wrapResolvedValue({
266
+ kind: 'ReaderWithRefetchQueries',
267
+ nestedRefetchQueries: readerWithRefetchQueries.nestedRefetchQueries,
268
+ readerArtifact: readerArtifact,
269
+ }),
270
+ fieldName: readerArtifact.fieldName,
271
+ readerArtifactKind: readerArtifact.kind,
266
272
  };
267
273
  case 'ReaderWithRefetchQueriesLoader':
268
274
  return {
269
275
  // TODO: cache promise wrapper
270
276
  readerWithRefetchQueries: wrapPromise(
271
- readerWithRefetchQueries.loader(),
277
+ readerWithRefetchQueries
278
+ .loader()
279
+ .then((readerWithRefetchQueries) => ({
280
+ kind: 'ReaderWithRefetchQueries',
281
+ nestedRefetchQueries:
282
+ readerWithRefetchQueries.nestedRefetchQueries,
283
+ readerArtifact: readerWithRefetchQueries.readerArtifact(),
284
+ })),
272
285
  ),
273
286
  fieldName: readerWithRefetchQueries.fieldName,
274
287
  readerArtifactKind: readerWithRefetchQueries.readerArtifactKind,
package/src/core/cache.ts CHANGED
@@ -590,17 +590,9 @@ function getDataIdOfNetworkResponse(
590
590
  variables: Variables,
591
591
  index: number | null,
592
592
  ): DataId {
593
- const __typename =
594
- astNode.concreteType ?? dataToNormalize[TYPENAME_FIELD_NAME];
595
- if (__typename == null) {
596
- throw new Error(
597
- 'Unexpected missing __typename in network response when normalizing a linked field. ' +
598
- 'This is indicative of a bug in Isograph.',
599
- );
600
- }
601
593
  // If we are dealing with nested Query, use __ROOT as id
602
594
  // TODO do not hard code this value here
603
- if (__typename === 'Query') {
595
+ if (astNode.concreteType === 'Query') {
604
596
  return ROOT_ID;
605
597
  }
606
598
 
@@ -22,6 +22,20 @@ export type ReaderWithRefetchQueries<
22
22
  readonly nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[];
23
23
  };
24
24
 
25
+ export type RawReaderWithRefetchQueries<
26
+ TReadFromStore extends UnknownTReadFromStore,
27
+ TClientFieldValue,
28
+ > = {
29
+ readonly kind: 'ReaderWithRefetchQueries';
30
+ readonly readerArtifact: () => TopLevelReaderArtifact<
31
+ TReadFromStore,
32
+ TClientFieldValue,
33
+ // TODO don't type this as any
34
+ any
35
+ >;
36
+ readonly nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[];
37
+ };
38
+
25
39
  export type ReaderWithRefetchQueriesLoader<
26
40
  TReadFromStore extends UnknownTReadFromStore,
27
41
  TClientFieldValue,
@@ -32,7 +46,7 @@ export type ReaderWithRefetchQueriesLoader<
32
46
  | 'EagerReaderArtifact'
33
47
  | 'ComponentReaderArtifact';
34
48
  readonly loader: () => Promise<
35
- ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>
49
+ RawReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>
36
50
  >;
37
51
  };
38
52
 
@@ -69,7 +83,7 @@ export type IsographEntrypoint<
69
83
  readonly kind: 'Entrypoint';
70
84
  readonly networkRequestInfo: NetworkRequestInfo<TNormalizationAst>;
71
85
  readonly readerWithRefetchQueries:
72
- | ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>
86
+ | RawReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>
73
87
  | ReaderWithRefetchQueriesLoader<TReadFromStore, TClientFieldValue>;
74
88
  readonly concreteType: TypeName;
75
89
  /**
@@ -395,20 +395,18 @@ function readDataForOnComplete<
395
395
  suspendIfInFlight: false,
396
396
  throwOnNetworkError: false,
397
397
  };
398
- const resolvedReaderWithRefetchQueries =
399
- readerWithRefetchQueries as ReaderWithRefetchQueries<
400
- TReadFromStore,
401
- TClientFieldValue
402
- >;
398
+ if (readerWithRefetchQueries == null) {
399
+ throw new Error(
400
+ 'Expected readerWithRefetchQueries to be not null. This is indicative of a bug in Isograph.',
401
+ );
402
+ }
403
403
 
404
404
  const fragment: FragmentReference<TReadFromStore, TClientFieldValue> = {
405
405
  kind: 'FragmentReference',
406
406
  // TODO this smells.
407
- readerWithRefetchQueries: wrapResolvedValue(
408
- resolvedReaderWithRefetchQueries,
409
- ),
410
- fieldName: resolvedReaderWithRefetchQueries.readerArtifact.fieldName,
411
- readerArtifactKind: resolvedReaderWithRefetchQueries.readerArtifact.kind,
407
+ readerWithRefetchQueries: wrapResolvedValue(readerWithRefetchQueries),
408
+ fieldName: readerWithRefetchQueries.readerArtifact.fieldName,
409
+ readerArtifactKind: readerWithRefetchQueries.readerArtifact.kind,
412
410
  root,
413
411
  variables,
414
412
  networkRequest: fakeNetworkRequest,
@@ -418,7 +416,7 @@ function readDataForOnComplete<
418
416
  fragment,
419
417
  fakeNetworkRequestOptions,
420
418
  ).item;
421
- const readerArtifact = resolvedReaderWithRefetchQueries.readerArtifact;
419
+ const readerArtifact = readerWithRefetchQueries.readerArtifact;
422
420
  switch (readerArtifact.kind) {
423
421
  case 'ComponentReaderArtifact': {
424
422
  // @ts-expect-error We should find a way to encode this in the type system:
@@ -432,7 +430,7 @@ function readDataForOnComplete<
432
430
  kind: 'ReaderWithRefetchQueries',
433
431
  readerArtifact: readerArtifact,
434
432
  nestedRefetchQueries:
435
- resolvedReaderWithRefetchQueries.nestedRefetchQueries,
433
+ readerWithRefetchQueries.nestedRefetchQueries,
436
434
  }),
437
435
  fieldName: readerArtifact.fieldName,
438
436
  readerArtifactKind: readerArtifact.kind,
package/src/core/read.ts CHANGED
@@ -550,25 +550,25 @@ export function readResolverFieldData(
550
550
 
551
551
  const readerWithRefetchQueries = {
552
552
  kind: 'ReaderWithRefetchQueries',
553
- readerArtifact: field.readerArtifact,
553
+ readerArtifact: field.readerArtifact(),
554
554
  nestedRefetchQueries: resolverRefetchQueries,
555
555
  } satisfies ReaderWithRefetchQueries<any, any>;
556
556
 
557
557
  const fragment = {
558
558
  kind: 'FragmentReference',
559
559
  readerWithRefetchQueries: wrapResolvedValue(readerWithRefetchQueries),
560
- fieldName: field.readerArtifact.fieldName,
561
- readerArtifactKind: field.readerArtifact.kind,
560
+ fieldName: readerWithRefetchQueries.readerArtifact.fieldName,
561
+ readerArtifactKind: readerWithRefetchQueries.readerArtifact.kind,
562
562
  root,
563
563
  variables: generateChildVariableMap(variables, field.arguments),
564
564
  networkRequest,
565
565
  } satisfies FragmentReference<any, any>;
566
566
 
567
- switch (field.readerArtifact.kind) {
567
+ switch (readerWithRefetchQueries.readerArtifact.kind) {
568
568
  case 'EagerReaderArtifact': {
569
569
  const data = readData(
570
570
  environment,
571
- field.readerArtifact.readerAst,
571
+ readerWithRefetchQueries.readerArtifact.readerAst,
572
572
  root,
573
573
  generateChildVariableMap(variables, field.arguments),
574
574
  resolverRefetchQueries,
@@ -587,7 +587,7 @@ export function readResolverFieldData(
587
587
  const firstParameter = {
588
588
  data: data.data,
589
589
  parameters: variables,
590
- startUpdate: field.readerArtifact.hasUpdatable
590
+ startUpdate: readerWithRefetchQueries.readerArtifact.hasUpdatable
591
591
  ? getOrCreateCachedStartUpdate(
592
592
  environment,
593
593
  fragment,
@@ -597,7 +597,7 @@ export function readResolverFieldData(
597
597
  };
598
598
  return {
599
599
  kind: 'Success',
600
- data: field.readerArtifact.resolver(firstParameter),
600
+ data: readerWithRefetchQueries.readerArtifact.resolver(firstParameter),
601
601
  };
602
602
  }
603
603
  case 'ComponentReaderArtifact': {
@@ -651,7 +651,8 @@ export function readLinkedFieldData(
651
651
  let value = storeRecord[storeRecordName];
652
652
 
653
653
  if (field.condition != null) {
654
- const data = readData(field.condition.readerAst, root);
654
+ const condition = field.condition();
655
+ const data = readData(condition.readerAst, root);
655
656
  if (data.kind === 'MissingData') {
656
657
  return {
657
658
  kind: 'MissingData',
@@ -664,7 +665,7 @@ export function readLinkedFieldData(
664
665
 
665
666
  const readerWithRefetchQueries = {
666
667
  kind: 'ReaderWithRefetchQueries',
667
- readerArtifact: field.condition,
668
+ readerArtifact: condition,
668
669
  // TODO this is wrong
669
670
  // should map field.condition.usedRefetchQueries
670
671
  // but it doesn't exist
@@ -675,8 +676,8 @@ export function readLinkedFieldData(
675
676
  kind: 'FragmentReference',
676
677
  readerWithRefetchQueries: wrapResolvedValue(readerWithRefetchQueries),
677
678
  root,
678
- fieldName: field.condition.fieldName,
679
- readerArtifactKind: field.condition.kind,
679
+ fieldName: condition.fieldName,
680
+ readerArtifactKind: condition.kind,
680
681
  variables: generateChildVariableMap(
681
682
  variables,
682
683
  // TODO this is wrong
@@ -687,10 +688,10 @@ export function readLinkedFieldData(
687
688
  networkRequest,
688
689
  } satisfies FragmentReference<any, any>;
689
690
 
690
- const condition = field.condition.resolver({
691
+ const link = condition.resolver({
691
692
  data: data.data,
692
693
  parameters: {},
693
- ...(field.condition.hasUpdatable
694
+ ...(condition.hasUpdatable
694
695
  ? {
695
696
  startUpdate: getOrCreateCachedStartUpdate(
696
697
  environment,
@@ -700,7 +701,7 @@ export function readLinkedFieldData(
700
701
  }
701
702
  : undefined),
702
703
  });
703
- value = condition;
704
+ value = link;
704
705
  }
705
706
 
706
707
  if (Array.isArray(value)) {
@@ -105,10 +105,12 @@ export type ReaderLinkedField = {
105
105
  readonly alias: string | null;
106
106
  readonly selections: ReaderAst<unknown>;
107
107
  readonly arguments: Arguments | null;
108
- readonly condition: EagerReaderArtifact<
109
- { data: any; parameters: any; startUpdate?: StartUpdate<any> },
110
- StoreLink | null | (StoreLink | null)[] | StoreLink[]
111
- > | null;
108
+ readonly condition:
109
+ | (() => EagerReaderArtifact<
110
+ { data: any; parameters: any; startUpdate?: StartUpdate<any> },
111
+ StoreLink | null | (StoreLink | null)[] | StoreLink[]
112
+ >)
113
+ | null;
112
114
  readonly isUpdatable: boolean;
113
115
  /**
114
116
  * If refetchQueryIndex != null, then the linked field is a client pointer.
@@ -124,7 +126,7 @@ export type ReaderNonLoadableResolverField = {
124
126
  readonly kind: 'Resolver';
125
127
  readonly alias: string;
126
128
  // TODO don't type this as any
127
- readonly readerArtifact: TopLevelReaderArtifact<any, any, any>;
129
+ readonly readerArtifact: () => TopLevelReaderArtifact<any, any, any>;
128
130
  readonly arguments: Arguments | null;
129
131
  readonly usedRefetchQueries: number[];
130
132
  };
@@ -14,15 +14,15 @@ const readerAst: ReaderAst<{ data: any, parameters: Record<PropertyKey, never> }
14
14
  },
15
15
  ];
16
16
 
17
- const artifact: EagerReaderArtifact<
17
+ const artifact = (): EagerReaderArtifact<
18
18
  { data: any, parameters: Record<PropertyKey, never> },
19
19
  Link<"Economist"> | null
20
- > = {
20
+ > => ({
21
21
  kind: "EagerReaderArtifact",
22
22
  fieldName: "asEconomist",
23
23
  resolver: ({ data }) => data.__typename === "Economist" ? data.__link : null,
24
24
  readerAst,
25
25
  hasUpdatable: false,
26
- };
26
+ });
27
27
 
28
28
  export default artifact;
@@ -79,15 +79,15 @@ const readerAst: ReaderAst<Query__linkedUpdate__param> = [
79
79
  },
80
80
  ];
81
81
 
82
- const artifact: EagerReaderArtifact<
82
+ const artifact = (): EagerReaderArtifact<
83
83
  Query__linkedUpdate__param,
84
84
  Query__linkedUpdate__output_type
85
- > = {
85
+ > => ({
86
86
  kind: "EagerReaderArtifact",
87
87
  fieldName: "linkedUpdate",
88
88
  resolver,
89
89
  readerAst,
90
90
  hasUpdatable: true,
91
- };
91
+ });
92
92
 
93
93
  export default artifact;
@@ -24,15 +24,15 @@ const readerAst: ReaderAst<Query__meName__param> = [
24
24
  },
25
25
  ];
26
26
 
27
- const artifact: EagerReaderArtifact<
27
+ const artifact = (): EagerReaderArtifact<
28
28
  Query__meName__param,
29
29
  Query__meName__output_type
30
- > = {
30
+ > => ({
31
31
  kind: "EagerReaderArtifact",
32
32
  fieldName: "meName",
33
33
  resolver,
34
34
  readerAst,
35
35
  hasUpdatable: false,
36
- };
36
+ });
37
37
 
38
38
  export default artifact;
@@ -53,15 +53,15 @@ const readerAst: ReaderAst<Query__meNameSuccessor__param> = [
53
53
  },
54
54
  ];
55
55
 
56
- const artifact: EagerReaderArtifact<
56
+ const artifact = (): EagerReaderArtifact<
57
57
  Query__meNameSuccessor__param,
58
58
  Query__meNameSuccessor__output_type
59
- > = {
59
+ > => ({
60
60
  kind: "EagerReaderArtifact",
61
61
  fieldName: "meNameSuccessor",
62
62
  resolver,
63
63
  readerAst,
64
64
  hasUpdatable: false,
65
- };
65
+ });
66
66
 
67
67
  export default artifact;
@@ -29,15 +29,15 @@ const readerAst: ReaderAst<Query__nodeField__param> = [
29
29
  },
30
30
  ];
31
31
 
32
- const artifact: EagerReaderArtifact<
32
+ const artifact = (): EagerReaderArtifact<
33
33
  Query__nodeField__param,
34
34
  Query__nodeField__output_type
35
- > = {
35
+ > => ({
36
36
  kind: "EagerReaderArtifact",
37
37
  fieldName: "nodeField",
38
38
  resolver,
39
39
  readerAst,
40
40
  hasUpdatable: false,
41
- };
41
+ });
42
42
 
43
43
  export default artifact;
@@ -24,15 +24,15 @@ const readerAst: ReaderAst<Query__normalizeUndefinedField__param> = [
24
24
  },
25
25
  ];
26
26
 
27
- const artifact: EagerReaderArtifact<
27
+ const artifact = (): EagerReaderArtifact<
28
28
  Query__normalizeUndefinedField__param,
29
29
  Query__normalizeUndefinedField__output_type
30
- > = {
30
+ > => ({
31
31
  kind: "EagerReaderArtifact",
32
32
  fieldName: "normalizeUndefinedField",
33
33
  resolver,
34
34
  readerAst,
35
35
  hasUpdatable: false,
36
- };
36
+ });
37
37
 
38
38
  export default artifact;
@@ -41,15 +41,15 @@ const readerAst: ReaderAst<Query__startUpdate__param> = [
41
41
  },
42
42
  ];
43
43
 
44
- const artifact: EagerReaderArtifact<
44
+ const artifact = (): EagerReaderArtifact<
45
45
  Query__startUpdate__param,
46
46
  Query__startUpdate__output_type
47
- > = {
47
+ > => ({
48
48
  kind: "EagerReaderArtifact",
49
49
  fieldName: "startUpdate",
50
50
  resolver,
51
51
  readerAst,
52
52
  hasUpdatable: true,
53
- };
53
+ });
54
54
 
55
55
  export default artifact;
@@ -40,15 +40,15 @@ const readerAst: ReaderAst<Query__subquery__param> = [
40
40
  },
41
41
  ];
42
42
 
43
- const artifact: EagerReaderArtifact<
43
+ const artifact = (): EagerReaderArtifact<
44
44
  Query__subquery__param,
45
45
  Query__subquery__output_type
46
- > = {
46
+ > => ({
47
47
  kind: "EagerReaderArtifact",
48
48
  fieldName: "subquery",
49
49
  resolver,
50
50
  readerAst,
51
51
  hasUpdatable: false,
52
- };
52
+ });
53
53
 
54
54
  export default artifact;