@isograph/react 0.3.0 → 0.3.1

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 (128) hide show
  1. package/.turbo/turbo-compile-typescript.log +4 -0
  2. package/dist/core/FragmentReference.d.ts +16 -7
  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 +17 -27
  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 +3 -4
  9. package/dist/core/PromiseWrapper.d.ts.map +1 -1
  10. package/dist/core/PromiseWrapper.js +5 -4
  11. package/dist/core/areEqualWithDeepComparison.d.ts.map +1 -1
  12. package/dist/core/areEqualWithDeepComparison.js +16 -0
  13. package/dist/core/cache.d.ts +11 -20
  14. package/dist/core/cache.d.ts.map +1 -1
  15. package/dist/core/cache.js +60 -45
  16. package/dist/core/check.d.ts +9 -5
  17. package/dist/core/check.d.ts.map +1 -1
  18. package/dist/core/check.js +2 -2
  19. package/dist/core/componentCache.d.ts +1 -1
  20. package/dist/core/componentCache.d.ts.map +1 -1
  21. package/dist/core/componentCache.js +27 -31
  22. package/dist/core/entrypoint.d.ts +23 -26
  23. package/dist/core/entrypoint.d.ts.map +1 -1
  24. package/dist/core/garbageCollection.d.ts +3 -4
  25. package/dist/core/garbageCollection.d.ts.map +1 -1
  26. package/dist/core/garbageCollection.js +1 -1
  27. package/dist/core/logging.d.ts +12 -13
  28. package/dist/core/logging.d.ts.map +1 -1
  29. package/dist/core/logging.js +8 -5
  30. package/dist/core/makeNetworkRequest.d.ts +5 -5
  31. package/dist/core/makeNetworkRequest.d.ts.map +1 -1
  32. package/dist/core/makeNetworkRequest.js +107 -22
  33. package/dist/core/read.d.ts +15 -10
  34. package/dist/core/read.d.ts.map +1 -1
  35. package/dist/core/read.js +398 -304
  36. package/dist/core/reader.d.ts +24 -32
  37. package/dist/core/reader.d.ts.map +1 -1
  38. package/dist/core/startUpdate.d.ts +5 -0
  39. package/dist/core/startUpdate.d.ts.map +1 -0
  40. package/dist/core/startUpdate.js +15 -0
  41. package/dist/core/util.d.ts +3 -0
  42. package/dist/core/util.d.ts.map +1 -1
  43. package/dist/index.d.ts +16 -16
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +2 -1
  46. package/dist/loadable-hooks/useClientSideDefer.d.ts +4 -10
  47. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
  48. package/dist/loadable-hooks/useClientSideDefer.js +2 -2
  49. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +8 -15
  50. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
  51. package/dist/loadable-hooks/useConnectionSpecPagination.js +6 -4
  52. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +1 -2
  53. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -1
  54. package/dist/loadable-hooks/useImperativeLoadableField.d.ts +4 -6
  55. package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -1
  56. package/dist/loadable-hooks/useImperativeLoadableField.js +1 -1
  57. package/dist/loadable-hooks/useSkipLimitPagination.d.ts +6 -13
  58. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
  59. package/dist/loadable-hooks/useSkipLimitPagination.js +11 -9
  60. package/dist/react/FragmentReader.d.ts +2 -3
  61. package/dist/react/FragmentReader.d.ts.map +1 -1
  62. package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -1
  63. package/dist/react/useImperativeReference.d.ts +7 -10
  64. package/dist/react/useImperativeReference.d.ts.map +1 -1
  65. package/dist/react/useImperativeReference.js +2 -3
  66. package/dist/react/useLazyReference.d.ts +4 -7
  67. package/dist/react/useLazyReference.d.ts.map +1 -1
  68. package/dist/react/useLazyReference.js +26 -5
  69. package/dist/react/useReadAndSubscribe.d.ts +3 -9
  70. package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
  71. package/dist/react/useReadAndSubscribe.js +7 -3
  72. package/dist/react/useRerenderOnChange.d.ts +1 -1
  73. package/dist/react/useRerenderOnChange.d.ts.map +1 -1
  74. package/dist/react/useResult.d.ts +3 -6
  75. package/dist/react/useResult.d.ts.map +1 -1
  76. package/dist/react/useResult.js +10 -8
  77. package/isograph.config.json +1 -0
  78. package/package.json +7 -6
  79. package/src/core/FragmentReference.ts +30 -15
  80. package/src/core/IsographEnvironment.ts +39 -31
  81. package/src/core/PromiseWrapper.ts +3 -3
  82. package/src/core/areEqualWithDeepComparison.ts +20 -0
  83. package/src/core/cache.ts +105 -72
  84. package/src/core/check.ts +13 -8
  85. package/src/core/componentCache.ts +45 -52
  86. package/src/core/entrypoint.ts +34 -16
  87. package/src/core/garbageCollection.ts +6 -6
  88. package/src/core/logging.ts +24 -22
  89. package/src/core/makeNetworkRequest.ts +183 -30
  90. package/src/core/read.ts +618 -435
  91. package/src/core/reader.ts +37 -24
  92. package/src/core/startUpdate.ts +28 -0
  93. package/src/core/util.ts +4 -0
  94. package/src/index.ts +82 -9
  95. package/src/loadable-hooks/useClientSideDefer.ts +11 -10
  96. package/src/loadable-hooks/useConnectionSpecPagination.ts +26 -13
  97. package/src/loadable-hooks/useImperativeExposedMutationField.ts +1 -1
  98. package/src/loadable-hooks/useImperativeLoadableField.ts +10 -12
  99. package/src/loadable-hooks/useSkipLimitPagination.ts +37 -19
  100. package/src/react/FragmentReader.tsx +3 -3
  101. package/src/react/IsographEnvironmentProvider.tsx +1 -1
  102. package/src/react/useImperativeReference.ts +40 -19
  103. package/src/react/useLazyReference.ts +62 -14
  104. package/src/react/useReadAndSubscribe.ts +17 -9
  105. package/src/react/useRerenderOnChange.ts +2 -2
  106. package/src/react/useResult.ts +21 -8
  107. package/src/tests/__isograph/Query/meName/entrypoint.ts +4 -28
  108. package/src/tests/__isograph/Query/meName/normalization_ast.ts +25 -0
  109. package/src/tests/__isograph/Query/meName/query_text.ts +6 -0
  110. package/src/tests/__isograph/Query/meName/resolver_reader.ts +4 -0
  111. package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +4 -66
  112. package/src/tests/__isograph/Query/meNameSuccessor/normalization_ast.ts +56 -0
  113. package/src/tests/__isograph/Query/meNameSuccessor/query_text.ts +13 -0
  114. package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +7 -0
  115. package/src/tests/__isograph/Query/nodeField/entrypoint.ts +4 -33
  116. package/src/tests/__isograph/Query/nodeField/normalization_ast.ts +30 -0
  117. package/src/tests/__isograph/Query/nodeField/query_text.ts +6 -0
  118. package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +4 -0
  119. package/src/tests/__isograph/Query/subquery/entrypoint.ts +4 -43
  120. package/src/tests/__isograph/Query/subquery/normalization_ast.ts +38 -0
  121. package/src/tests/__isograph/Query/subquery/query_text.ts +8 -0
  122. package/src/tests/__isograph/Query/subquery/resolver_reader.ts +5 -0
  123. package/src/tests/__isograph/iso.ts +3 -2
  124. package/src/tests/garbageCollection.test.ts +10 -8
  125. package/src/tests/meNameSuccessor.ts +1 -1
  126. package/src/tests/nodeQuery.ts +2 -1
  127. package/src/tests/normalizeData.test.ts +1 -1
  128. package/tsconfig.pkg.json +1 -2
@@ -1,25 +1,25 @@
1
1
  import { Factory } from '@isograph/disposable-types';
2
+ import { FetchOptions } from './check';
3
+ import {
4
+ IsographEntrypoint,
5
+ IsographEntrypointLoader,
6
+ RefetchQueryNormalizationArtifact,
7
+ RefetchQueryNormalizationArtifactWrapper,
8
+ } from './entrypoint';
2
9
  import {
3
- FragmentReference,
4
10
  ExtractParameters,
5
- ExtractData,
11
+ FragmentReference,
12
+ type UnknownTReadFromStore,
6
13
  } from './FragmentReference';
7
14
  import {
8
15
  ComponentOrFieldName,
9
16
  IsographEnvironment,
10
17
  type Link,
11
18
  } from './IsographEnvironment';
12
- import {
13
- IsographEntrypoint,
14
- IsographEntrypointLoader,
15
- RefetchQueryNormalizationArtifact,
16
- RefetchQueryNormalizationArtifactWrapper,
17
- } from './entrypoint';
18
19
  import { Arguments } from './util';
19
- import { FetchOptions } from './check';
20
20
 
21
21
  export type TopLevelReaderArtifact<
22
- TReadFromStore extends { parameters: object; data: object },
22
+ TReadFromStore extends UnknownTReadFromStore,
23
23
  TClientFieldValue,
24
24
  TComponentProps extends Record<PropertyKey, never>,
25
25
  > =
@@ -27,35 +27,39 @@ export type TopLevelReaderArtifact<
27
27
  | ComponentReaderArtifact<TReadFromStore, TComponentProps>;
28
28
 
29
29
  export type EagerReaderArtifact<
30
- TReadFromStore extends { parameters: object; data: object },
30
+ TReadFromStore extends UnknownTReadFromStore,
31
31
  TClientFieldValue,
32
32
  > = {
33
33
  readonly kind: 'EagerReaderArtifact';
34
+ readonly fieldName: string;
34
35
  readonly readerAst: ReaderAst<TReadFromStore>;
35
36
  readonly resolver: (
36
37
  data: ResolverFirstParameter<TReadFromStore>,
37
38
  ) => TClientFieldValue;
39
+ readonly hasUpdatable: boolean;
38
40
  };
39
41
 
40
42
  export type ComponentReaderArtifact<
41
- TReadFromStore extends { parameters: object; data: object },
43
+ TReadFromStore extends UnknownTReadFromStore,
42
44
  TComponentProps extends Record<string, unknown> = Record<PropertyKey, never>,
43
45
  > = {
44
46
  readonly kind: 'ComponentReaderArtifact';
45
- readonly componentName: ComponentOrFieldName;
47
+ readonly fieldName: ComponentOrFieldName;
46
48
  readonly readerAst: ReaderAst<TReadFromStore>;
47
49
  readonly resolver: (
48
50
  data: ResolverFirstParameter<TReadFromStore>,
49
51
  runtimeProps: TComponentProps,
50
52
  ) => React.ReactNode;
53
+ readonly hasUpdatable: boolean;
51
54
  };
52
55
 
53
56
  export type ResolverFirstParameter<
54
- TReadFromStore extends { data: object; parameters: object },
55
- > = {
56
- data: ExtractData<TReadFromStore>;
57
- parameters: ExtractParameters<TReadFromStore>;
58
- };
57
+ TReadFromStore extends UnknownTReadFromStore,
58
+ > = Pick<TReadFromStore, 'data' | 'parameters' | 'startUpdate'>;
59
+
60
+ export type StartUpdate<UpdatableData> = (
61
+ updater: (updatableData: UpdatableData) => void,
62
+ ) => void;
59
63
 
60
64
  export type RefetchReaderArtifact = {
61
65
  readonly kind: 'RefetchReaderArtifact';
@@ -79,7 +83,8 @@ export type ReaderAstNode =
79
83
  | ReaderLinkedField
80
84
  | ReaderNonLoadableResolverField
81
85
  | ReaderImperativelyLoadedField
82
- | ReaderLoadableField;
86
+ | ReaderLoadableField
87
+ | ReaderLinkField;
83
88
 
84
89
  // @ts-ignore
85
90
  export type ReaderAst<TReadFromStore> = ReadonlyArray<ReaderAstNode>;
@@ -89,7 +94,14 @@ export type ReaderScalarField = {
89
94
  readonly fieldName: string;
90
95
  readonly alias: string | null;
91
96
  readonly arguments: Arguments | null;
97
+ readonly isUpdatable: boolean;
98
+ };
99
+
100
+ export type ReaderLinkField = {
101
+ readonly kind: 'Link';
102
+ readonly alias: string;
92
103
  };
104
+
93
105
  export type ReaderLinkedField = {
94
106
  readonly kind: 'Linked';
95
107
  readonly fieldName: string;
@@ -97,9 +109,10 @@ export type ReaderLinkedField = {
97
109
  readonly selections: ReaderAst<unknown>;
98
110
  readonly arguments: Arguments | null;
99
111
  readonly condition: EagerReaderArtifact<
100
- { data: object; parameters: object },
112
+ { data: object; parameters: any; startUpdate?: StartUpdate<object> },
101
113
  boolean | Link | null
102
114
  > | null;
115
+ readonly isUpdatable: boolean;
103
116
  };
104
117
 
105
118
  export type ReaderNonLoadableResolverField = {
@@ -132,11 +145,11 @@ export type ReaderLoadableField = {
132
145
 
133
146
  // TODO we should not type these as any
134
147
  readonly entrypoint:
135
- | IsographEntrypoint<any, any>
148
+ | IsographEntrypoint<any, any, any>
136
149
  | IsographEntrypointLoader<any, any>;
137
150
  };
138
151
 
139
- type StableId = string;
152
+ export type StableId = string;
140
153
  /// Why is LoadableField the way it is? Let's work backwards.
141
154
  ///
142
155
  /// We ultimately need a stable id (for deduplication) and a way to produce a
@@ -147,7 +160,7 @@ type StableId = string;
147
160
  /// except to stringify the args or whatnot. Calling the factory can be
148
161
  /// expensive. For example, doing so will probably trigger a network request.
149
162
  export type LoadableField<
150
- TReadFromStore extends { data: object; parameters: object },
163
+ TReadFromStore extends UnknownTReadFromStore,
151
164
  TResult,
152
165
  TArgs = ExtractParameters<TReadFromStore>,
153
166
  > = (
@@ -156,5 +169,5 @@ export type LoadableField<
156
169
  // user-facing API. Users should only interact with LoadableFields via APIs
157
170
  // like useClientSideDefer. These APIs should have a nullable fetchOptions
158
171
  // parameter, and provide a default value ({}) to the LoadableField.
159
- fetchOptions: FetchOptions,
172
+ fetchOptions: FetchOptions<TResult>,
160
173
  ) => [StableId, Factory<FragmentReference<TReadFromStore, TResult>>];
@@ -0,0 +1,28 @@
1
+ import {
2
+ stableIdForFragmentReference,
3
+ type ExtractStartUpdate,
4
+ type FragmentReference,
5
+ type UnknownTReadFromStore,
6
+ } from './FragmentReference';
7
+ import type { IsographEnvironment } from './IsographEnvironment';
8
+
9
+ export function getOrCreateCachedStartUpdate<
10
+ TReadFromStore extends UnknownTReadFromStore,
11
+ >(
12
+ environment: IsographEnvironment,
13
+ fragmentReference: FragmentReference<TReadFromStore, any>,
14
+ eagerResolverName: string,
15
+ ): ExtractStartUpdate<TReadFromStore> {
16
+ return (environment.eagerReaderCache[
17
+ stableIdForFragmentReference(fragmentReference, eagerResolverName)
18
+ ] ??= createStartUpdate(environment, fragmentReference));
19
+ }
20
+
21
+ export function createStartUpdate<TReadFromStore extends UnknownTReadFromStore>(
22
+ _environment: IsographEnvironment,
23
+ _fragmentReference: FragmentReference<TReadFromStore, any>,
24
+ ): ExtractStartUpdate<TReadFromStore> {
25
+ return (_updater) => {
26
+ // TODO start update
27
+ };
28
+ }
package/src/core/util.ts CHANGED
@@ -24,4 +24,8 @@ export type ArgumentValue =
24
24
  | {
25
25
  readonly kind: 'Enum';
26
26
  readonly value: string;
27
+ }
28
+ | {
29
+ readonly kind: 'Object';
30
+ readonly value: Arguments;
27
31
  };
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@ export {
3
3
  unretainQuery,
4
4
  type RetainedQuery,
5
5
  garbageCollectEnvironment,
6
+ type DidUnretainSomeQuery,
6
7
  } from './core/garbageCollection';
7
8
  export {
8
9
  type PromiseWrapper,
@@ -10,8 +11,20 @@ export {
10
11
  getPromiseState,
11
12
  wrapResolvedValue,
12
13
  wrapPromise,
14
+ type PromiseState,
15
+ type Result,
16
+ type AnyError,
17
+ type NotSet,
18
+ NOT_SET,
13
19
  } from './core/PromiseWrapper';
14
- export { subscribe, normalizeData } from './core/cache';
20
+ export {
21
+ subscribe,
22
+ normalizeData,
23
+ type NetworkResponseObject,
24
+ type NetworkResponseValue,
25
+ type NetworkResponseScalarValue,
26
+ type EncounteredIds,
27
+ } from './core/cache';
15
28
  export { makeNetworkRequest } from './core/makeNetworkRequest';
16
29
  export {
17
30
  ROOT_ID,
@@ -20,10 +33,21 @@ export {
20
33
  type IsographEnvironment,
21
34
  type IsographNetworkFunction,
22
35
  type IsographStore,
36
+ type MissingFieldHandler,
23
37
  type Link,
24
38
  type StoreRecord,
39
+ type CacheMap,
25
40
  createIsographEnvironment,
26
41
  createIsographStore,
42
+ type FieldCache,
43
+ type Subscriptions,
44
+ type Subscription,
45
+ type TypeName,
46
+ type FragmentSubscription,
47
+ type AnyChangesToRecordSubscription,
48
+ type AnyRecordSubscription,
49
+ type ComponentOrFieldName,
50
+ type StringifiedArgs,
27
51
  } from './core/IsographEnvironment';
28
52
  export {
29
53
  type EagerReaderArtifact,
@@ -36,11 +60,18 @@ export {
36
60
  type ReaderScalarField,
37
61
  type TopLevelReaderArtifact,
38
62
  type LoadableField,
63
+ type StableId,
39
64
  type ResolverFirstParameter,
65
+ type ReaderImperativelyLoadedField,
66
+ type ReaderLoadableField,
67
+ type ReaderLinkField,
68
+ type StartUpdate,
40
69
  } from './core/reader';
41
70
  export {
42
71
  type NormalizationAst,
43
72
  type NormalizationAstNode,
73
+ type NormalizationAstNodes,
74
+ type NormalizationAstLoader,
44
75
  type NormalizationLinkedField,
45
76
  type NormalizationScalarField,
46
77
  type IsographEntrypoint,
@@ -51,8 +82,16 @@ export {
51
82
  type ExtractReadFromStore,
52
83
  type ExtractResolverResult,
53
84
  type NetworkRequestInfo,
85
+ type NormalizationInlineFragment,
86
+ type ReaderWithRefetchQueries,
87
+ type IsographEntrypointLoader,
54
88
  } from './core/entrypoint';
55
- export { readButDoNotEvaluate } from './core/read';
89
+ export {
90
+ readButDoNotEvaluate,
91
+ type WithEncounteredRecords,
92
+ type NetworkRequestReaderOptions,
93
+ type ReadDataResult,
94
+ } from './core/read';
56
95
  export {
57
96
  type ExtractSecondParam,
58
97
  type CombineWithIntrinsicAttributes,
@@ -66,23 +105,41 @@ export {
66
105
  type Variables,
67
106
  type ExtractParameters,
68
107
  type ExtractData,
108
+ type UnknownTReadFromStore,
69
109
  stableIdForFragmentReference,
110
+ type ExtractStartUpdate,
111
+ type VariableValue,
112
+ type StableIdForFragmentReference,
70
113
  } from './core/FragmentReference';
71
114
  export {
72
115
  type LogMessage,
73
116
  type LogFunction,
117
+ type WrappedLogFunction,
74
118
  logMessage,
75
119
  registerLogger,
76
120
  } from './core/logging';
77
- export { check, CheckResult, FetchOptions, ShouldFetch } from './core/check';
121
+ export {
122
+ check,
123
+ type CheckResult,
124
+ type FetchOptions,
125
+ type RequiredFetchOptions,
126
+ type ShouldFetch,
127
+ type RequiredShouldFetch,
128
+ } from './core/check';
78
129
 
79
130
  export {
80
131
  IsographEnvironmentProvider,
81
132
  useIsographEnvironment,
82
133
  type IsographEnvironmentProviderProps,
83
134
  } from './react/IsographEnvironmentProvider';
84
- export { useImperativeReference } from './react/useImperativeReference';
85
- export { FragmentReader } from './react/FragmentReader';
135
+ export {
136
+ useImperativeReference,
137
+ type UseImperativeReferenceResult,
138
+ } from './react/useImperativeReference';
139
+ export {
140
+ FragmentReader,
141
+ type IsExactlyIntrinsicAttributes,
142
+ } from './react/FragmentReader';
86
143
  export { useResult } from './react/useResult';
87
144
  export {
88
145
  useReadAndSubscribe,
@@ -93,7 +150,23 @@ export { useRerenderOnChange } from './react/useRerenderOnChange';
93
150
  export { RenderAfterCommit__DO_NOT_USE } from './react/RenderAfterCommit__DO_NOT_USE';
94
151
 
95
152
  export { useClientSideDefer } from './loadable-hooks/useClientSideDefer';
96
- export { useImperativeExposedMutationField } from './loadable-hooks/useImperativeExposedMutationField';
97
- export { useSkipLimitPagination } from './loadable-hooks/useSkipLimitPagination';
98
- export { useConnectionSpecPagination } from './loadable-hooks/useConnectionSpecPagination';
99
- export { useImperativeLoadableField } from './loadable-hooks/useImperativeLoadableField';
153
+ export {
154
+ useImperativeExposedMutationField,
155
+ type UseImperativeLoadableFieldReturn as UseImperativeExposedMutationFieldReturn,
156
+ } from './loadable-hooks/useImperativeExposedMutationField';
157
+ export {
158
+ useSkipLimitPagination,
159
+ type UseSkipLimitPaginationArgs,
160
+ type UseSkipLimitReturnValue,
161
+ } from './loadable-hooks/useSkipLimitPagination';
162
+ export {
163
+ useConnectionSpecPagination,
164
+ type Connection,
165
+ type PageInfo,
166
+ type UseConnectionSpecPaginationArgs,
167
+ type UsePaginationReturnValue,
168
+ } from './loadable-hooks/useConnectionSpecPagination';
169
+ export {
170
+ useImperativeLoadableField,
171
+ type UseImperativeLoadableFieldReturn,
172
+ } from './loadable-hooks/useImperativeLoadableField';
@@ -1,15 +1,16 @@
1
+ import { useLazyDisposableState } from '@isograph/react-disposable-state';
2
+ import { getOrCreateItemInSuspenseCache } from '../core/cache';
3
+ import { FetchOptions } from '../core/check';
1
4
  import {
2
5
  ExtractParameters,
3
6
  FragmentReference,
7
+ type UnknownTReadFromStore,
4
8
  } from '../core/FragmentReference';
5
- import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
6
- import { getOrCreateItemInSuspenseCache } from '../core/cache';
7
- import { useLazyDisposableState } from '@isograph/react-disposable-state';
8
9
  import { LoadableField } from '../core/reader';
9
- import { FetchOptions } from '../core/check';
10
+ import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
10
11
 
11
12
  export function useClientSideDefer<
12
- TReadFromStore extends { data: object; parameters: object },
13
+ TReadFromStore extends UnknownTReadFromStore,
13
14
  TResult,
14
15
  >(
15
16
  loadableField: LoadableField<
@@ -18,11 +19,11 @@ export function useClientSideDefer<
18
19
  ExtractParameters<TReadFromStore>
19
20
  >,
20
21
  args?: Record<PropertyKey, never>,
21
- fetchOptions?: FetchOptions,
22
+ fetchOptions?: FetchOptions<TResult>,
22
23
  ): { fragmentReference: FragmentReference<TReadFromStore, TResult> };
23
24
 
24
25
  export function useClientSideDefer<
25
- TReadFromStore extends { data: object; parameters: object },
26
+ TReadFromStore extends UnknownTReadFromStore,
26
27
  TResult,
27
28
  TProvidedArgs extends object,
28
29
  >(
@@ -32,11 +33,11 @@ export function useClientSideDefer<
32
33
  Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>
33
34
  >,
34
35
  args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>,
35
- fetchOptions?: FetchOptions,
36
+ fetchOptions?: FetchOptions<TResult>,
36
37
  ): { fragmentReference: FragmentReference<TReadFromStore, TResult> };
37
38
 
38
39
  export function useClientSideDefer<
39
- TReadFromStore extends { data: object; parameters: object },
40
+ TReadFromStore extends UnknownTReadFromStore,
40
41
  TResult,
41
42
  TProvidedArgs extends object,
42
43
  >(
@@ -46,7 +47,7 @@ export function useClientSideDefer<
46
47
  Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>
47
48
  >,
48
49
  args?: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>,
49
- fetchOptions?: FetchOptions,
50
+ fetchOptions?: FetchOptions<TResult>,
50
51
  ): { fragmentReference: FragmentReference<TReadFromStore, TResult> } {
51
52
  const [id, loader] = loadableField(args, fetchOptions ?? {});
52
53
  const environment = useIsographEnvironment();
@@ -9,20 +9,24 @@ import {
9
9
  } from '@isograph/reference-counted-pointer';
10
10
  import { useState } from 'react';
11
11
  import { subscribeToAnyChange } from '../core/cache';
12
- import { FragmentReference } from '../core/FragmentReference';
12
+ import { FetchOptions } from '../core/check';
13
+ import {
14
+ FragmentReference,
15
+ type UnknownTReadFromStore,
16
+ } from '../core/FragmentReference';
13
17
  import { getPromiseState, readPromise } from '../core/PromiseWrapper';
14
18
  import {
15
19
  readButDoNotEvaluate,
16
20
  type WithEncounteredRecords,
17
21
  } from '../core/read';
18
22
  import { LoadableField, type ReaderAst } from '../core/reader';
23
+ import { getOrCreateCachedStartUpdate } from '../core/startUpdate';
19
24
  import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
20
25
  import { useSubscribeToMultiple } from '../react/useReadAndSubscribe';
21
26
  import { maybeUnwrapNetworkRequest } from '../react/useResult';
22
- import { FetchOptions } from '../core/check';
23
27
 
24
- type UsePaginationReturnValue<
25
- TReadFromStore extends { parameters: object; data: object },
28
+ export type UsePaginationReturnValue<
29
+ TReadFromStore extends UnknownTReadFromStore,
26
30
  TItem,
27
31
  > =
28
32
  | {
@@ -32,7 +36,10 @@ type UsePaginationReturnValue<
32
36
  }
33
37
  | {
34
38
  kind: 'Complete';
35
- fetchMore: (count: number, fetchOptions?: FetchOptions) => void;
39
+ fetchMore: (
40
+ count: number,
41
+ fetchOptions?: FetchOptions<Connection<TItem>>,
42
+ ) => void;
36
43
  results: ReadonlyArray<TItem>;
37
44
  hasNextPage: boolean;
38
45
  };
@@ -59,12 +66,12 @@ function flatten<T>(arr: ReadonlyArray<ReadonlyArray<T>>): ReadonlyArray<T> {
59
66
  return outArray;
60
67
  }
61
68
 
62
- type PageInfo = {
69
+ export type PageInfo = {
63
70
  readonly hasNextPage: boolean;
64
71
  readonly endCursor: string | null;
65
72
  };
66
73
 
67
- type Connection<T> = {
74
+ export type Connection<T> = {
68
75
  readonly edges: ReadonlyArray<T> | null;
69
76
  readonly pageInfo: PageInfo;
70
77
  };
@@ -74,16 +81,13 @@ type NonNullConnection<T> = {
74
81
  readonly pageInfo: PageInfo;
75
82
  };
76
83
 
77
- type UseConnectionSpecPaginationArgs = {
84
+ export type UseConnectionSpecPaginationArgs = {
78
85
  first: number;
79
86
  after: string | null;
80
87
  };
81
88
 
82
89
  export function useConnectionSpecPagination<
83
- TReadFromStore extends {
84
- parameters: object;
85
- data: object;
86
- },
90
+ TReadFromStore extends UnknownTReadFromStore,
87
91
  TItem,
88
92
  >(
89
93
  loadableField: LoadableField<
@@ -125,6 +129,15 @@ export function useConnectionSpecPagination<
125
129
  const firstParameter = {
126
130
  data,
127
131
  parameters: fragmentReference.variables,
132
+ ...(readerWithRefetchQueries.readerArtifact.hasUpdatable
133
+ ? {
134
+ startUpdate: getOrCreateCachedStartUpdate(
135
+ environment,
136
+ fragmentReference,
137
+ readerWithRefetchQueries.readerArtifact.fieldName,
138
+ ),
139
+ }
140
+ : undefined),
128
141
  };
129
142
 
130
143
  if (
@@ -194,7 +207,7 @@ export function useConnectionSpecPagination<
194
207
 
195
208
  const getFetchMore =
196
209
  (after: string | null) =>
197
- (count: number, fetchOptions?: FetchOptions): void => {
210
+ (count: number, fetchOptions?: FetchOptions<Connection<TItem>>): void => {
198
211
  const loadedField = loadableField(
199
212
  {
200
213
  after: after,
@@ -1,4 +1,4 @@
1
- type UseImperativeLoadableFieldReturn<TArgs> = {
1
+ export type UseImperativeLoadableFieldReturn<TArgs> = {
2
2
  loadField: (args: TArgs) => void;
3
3
  };
4
4
 
@@ -1,27 +1,25 @@
1
+ import {
2
+ UNASSIGNED_STATE,
3
+ useUpdatableDisposableState,
4
+ } from '@isograph/react-disposable-state';
5
+ import { FetchOptions } from '../core/check';
1
6
  import {
2
7
  ExtractParameters,
3
8
  FragmentReference,
4
9
  } from '../core/FragmentReference';
5
- import {
6
- UnassignedState,
7
- useUpdatableDisposableState,
8
- } from '@isograph/react-disposable-state';
9
10
  import { LoadableField } from '../core/reader';
10
- import { FetchOptions } from '../core/check';
11
11
 
12
- type UseImperativeLoadableFieldReturn<
12
+ export type UseImperativeLoadableFieldReturn<
13
13
  TReadFromStore extends { data: object; parameters: object },
14
14
  TResult,
15
15
  TProvidedArgs extends object,
16
16
  > = {
17
- fragmentReference:
18
- | FragmentReference<TReadFromStore, TResult>
19
- | UnassignedState;
17
+ fragmentReference: FragmentReference<TReadFromStore, TResult> | null;
20
18
  loadField: (
21
19
  // TODO this should be void iff all args are provided by the query, like in
22
20
  // useClientSideDefer.
23
21
  args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs> | void,
24
- fetchOptions?: FetchOptions,
22
+ fetchOptions?: FetchOptions<TResult>,
25
23
  ) => void;
26
24
  };
27
25
 
@@ -42,11 +40,11 @@ export function useImperativeLoadableField<
42
40
  return {
43
41
  loadField: (
44
42
  args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs> | void,
45
- fetchOptions?: FetchOptions,
43
+ fetchOptions?: FetchOptions<TResult>,
46
44
  ) => {
47
45
  const [_id, loader] = loadableField(args, fetchOptions ?? {});
48
46
  setState(loader());
49
47
  },
50
- fragmentReference: state,
48
+ fragmentReference: state !== UNASSIGNED_STATE ? state : null,
51
49
  };
52
50
  }
@@ -1,11 +1,4 @@
1
- import { LoadableField, type ReaderAst } from '../core/reader';
2
- import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
3
1
  import { ItemCleanupPair } from '@isograph/disposable-types';
4
- import { FragmentReference } from '../core/FragmentReference';
5
- import { maybeUnwrapNetworkRequest } from '../react/useResult';
6
- import { readButDoNotEvaluate } from '../core/read';
7
- import { subscribeToAnyChange } from '../core/cache';
8
- import { useState } from 'react';
9
2
  import {
10
3
  UNASSIGNED_STATE,
11
4
  useUpdatableDisposableState,
@@ -14,18 +7,34 @@ import {
14
7
  createReferenceCountedPointer,
15
8
  ReferenceCountedPointer,
16
9
  } from '@isograph/reference-counted-pointer';
10
+ import { useState } from 'react';
11
+ import { subscribeToAnyChange } from '../core/cache';
12
+ import { FetchOptions } from '../core/check';
13
+ import {
14
+ FragmentReference,
15
+ type UnknownTReadFromStore,
16
+ } from '../core/FragmentReference';
17
17
  import { getPromiseState, readPromise } from '../core/PromiseWrapper';
18
- import { type WithEncounteredRecords } from '../core/read';
18
+ import {
19
+ readButDoNotEvaluate,
20
+ type WithEncounteredRecords,
21
+ } from '../core/read';
22
+ import { LoadableField, type ReaderAst } from '../core/reader';
23
+ import { getOrCreateCachedStartUpdate } from '../core/startUpdate';
24
+ import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
19
25
  import { useSubscribeToMultiple } from '../react/useReadAndSubscribe';
20
- import { FetchOptions } from '../core/check';
26
+ import { maybeUnwrapNetworkRequest } from '../react/useResult';
21
27
 
22
- type UseSkipLimitReturnValue<
23
- TReadFromStore extends { data: object; parameters: object },
28
+ export type UseSkipLimitReturnValue<
29
+ TReadFromStore extends UnknownTReadFromStore,
24
30
  TItem,
25
31
  > =
26
32
  | {
27
33
  readonly kind: 'Complete';
28
- readonly fetchMore: (count: number, fetchOptions?: FetchOptions) => void;
34
+ readonly fetchMore: (
35
+ count: number,
36
+ fetchOptions?: FetchOptions<ReadonlyArray<TItem>>,
37
+ ) => void;
29
38
  readonly results: ReadonlyArray<TItem>;
30
39
  }
31
40
  | {
@@ -38,7 +47,7 @@ type UseSkipLimitReturnValue<
38
47
  };
39
48
 
40
49
  type ArrayFragmentReference<
41
- TReadFromStore extends { parameters: object; data: object },
50
+ TReadFromStore extends UnknownTReadFromStore,
42
51
  TItem,
43
52
  > = FragmentReference<TReadFromStore, ReadonlyArray<TItem>>;
44
53
 
@@ -64,17 +73,14 @@ function flatten<T>(arr: ReadonlyArray<ReadonlyArray<T>>): ReadonlyArray<T> {
64
73
  return outArray;
65
74
  }
66
75
 
67
- type UseSkipLimitPaginationArgs = {
76
+ export type UseSkipLimitPaginationArgs = {
68
77
  skip: number;
69
78
  limit: number;
70
79
  };
71
80
 
72
81
  export function useSkipLimitPagination<
73
82
  TItem,
74
- TReadFromStore extends {
75
- parameters: object;
76
- data: object;
77
- },
83
+ TReadFromStore extends UnknownTReadFromStore,
78
84
  >(
79
85
  loadableField: LoadableField<
80
86
  TReadFromStore,
@@ -117,6 +123,15 @@ export function useSkipLimitPagination<
117
123
  const firstParameter = {
118
124
  data,
119
125
  parameters: fragmentReference.variables,
126
+ ...(readerWithRefetchQueries.readerArtifact.hasUpdatable
127
+ ? {
128
+ startUpdate: getOrCreateCachedStartUpdate(
129
+ environment,
130
+ fragmentReference,
131
+ readerWithRefetchQueries.readerArtifact.kind,
132
+ ),
133
+ }
134
+ : undefined),
120
135
  };
121
136
 
122
137
  if (
@@ -179,7 +194,10 @@ export function useSkipLimitPagination<
179
194
 
180
195
  const getFetchMore =
181
196
  (loadedSoFar: number) =>
182
- (count: number, fetchOptions?: FetchOptions): void => {
197
+ (
198
+ count: number,
199
+ fetchOptions?: FetchOptions<ReadonlyArray<TItem>>,
200
+ ): void => {
183
201
  const loadedField = loadableField(
184
202
  {
185
203
  skip: loadedSoFar,