@isograph/react 0.0.0-main-15990be5 → 0.0.0-main-cd7d2fe9
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 +1 -1
- package/dist/core/FragmentReference.d.ts +5 -0
- package/dist/core/FragmentReference.d.ts.map +1 -1
- package/dist/core/IsographEnvironment.d.ts +3 -5
- package/dist/core/IsographEnvironment.d.ts.map +1 -1
- package/dist/core/cache.d.ts +4 -1
- package/dist/core/cache.d.ts.map +1 -1
- package/dist/core/componentCache.d.ts.map +1 -1
- package/dist/core/componentCache.js +4 -0
- package/dist/core/entrypoint.d.ts +5 -1
- package/dist/core/entrypoint.d.ts.map +1 -1
- package/dist/core/makeNetworkRequest.d.ts +3 -0
- package/dist/core/makeNetworkRequest.d.ts.map +1 -1
- package/dist/core/makeNetworkRequest.js +7 -2
- package/dist/core/read.d.ts +2 -0
- package/dist/core/read.d.ts.map +1 -1
- package/dist/core/read.js +5 -0
- package/dist/core/reader.d.ts +12 -2
- package/dist/core/reader.d.ts.map +1 -1
- package/dist/core/startUpdate.d.ts +9 -0
- package/dist/core/startUpdate.d.ts.map +1 -0
- package/dist/core/startUpdate.js +6 -0
- package/dist/loadable-hooks/useClientSideDefer.d.ts +3 -1
- package/dist/loadable-hooks/useClientSideDefer.d.ts.map +1 -1
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts +3 -1
- package/dist/loadable-hooks/useConnectionSpecPagination.d.ts.map +1 -1
- package/dist/loadable-hooks/useConnectionSpecPagination.js +4 -0
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts +3 -1
- package/dist/loadable-hooks/useSkipLimitPagination.d.ts.map +1 -1
- package/dist/loadable-hooks/useSkipLimitPagination.js +4 -0
- package/dist/react/useImperativeReference.d.ts +2 -0
- package/dist/react/useImperativeReference.d.ts.map +1 -1
- package/dist/react/useLazyReference.d.ts +2 -0
- package/dist/react/useLazyReference.d.ts.map +1 -1
- package/dist/react/useReadAndSubscribe.d.ts +3 -1
- package/dist/react/useReadAndSubscribe.d.ts.map +1 -1
- package/dist/react/useResult.d.ts +2 -0
- package/dist/react/useResult.d.ts.map +1 -1
- package/dist/react/useResult.js +4 -0
- package/package.json +4 -4
- package/src/core/FragmentReference.ts +12 -1
- package/src/core/IsographEnvironment.ts +7 -3
- package/src/core/cache.ts +21 -4
- package/src/core/componentCache.ts +4 -0
- package/src/core/entrypoint.ts +21 -5
- package/src/core/makeNetworkRequest.ts +32 -14
- package/src/core/read.ts +11 -2
- package/src/core/reader.ts +34 -6
- package/src/core/startUpdate.ts +16 -0
- package/src/loadable-hooks/useClientSideDefer.ts +16 -4
- package/src/loadable-hooks/useConnectionSpecPagination.ts +15 -2
- package/src/loadable-hooks/useSkipLimitPagination.ts +20 -3
- package/src/react/useImperativeReference.ts +6 -1
- package/src/react/useLazyReference.ts +6 -1
- package/src/react/useReadAndSubscribe.ts +11 -3
- package/src/react/useResult.ts +10 -1
- package/src/tests/__isograph/Query/meName/resolver_reader.ts +1 -0
- package/src/tests/__isograph/Query/meNameSuccessor/resolver_reader.ts +1 -0
- package/src/tests/__isograph/Query/nodeField/resolver_reader.ts +1 -0
- package/src/tests/__isograph/Query/subquery/resolver_reader.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLazyReference.d.ts","sourceRoot":"","sources":["../../src/react/useLazyReference.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"useLazyReference.d.ts","sourceRoot":"","sources":["../../src/react/useLazyReference.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,wBAAgB,gBAAgB,CAC9B,cAAc,SAAS;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC,EACD,iBAAiB,EAEjB,UAAU,EAAE,kBAAkB,CAAC,cAAc,EAAE,iBAAiB,CAAC,EACjE,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAC5C,YAAY,CAAC,EAAE,YAAY,CAAC,iBAAiB,CAAC,GAC7C;IACD,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;CACzE,CAqBA"}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { ExtractData, FragmentReference } from '../core/FragmentReference';
|
|
2
2
|
import { NetworkRequestReaderOptions, WithEncounteredRecords } from '../core/read';
|
|
3
|
-
import type { ReaderAst } from '../core/reader';
|
|
3
|
+
import type { ReaderAst, StartUpdate } from '../core/reader';
|
|
4
4
|
/**
|
|
5
5
|
* Read the data from a fragment reference and subscribe to updates.
|
|
6
6
|
*/
|
|
7
7
|
export declare function useReadAndSubscribe<TReadFromStore extends {
|
|
8
8
|
parameters: object;
|
|
9
9
|
data: object;
|
|
10
|
+
startUpdate?: StartUpdate<object>;
|
|
10
11
|
}>(fragmentReference: FragmentReference<TReadFromStore, any>, networkRequestOptions: NetworkRequestReaderOptions, readerAst: ReaderAst<TReadFromStore>): ExtractData<TReadFromStore>;
|
|
11
12
|
export declare function useSubscribeToMultiple<TReadFromStore extends {
|
|
12
13
|
parameters: object;
|
|
13
14
|
data: object;
|
|
15
|
+
startUpdate?: StartUpdate<object>;
|
|
14
16
|
}>(items: ReadonlyArray<{
|
|
15
17
|
records: WithEncounteredRecords<TReadFromStore>;
|
|
16
18
|
callback: (updatedRecords: WithEncounteredRecords<TReadFromStore>) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useReadAndSubscribe.d.ts","sourceRoot":"","sources":["../../src/react/useReadAndSubscribe.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,iBAAiB,EAElB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,2BAA2B,EAE3B,sBAAsB,EACvB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"useReadAndSubscribe.d.ts","sourceRoot":"","sources":["../../src/react/useReadAndSubscribe.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EACX,iBAAiB,EAElB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,2BAA2B,EAE3B,sBAAsB,EACvB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7D;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,SAAS;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC,EAED,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,GAAG,CAAC,EACzD,qBAAqB,EAAE,2BAA2B,EAClD,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,GACnC,WAAW,CAAC,cAAc,CAAC,CAY7B;AAED,wBAAgB,sBAAsB,CACpC,cAAc,SAAS;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC,EAED,KAAK,EAAE,aAAa,CAAC;IACnB,OAAO,EAAE,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAChD,QAAQ,EAAE,CAAC,cAAc,EAAE,sBAAsB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAC3E,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAC1D,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;CACtC,CAAC,QAiCH"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { FragmentReference } from '../core/FragmentReference';
|
|
2
2
|
import { PromiseWrapper } from '../core/PromiseWrapper';
|
|
3
3
|
import { NetworkRequestReaderOptions } from '../core/read';
|
|
4
|
+
import type { StartUpdate } from '../core/reader';
|
|
4
5
|
export declare function useResult<TReadFromStore extends {
|
|
5
6
|
parameters: object;
|
|
6
7
|
data: object;
|
|
8
|
+
startUpdate?: StartUpdate<object>;
|
|
7
9
|
}, TClientFieldValue>(fragmentReference: FragmentReference<TReadFromStore, TClientFieldValue>, partialNetworkRequestOptions?: Partial<NetworkRequestReaderOptions> | void): TClientFieldValue;
|
|
8
10
|
export declare function maybeUnwrapNetworkRequest(networkRequest: PromiseWrapper<void, any>, networkRequestOptions: NetworkRequestReaderOptions): void;
|
|
9
11
|
//# sourceMappingURL=useResult.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useResult.d.ts","sourceRoot":"","sources":["../../src/react/useResult.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAEL,cAAc,EAEf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,2BAA2B,EAC5B,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"useResult.d.ts","sourceRoot":"","sources":["../../src/react/useResult.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAEL,cAAc,EAEf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD,wBAAgB,SAAS,CACvB,cAAc,SAAS;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC,EACD,iBAAiB,EAEjB,iBAAiB,EAAE,iBAAiB,CAAC,cAAc,EAAE,iBAAiB,CAAC,EACvE,4BAA4B,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,GAAG,IAAI,GACzE,iBAAiB,CAwCnB;AAED,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,EACzC,qBAAqB,EAAE,2BAA2B,QAWnD"}
|
package/dist/react/useResult.js
CHANGED
|
@@ -5,6 +5,7 @@ exports.maybeUnwrapNetworkRequest = maybeUnwrapNetworkRequest;
|
|
|
5
5
|
const componentCache_1 = require("../core/componentCache");
|
|
6
6
|
const PromiseWrapper_1 = require("../core/PromiseWrapper");
|
|
7
7
|
const read_1 = require("../core/read");
|
|
8
|
+
const startUpdate_1 = require("../core/startUpdate");
|
|
8
9
|
const IsographEnvironmentProvider_1 = require("../react/IsographEnvironmentProvider");
|
|
9
10
|
const useReadAndSubscribe_1 = require("./useReadAndSubscribe");
|
|
10
11
|
function useResult(fragmentReference, partialNetworkRequestOptions) {
|
|
@@ -22,6 +23,9 @@ function useResult(fragmentReference, partialNetworkRequestOptions) {
|
|
|
22
23
|
const param = {
|
|
23
24
|
data: data,
|
|
24
25
|
parameters: fragmentReference.variables,
|
|
26
|
+
startUpdate: readerWithRefetchQueries.readerArtifact.hasUpdatable
|
|
27
|
+
? (0, startUpdate_1.startUpdate)(environment, data)
|
|
28
|
+
: undefined,
|
|
25
29
|
};
|
|
26
30
|
return readerWithRefetchQueries.readerArtifact.resolver(param);
|
|
27
31
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@isograph/react",
|
|
3
|
-
"version": "0.0.0-main-
|
|
3
|
+
"version": "0.0.0-main-cd7d2fe9",
|
|
4
4
|
"description": "Use Isograph with React",
|
|
5
5
|
"homepage": "https://isograph.dev",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
"iso-watch": "cross-env ../../target/debug/isograph_cli --config ./isograph.config.json --watch"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@isograph/disposable-types": "0.0.0-main-
|
|
23
|
-
"@isograph/react-disposable-state": "0.0.0-main-
|
|
24
|
-
"@isograph/reference-counted-pointer": "0.0.0-main-
|
|
22
|
+
"@isograph/disposable-types": "0.0.0-main-cd7d2fe9",
|
|
23
|
+
"@isograph/react-disposable-state": "0.0.0-main-cd7d2fe9",
|
|
24
|
+
"@isograph/reference-counted-pointer": "0.0.0-main-cd7d2fe9"
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
27
|
"react": "^18.0.0 || ^19.0.0"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ReaderWithRefetchQueries } from '../core/entrypoint';
|
|
2
2
|
import { type Link } from './IsographEnvironment';
|
|
3
3
|
import { PromiseWrapper } from './PromiseWrapper';
|
|
4
|
+
import type { StartUpdate } from './reader';
|
|
4
5
|
|
|
5
6
|
// TODO type this better
|
|
6
7
|
export type VariableValue = string | number | boolean | null | object;
|
|
@@ -19,8 +20,18 @@ export type ExtractParameters<T> = T extends {
|
|
|
19
20
|
? P
|
|
20
21
|
: Variables;
|
|
21
22
|
|
|
23
|
+
export type ExtractStartUpdate<
|
|
24
|
+
T extends {
|
|
25
|
+
startUpdate?: StartUpdate<object>;
|
|
26
|
+
},
|
|
27
|
+
> = T['startUpdate'];
|
|
28
|
+
|
|
22
29
|
export type FragmentReference<
|
|
23
|
-
TReadFromStore extends {
|
|
30
|
+
TReadFromStore extends {
|
|
31
|
+
parameters: object;
|
|
32
|
+
data: object;
|
|
33
|
+
startUpdate?: StartUpdate<object>;
|
|
34
|
+
},
|
|
24
35
|
TClientFieldValue,
|
|
25
36
|
> = {
|
|
26
37
|
readonly kind: 'FragmentReference';
|
|
@@ -5,7 +5,7 @@ import { RetainedQuery } from './garbageCollection';
|
|
|
5
5
|
import { LogFunction, WrappedLogFunction } from './logging';
|
|
6
6
|
import { PromiseWrapper, wrapPromise } from './PromiseWrapper';
|
|
7
7
|
import { WithEncounteredRecords } from './read';
|
|
8
|
-
import type { ReaderAst } from './reader';
|
|
8
|
+
import type { ReaderAst, StartUpdate } from './reader';
|
|
9
9
|
|
|
10
10
|
export type ComponentOrFieldName = string;
|
|
11
11
|
export type StringifiedArgs = string;
|
|
@@ -16,7 +16,11 @@ type ComponentCache = {
|
|
|
16
16
|
};
|
|
17
17
|
|
|
18
18
|
export type FragmentSubscription<
|
|
19
|
-
TReadFromStore extends {
|
|
19
|
+
TReadFromStore extends {
|
|
20
|
+
parameters: object;
|
|
21
|
+
data: object;
|
|
22
|
+
startUpdate?: StartUpdate<object>;
|
|
23
|
+
},
|
|
20
24
|
> = {
|
|
21
25
|
readonly kind: 'FragmentSubscription';
|
|
22
26
|
readonly callback: (
|
|
@@ -40,7 +44,7 @@ type AnyRecordSubscription = {
|
|
|
40
44
|
};
|
|
41
45
|
|
|
42
46
|
type Subscription =
|
|
43
|
-
| FragmentSubscription<
|
|
47
|
+
| FragmentSubscription<any>
|
|
44
48
|
| AnyChangesToRecordSubscription
|
|
45
49
|
| AnyRecordSubscription;
|
|
46
50
|
type Subscriptions = Set<Subscription>;
|
package/src/core/cache.ts
CHANGED
|
@@ -33,13 +33,22 @@ import { logMessage } from './logging';
|
|
|
33
33
|
import { maybeMakeNetworkRequest } from './makeNetworkRequest';
|
|
34
34
|
import { wrapResolvedValue } from './PromiseWrapper';
|
|
35
35
|
import { readButDoNotEvaluate, WithEncounteredRecords } from './read';
|
|
36
|
-
import {
|
|
36
|
+
import {
|
|
37
|
+
ReaderLinkedField,
|
|
38
|
+
ReaderScalarField,
|
|
39
|
+
type ReaderAst,
|
|
40
|
+
type StartUpdate,
|
|
41
|
+
} from './reader';
|
|
37
42
|
import { Argument, ArgumentValue } from './util';
|
|
38
43
|
|
|
39
44
|
export const TYPENAME_FIELD_NAME = '__typename';
|
|
40
45
|
|
|
41
46
|
export function getOrCreateItemInSuspenseCache<
|
|
42
|
-
TReadFromStore extends {
|
|
47
|
+
TReadFromStore extends {
|
|
48
|
+
parameters: object;
|
|
49
|
+
data: object;
|
|
50
|
+
startUpdate?: StartUpdate<object>;
|
|
51
|
+
},
|
|
43
52
|
TClientFieldValue,
|
|
44
53
|
>(
|
|
45
54
|
environment: IsographEnvironment,
|
|
@@ -83,7 +92,11 @@ export function stableCopy<T>(value: T): T {
|
|
|
83
92
|
}
|
|
84
93
|
|
|
85
94
|
export function getOrCreateCacheForArtifact<
|
|
86
|
-
TReadFromStore extends {
|
|
95
|
+
TReadFromStore extends {
|
|
96
|
+
parameters: object;
|
|
97
|
+
data: object;
|
|
98
|
+
startUpdate?: StartUpdate<object>;
|
|
99
|
+
},
|
|
87
100
|
TClientFieldValue,
|
|
88
101
|
>(
|
|
89
102
|
environment: IsographEnvironment,
|
|
@@ -209,7 +222,11 @@ export function subscribeToAnyChangesToRecord(
|
|
|
209
222
|
|
|
210
223
|
// TODO we should re-read and call callback if the value has changed
|
|
211
224
|
export function subscribe<
|
|
212
|
-
TReadFromStore extends {
|
|
225
|
+
TReadFromStore extends {
|
|
226
|
+
parameters: object;
|
|
227
|
+
data: object;
|
|
228
|
+
startUpdate?: StartUpdate<object>;
|
|
229
|
+
},
|
|
213
230
|
>(
|
|
214
231
|
environment: IsographEnvironment,
|
|
215
232
|
encounteredDataAndRecords: WithEncounteredRecords<TReadFromStore>,
|
|
@@ -5,6 +5,7 @@ import { IsographEnvironment } from './IsographEnvironment';
|
|
|
5
5
|
import { logMessage } from './logging';
|
|
6
6
|
import { readPromise } from './PromiseWrapper';
|
|
7
7
|
import { NetworkRequestReaderOptions } from './read';
|
|
8
|
+
import { startUpdate } from './startUpdate';
|
|
8
9
|
|
|
9
10
|
export function getOrCreateCachedComponent(
|
|
10
11
|
environment: IsographEnvironment,
|
|
@@ -51,6 +52,9 @@ export function getOrCreateCachedComponent(
|
|
|
51
52
|
{
|
|
52
53
|
data,
|
|
53
54
|
parameters: fragmentReference.variables,
|
|
55
|
+
startUpdate: readerWithRefetchQueries.readerArtifact.hasUpdatable
|
|
56
|
+
? startUpdate(environment, data)
|
|
57
|
+
: undefined,
|
|
54
58
|
},
|
|
55
59
|
additionalRuntimeProps,
|
|
56
60
|
);
|
package/src/core/entrypoint.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import type { TypeName } from './IsographEnvironment';
|
|
2
|
-
import { TopLevelReaderArtifact } from './reader';
|
|
2
|
+
import { TopLevelReaderArtifact, type StartUpdate } from './reader';
|
|
3
3
|
import { Arguments } from './util';
|
|
4
4
|
|
|
5
5
|
export type ReaderWithRefetchQueries<
|
|
6
|
-
TReadFromStore extends {
|
|
6
|
+
TReadFromStore extends {
|
|
7
|
+
parameters: object;
|
|
8
|
+
data: object;
|
|
9
|
+
startUpdate?: StartUpdate<object>;
|
|
10
|
+
},
|
|
7
11
|
TClientFieldValue,
|
|
8
12
|
> = {
|
|
9
13
|
readonly kind: 'ReaderWithRefetchQueries';
|
|
@@ -23,7 +27,11 @@ export type NetworkRequestInfo<TNormalizationAst> = {
|
|
|
23
27
|
};
|
|
24
28
|
// This type should be treated as an opaque type.
|
|
25
29
|
export type IsographEntrypoint<
|
|
26
|
-
TReadFromStore extends {
|
|
30
|
+
TReadFromStore extends {
|
|
31
|
+
parameters: object;
|
|
32
|
+
data: object;
|
|
33
|
+
startUpdate?: StartUpdate<object>;
|
|
34
|
+
},
|
|
27
35
|
TClientFieldValue,
|
|
28
36
|
TNormalizationAst = NormalizationAst,
|
|
29
37
|
> = {
|
|
@@ -37,7 +45,11 @@ export type IsographEntrypoint<
|
|
|
37
45
|
};
|
|
38
46
|
|
|
39
47
|
export type IsographEntrypointLoader<
|
|
40
|
-
TReadFromStore extends {
|
|
48
|
+
TReadFromStore extends {
|
|
49
|
+
parameters: object;
|
|
50
|
+
data: object;
|
|
51
|
+
startUpdate?: StartUpdate<object>;
|
|
52
|
+
},
|
|
41
53
|
TClientFieldValue,
|
|
42
54
|
> = {
|
|
43
55
|
readonly kind: 'EntrypointLoader';
|
|
@@ -93,7 +105,11 @@ export type RefetchQueryNormalizationArtifactWrapper = {
|
|
|
93
105
|
};
|
|
94
106
|
|
|
95
107
|
export function assertIsEntrypoint<
|
|
96
|
-
TReadFromStore extends {
|
|
108
|
+
TReadFromStore extends {
|
|
109
|
+
parameters: object;
|
|
110
|
+
data: object;
|
|
111
|
+
startUpdate?: StartUpdate<object>;
|
|
112
|
+
},
|
|
97
113
|
TClientFieldValue,
|
|
98
114
|
>(
|
|
99
115
|
value:
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
IsographEntrypoint,
|
|
7
7
|
RefetchQueryNormalizationArtifact,
|
|
8
8
|
} from './entrypoint';
|
|
9
|
-
import { ExtractParameters } from './FragmentReference';
|
|
9
|
+
import { ExtractParameters, type FragmentReference } from './FragmentReference';
|
|
10
10
|
import {
|
|
11
11
|
garbageCollectEnvironment,
|
|
12
12
|
RetainedQuery,
|
|
@@ -22,11 +22,17 @@ import {
|
|
|
22
22
|
wrapResolvedValue,
|
|
23
23
|
} from './PromiseWrapper';
|
|
24
24
|
import { readButDoNotEvaluate } from './read';
|
|
25
|
+
import type { StartUpdate } from './reader';
|
|
26
|
+
import { startUpdate } from './startUpdate';
|
|
25
27
|
|
|
26
28
|
let networkRequestId = 0;
|
|
27
29
|
|
|
28
30
|
export function maybeMakeNetworkRequest<
|
|
29
|
-
TReadFromStore extends {
|
|
31
|
+
TReadFromStore extends {
|
|
32
|
+
parameters: object;
|
|
33
|
+
data: object;
|
|
34
|
+
startUpdate?: StartUpdate<object>;
|
|
35
|
+
},
|
|
30
36
|
TClientFieldValue,
|
|
31
37
|
>(
|
|
32
38
|
environment: IsographEnvironment,
|
|
@@ -68,7 +74,11 @@ export function maybeMakeNetworkRequest<
|
|
|
68
74
|
}
|
|
69
75
|
|
|
70
76
|
export function makeNetworkRequest<
|
|
71
|
-
TReadFromStore extends {
|
|
77
|
+
TReadFromStore extends {
|
|
78
|
+
parameters: object;
|
|
79
|
+
data: object;
|
|
80
|
+
startUpdate?: StartUpdate<object>;
|
|
81
|
+
},
|
|
72
82
|
TClientFieldValue,
|
|
73
83
|
>(
|
|
74
84
|
environment: IsographEnvironment,
|
|
@@ -201,7 +211,11 @@ type NetworkRequestStatus =
|
|
|
201
211
|
};
|
|
202
212
|
|
|
203
213
|
function readDataForOnComplete<
|
|
204
|
-
TReadFromStore extends {
|
|
214
|
+
TReadFromStore extends {
|
|
215
|
+
parameters: object;
|
|
216
|
+
data: object;
|
|
217
|
+
startUpdate?: StartUpdate<object>;
|
|
218
|
+
},
|
|
205
219
|
TClientFieldValue,
|
|
206
220
|
>(
|
|
207
221
|
artifact:
|
|
@@ -227,18 +241,19 @@ function readDataForOnComplete<
|
|
|
227
241
|
throwOnNetworkError: false,
|
|
228
242
|
};
|
|
229
243
|
|
|
244
|
+
const fragment: FragmentReference<TReadFromStore, TClientFieldValue> = {
|
|
245
|
+
kind: 'FragmentReference',
|
|
246
|
+
// TODO this smells.
|
|
247
|
+
readerWithRefetchQueries: wrapResolvedValue(
|
|
248
|
+
artifact.readerWithRefetchQueries,
|
|
249
|
+
),
|
|
250
|
+
root,
|
|
251
|
+
variables,
|
|
252
|
+
networkRequest: fakeNetworkRequest,
|
|
253
|
+
};
|
|
230
254
|
const fragmentResult = readButDoNotEvaluate(
|
|
231
255
|
environment,
|
|
232
|
-
|
|
233
|
-
kind: 'FragmentReference',
|
|
234
|
-
// TODO this smells.
|
|
235
|
-
readerWithRefetchQueries: wrapResolvedValue(
|
|
236
|
-
artifact.readerWithRefetchQueries,
|
|
237
|
-
),
|
|
238
|
-
root,
|
|
239
|
-
variables,
|
|
240
|
-
networkRequest: fakeNetworkRequest,
|
|
241
|
-
},
|
|
256
|
+
fragment,
|
|
242
257
|
fakeNetworkRequestOptions,
|
|
243
258
|
).item;
|
|
244
259
|
const readerArtifact = artifact.readerWithRefetchQueries.readerArtifact;
|
|
@@ -269,6 +284,9 @@ function readDataForOnComplete<
|
|
|
269
284
|
return readerArtifact.resolver({
|
|
270
285
|
data: fragmentResult,
|
|
271
286
|
parameters: variables,
|
|
287
|
+
startUpdate: readerArtifact.hasUpdatable
|
|
288
|
+
? startUpdate(environment, fragmentResult)
|
|
289
|
+
: undefined,
|
|
272
290
|
});
|
|
273
291
|
}
|
|
274
292
|
default: {
|
package/src/core/read.ts
CHANGED
|
@@ -33,7 +33,8 @@ import {
|
|
|
33
33
|
wrapPromise,
|
|
34
34
|
wrapResolvedValue,
|
|
35
35
|
} from './PromiseWrapper';
|
|
36
|
-
import { ReaderAst } from './reader';
|
|
36
|
+
import { ReaderAst, type StartUpdate } from './reader';
|
|
37
|
+
import { startUpdate } from './startUpdate';
|
|
37
38
|
import { Arguments } from './util';
|
|
38
39
|
|
|
39
40
|
export type WithEncounteredRecords<T> = {
|
|
@@ -42,7 +43,11 @@ export type WithEncounteredRecords<T> = {
|
|
|
42
43
|
};
|
|
43
44
|
|
|
44
45
|
export function readButDoNotEvaluate<
|
|
45
|
-
TReadFromStore extends {
|
|
46
|
+
TReadFromStore extends {
|
|
47
|
+
parameters: object;
|
|
48
|
+
data: object;
|
|
49
|
+
startUpdate?: StartUpdate<object>;
|
|
50
|
+
},
|
|
46
51
|
>(
|
|
47
52
|
environment: IsographEnvironment,
|
|
48
53
|
fragmentReference: FragmentReference<TReadFromStore, unknown>,
|
|
@@ -264,6 +269,9 @@ function readData<TReadFromStore>(
|
|
|
264
269
|
const condition = field.condition.resolver({
|
|
265
270
|
data: data.data,
|
|
266
271
|
parameters: {},
|
|
272
|
+
startUpdate: field.condition.hasUpdatable
|
|
273
|
+
? startUpdate(environment, data)
|
|
274
|
+
: undefined,
|
|
267
275
|
});
|
|
268
276
|
if (condition === true) {
|
|
269
277
|
link = root;
|
|
@@ -427,6 +435,7 @@ function readData<TReadFromStore>(
|
|
|
427
435
|
const firstParameter = {
|
|
428
436
|
data: data.data,
|
|
429
437
|
parameters: variables,
|
|
438
|
+
startUpdate: () => {},
|
|
430
439
|
};
|
|
431
440
|
target[field.alias] =
|
|
432
441
|
field.readerArtifact.resolver(firstParameter);
|
package/src/core/reader.ts
CHANGED
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
ExtractData,
|
|
11
11
|
ExtractParameters,
|
|
12
12
|
FragmentReference,
|
|
13
|
+
type ExtractStartUpdate,
|
|
13
14
|
} from './FragmentReference';
|
|
14
15
|
import {
|
|
15
16
|
ComponentOrFieldName,
|
|
@@ -19,7 +20,11 @@ import {
|
|
|
19
20
|
import { Arguments } from './util';
|
|
20
21
|
|
|
21
22
|
export type TopLevelReaderArtifact<
|
|
22
|
-
TReadFromStore extends {
|
|
23
|
+
TReadFromStore extends {
|
|
24
|
+
parameters: object;
|
|
25
|
+
data: object;
|
|
26
|
+
startUpdate?: StartUpdate<object>;
|
|
27
|
+
},
|
|
23
28
|
TClientFieldValue,
|
|
24
29
|
TComponentProps extends Record<PropertyKey, never>,
|
|
25
30
|
> =
|
|
@@ -27,7 +32,11 @@ export type TopLevelReaderArtifact<
|
|
|
27
32
|
| ComponentReaderArtifact<TReadFromStore, TComponentProps>;
|
|
28
33
|
|
|
29
34
|
export type EagerReaderArtifact<
|
|
30
|
-
TReadFromStore extends {
|
|
35
|
+
TReadFromStore extends {
|
|
36
|
+
parameters: object;
|
|
37
|
+
data: object;
|
|
38
|
+
startUpdate?: StartUpdate<object>;
|
|
39
|
+
},
|
|
31
40
|
TClientFieldValue,
|
|
32
41
|
> = {
|
|
33
42
|
readonly kind: 'EagerReaderArtifact';
|
|
@@ -35,10 +44,15 @@ export type EagerReaderArtifact<
|
|
|
35
44
|
readonly resolver: (
|
|
36
45
|
data: ResolverFirstParameter<TReadFromStore>,
|
|
37
46
|
) => TClientFieldValue;
|
|
47
|
+
readonly hasUpdatable: boolean;
|
|
38
48
|
};
|
|
39
49
|
|
|
40
50
|
export type ComponentReaderArtifact<
|
|
41
|
-
TReadFromStore extends {
|
|
51
|
+
TReadFromStore extends {
|
|
52
|
+
parameters: object;
|
|
53
|
+
data: object;
|
|
54
|
+
startUpdate?: StartUpdate<object>;
|
|
55
|
+
},
|
|
42
56
|
TComponentProps extends Record<string, unknown> = Record<PropertyKey, never>,
|
|
43
57
|
> = {
|
|
44
58
|
readonly kind: 'ComponentReaderArtifact';
|
|
@@ -48,15 +62,25 @@ export type ComponentReaderArtifact<
|
|
|
48
62
|
data: ResolverFirstParameter<TReadFromStore>,
|
|
49
63
|
runtimeProps: TComponentProps,
|
|
50
64
|
) => React.ReactNode;
|
|
65
|
+
readonly hasUpdatable: boolean;
|
|
51
66
|
};
|
|
52
67
|
|
|
53
68
|
export type ResolverFirstParameter<
|
|
54
|
-
TReadFromStore extends {
|
|
69
|
+
TReadFromStore extends {
|
|
70
|
+
data: object;
|
|
71
|
+
parameters: object;
|
|
72
|
+
startUpdate?: StartUpdate<object>;
|
|
73
|
+
},
|
|
55
74
|
> = {
|
|
56
75
|
data: ExtractData<TReadFromStore>;
|
|
57
76
|
parameters: ExtractParameters<TReadFromStore>;
|
|
77
|
+
startUpdate: undefined | ExtractStartUpdate<TReadFromStore>;
|
|
58
78
|
};
|
|
59
79
|
|
|
80
|
+
export type StartUpdate<UpdatableData> = (
|
|
81
|
+
updater: (updatableData: UpdatableData) => void,
|
|
82
|
+
) => void;
|
|
83
|
+
|
|
60
84
|
export type RefetchReaderArtifact = {
|
|
61
85
|
readonly kind: 'RefetchReaderArtifact';
|
|
62
86
|
readonly readerAst: ReaderAst<unknown>;
|
|
@@ -104,7 +128,7 @@ export type ReaderLinkedField = {
|
|
|
104
128
|
readonly selections: ReaderAst<unknown>;
|
|
105
129
|
readonly arguments: Arguments | null;
|
|
106
130
|
readonly condition: EagerReaderArtifact<
|
|
107
|
-
{ data: object; parameters: object },
|
|
131
|
+
{ data: object; parameters: any; startUpdate?: StartUpdate<object> },
|
|
108
132
|
boolean | Link | null
|
|
109
133
|
> | null;
|
|
110
134
|
};
|
|
@@ -154,7 +178,11 @@ type StableId = string;
|
|
|
154
178
|
/// except to stringify the args or whatnot. Calling the factory can be
|
|
155
179
|
/// expensive. For example, doing so will probably trigger a network request.
|
|
156
180
|
export type LoadableField<
|
|
157
|
-
TReadFromStore extends {
|
|
181
|
+
TReadFromStore extends {
|
|
182
|
+
data: object;
|
|
183
|
+
parameters: object;
|
|
184
|
+
startUpdate?: StartUpdate<object>;
|
|
185
|
+
},
|
|
158
186
|
TResult,
|
|
159
187
|
TArgs = ExtractParameters<TReadFromStore>,
|
|
160
188
|
> = (
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ExtractData, ExtractStartUpdate } from './FragmentReference';
|
|
2
|
+
import type { IsographEnvironment } from './IsographEnvironment';
|
|
3
|
+
import type { StartUpdate } from './reader';
|
|
4
|
+
|
|
5
|
+
export function startUpdate<
|
|
6
|
+
TReadFromStore extends {
|
|
7
|
+
parameters: object;
|
|
8
|
+
data: object;
|
|
9
|
+
startUpdate?: StartUpdate<object>;
|
|
10
|
+
},
|
|
11
|
+
>(
|
|
12
|
+
_environment: IsographEnvironment,
|
|
13
|
+
_data: ExtractData<TReadFromStore>,
|
|
14
|
+
): ExtractStartUpdate<TReadFromStore> {
|
|
15
|
+
return (_updater) => {};
|
|
16
|
+
}
|
|
@@ -5,11 +5,15 @@ import {
|
|
|
5
5
|
ExtractParameters,
|
|
6
6
|
FragmentReference,
|
|
7
7
|
} from '../core/FragmentReference';
|
|
8
|
-
import { LoadableField } from '../core/reader';
|
|
8
|
+
import { LoadableField, type StartUpdate } from '../core/reader';
|
|
9
9
|
import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
|
|
10
10
|
|
|
11
11
|
export function useClientSideDefer<
|
|
12
|
-
TReadFromStore extends {
|
|
12
|
+
TReadFromStore extends {
|
|
13
|
+
data: object;
|
|
14
|
+
parameters: object;
|
|
15
|
+
startUpdate?: StartUpdate<object>;
|
|
16
|
+
},
|
|
13
17
|
TResult,
|
|
14
18
|
>(
|
|
15
19
|
loadableField: LoadableField<
|
|
@@ -22,7 +26,11 @@ export function useClientSideDefer<
|
|
|
22
26
|
): { fragmentReference: FragmentReference<TReadFromStore, TResult> };
|
|
23
27
|
|
|
24
28
|
export function useClientSideDefer<
|
|
25
|
-
TReadFromStore extends {
|
|
29
|
+
TReadFromStore extends {
|
|
30
|
+
data: object;
|
|
31
|
+
parameters: object;
|
|
32
|
+
startUpdate?: StartUpdate<object>;
|
|
33
|
+
},
|
|
26
34
|
TResult,
|
|
27
35
|
TProvidedArgs extends object,
|
|
28
36
|
>(
|
|
@@ -36,7 +44,11 @@ export function useClientSideDefer<
|
|
|
36
44
|
): { fragmentReference: FragmentReference<TReadFromStore, TResult> };
|
|
37
45
|
|
|
38
46
|
export function useClientSideDefer<
|
|
39
|
-
TReadFromStore extends {
|
|
47
|
+
TReadFromStore extends {
|
|
48
|
+
data: object;
|
|
49
|
+
parameters: object;
|
|
50
|
+
startUpdate?: StartUpdate<object>;
|
|
51
|
+
},
|
|
40
52
|
TResult,
|
|
41
53
|
TProvidedArgs extends object,
|
|
42
54
|
>(
|
|
@@ -16,13 +16,22 @@ import {
|
|
|
16
16
|
readButDoNotEvaluate,
|
|
17
17
|
type WithEncounteredRecords,
|
|
18
18
|
} from '../core/read';
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
LoadableField,
|
|
21
|
+
type ReaderAst,
|
|
22
|
+
type StartUpdate,
|
|
23
|
+
} from '../core/reader';
|
|
24
|
+
import { startUpdate } from '../core/startUpdate';
|
|
20
25
|
import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
|
|
21
26
|
import { useSubscribeToMultiple } from '../react/useReadAndSubscribe';
|
|
22
27
|
import { maybeUnwrapNetworkRequest } from '../react/useResult';
|
|
23
28
|
|
|
24
29
|
type UsePaginationReturnValue<
|
|
25
|
-
TReadFromStore extends {
|
|
30
|
+
TReadFromStore extends {
|
|
31
|
+
parameters: object;
|
|
32
|
+
data: object;
|
|
33
|
+
startUpdate?: StartUpdate<object>;
|
|
34
|
+
},
|
|
26
35
|
TItem,
|
|
27
36
|
> =
|
|
28
37
|
| {
|
|
@@ -86,6 +95,7 @@ export function useConnectionSpecPagination<
|
|
|
86
95
|
TReadFromStore extends {
|
|
87
96
|
parameters: object;
|
|
88
97
|
data: object;
|
|
98
|
+
startUpdate?: StartUpdate<object>;
|
|
89
99
|
},
|
|
90
100
|
TItem,
|
|
91
101
|
>(
|
|
@@ -128,6 +138,9 @@ export function useConnectionSpecPagination<
|
|
|
128
138
|
const firstParameter = {
|
|
129
139
|
data,
|
|
130
140
|
parameters: fragmentReference.variables,
|
|
141
|
+
startUpdate: readerWithRefetchQueries.readerArtifact.hasUpdatable
|
|
142
|
+
? startUpdate(environment, data)
|
|
143
|
+
: undefined,
|
|
131
144
|
};
|
|
132
145
|
|
|
133
146
|
if (
|
|
@@ -16,13 +16,22 @@ import {
|
|
|
16
16
|
readButDoNotEvaluate,
|
|
17
17
|
type WithEncounteredRecords,
|
|
18
18
|
} from '../core/read';
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
LoadableField,
|
|
21
|
+
type ReaderAst,
|
|
22
|
+
type StartUpdate,
|
|
23
|
+
} from '../core/reader';
|
|
24
|
+
import { startUpdate } from '../core/startUpdate';
|
|
20
25
|
import { useIsographEnvironment } from '../react/IsographEnvironmentProvider';
|
|
21
26
|
import { useSubscribeToMultiple } from '../react/useReadAndSubscribe';
|
|
22
27
|
import { maybeUnwrapNetworkRequest } from '../react/useResult';
|
|
23
28
|
|
|
24
29
|
type UseSkipLimitReturnValue<
|
|
25
|
-
TReadFromStore extends {
|
|
30
|
+
TReadFromStore extends {
|
|
31
|
+
data: object;
|
|
32
|
+
parameters: object;
|
|
33
|
+
startUpdate?: StartUpdate<object>;
|
|
34
|
+
},
|
|
26
35
|
TItem,
|
|
27
36
|
> =
|
|
28
37
|
| {
|
|
@@ -43,7 +52,11 @@ type UseSkipLimitReturnValue<
|
|
|
43
52
|
};
|
|
44
53
|
|
|
45
54
|
type ArrayFragmentReference<
|
|
46
|
-
TReadFromStore extends {
|
|
55
|
+
TReadFromStore extends {
|
|
56
|
+
parameters: object;
|
|
57
|
+
data: object;
|
|
58
|
+
startUpdate?: StartUpdate<object>;
|
|
59
|
+
},
|
|
47
60
|
TItem,
|
|
48
61
|
> = FragmentReference<TReadFromStore, ReadonlyArray<TItem>>;
|
|
49
62
|
|
|
@@ -79,6 +92,7 @@ export function useSkipLimitPagination<
|
|
|
79
92
|
TReadFromStore extends {
|
|
80
93
|
parameters: object;
|
|
81
94
|
data: object;
|
|
95
|
+
startUpdate?: StartUpdate<object>;
|
|
82
96
|
},
|
|
83
97
|
>(
|
|
84
98
|
loadableField: LoadableField<
|
|
@@ -122,6 +136,9 @@ export function useSkipLimitPagination<
|
|
|
122
136
|
const firstParameter = {
|
|
123
137
|
data,
|
|
124
138
|
parameters: fragmentReference.variables,
|
|
139
|
+
startUpdate: readerWithRefetchQueries.readerArtifact.hasUpdatable
|
|
140
|
+
? startUpdate(environment, data)
|
|
141
|
+
: undefined,
|
|
125
142
|
};
|
|
126
143
|
|
|
127
144
|
if (
|