@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,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,16 @@ 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
+ networkRequestOptions,
139
+ ),
140
+ }
141
+ : undefined),
128
142
  };
129
143
 
130
144
  if (
@@ -194,7 +208,7 @@ export function useConnectionSpecPagination<
194
208
 
195
209
  const getFetchMore =
196
210
  (after: string | null) =>
197
- (count: number, fetchOptions?: FetchOptions): void => {
211
+ (count: number, fetchOptions?: FetchOptions<Connection<TItem>>): void => {
198
212
  const loadedField = loadableField(
199
213
  {
200
214
  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,16 @@ 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
+ networkRequestOptions,
133
+ ),
134
+ }
135
+ : undefined),
120
136
  };
121
137
 
122
138
  if (
@@ -179,7 +195,10 @@ export function useSkipLimitPagination<
179
195
 
180
196
  const getFetchMore =
181
197
  (loadedSoFar: number) =>
182
- (count: number, fetchOptions?: FetchOptions): void => {
198
+ (
199
+ count: number,
200
+ fetchOptions?: FetchOptions<ReadonlyArray<TItem>>,
201
+ ): void => {
183
202
  const loadedField = loadableField(
184
203
  {
185
204
  skip: loadedSoFar,
@@ -1,43 +1,27 @@
1
- import * as React from 'react';
2
- import { ExtractReadFromStore, IsographEntrypoint } from '../core/entrypoint';
3
- import { FragmentReference } from '../core/FragmentReference';
1
+ import {
2
+ type ExtractReadFromStore,
3
+ type IsographEntrypoint,
4
+ } from '../core/entrypoint';
5
+ import { type FragmentReference } from '../core/FragmentReference';
6
+ import { type NetworkRequestReaderOptions } from '../core/read';
4
7
  import { useResult } from './useResult';
5
- import { NetworkRequestReaderOptions } from '../core/read';
6
-
7
- type IsExactlyIntrinsicAttributes<T> = T extends JSX.IntrinsicAttributes
8
- ? JSX.IntrinsicAttributes extends T
9
- ? true
10
- : false
11
- : false;
12
8
 
13
9
  export function FragmentReader<
14
- TProps extends Record<any, any>,
15
- TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>>,
16
- >(
17
- props: IsExactlyIntrinsicAttributes<TProps> extends true
18
- ? {
19
- fragmentReference: FragmentReference<
20
- ExtractReadFromStore<TEntrypoint>,
21
- React.FC<TProps>
22
- >;
23
- additionalProps?: Record<PropertyKey, never>;
24
- networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
25
- }
26
- : {
27
- fragmentReference: FragmentReference<
28
- ExtractReadFromStore<TEntrypoint>,
29
- React.FC<TProps>
30
- >;
31
- additionalProps: Omit<TProps, keyof JSX.IntrinsicAttributes>;
32
- networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
33
- },
34
- ): React.ReactNode {
35
- const Component = useResult(
36
- props.fragmentReference,
37
- props.networkRequestOptions,
38
- );
39
- // TypeScript is not understanding that if additionalProps is Record<PropertyKey, never>,
40
- // it means that TProps === JSX.IntrinsicAttributes.
41
- // @ts-expect-error
42
- return <Component {...props.additionalProps} />;
10
+ TResult,
11
+ TEntrypoint extends IsographEntrypoint<any, TResult, any>,
12
+ TChildrenResult,
13
+ >({
14
+ fragmentReference,
15
+ networkRequestOptions,
16
+ children,
17
+ }: {
18
+ fragmentReference: FragmentReference<
19
+ ExtractReadFromStore<TEntrypoint>,
20
+ TResult
21
+ >;
22
+ networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
23
+ children: (data: TResult) => TChildrenResult;
24
+ }): TChildrenResult {
25
+ const result = useResult(fragmentReference, networkRequestOptions);
26
+ return children(result);
43
27
  }
@@ -0,0 +1,46 @@
1
+ import * as React from 'react';
2
+ import {
3
+ type ExtractReadFromStore,
4
+ type IsographEntrypoint,
5
+ } from '../core/entrypoint';
6
+ import { type FragmentReference } from '../core/FragmentReference';
7
+ import { type NetworkRequestReaderOptions } from '../core/read';
8
+ import { useResult } from './useResult';
9
+
10
+ export type IsExactlyIntrinsicAttributes<T> = T extends JSX.IntrinsicAttributes
11
+ ? JSX.IntrinsicAttributes extends T
12
+ ? true
13
+ : false
14
+ : false;
15
+
16
+ export function FragmentRenderer<
17
+ TProps extends Record<any, any>,
18
+ TEntrypoint extends IsographEntrypoint<any, React.FC<TProps>, any>,
19
+ >(
20
+ props: IsExactlyIntrinsicAttributes<TProps> extends true
21
+ ? {
22
+ fragmentReference: FragmentReference<
23
+ ExtractReadFromStore<TEntrypoint>,
24
+ React.FC<TProps>
25
+ >;
26
+ additionalProps?: Record<PropertyKey, never>;
27
+ networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
28
+ }
29
+ : {
30
+ fragmentReference: FragmentReference<
31
+ ExtractReadFromStore<TEntrypoint>,
32
+ React.FC<TProps>
33
+ >;
34
+ additionalProps: Omit<TProps, keyof JSX.IntrinsicAttributes>;
35
+ networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
36
+ },
37
+ ): React.ReactNode {
38
+ const Component = useResult(
39
+ props.fragmentReference,
40
+ props.networkRequestOptions,
41
+ );
42
+ // TypeScript is not understanding that if additionalProps is Record<PropertyKey, never>,
43
+ // it means that TProps === JSX.IntrinsicAttributes.
44
+ // @ts-expect-error
45
+ return <Component {...props.additionalProps} />;
46
+ }
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { ReactNode, createContext, useContext } from 'react';
2
+ import { createContext, ReactNode, useContext } from 'react';
3
3
  import { type IsographEnvironment } from '../core/IsographEnvironment';
4
4
 
5
5
  export const IsographEnvironmentContext =
@@ -0,0 +1,40 @@
1
+ import { type FetchOptions } from '../core/check';
2
+ import {
3
+ ExtractParameters,
4
+ type UnknownTReadFromStore,
5
+ } from '../core/FragmentReference';
6
+ import { type NetworkRequestReaderOptions } from '../core/read';
7
+ import { type LoadableField } from '../core/reader';
8
+ import { useClientSideDefer } from '../loadable-hooks/useClientSideDefer';
9
+ import { useResult } from './useResult';
10
+
11
+ export function LoadableFieldReader<
12
+ TReadFromStore extends UnknownTReadFromStore,
13
+ TResult,
14
+ TProvidedArgs extends object,
15
+ TChildrenResult,
16
+ >(props: {
17
+ loadableField: LoadableField<
18
+ TReadFromStore,
19
+ TResult,
20
+ Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>
21
+ >;
22
+ // TODO we can improve this to not require args if its an empty object
23
+ args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>;
24
+ fetchOptions?: FetchOptions<TResult>;
25
+ networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
26
+ children: (arg: TResult) => TChildrenResult;
27
+ }): TChildrenResult {
28
+ const { fragmentReference } = useClientSideDefer(
29
+ props.loadableField,
30
+ props.args,
31
+ props.fetchOptions,
32
+ );
33
+
34
+ const readOutFragmentData = useResult(
35
+ fragmentReference,
36
+ props.networkRequestOptions,
37
+ );
38
+
39
+ return props.children(readOutFragmentData);
40
+ }
@@ -0,0 +1,41 @@
1
+ import * as React from 'react';
2
+ import { type FetchOptions } from '../core/check';
3
+ import {
4
+ ExtractParameters,
5
+ type UnknownTReadFromStore,
6
+ } from '../core/FragmentReference';
7
+ import { type NetworkRequestReaderOptions } from '../core/read';
8
+ import { type LoadableField } from '../core/reader';
9
+ import { useClientSideDefer } from '../loadable-hooks/useClientSideDefer';
10
+ import { useResult } from './useResult';
11
+
12
+ export function LoadableFieldRenderer<
13
+ TReadFromStore extends UnknownTReadFromStore,
14
+ TProvidedArgs extends object,
15
+ TChildrenResult,
16
+ TProps,
17
+ >(props: {
18
+ loadableField: LoadableField<
19
+ TReadFromStore,
20
+ React.FC<TProps>,
21
+ Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>
22
+ >;
23
+ // TODO we can improve this to not require args if its an empty object
24
+ args: Omit<ExtractParameters<TReadFromStore>, keyof TProvidedArgs>;
25
+ fetchOptions?: FetchOptions<React.FC<TProps>>;
26
+ networkRequestOptions?: Partial<NetworkRequestReaderOptions>;
27
+ additionalProps: Omit<TProps, keyof JSX.IntrinsicAttributes>;
28
+ }): TChildrenResult {
29
+ const { fragmentReference } = useClientSideDefer(
30
+ props.loadableField,
31
+ props.args,
32
+ props.fetchOptions,
33
+ );
34
+
35
+ const Component = useResult(fragmentReference, props.networkRequestOptions);
36
+
37
+ // TODO we probably can figure out a way to convince TypeScript of
38
+ // the validity of this.
39
+ // @ts-expect-error
40
+ return <Component {...props.additionalProps} />;
41
+ }
@@ -1,60 +1,82 @@
1
1
  import {
2
- UnassignedState,
2
+ UNASSIGNED_STATE,
3
3
  useUpdatableDisposableState,
4
4
  } from '@isograph/react-disposable-state';
5
- import { IsographEntrypoint } from '../core/entrypoint';
5
+ import { FetchOptions, type RequiredFetchOptions } from '../core/check';
6
+ import {
7
+ IsographEntrypoint,
8
+ type NormalizationAst,
9
+ type NormalizationAstLoader,
10
+ } from '../core/entrypoint';
6
11
  import {
7
- FragmentReference,
8
12
  ExtractParameters,
13
+ FragmentReference,
14
+ type UnknownTReadFromStore,
9
15
  } from '../core/FragmentReference';
10
- import { useIsographEnvironment } from './IsographEnvironmentProvider';
11
16
  import { ROOT_ID } from '../core/IsographEnvironment';
12
17
  import { maybeMakeNetworkRequest } from '../core/makeNetworkRequest';
13
- import { wrapResolvedValue } from '../core/PromiseWrapper';
14
- import { FetchOptions } from '../core/check';
15
-
16
- // TODO rename this to useImperativelyLoadedEntrypoint
18
+ import { wrapPromise, wrapResolvedValue } from '../core/PromiseWrapper';
19
+ import { useIsographEnvironment } from './IsographEnvironmentProvider';
17
20
 
18
- export function useImperativeReference<
19
- TReadFromStore extends { parameters: object; data: object },
21
+ export type UseImperativeReferenceResult<
22
+ TReadFromStore extends UnknownTReadFromStore,
20
23
  TClientFieldValue,
21
- >(
22
- entrypoint: IsographEntrypoint<TReadFromStore, TClientFieldValue>,
23
- ): {
24
- fragmentReference:
25
- | FragmentReference<TReadFromStore, TClientFieldValue>
26
- | UnassignedState;
24
+ TNormalizationAst extends NormalizationAst | NormalizationAstLoader,
25
+ > = {
26
+ fragmentReference: FragmentReference<
27
+ TReadFromStore,
28
+ TClientFieldValue
29
+ > | null;
27
30
  loadFragmentReference: (
28
31
  variables: ExtractParameters<TReadFromStore>,
29
- fetchOptions?: FetchOptions,
32
+ ...[fetchOptions]: NormalizationAstLoader extends TNormalizationAst
33
+ ? [fetchOptions: RequiredFetchOptions<TClientFieldValue>]
34
+ : [fetchOptions?: FetchOptions<TClientFieldValue>]
30
35
  ) => void;
31
- } {
36
+ };
37
+
38
+ export function useImperativeReference<
39
+ TReadFromStore extends UnknownTReadFromStore,
40
+ TClientFieldValue,
41
+ TNormalizationAst extends NormalizationAst | NormalizationAstLoader,
42
+ >(
43
+ entrypoint: IsographEntrypoint<
44
+ TReadFromStore,
45
+ TClientFieldValue,
46
+ TNormalizationAst
47
+ >,
48
+ ): UseImperativeReferenceResult<
49
+ TReadFromStore,
50
+ TClientFieldValue,
51
+ TNormalizationAst
52
+ > {
32
53
  const { state, setState } =
33
54
  useUpdatableDisposableState<
34
55
  FragmentReference<TReadFromStore, TClientFieldValue>
35
56
  >();
36
57
  const environment = useIsographEnvironment();
37
58
  return {
38
- fragmentReference: state,
59
+ fragmentReference: state !== UNASSIGNED_STATE ? state : null,
39
60
  loadFragmentReference: (
40
61
  variables: ExtractParameters<TReadFromStore>,
41
- fetchOptions?: FetchOptions,
62
+ fetchOptions?: FetchOptions<TClientFieldValue>,
42
63
  ) => {
64
+ const readerWithRefetchQueries =
65
+ entrypoint.readerWithRefetchQueries.kind ===
66
+ 'ReaderWithRefetchQueriesLoader'
67
+ ? wrapPromise(entrypoint.readerWithRefetchQueries.loader())
68
+ : wrapResolvedValue(entrypoint.readerWithRefetchQueries);
43
69
  const [networkRequest, disposeNetworkRequest] = maybeMakeNetworkRequest(
44
70
  environment,
45
71
  entrypoint,
46
72
  variables,
47
- fetchOptions,
73
+ readerWithRefetchQueries,
74
+ fetchOptions ?? null,
48
75
  );
49
76
  setState([
50
77
  {
51
78
  kind: 'FragmentReference',
52
- readerWithRefetchQueries: wrapResolvedValue({
53
- kind: 'ReaderWithRefetchQueries',
54
- readerArtifact: entrypoint.readerWithRefetchQueries.readerArtifact,
55
- nestedRefetchQueries:
56
- entrypoint.readerWithRefetchQueries.nestedRefetchQueries,
57
- }),
79
+ readerWithRefetchQueries,
58
80
  root: { __link: ROOT_ID, __typename: entrypoint.concreteType },
59
81
  variables,
60
82
  networkRequest,