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