@isograph/react 0.3.0 → 0.4.0

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 (164) hide show
  1. package/.turbo/turbo-compile-libs.log +5 -0
  2. package/dist/core/FragmentReference.d.ts +17 -8
  3. package/dist/core/FragmentReference.d.ts.map +1 -1
  4. package/dist/core/FragmentReference.js +3 -12
  5. package/dist/core/IsographEnvironment.d.ts +30 -35
  6. package/dist/core/IsographEnvironment.d.ts.map +1 -1
  7. package/dist/core/IsographEnvironment.js +4 -0
  8. package/dist/core/PromiseWrapper.d.ts +6 -7
  9. package/dist/core/PromiseWrapper.d.ts.map +1 -1
  10. package/dist/core/PromiseWrapper.js +6 -12
  11. package/dist/core/areEqualWithDeepComparison.d.ts +1 -3
  12. package/dist/core/areEqualWithDeepComparison.d.ts.map +1 -1
  13. package/dist/core/areEqualWithDeepComparison.js +16 -2
  14. package/dist/core/brand.d.ts +2 -0
  15. package/dist/core/brand.d.ts.map +1 -0
  16. package/dist/core/brand.js +2 -0
  17. package/dist/core/cache.d.ts +16 -24
  18. package/dist/core/cache.d.ts.map +1 -1
  19. package/dist/core/cache.js +105 -72
  20. package/dist/core/check.d.ts +11 -7
  21. package/dist/core/check.d.ts.map +1 -1
  22. package/dist/core/check.js +2 -2
  23. package/dist/core/componentCache.d.ts +1 -1
  24. package/dist/core/componentCache.d.ts.map +1 -1
  25. package/dist/core/componentCache.js +27 -31
  26. package/dist/core/entrypoint.d.ts +43 -28
  27. package/dist/core/entrypoint.d.ts.map +1 -1
  28. package/dist/core/garbageCollection.d.ts +5 -6
  29. package/dist/core/garbageCollection.d.ts.map +1 -1
  30. package/dist/core/garbageCollection.js +1 -1
  31. package/dist/core/logging.d.ts +23 -15
  32. package/dist/core/logging.d.ts.map +1 -1
  33. package/dist/core/logging.js +8 -5
  34. package/dist/core/makeNetworkRequest.d.ts +5 -5
  35. package/dist/core/makeNetworkRequest.d.ts.map +1 -1
  36. package/dist/core/makeNetworkRequest.js +113 -28
  37. package/dist/core/read.d.ts +16 -11
  38. package/dist/core/read.d.ts.map +1 -1
  39. package/dist/core/read.js +468 -305
  40. package/dist/core/reader.d.ts +33 -37
  41. package/dist/core/reader.d.ts.map +1 -1
  42. package/dist/core/startUpdate.d.ts +8 -0
  43. package/dist/core/startUpdate.d.ts.map +1 -0
  44. package/dist/core/startUpdate.js +163 -0
  45. package/dist/core/util.d.ts +3 -0
  46. package/dist/core/util.d.ts.map +1 -1
  47. package/dist/index.d.ts +18 -15
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +9 -1
  50. package/dist/loadable-hooks/useClientSideDefer.d.ts +4 -10
  51. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
  52. package/dist/loadable-hooks/useClientSideDefer.js +2 -2
  53. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +8 -15
  54. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
  55. package/dist/loadable-hooks/useConnectionSpecPagination.js +6 -4
  56. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +1 -2
  57. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -1
  58. package/dist/loadable-hooks/useImperativeLoadableField.d.ts +4 -6
  59. package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -1
  60. package/dist/loadable-hooks/useImperativeLoadableField.js +1 -1
  61. package/dist/loadable-hooks/useSkipLimitPagination.d.ts +6 -13
  62. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
  63. package/dist/loadable-hooks/useSkipLimitPagination.js +11 -9
  64. package/dist/react/FragmentReader.d.ts +7 -14
  65. package/dist/react/FragmentReader.d.ts.map +1 -1
  66. package/dist/react/FragmentReader.js +3 -30
  67. package/dist/react/FragmentRenderer.d.ts +15 -0
  68. package/dist/react/FragmentRenderer.d.ts.map +1 -0
  69. package/dist/react/FragmentRenderer.js +35 -0
  70. package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -1
  71. package/dist/react/LoadableFieldReader.d.ts +12 -0
  72. package/dist/react/LoadableFieldReader.d.ts.map +1 -0
  73. package/dist/react/LoadableFieldReader.js +10 -0
  74. package/dist/react/LoadableFieldRenderer.d.ts +13 -0
  75. package/dist/react/LoadableFieldRenderer.d.ts.map +1 -0
  76. package/dist/react/LoadableFieldRenderer.js +37 -0
  77. package/dist/react/useImperativeReference.d.ts +7 -10
  78. package/dist/react/useImperativeReference.d.ts.map +1 -1
  79. package/dist/react/useImperativeReference.js +8 -9
  80. package/dist/react/useLazyReference.d.ts +4 -7
  81. package/dist/react/useLazyReference.d.ts.map +1 -1
  82. package/dist/react/useLazyReference.js +26 -5
  83. package/dist/react/useReadAndSubscribe.d.ts +3 -9
  84. package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
  85. package/dist/react/useReadAndSubscribe.js +7 -3
  86. package/dist/react/useRerenderOnChange.d.ts +1 -1
  87. package/dist/react/useRerenderOnChange.d.ts.map +1 -1
  88. package/dist/react/useResult.d.ts +3 -6
  89. package/dist/react/useResult.d.ts.map +1 -1
  90. package/dist/react/useResult.js +10 -8
  91. package/isograph.config.json +1 -0
  92. package/package.json +6 -6
  93. package/src/core/FragmentReference.ts +40 -16
  94. package/src/core/IsographEnvironment.ts +57 -39
  95. package/src/core/PromiseWrapper.ts +15 -18
  96. package/src/core/areEqualWithDeepComparison.ts +22 -2
  97. package/src/core/brand.ts +18 -0
  98. package/src/core/cache.ts +153 -113
  99. package/src/core/check.ts +17 -12
  100. package/src/core/componentCache.ts +47 -50
  101. package/src/core/entrypoint.ts +66 -21
  102. package/src/core/garbageCollection.ts +9 -9
  103. package/src/core/logging.ts +39 -25
  104. package/src/core/makeNetworkRequest.ts +212 -34
  105. package/src/core/read.ts +728 -440
  106. package/src/core/reader.ts +46 -29
  107. package/src/core/startUpdate.ts +334 -0
  108. package/src/core/util.ts +4 -0
  109. package/src/index.ts +89 -8
  110. package/src/loadable-hooks/useClientSideDefer.ts +11 -10
  111. package/src/loadable-hooks/useConnectionSpecPagination.ts +27 -13
  112. package/src/loadable-hooks/useImperativeExposedMutationField.ts +1 -1
  113. package/src/loadable-hooks/useImperativeLoadableField.ts +10 -12
  114. package/src/loadable-hooks/useSkipLimitPagination.ts +38 -19
  115. package/src/react/FragmentReader.tsx +23 -39
  116. package/src/react/FragmentRenderer.tsx +46 -0
  117. package/src/react/IsographEnvironmentProvider.tsx +1 -1
  118. package/src/react/LoadableFieldReader.tsx +40 -0
  119. package/src/react/LoadableFieldRenderer.tsx +41 -0
  120. package/src/react/useImperativeReference.ts +49 -27
  121. package/src/react/useLazyReference.ts +62 -14
  122. package/src/react/useReadAndSubscribe.ts +17 -9
  123. package/src/react/useRerenderOnChange.ts +2 -2
  124. package/src/react/useResult.ts +22 -8
  125. package/src/tests/__isograph/Economist/link/output_type.ts +2 -0
  126. package/src/tests/__isograph/Node/asEconomist/resolver_reader.ts +28 -0
  127. package/src/tests/__isograph/Node/link/output_type.ts +3 -0
  128. package/src/tests/__isograph/Query/linkedUpdate/entrypoint.ts +31 -0
  129. package/src/tests/__isograph/Query/linkedUpdate/normalization_ast.ts +95 -0
  130. package/src/tests/__isograph/Query/linkedUpdate/output_type.ts +3 -0
  131. package/src/tests/__isograph/Query/linkedUpdate/param_type.ts +51 -0
  132. package/src/tests/__isograph/Query/linkedUpdate/query_text.ts +20 -0
  133. package/src/tests/__isograph/Query/linkedUpdate/resolver_reader.ts +93 -0
  134. package/src/tests/__isograph/Query/meName/entrypoint.ts +8 -29
  135. package/src/tests/__isograph/Query/meName/normalization_ast.ts +25 -0
  136. package/src/tests/__isograph/Query/meName/query_text.ts +6 -0
  137. package/src/tests/__isograph/Query/meName/resolver_reader.ts +5 -0
  138. package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +8 -67
  139. package/src/tests/__isograph/Query/meNameSuccessor/normalization_ast.ts +56 -0
  140. package/src/tests/__isograph/Query/meNameSuccessor/query_text.ts +13 -0
  141. package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +10 -0
  142. package/src/tests/__isograph/Query/nodeField/entrypoint.ts +8 -34
  143. package/src/tests/__isograph/Query/nodeField/normalization_ast.ts +30 -0
  144. package/src/tests/__isograph/Query/nodeField/query_text.ts +6 -0
  145. package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +5 -0
  146. package/src/tests/__isograph/Query/startUpdate/entrypoint.ts +31 -0
  147. package/src/tests/__isograph/Query/startUpdate/normalization_ast.ts +51 -0
  148. package/src/tests/__isograph/Query/startUpdate/output_type.ts +3 -0
  149. package/src/tests/__isograph/Query/startUpdate/param_type.ts +26 -0
  150. package/src/tests/__isograph/Query/startUpdate/parameters_type.ts +3 -0
  151. package/src/tests/__isograph/Query/startUpdate/query_text.ts +11 -0
  152. package/src/tests/__isograph/Query/startUpdate/resolver_reader.ts +55 -0
  153. package/src/tests/__isograph/Query/subquery/entrypoint.ts +8 -44
  154. package/src/tests/__isograph/Query/subquery/normalization_ast.ts +38 -0
  155. package/src/tests/__isograph/Query/subquery/query_text.ts +8 -0
  156. package/src/tests/__isograph/Query/subquery/resolver_reader.ts +7 -0
  157. package/src/tests/__isograph/iso.ts +24 -3
  158. package/src/tests/__isograph/tsconfig.json +8 -0
  159. package/src/tests/garbageCollection.test.ts +10 -8
  160. package/src/tests/meNameSuccessor.ts +1 -1
  161. package/src/tests/nodeQuery.ts +2 -1
  162. package/src/tests/normalizeData.test.ts +1 -2
  163. package/src/tests/startUpdate.test.ts +205 -0
  164. package/tsconfig.pkg.json +1 -2
@@ -1,10 +1,13 @@
1
- import { stableCopy } from './cache';
2
- import { IsographEnvironment } from './IsographEnvironment';
3
- import { FragmentReference } from './FragmentReference';
4
1
  import { useReadAndSubscribe } from '../react/useReadAndSubscribe';
5
- import { NetworkRequestReaderOptions } from './read';
6
- import { readPromise } from './PromiseWrapper';
2
+ import {
3
+ FragmentReference,
4
+ stableIdForFragmentReference,
5
+ } from './FragmentReference';
6
+ import { IsographEnvironment } from './IsographEnvironment';
7
7
  import { logMessage } from './logging';
8
+ import { readPromise } from './PromiseWrapper';
9
+ import { NetworkRequestReaderOptions } from './read';
10
+ import { createStartUpdate } from './startUpdate';
8
11
 
9
12
  export function getOrCreateCachedComponent(
10
13
  environment: IsographEnvironment,
@@ -12,51 +15,45 @@ export function getOrCreateCachedComponent(
12
15
  fragmentReference: FragmentReference<any, any>,
13
16
  networkRequestOptions: NetworkRequestReaderOptions,
14
17
  ): React.FC<any> {
15
- // cachedComponentsById is a three layer cache: id, then component name, then
16
- // stringified args. These three, together, uniquely identify a read at a given
17
- // time.
18
- const cachedComponentsById = environment.componentCache;
19
-
20
- const recordLink = fragmentReference.root.__link;
21
-
22
- const componentsByName = (cachedComponentsById[recordLink] ??= {});
23
-
24
- componentsByName[componentName] = componentsByName[componentName] ?? {};
25
- const byArgs = componentsByName[componentName];
26
-
27
- const stringifiedArgs = JSON.stringify(
28
- stableCopy(fragmentReference.variables),
18
+ // We create startUpdate outside of component to make it stable
19
+ const startUpdate = createStartUpdate(
20
+ environment,
21
+ fragmentReference,
22
+ networkRequestOptions,
29
23
  );
30
- byArgs[stringifiedArgs] =
31
- byArgs[stringifiedArgs] ??
32
- (() => {
33
- function Component(additionalRuntimeProps: { [key: string]: any }) {
34
- const readerWithRefetchQueries = readPromise(
35
- fragmentReference.readerWithRefetchQueries,
36
- );
37
-
38
- const data = useReadAndSubscribe(
39
- fragmentReference,
40
- networkRequestOptions,
41
- readerWithRefetchQueries.readerArtifact.readerAst,
42
- );
43
-
44
- logMessage(environment, {
45
- kind: 'ComponentRerendered',
46
- componentName,
47
- rootLink: fragmentReference.root,
48
- });
49
24
 
50
- return readerWithRefetchQueries.readerArtifact.resolver(
51
- {
52
- data,
53
- parameters: fragmentReference.variables,
54
- },
55
- additionalRuntimeProps,
56
- );
57
- }
58
- Component.displayName = `${componentName} (id: ${fragmentReference.root}) @component`;
59
- return Component;
60
- })();
61
- return byArgs[stringifiedArgs];
25
+ return (environment.componentCache[
26
+ stableIdForFragmentReference(fragmentReference, componentName)
27
+ ] ??= (() => {
28
+ function Component(additionalRuntimeProps: { [key: string]: any }) {
29
+ const readerWithRefetchQueries = readPromise(
30
+ fragmentReference.readerWithRefetchQueries,
31
+ );
32
+
33
+ const data = useReadAndSubscribe(
34
+ fragmentReference,
35
+ networkRequestOptions,
36
+ readerWithRefetchQueries.readerArtifact.readerAst,
37
+ );
38
+
39
+ logMessage(environment, () => ({
40
+ kind: 'ComponentRerendered',
41
+ componentName,
42
+ rootLink: fragmentReference.root,
43
+ }));
44
+
45
+ return readerWithRefetchQueries.readerArtifact.resolver(
46
+ {
47
+ data,
48
+ parameters: fragmentReference.variables,
49
+ startUpdate: readerWithRefetchQueries.readerArtifact.hasUpdatable
50
+ ? startUpdate
51
+ : undefined,
52
+ },
53
+ additionalRuntimeProps,
54
+ );
55
+ }
56
+ Component.displayName = `${componentName} (id: ${fragmentReference.root}) @component`;
57
+ return Component;
58
+ })());
62
59
  }
@@ -1,9 +1,10 @@
1
+ import type { UnknownTReadFromStore } from './FragmentReference';
1
2
  import type { TypeName } from './IsographEnvironment';
2
3
  import { TopLevelReaderArtifact } from './reader';
3
4
  import { Arguments } from './util';
4
5
 
5
6
  export type ReaderWithRefetchQueries<
6
- TReadFromStore extends { parameters: object; data: object },
7
+ TReadFromStore extends UnknownTReadFromStore,
7
8
  TClientFieldValue,
8
9
  > = {
9
10
  readonly kind: 'ReaderWithRefetchQueries';
@@ -16,33 +17,61 @@ export type ReaderWithRefetchQueries<
16
17
  readonly nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[];
17
18
  };
18
19
 
19
- export type NetworkRequestInfo = {
20
+ export type ReaderWithRefetchQueriesLoader<
21
+ TReadFromStore extends UnknownTReadFromStore,
22
+ TClientFieldValue,
23
+ > = {
24
+ readonly kind: 'ReaderWithRefetchQueriesLoader';
25
+ readonly loader: () => Promise<
26
+ ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>
27
+ >;
28
+ };
29
+
30
+ export type NetworkRequestInfo<TNormalizationAst> = {
20
31
  readonly kind: 'NetworkRequestInfo';
21
- readonly queryText: string;
22
- readonly normalizationAst: NormalizationAst;
32
+ readonly operation: IsographOperation | IsographPersistedOperation;
33
+ readonly normalizationAst: TNormalizationAst;
23
34
  };
35
+
36
+ export type IsographOperation = {
37
+ readonly kind: 'Operation';
38
+ readonly text: string;
39
+ };
40
+
41
+ export type IsographPersistedOperation = {
42
+ readonly kind: 'PersistedOperation';
43
+ readonly operationId: string;
44
+ readonly extraInfo: IsographPersistedOperationExtraInfo | null;
45
+ };
46
+
47
+ export type IsographPersistedOperationExtraInfo = {
48
+ readonly kind: 'PersistedOperationExtraInfo';
49
+ readonly operationName: string | null;
50
+ readonly operationKind: 'Query' | 'Mutation' | 'Subscription';
51
+ };
52
+
24
53
  // This type should be treated as an opaque type.
25
54
  export type IsographEntrypoint<
26
- TReadFromStore extends { parameters: object; data: object },
55
+ TReadFromStore extends UnknownTReadFromStore,
27
56
  TClientFieldValue,
57
+ TNormalizationAst extends NormalizationAst | NormalizationAstLoader,
28
58
  > = {
29
59
  readonly kind: 'Entrypoint';
30
- readonly networkRequestInfo: NetworkRequestInfo;
31
- readonly readerWithRefetchQueries: ReaderWithRefetchQueries<
32
- TReadFromStore,
33
- TClientFieldValue
34
- >;
60
+ readonly networkRequestInfo: NetworkRequestInfo<TNormalizationAst>;
61
+ readonly readerWithRefetchQueries:
62
+ | ReaderWithRefetchQueries<TReadFromStore, TClientFieldValue>
63
+ | ReaderWithRefetchQueriesLoader<TReadFromStore, TClientFieldValue>;
35
64
  readonly concreteType: TypeName;
36
65
  };
37
66
 
38
67
  export type IsographEntrypointLoader<
39
- TReadFromStore extends { parameters: object; data: object },
68
+ TReadFromStore extends UnknownTReadFromStore,
40
69
  TClientFieldValue,
41
70
  > = {
42
71
  readonly kind: 'EntrypointLoader';
43
72
  readonly typeAndField: string;
44
73
  readonly loader: () => Promise<
45
- IsographEntrypoint<TReadFromStore, TClientFieldValue>
74
+ IsographEntrypoint<TReadFromStore, TClientFieldValue, NormalizationAst>
46
75
  >;
47
76
  };
48
77
 
@@ -50,7 +79,18 @@ export type NormalizationAstNode =
50
79
  | NormalizationScalarField
51
80
  | NormalizationLinkedField
52
81
  | NormalizationInlineFragment;
53
- export type NormalizationAst = ReadonlyArray<NormalizationAstNode>;
82
+
83
+ export type NormalizationAstNodes = ReadonlyArray<NormalizationAstNode>;
84
+
85
+ export type NormalizationAst = {
86
+ readonly kind: 'NormalizationAst';
87
+ readonly selections: NormalizationAstNodes;
88
+ };
89
+
90
+ export type NormalizationAstLoader = {
91
+ readonly kind: 'NormalizationAstLoader';
92
+ readonly loader: () => Promise<NormalizationAst>;
93
+ };
54
94
 
55
95
  export type NormalizationScalarField = {
56
96
  readonly kind: 'Scalar';
@@ -62,20 +102,20 @@ export type NormalizationLinkedField = {
62
102
  readonly kind: 'Linked';
63
103
  readonly fieldName: string;
64
104
  readonly arguments: Arguments | null;
65
- readonly selections: NormalizationAst;
105
+ readonly selections: NormalizationAstNodes;
66
106
  readonly concreteType: TypeName | null;
67
107
  };
68
108
 
69
109
  export type NormalizationInlineFragment = {
70
110
  readonly kind: 'InlineFragment';
71
111
  readonly type: string;
72
- readonly selections: NormalizationAst;
112
+ readonly selections: NormalizationAstNodes;
73
113
  };
74
114
 
75
115
  // This is more like an entrypoint, but one specifically for a refetch query/mutation
76
116
  export type RefetchQueryNormalizationArtifact = {
77
117
  readonly kind: 'RefetchQuery';
78
- readonly networkRequestInfo: NetworkRequestInfo;
118
+ readonly networkRequestInfo: NetworkRequestInfo<NormalizationAst>;
79
119
  readonly concreteType: TypeName;
80
120
  };
81
121
 
@@ -86,21 +126,26 @@ export type RefetchQueryNormalizationArtifactWrapper = {
86
126
  };
87
127
 
88
128
  export function assertIsEntrypoint<
89
- TReadFromStore extends { parameters: object; data: object },
129
+ TReadFromStore extends UnknownTReadFromStore,
90
130
  TClientFieldValue,
131
+ TNormalizationAst extends NormalizationAst | NormalizationAstLoader,
91
132
  >(
92
133
  value:
93
- | IsographEntrypoint<TReadFromStore, TClientFieldValue>
134
+ | IsographEntrypoint<TReadFromStore, TClientFieldValue, TNormalizationAst>
94
135
  | ((_: any) => any)
95
136
  // Temporarily, allow any here. Once we automatically provide
96
137
  // types to entrypoints, we probably don't need this.
97
138
  | any,
98
- ): asserts value is IsographEntrypoint<TReadFromStore, TClientFieldValue> {
139
+ ): asserts value is IsographEntrypoint<
140
+ TReadFromStore,
141
+ TClientFieldValue,
142
+ TNormalizationAst
143
+ > {
99
144
  if (typeof value === 'function') throw new Error('Not a string');
100
145
  }
101
146
 
102
147
  export type ExtractReadFromStore<Type> =
103
- Type extends IsographEntrypoint<infer X, any> ? X : never;
148
+ Type extends IsographEntrypoint<infer X, any, any> ? X : never;
104
149
  export type ExtractResolverResult<Type> =
105
- Type extends IsographEntrypoint<any, infer X> ? X : never;
150
+ Type extends IsographEntrypoint<any, infer X, any> ? X : never;
106
151
  export type ExtractProps<Type> = Type extends React.FC<infer X> ? X : never;
@@ -1,23 +1,23 @@
1
+ import { getParentRecordKey } from './cache';
2
+ import { NormalizationAstNodes } from './entrypoint';
1
3
  import { Variables } from './FragmentReference';
2
4
  import {
5
+ assertLink,
3
6
  DataId,
4
7
  IsographEnvironment,
5
8
  IsographStore,
6
9
  StoreRecord,
7
- assertLink,
8
- type Link,
10
+ type StoreLink,
9
11
  type TypeName,
10
12
  } from './IsographEnvironment';
11
- import { getParentRecordKey } from './cache';
12
- import { NormalizationAst } from './entrypoint';
13
13
 
14
14
  export type RetainedQuery = {
15
- readonly normalizationAst: NormalizationAst;
15
+ readonly normalizationAst: NormalizationAstNodes;
16
16
  readonly variables: {};
17
- readonly root: Link;
17
+ readonly root: StoreLink;
18
18
  };
19
19
 
20
- type DidUnretainSomeQuery = boolean;
20
+ export type DidUnretainSomeQuery = boolean;
21
21
  export function unretainQuery(
22
22
  environment: IsographEnvironment,
23
23
  retainedQuery: RetainedQuery,
@@ -108,7 +108,7 @@ function recordReachableIdsFromRecord(
108
108
  store: IsographStore,
109
109
  currentRecord: StoreRecord,
110
110
  mutableRetainedIds: RetainedIds,
111
- selections: NormalizationAst,
111
+ selections: NormalizationAstNodes,
112
112
  variables: Variables | null,
113
113
  ) {
114
114
  for (const selection of selections) {
@@ -117,7 +117,7 @@ function recordReachableIdsFromRecord(
117
117
  const linkKey = getParentRecordKey(selection, variables ?? {});
118
118
  const linkedFieldOrFields = currentRecord[linkKey];
119
119
 
120
- const links: Link[] = [];
120
+ const links: StoreLink[] = [];
121
121
  if (Array.isArray(linkedFieldOrFields)) {
122
122
  for (const maybeLink of linkedFieldOrFields) {
123
123
  const link = assertLink(maybeLink);
@@ -1,31 +1,25 @@
1
1
  import { CleanupFn } from '@isograph/disposable-types';
2
- import {
3
- IsographEnvironment,
4
- IsographStore,
5
- StoreRecord,
6
- type Link,
7
- } from './IsographEnvironment';
2
+ import { NetworkResponseObject, type EncounteredIds } from './cache';
3
+ import { CheckResult } from './check';
8
4
  import {
9
5
  IsographEntrypoint,
10
- NormalizationAst,
11
6
  RefetchQueryNormalizationArtifact,
7
+ type NormalizationAstNodes,
12
8
  } from './entrypoint';
13
9
  import { FragmentReference, Variables } from './FragmentReference';
14
- import { NetworkResponseObject, type EncounteredIds } from './cache';
15
- import { Arguments } from './util';
10
+ import {
11
+ IsographEnvironment,
12
+ IsographStore,
13
+ StoreRecord,
14
+ type StoreLink,
15
+ } from './IsographEnvironment';
16
16
  import { ReadDataResult } from './read';
17
- import { CheckResult } from './check';
17
+ import { Arguments } from './util';
18
18
 
19
19
  export type LogMessage =
20
- | {
21
- kind: 'GettingSuspenseCacheItem';
22
- index: string;
23
- availableCacheItems: ReadonlyArray<string>;
24
- found: boolean;
25
- }
26
20
  | {
27
21
  kind: 'AboutToNormalize';
28
- normalizationAst: NormalizationAst;
22
+ normalizationAst: NormalizationAstNodes;
29
23
  networkResponse: NetworkResponseObject;
30
24
  variables: Variables;
31
25
  }
@@ -44,13 +38,13 @@ export type LogMessage =
44
38
  | {
45
39
  kind: 'ComponentRerendered';
46
40
  componentName: string;
47
- rootLink: Link;
41
+ rootLink: StoreLink;
48
42
  }
49
43
  | {
50
44
  kind: 'MakeNetworkRequest';
51
45
  artifact:
52
46
  | RefetchQueryNormalizationArtifact
53
- | IsographEntrypoint<any, any>;
47
+ | IsographEntrypoint<any, any, any>;
54
48
  variables: Variables;
55
49
  networkRequestId: string;
56
50
  }
@@ -67,7 +61,7 @@ export type LogMessage =
67
61
  }
68
62
  | {
69
63
  kind: 'MissingFieldHandlerCalled';
70
- root: Link;
64
+ root: StoreLink;
71
65
  storeRecord: StoreRecord;
72
66
  fieldName: string;
73
67
  arguments: Arguments | null;
@@ -76,6 +70,8 @@ export type LogMessage =
76
70
  | {
77
71
  kind: 'DoneReading';
78
72
  response: ReadDataResult<any>;
73
+ fieldName: string;
74
+ root: StoreLink;
79
75
  }
80
76
  | {
81
77
  kind: 'NonEntrypointReceived';
@@ -84,6 +80,21 @@ export type LogMessage =
84
80
  | {
85
81
  kind: 'EnvironmentCheck';
86
82
  result: CheckResult;
83
+ }
84
+ | {
85
+ kind: 'EnvironmentCreated';
86
+ }
87
+ | {
88
+ kind: 'StartUpdateError';
89
+ error: any;
90
+ }
91
+ | {
92
+ kind: 'StartUpdateComplete';
93
+ updatedIds: EncounteredIds;
94
+ }
95
+ | {
96
+ kind: 'ErrorEncounteredInWithErrorHandling';
97
+ error: any;
87
98
  };
88
99
 
89
100
  export type LogFunction = (logMessage: LogMessage) => void;
@@ -95,12 +106,15 @@ export type WrappedLogFunction = {
95
106
 
96
107
  export function logMessage(
97
108
  environment: IsographEnvironment,
98
- message: LogMessage,
109
+ getMessage: () => LogMessage,
99
110
  ) {
100
- for (const logger of environment.loggers) {
101
- try {
102
- logger.log(message);
103
- } catch {}
111
+ if (environment.loggers.size > 0) {
112
+ const message = getMessage();
113
+ for (const logger of environment.loggers) {
114
+ try {
115
+ logger.log(message);
116
+ } catch {}
117
+ }
104
118
  }
105
119
  }
106
120