@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.
- package/.turbo/turbo-compile-libs.log +5 -0
- package/dist/core/FragmentReference.d.ts +17 -8
- package/dist/core/FragmentReference.d.ts.map +1 -1
- package/dist/core/FragmentReference.js +3 -12
- package/dist/core/IsographEnvironment.d.ts +30 -35
- package/dist/core/IsographEnvironment.d.ts.map +1 -1
- package/dist/core/IsographEnvironment.js +4 -0
- package/dist/core/PromiseWrapper.d.ts +6 -7
- package/dist/core/PromiseWrapper.d.ts.map +1 -1
- package/dist/core/PromiseWrapper.js +6 -12
- package/dist/core/areEqualWithDeepComparison.d.ts +1 -3
- package/dist/core/areEqualWithDeepComparison.d.ts.map +1 -1
- package/dist/core/areEqualWithDeepComparison.js +16 -2
- package/dist/core/brand.d.ts +2 -0
- package/dist/core/brand.d.ts.map +1 -0
- package/dist/core/brand.js +2 -0
- package/dist/core/cache.d.ts +16 -24
- package/dist/core/cache.d.ts.map +1 -1
- package/dist/core/cache.js +105 -72
- package/dist/core/check.d.ts +11 -7
- package/dist/core/check.d.ts.map +1 -1
- package/dist/core/check.js +2 -2
- package/dist/core/componentCache.d.ts +1 -1
- package/dist/core/componentCache.d.ts.map +1 -1
- package/dist/core/componentCache.js +27 -31
- package/dist/core/entrypoint.d.ts +43 -28
- package/dist/core/entrypoint.d.ts.map +1 -1
- package/dist/core/garbageCollection.d.ts +5 -6
- package/dist/core/garbageCollection.d.ts.map +1 -1
- package/dist/core/garbageCollection.js +1 -1
- package/dist/core/logging.d.ts +23 -15
- package/dist/core/logging.d.ts.map +1 -1
- package/dist/core/logging.js +8 -5
- package/dist/core/makeNetworkRequest.d.ts +5 -5
- package/dist/core/makeNetworkRequest.d.ts.map +1 -1
- package/dist/core/makeNetworkRequest.js +113 -28
- package/dist/core/read.d.ts +16 -11
- package/dist/core/read.d.ts.map +1 -1
- package/dist/core/read.js +468 -305
- package/dist/core/reader.d.ts +33 -37
- package/dist/core/reader.d.ts.map +1 -1
- package/dist/core/startUpdate.d.ts +8 -0
- package/dist/core/startUpdate.d.ts.map +1 -0
- package/dist/core/startUpdate.js +163 -0
- package/dist/core/util.d.ts +3 -0
- package/dist/core/util.d.ts.map +1 -1
- package/dist/index.d.ts +18 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/loadable-hooks/useClientSideDefer.d.ts +4 -10
- package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
- package/dist/loadable-hooks/useClientSideDefer.js +2 -2
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +8 -15
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
- package/dist/loadable-hooks/useConnectionSpecPagination.js +6 -4
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts +1 -2
- package/dist/loadable-hooks/useImperativeExposedMutationField.d.ts.map +1 -1
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts +4 -6
- package/dist/loadable-hooks/useImperativeLoadableField.d.ts.map +1 -1
- package/dist/loadable-hooks/useImperativeLoadableField.js +1 -1
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts +6 -13
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
- package/dist/loadable-hooks/useSkipLimitPagination.js +11 -9
- package/dist/react/FragmentReader.d.ts +7 -14
- package/dist/react/FragmentReader.d.ts.map +1 -1
- package/dist/react/FragmentReader.js +3 -30
- package/dist/react/FragmentRenderer.d.ts +15 -0
- package/dist/react/FragmentRenderer.d.ts.map +1 -0
- package/dist/react/FragmentRenderer.js +35 -0
- package/dist/react/IsographEnvironmentProvider.d.ts.map +1 -1
- package/dist/react/LoadableFieldReader.d.ts +12 -0
- package/dist/react/LoadableFieldReader.d.ts.map +1 -0
- package/dist/react/LoadableFieldReader.js +10 -0
- package/dist/react/LoadableFieldRenderer.d.ts +13 -0
- package/dist/react/LoadableFieldRenderer.d.ts.map +1 -0
- package/dist/react/LoadableFieldRenderer.js +37 -0
- package/dist/react/useImperativeReference.d.ts +7 -10
- package/dist/react/useImperativeReference.d.ts.map +1 -1
- package/dist/react/useImperativeReference.js +8 -9
- package/dist/react/useLazyReference.d.ts +4 -7
- package/dist/react/useLazyReference.d.ts.map +1 -1
- package/dist/react/useLazyReference.js +26 -5
- package/dist/react/useReadAndSubscribe.d.ts +3 -9
- package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
- package/dist/react/useReadAndSubscribe.js +7 -3
- package/dist/react/useRerenderOnChange.d.ts +1 -1
- package/dist/react/useRerenderOnChange.d.ts.map +1 -1
- package/dist/react/useResult.d.ts +3 -6
- package/dist/react/useResult.d.ts.map +1 -1
- package/dist/react/useResult.js +10 -8
- package/isograph.config.json +1 -0
- package/package.json +6 -6
- package/src/core/FragmentReference.ts +40 -16
- package/src/core/IsographEnvironment.ts +57 -39
- package/src/core/PromiseWrapper.ts +15 -18
- package/src/core/areEqualWithDeepComparison.ts +22 -2
- package/src/core/brand.ts +18 -0
- package/src/core/cache.ts +153 -113
- package/src/core/check.ts +17 -12
- package/src/core/componentCache.ts +47 -50
- package/src/core/entrypoint.ts +66 -21
- package/src/core/garbageCollection.ts +9 -9
- package/src/core/logging.ts +39 -25
- package/src/core/makeNetworkRequest.ts +212 -34
- package/src/core/read.ts +728 -440
- package/src/core/reader.ts +46 -29
- package/src/core/startUpdate.ts +334 -0
- package/src/core/util.ts +4 -0
- package/src/index.ts +89 -8
- package/src/loadable-hooks/useClientSideDefer.ts +11 -10
- package/src/loadable-hooks/useConnectionSpecPagination.ts +27 -13
- package/src/loadable-hooks/useImperativeExposedMutationField.ts +1 -1
- package/src/loadable-hooks/useImperativeLoadableField.ts +10 -12
- package/src/loadable-hooks/useSkipLimitPagination.ts +38 -19
- package/src/react/FragmentReader.tsx +23 -39
- package/src/react/FragmentRenderer.tsx +46 -0
- package/src/react/IsographEnvironmentProvider.tsx +1 -1
- package/src/react/LoadableFieldReader.tsx +40 -0
- package/src/react/LoadableFieldRenderer.tsx +41 -0
- package/src/react/useImperativeReference.ts +49 -27
- package/src/react/useLazyReference.ts +62 -14
- package/src/react/useReadAndSubscribe.ts +17 -9
- package/src/react/useRerenderOnChange.ts +2 -2
- package/src/react/useResult.ts +22 -8
- package/src/tests/__isograph/Economist/link/output_type.ts +2 -0
- package/src/tests/__isograph/Node/asEconomist/resolver_reader.ts +28 -0
- package/src/tests/__isograph/Node/link/output_type.ts +3 -0
- package/src/tests/__isograph/Query/linkedUpdate/entrypoint.ts +31 -0
- package/src/tests/__isograph/Query/linkedUpdate/normalization_ast.ts +95 -0
- package/src/tests/__isograph/Query/linkedUpdate/output_type.ts +3 -0
- package/src/tests/__isograph/Query/linkedUpdate/param_type.ts +51 -0
- package/src/tests/__isograph/Query/linkedUpdate/query_text.ts +20 -0
- package/src/tests/__isograph/Query/linkedUpdate/resolver_reader.ts +93 -0
- package/src/tests/__isograph/Query/meName/entrypoint.ts +8 -29
- package/src/tests/__isograph/Query/meName/normalization_ast.ts +25 -0
- package/src/tests/__isograph/Query/meName/query_text.ts +6 -0
- package/src/tests/__isograph/Query/meName/resolver_reader.ts +5 -0
- package/src/tests/__isograph/Query/meNameSuccessor/entrypoint.ts +8 -67
- package/src/tests/__isograph/Query/meNameSuccessor/normalization_ast.ts +56 -0
- package/src/tests/__isograph/Query/meNameSuccessor/query_text.ts +13 -0
- package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +10 -0
- package/src/tests/__isograph/Query/nodeField/entrypoint.ts +8 -34
- package/src/tests/__isograph/Query/nodeField/normalization_ast.ts +30 -0
- package/src/tests/__isograph/Query/nodeField/query_text.ts +6 -0
- package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +5 -0
- package/src/tests/__isograph/Query/startUpdate/entrypoint.ts +31 -0
- package/src/tests/__isograph/Query/startUpdate/normalization_ast.ts +51 -0
- package/src/tests/__isograph/Query/startUpdate/output_type.ts +3 -0
- package/src/tests/__isograph/Query/startUpdate/param_type.ts +26 -0
- package/src/tests/__isograph/Query/startUpdate/parameters_type.ts +3 -0
- package/src/tests/__isograph/Query/startUpdate/query_text.ts +11 -0
- package/src/tests/__isograph/Query/startUpdate/resolver_reader.ts +55 -0
- package/src/tests/__isograph/Query/subquery/entrypoint.ts +8 -44
- package/src/tests/__isograph/Query/subquery/normalization_ast.ts +38 -0
- package/src/tests/__isograph/Query/subquery/query_text.ts +8 -0
- package/src/tests/__isograph/Query/subquery/resolver_reader.ts +7 -0
- package/src/tests/__isograph/iso.ts +24 -3
- package/src/tests/__isograph/tsconfig.json +8 -0
- package/src/tests/garbageCollection.test.ts +10 -8
- package/src/tests/meNameSuccessor.ts +1 -1
- package/src/tests/nodeQuery.ts +2 -1
- package/src/tests/normalizeData.test.ts +1 -2
- package/src/tests/startUpdate.test.ts +205 -0
- 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 {
|
|
10
|
+
import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
|
|
10
11
|
|
|
11
12
|
export function useClientSideDefer<
|
|
12
|
-
TReadFromStore extends
|
|
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
|
|
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
|
|
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 {
|
|
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
|
|
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: (
|
|
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,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 {
|
|
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 {
|
|
26
|
+
import { maybeUnwrapNetworkRequest } from '../react/useResult';
|
|
21
27
|
|
|
22
|
-
type UseSkipLimitReturnValue<
|
|
23
|
-
TReadFromStore extends
|
|
28
|
+
export type UseSkipLimitReturnValue<
|
|
29
|
+
TReadFromStore extends UnknownTReadFromStore,
|
|
24
30
|
TItem,
|
|
25
31
|
> =
|
|
26
32
|
| {
|
|
27
33
|
readonly kind: 'Complete';
|
|
28
|
-
readonly fetchMore: (
|
|
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
|
|
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
|
-
(
|
|
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
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
15
|
-
TEntrypoint extends IsographEntrypoint<any,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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 {
|
|
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
|
-
|
|
2
|
+
UNASSIGNED_STATE,
|
|
3
3
|
useUpdatableDisposableState,
|
|
4
4
|
} from '@isograph/react-disposable-state';
|
|
5
|
-
import {
|
|
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 {
|
|
15
|
-
|
|
16
|
-
// TODO rename this to useImperativelyLoadedEntrypoint
|
|
18
|
+
import { wrapPromise, wrapResolvedValue } from '../core/PromiseWrapper';
|
|
19
|
+
import { useIsographEnvironment } from './IsographEnvironmentProvider';
|
|
17
20
|
|
|
18
|
-
export
|
|
19
|
-
TReadFromStore extends
|
|
21
|
+
export type UseImperativeReferenceResult<
|
|
22
|
+
TReadFromStore extends UnknownTReadFromStore,
|
|
20
23
|
TClientFieldValue,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
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
|
-
|
|
73
|
+
readerWithRefetchQueries,
|
|
74
|
+
fetchOptions ?? null,
|
|
48
75
|
);
|
|
49
76
|
setState([
|
|
50
77
|
{
|
|
51
78
|
kind: 'FragmentReference',
|
|
52
|
-
readerWithRefetchQueries
|
|
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,
|