@isograph/react 0.2.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 (151) hide show
  1. package/.turbo/turbo-compile-typescript.log +4 -0
  2. package/dist/core/FragmentReference.d.ts +25 -6
  3. package/dist/core/FragmentReference.d.ts.map +1 -0
  4. package/dist/core/FragmentReference.js +3 -13
  5. package/dist/core/IsographEnvironment.d.ts +34 -26
  6. package/dist/core/IsographEnvironment.d.ts.map +1 -0
  7. package/dist/core/IsographEnvironment.js +19 -22
  8. package/dist/core/PromiseWrapper.d.ts +4 -4
  9. package/dist/core/PromiseWrapper.d.ts.map +1 -0
  10. package/dist/core/PromiseWrapper.js +9 -9
  11. package/dist/core/areEqualWithDeepComparison.d.ts +5 -3
  12. package/dist/core/areEqualWithDeepComparison.d.ts.map +1 -0
  13. package/dist/core/areEqualWithDeepComparison.js +89 -39
  14. package/dist/core/cache.d.ts +20 -13
  15. package/dist/core/cache.d.ts.map +1 -0
  16. package/dist/core/cache.js +205 -128
  17. package/dist/core/check.d.ts +22 -0
  18. package/dist/core/check.d.ts.map +1 -0
  19. package/dist/core/check.js +127 -0
  20. package/dist/core/componentCache.d.ts +2 -2
  21. package/dist/core/componentCache.d.ts.map +1 -0
  22. package/dist/core/componentCache.js +28 -32
  23. package/dist/core/entrypoint.d.ts +31 -15
  24. package/dist/core/entrypoint.d.ts.map +1 -0
  25. package/dist/core/entrypoint.js +1 -2
  26. package/dist/core/garbageCollection.d.ts +6 -5
  27. package/dist/core/garbageCollection.d.ts.map +1 -0
  28. package/dist/core/garbageCollection.js +49 -16
  29. package/dist/core/logging.d.ts +68 -0
  30. package/dist/core/logging.d.ts.map +1 -0
  31. package/dist/core/logging.js +22 -0
  32. package/dist/core/makeNetworkRequest.d.ts +6 -3
  33. package/dist/core/makeNetworkRequest.d.ts.map +1 -0
  34. package/dist/core/makeNetworkRequest.js +160 -19
  35. package/dist/core/read.d.ts +25 -5
  36. package/dist/core/read.d.ts.map +1 -0
  37. package/dist/core/read.js +416 -259
  38. package/dist/core/reader.d.ts +31 -15
  39. package/dist/core/reader.d.ts.map +1 -0
  40. package/dist/core/startUpdate.d.ts +5 -0
  41. package/dist/core/startUpdate.d.ts.map +1 -0
  42. package/dist/core/startUpdate.js +15 -0
  43. package/dist/core/util.d.ts +5 -0
  44. package/dist/core/util.d.ts.map +1 -0
  45. package/dist/index.d.ts +19 -14
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +11 -2
  48. package/dist/loadable-hooks/useClientSideDefer.d.ts +9 -3
  49. package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -0
  50. package/dist/loadable-hooks/useClientSideDefer.js +6 -8
  51. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +27 -0
  52. package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -0
  53. package/dist/loadable-hooks/useConnectionSpecPagination.js +162 -0
  54. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +2 -2
  55. package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -0
  56. package/dist/loadable-hooks/useImperativeExposedMutationField.js +1 -2
  57. package/dist/loadable-hooks/useImperativeLoadableField.d.ts +13 -7
  58. package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -0
  59. package/dist/loadable-hooks/useImperativeLoadableField.js +4 -5
  60. package/dist/loadable-hooks/useSkipLimitPagination.d.ts +13 -26
  61. package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -0
  62. package/dist/loadable-hooks/useSkipLimitPagination.js +93 -47
  63. package/dist/react/FragmentReader.d.ts +6 -4
  64. package/dist/react/FragmentReader.d.ts.map +1 -0
  65. package/dist/react/FragmentReader.js +4 -2
  66. package/dist/react/IsographEnvironmentProvider.d.ts +1 -0
  67. package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -0
  68. package/dist/react/IsographEnvironmentProvider.js +3 -3
  69. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts +10 -0
  70. package/dist/react/RenderAfterCommit__DO_NOT_USE.d.ts.map +1 -0
  71. package/dist/react/RenderAfterCommit__DO_NOT_USE.js +15 -0
  72. package/dist/react/useImperativeReference.d.ts +8 -6
  73. package/dist/react/useImperativeReference.d.ts.map +1 -0
  74. package/dist/react/useImperativeReference.js +6 -8
  75. package/dist/react/useLazyReference.d.ts +5 -3
  76. package/dist/react/useLazyReference.d.ts.map +1 -0
  77. package/dist/react/useLazyReference.js +34 -6
  78. package/dist/react/useReadAndSubscribe.d.ts +6 -3
  79. package/dist/react/useReadAndSubscribe.d.ts.map +1 -0
  80. package/dist/react/useReadAndSubscribe.js +13 -10
  81. package/dist/react/useRerenderOnChange.d.ts +7 -2
  82. package/dist/react/useRerenderOnChange.d.ts.map +1 -0
  83. package/dist/react/useRerenderOnChange.js +3 -4
  84. package/dist/react/useResult.d.ts +4 -3
  85. package/dist/react/useResult.d.ts.map +1 -0
  86. package/dist/react/useResult.js +14 -9
  87. package/isograph.config.json +8 -0
  88. package/package.json +14 -9
  89. package/{src/tests/schema.graphql → schema.graphql} +1 -0
  90. package/src/core/FragmentReference.ts +44 -17
  91. package/src/core/IsographEnvironment.ts +67 -50
  92. package/src/core/PromiseWrapper.ts +3 -3
  93. package/src/core/areEqualWithDeepComparison.ts +95 -41
  94. package/src/core/cache.ts +316 -169
  95. package/src/core/check.ts +212 -0
  96. package/src/core/componentCache.ts +40 -46
  97. package/src/core/entrypoint.ts +41 -16
  98. package/src/core/garbageCollection.ts +77 -26
  99. package/src/core/logging.ts +118 -0
  100. package/src/core/makeNetworkRequest.ts +249 -20
  101. package/src/core/read.ts +658 -368
  102. package/src/core/reader.ts +61 -21
  103. package/src/core/startUpdate.ts +28 -0
  104. package/src/core/util.ts +8 -0
  105. package/src/index.ts +94 -8
  106. package/src/loadable-hooks/useClientSideDefer.ts +48 -17
  107. package/src/loadable-hooks/useConnectionSpecPagination.ts +344 -0
  108. package/src/loadable-hooks/useImperativeExposedMutationField.ts +1 -1
  109. package/src/loadable-hooks/useImperativeLoadableField.ts +36 -12
  110. package/src/loadable-hooks/useSkipLimitPagination.ts +253 -94
  111. package/src/react/FragmentReader.tsx +15 -6
  112. package/src/react/IsographEnvironmentProvider.tsx +1 -1
  113. package/src/react/RenderAfterCommit__DO_NOT_USE.tsx +17 -0
  114. package/src/react/useImperativeReference.ts +50 -18
  115. package/src/react/useLazyReference.ts +79 -11
  116. package/src/react/useReadAndSubscribe.ts +33 -10
  117. package/src/react/useRerenderOnChange.ts +7 -2
  118. package/src/react/useResult.ts +30 -9
  119. package/src/tests/__isograph/Query/meName/entrypoint.ts +10 -29
  120. package/src/tests/__isograph/Query/meName/normalization_ast.ts +25 -0
  121. package/src/tests/__isograph/Query/meName/param_type.ts +5 -2
  122. package/src/tests/__isograph/Query/meName/query_text.ts +6 -0
  123. package/src/tests/__isograph/Query/meName/resolver_reader.ts +5 -0
  124. package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +10 -65
  125. package/src/tests/__isograph/Query/meNameSuccessor/normalization_ast.ts +56 -0
  126. package/src/tests/__isograph/Query/meNameSuccessor/param_type.ts +9 -6
  127. package/src/tests/__isograph/Query/meNameSuccessor/query_text.ts +13 -0
  128. package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +10 -0
  129. package/src/tests/__isograph/Query/nodeField/entrypoint.ts +10 -28
  130. package/src/tests/__isograph/Query/nodeField/normalization_ast.ts +30 -0
  131. package/src/tests/__isograph/Query/nodeField/param_type.ts +7 -3
  132. package/src/tests/__isograph/Query/nodeField/parameters_type.ts +3 -0
  133. package/src/tests/__isograph/Query/nodeField/query_text.ts +6 -0
  134. package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +5 -0
  135. package/src/tests/__isograph/Query/subquery/entrypoint.ts +28 -0
  136. package/src/tests/__isograph/Query/subquery/normalization_ast.ts +38 -0
  137. package/src/tests/__isograph/Query/subquery/output_type.ts +3 -0
  138. package/src/tests/__isograph/Query/subquery/param_type.ts +12 -0
  139. package/src/tests/__isograph/Query/subquery/parameters_type.ts +3 -0
  140. package/src/tests/__isograph/Query/subquery/query_text.ts +8 -0
  141. package/src/tests/__isograph/Query/subquery/resolver_reader.ts +52 -0
  142. package/src/tests/__isograph/iso.ts +24 -12
  143. package/src/tests/garbageCollection.test.ts +53 -45
  144. package/src/tests/meNameSuccessor.ts +8 -3
  145. package/src/tests/nodeQuery.ts +7 -4
  146. package/src/tests/normalizeData.test.ts +120 -0
  147. package/src/tests/tsconfig.json +3 -3
  148. package/tsconfig.json +2 -2
  149. package/tsconfig.pkg.json +7 -3
  150. package/vitest.config.ts +20 -0
  151. package/src/tests/isograph.config.json +0 -7
@@ -1,48 +1,66 @@
1
1
  import { Factory } from '@isograph/disposable-types';
2
- import { FragmentReference } from './FragmentReference';
3
- import {
4
- ComponentOrFieldName,
5
- DataId,
6
- IsographEnvironment,
7
- } from './IsographEnvironment';
2
+ import { FetchOptions } from './check';
8
3
  import {
9
4
  IsographEntrypoint,
10
5
  IsographEntrypointLoader,
11
6
  RefetchQueryNormalizationArtifact,
12
7
  RefetchQueryNormalizationArtifactWrapper,
13
8
  } from './entrypoint';
9
+ import {
10
+ ExtractParameters,
11
+ FragmentReference,
12
+ type UnknownTReadFromStore,
13
+ } from './FragmentReference';
14
+ import {
15
+ ComponentOrFieldName,
16
+ IsographEnvironment,
17
+ type Link,
18
+ } from './IsographEnvironment';
14
19
  import { Arguments } from './util';
15
20
 
16
21
  export type TopLevelReaderArtifact<
17
- TReadFromStore extends Object,
22
+ TReadFromStore extends UnknownTReadFromStore,
18
23
  TClientFieldValue,
19
- TComponentProps extends Record<string, never>,
24
+ TComponentProps extends Record<PropertyKey, never>,
20
25
  > =
21
26
  | EagerReaderArtifact<TReadFromStore, TClientFieldValue>
22
27
  | ComponentReaderArtifact<TReadFromStore, TComponentProps>;
23
28
 
24
29
  export type EagerReaderArtifact<
25
- TReadFromStore extends Object,
30
+ TReadFromStore extends UnknownTReadFromStore,
26
31
  TClientFieldValue,
27
32
  > = {
28
33
  readonly kind: 'EagerReaderArtifact';
34
+ readonly fieldName: string;
29
35
  readonly readerAst: ReaderAst<TReadFromStore>;
30
- readonly resolver: (data: TReadFromStore) => TClientFieldValue;
36
+ readonly resolver: (
37
+ data: ResolverFirstParameter<TReadFromStore>,
38
+ ) => TClientFieldValue;
39
+ readonly hasUpdatable: boolean;
31
40
  };
32
41
 
33
42
  export type ComponentReaderArtifact<
34
- TReadFromStore extends Object,
35
- TComponentProps extends Record<string, unknown> = Record<string, never>,
43
+ TReadFromStore extends UnknownTReadFromStore,
44
+ TComponentProps extends Record<string, unknown> = Record<PropertyKey, never>,
36
45
  > = {
37
46
  readonly kind: 'ComponentReaderArtifact';
38
- readonly componentName: ComponentOrFieldName;
47
+ readonly fieldName: ComponentOrFieldName;
39
48
  readonly readerAst: ReaderAst<TReadFromStore>;
40
49
  readonly resolver: (
41
- data: TReadFromStore,
50
+ data: ResolverFirstParameter<TReadFromStore>,
42
51
  runtimeProps: TComponentProps,
43
52
  ) => React.ReactNode;
53
+ readonly hasUpdatable: boolean;
44
54
  };
45
55
 
56
+ export type ResolverFirstParameter<
57
+ TReadFromStore extends UnknownTReadFromStore,
58
+ > = Pick<TReadFromStore, 'data' | 'parameters' | 'startUpdate'>;
59
+
60
+ export type StartUpdate<UpdatableData> = (
61
+ updater: (updatableData: UpdatableData) => void,
62
+ ) => void;
63
+
46
64
  export type RefetchReaderArtifact = {
47
65
  readonly kind: 'RefetchReaderArtifact';
48
66
  readonly readerAst: ReaderAst<unknown>;
@@ -53,7 +71,7 @@ export type RefetchReaderArtifact = {
53
71
  variables: any,
54
72
  // TODO type this better
55
73
  filteredVariables: any,
56
- rootId: DataId,
74
+ rootLink: Link,
57
75
  readerArtifact: TopLevelReaderArtifact<any, any, any> | null,
58
76
  // TODO type this better
59
77
  nestedRefetchQueries: RefetchQueryNormalizationArtifactWrapper[],
@@ -65,7 +83,8 @@ export type ReaderAstNode =
65
83
  | ReaderLinkedField
66
84
  | ReaderNonLoadableResolverField
67
85
  | ReaderImperativelyLoadedField
68
- | ReaderLoadableField;
86
+ | ReaderLoadableField
87
+ | ReaderLinkField;
69
88
 
70
89
  // @ts-ignore
71
90
  export type ReaderAst<TReadFromStore> = ReadonlyArray<ReaderAstNode>;
@@ -75,13 +94,25 @@ export type ReaderScalarField = {
75
94
  readonly fieldName: string;
76
95
  readonly alias: string | null;
77
96
  readonly arguments: Arguments | null;
97
+ readonly isUpdatable: boolean;
78
98
  };
99
+
100
+ export type ReaderLinkField = {
101
+ readonly kind: 'Link';
102
+ readonly alias: string;
103
+ };
104
+
79
105
  export type ReaderLinkedField = {
80
106
  readonly kind: 'Linked';
81
107
  readonly fieldName: string;
82
108
  readonly alias: string | null;
83
109
  readonly selections: ReaderAst<unknown>;
84
110
  readonly arguments: Arguments | null;
111
+ readonly condition: EagerReaderArtifact<
112
+ { data: object; parameters: any; startUpdate?: StartUpdate<object> },
113
+ boolean | Link | null
114
+ > | null;
115
+ readonly isUpdatable: boolean;
85
116
  };
86
117
 
87
118
  export type ReaderNonLoadableResolverField = {
@@ -114,11 +145,11 @@ export type ReaderLoadableField = {
114
145
 
115
146
  // TODO we should not type these as any
116
147
  readonly entrypoint:
117
- | IsographEntrypoint<any, any>
148
+ | IsographEntrypoint<any, any, any>
118
149
  | IsographEntrypointLoader<any, any>;
119
150
  };
120
151
 
121
- type StableId = string;
152
+ export type StableId = string;
122
153
  /// Why is LoadableField the way it is? Let's work backwards.
123
154
  ///
124
155
  /// We ultimately need a stable id (for deduplication) and a way to produce a
@@ -128,6 +159,15 @@ type StableId = string;
128
159
  /// Passing TArgs to the LoadableField should be cheap and do no "actual" work,
129
160
  /// except to stringify the args or whatnot. Calling the factory can be
130
161
  /// expensive. For example, doing so will probably trigger a network request.
131
- export type LoadableField<TArgs, TResult> = (
132
- args: TArgs,
133
- ) => [StableId, Factory<FragmentReference<any, TResult>>];
162
+ export type LoadableField<
163
+ TReadFromStore extends UnknownTReadFromStore,
164
+ TResult,
165
+ TArgs = ExtractParameters<TReadFromStore>,
166
+ > = (
167
+ args: TArgs | void,
168
+ // Note: fetchOptions is not nullable here because a LoadableField is not a
169
+ // user-facing API. Users should only interact with LoadableFields via APIs
170
+ // like useClientSideDefer. These APIs should have a nullable fetchOptions
171
+ // parameter, and provide a default value ({}) to the LoadableField.
172
+ fetchOptions: FetchOptions<TResult>,
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
@@ -1,5 +1,9 @@
1
1
  export type ExtractSecondParam<T extends (arg1: any, arg2: any) => any> =
2
2
  T extends (arg1: any, arg2: infer P) => any ? P : never;
3
+ export type CombineWithIntrinsicAttributes<T> =
4
+ T extends Record<PropertyKey, never>
5
+ ? JSX.IntrinsicAttributes
6
+ : T & JSX.IntrinsicAttributes;
3
7
 
4
8
  export type Arguments = Argument[];
5
9
  export type Argument = [ArgumentName, ArgumentValue];
@@ -20,4 +24,8 @@ export type ArgumentValue =
20
24
  | {
21
25
  readonly kind: 'Enum';
22
26
  readonly value: string;
27
+ }
28
+ | {
29
+ readonly kind: 'Object';
30
+ readonly value: Arguments;
23
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,11 +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,
27
- defaultMissingFieldHandler,
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,
28
51
  } from './core/IsographEnvironment';
29
52
  export {
30
53
  type EagerReaderArtifact,
@@ -37,10 +60,18 @@ export {
37
60
  type ReaderScalarField,
38
61
  type TopLevelReaderArtifact,
39
62
  type LoadableField,
63
+ type StableId,
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,
@@ -50,10 +81,20 @@ export {
50
81
  type ExtractProps,
51
82
  type ExtractReadFromStore,
52
83
  type ExtractResolverResult,
84
+ type NetworkRequestInfo,
85
+ type NormalizationInlineFragment,
86
+ type ReaderWithRefetchQueries,
87
+ type IsographEntrypointLoader,
53
88
  } from './core/entrypoint';
54
- export { readButDoNotEvaluate } from './core/read';
89
+ export {
90
+ readButDoNotEvaluate,
91
+ type WithEncounteredRecords,
92
+ type NetworkRequestReaderOptions,
93
+ type ReadDataResult,
94
+ } from './core/read';
55
95
  export {
56
96
  type ExtractSecondParam,
97
+ type CombineWithIntrinsicAttributes,
57
98
  type Argument,
58
99
  type ArgumentName,
59
100
  type ArgumentValue,
@@ -62,16 +103,43 @@ export {
62
103
  export {
63
104
  type FragmentReference,
64
105
  type Variables,
106
+ type ExtractParameters,
107
+ type ExtractData,
108
+ type UnknownTReadFromStore,
65
109
  stableIdForFragmentReference,
110
+ type ExtractStartUpdate,
111
+ type VariableValue,
112
+ type StableIdForFragmentReference,
66
113
  } from './core/FragmentReference';
114
+ export {
115
+ type LogMessage,
116
+ type LogFunction,
117
+ type WrappedLogFunction,
118
+ logMessage,
119
+ registerLogger,
120
+ } from './core/logging';
121
+ export {
122
+ check,
123
+ type CheckResult,
124
+ type FetchOptions,
125
+ type RequiredFetchOptions,
126
+ type ShouldFetch,
127
+ type RequiredShouldFetch,
128
+ } from './core/check';
67
129
 
68
130
  export {
69
131
  IsographEnvironmentProvider,
70
132
  useIsographEnvironment,
71
133
  type IsographEnvironmentProviderProps,
72
134
  } from './react/IsographEnvironmentProvider';
73
- export { useImperativeReference } from './react/useImperativeReference';
74
- 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';
75
143
  export { useResult } from './react/useResult';
76
144
  export {
77
145
  useReadAndSubscribe,
@@ -79,8 +147,26 @@ export {
79
147
  } from './react/useReadAndSubscribe';
80
148
  export { useLazyReference } from './react/useLazyReference';
81
149
  export { useRerenderOnChange } from './react/useRerenderOnChange';
150
+ export { RenderAfterCommit__DO_NOT_USE } from './react/RenderAfterCommit__DO_NOT_USE';
82
151
 
83
152
  export { useClientSideDefer } from './loadable-hooks/useClientSideDefer';
84
- export { useImperativeExposedMutationField } from './loadable-hooks/useImperativeExposedMutationField';
85
- export { useSkipLimitPagination } from './loadable-hooks/useSkipLimitPagination';
86
- 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,28 +1,59 @@
1
- import { FragmentReference } from '../core/FragmentReference';
2
- import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
3
- import { getOrCreateItemInSuspenseCache } from '../core/cache';
4
1
  import { useLazyDisposableState } from '@isograph/react-disposable-state';
2
+ import { getOrCreateItemInSuspenseCache } from '../core/cache';
3
+ import { FetchOptions } from '../core/check';
4
+ import {
5
+ ExtractParameters,
6
+ FragmentReference,
7
+ type UnknownTReadFromStore,
8
+ } from '../core/FragmentReference';
5
9
  import { LoadableField } from '../core/reader';
10
+ import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
6
11
 
7
- export function useClientSideDefer<TResult>(
8
- loadableField: LoadableField<void, TResult>,
9
- ): FragmentReference<Record<string, never>, TResult>;
12
+ export function useClientSideDefer<
13
+ TReadFromStore extends UnknownTReadFromStore,
14
+ TResult,
15
+ >(
16
+ loadableField: LoadableField<
17
+ TReadFromStore,
18
+ TResult,
19
+ ExtractParameters<TReadFromStore>
20
+ >,
21
+ args?: Record<PropertyKey, never>,
22
+ fetchOptions?: FetchOptions<TResult>,
23
+ ): { fragmentReference: FragmentReference<TReadFromStore, TResult> };
10
24
 
11
- export function useClientSideDefer<TArgs extends Object, TResult>(
12
- loadableField: LoadableField<TArgs, TResult>,
13
- args: TArgs,
14
- ): FragmentReference<TArgs, TResult>;
25
+ export function useClientSideDefer<
26
+ TReadFromStore extends UnknownTReadFromStore,
27
+ TResult,
28
+ TProvidedArgs extends object,
29
+ >(
30
+ loadableField: LoadableField<
31
+ TReadFromStore,
32
+ TResult,
33
+ Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>
34
+ >,
35
+ args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>,
36
+ fetchOptions?: FetchOptions<TResult>,
37
+ ): { fragmentReference: FragmentReference<TReadFromStore, TResult> };
15
38
 
16
- export function useClientSideDefer<TArgs extends Object, TResult>(
17
- loadableField: LoadableField<TArgs, TResult>,
18
- args?: TArgs,
19
- ): FragmentReference<TArgs, TResult> {
20
- // @ts-expect-error args is missing iff it has the type void
21
- const [id, loader] = loadableField(args);
39
+ export function useClientSideDefer<
40
+ TReadFromStore extends UnknownTReadFromStore,
41
+ TResult,
42
+ TProvidedArgs extends object,
43
+ >(
44
+ loadableField: LoadableField<
45
+ TReadFromStore,
46
+ TResult,
47
+ Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>
48
+ >,
49
+ args?: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>,
50
+ fetchOptions?: FetchOptions<TResult>,
51
+ ): { fragmentReference: FragmentReference<TReadFromStore, TResult> } {
52
+ const [id, loader] = loadableField(args, fetchOptions ?? {});
22
53
  const environment = useIsographEnvironment();
23
54
  const cache = getOrCreateItemInSuspenseCache(environment, id, loader);
24
55
 
25
56
  const fragmentReference = useLazyDisposableState(cache).state;
26
57
 
27
- return fragmentReference;
58
+ return { fragmentReference };
28
59
  }