@isograph/react 0.0.0-main-dd71e248 → 0.0.0-main-30cd2de5
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 +1 -1
- package/dist/core/IsographEnvironment.d.ts +1 -1
- package/dist/core/IsographEnvironment.d.ts.map +1 -1
- package/dist/core/PromiseWrapper.d.ts +13 -7
- package/dist/core/PromiseWrapper.d.ts.map +1 -1
- package/dist/core/garbageCollection.d.ts +6 -2
- package/dist/core/garbageCollection.d.ts.map +1 -1
- package/dist/core/garbageCollection.js +17 -2
- package/dist/core/makeNetworkRequest.d.ts.map +1 -1
- package/dist/core/makeNetworkRequest.js +45 -31
- package/package.json +4 -4
- package/src/core/IsographEnvironment.ts +1 -1
- package/src/core/PromiseWrapper.ts +14 -7
- package/src/core/garbageCollection.ts +35 -5
- package/src/core/makeNetworkRequest.ts +100 -43
- package/src/tests/garbageCollection.test.ts +6 -3
- package/src/tests/meNameSuccessor.ts +6 -3
- package/src/tests/nodeQuery.ts +4 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
../.. | WARN Unsupported engine: wanted: {"node":"22.9.0"} (current: {"node":"v22.21.1","pnpm":"10.15.0"})
|
|
2
2
|
|
|
3
|
-
> @isograph/react@0.0.0-main-
|
|
3
|
+
> @isograph/react@0.0.0-main-30cd2de5 compile-libs /home/runner/work/isograph/isograph/libs/isograph-react
|
|
4
4
|
> rimraf dist && tsc -p tsconfig.pkg.json
|
|
5
5
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ParentCache } from '@isograph/react-disposable-state';
|
|
2
2
|
import { IsographEntrypoint, IsographOperation, IsographPersistedOperation } from './entrypoint';
|
|
3
3
|
import { FragmentReference, Variables, type StableIdForFragmentReference, type UnknownTReadFromStore } from './FragmentReference';
|
|
4
|
-
import { RetainedQuery } from './garbageCollection';
|
|
4
|
+
import type { RetainedQuery } from './garbageCollection';
|
|
5
5
|
import { LogFunction, WrappedLogFunction } from './logging';
|
|
6
6
|
import { PromiseWrapper } from './PromiseWrapper';
|
|
7
7
|
import { WithEncounteredRecords } from './read';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IsographEnvironment.d.ts","sourceRoot":"","sources":["../../src/core/IsographEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,0BAA0B,EAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,KAAK,4BAA4B,EACjC,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"IsographEnvironment.d.ts","sourceRoot":"","sources":["../../src/core/IsographEnvironment.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,11 @@ export type AnyError = any;
|
|
|
2
2
|
export declare const NOT_SET: unique symbol;
|
|
3
3
|
export type NotSet = typeof NOT_SET;
|
|
4
4
|
export type Result<T, E> = {
|
|
5
|
-
kind: 'Ok';
|
|
6
|
-
value: T;
|
|
5
|
+
readonly kind: 'Ok';
|
|
6
|
+
readonly value: T;
|
|
7
7
|
} | {
|
|
8
|
-
kind: 'Err';
|
|
9
|
-
error: E;
|
|
8
|
+
readonly kind: 'Err';
|
|
9
|
+
readonly error: E;
|
|
10
10
|
};
|
|
11
11
|
/**
|
|
12
12
|
* Invariant:
|
|
@@ -16,12 +16,18 @@ export type PromiseWrapper<T, E = any> = {
|
|
|
16
16
|
readonly promise: Promise<Exclude<T, NotSet>>;
|
|
17
17
|
result: Result<Exclude<T, NotSet>, E> | NotSet;
|
|
18
18
|
};
|
|
19
|
+
export interface PromiseWrapperOk<T, E = any> extends PromiseWrapper<T, E> {
|
|
20
|
+
result: {
|
|
21
|
+
readonly kind: 'Ok';
|
|
22
|
+
readonly value: Exclude<T, NotSet>;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
19
25
|
export declare function wrapPromise<T>(promise: Promise<Exclude<T, NotSet>>): PromiseWrapper<T, unknown>;
|
|
20
|
-
export declare function wrapResolvedValue<T>(value: Exclude<T, NotSet>):
|
|
26
|
+
export declare function wrapResolvedValue<T>(value: Exclude<T, NotSet>): PromiseWrapperOk<T, never>;
|
|
21
27
|
export declare function readPromise<T, E>(p: PromiseWrapper<T, E>): T;
|
|
22
28
|
export type PromiseState<T, E> = {
|
|
23
|
-
kind: 'Pending';
|
|
24
|
-
promise: Promise<T>;
|
|
29
|
+
readonly kind: 'Pending';
|
|
30
|
+
readonly promise: Promise<T>;
|
|
25
31
|
} | Result<T, E>;
|
|
26
32
|
export declare function getPromiseState<T, E>(p: PromiseWrapper<T, E>): PromiseState<T, E>;
|
|
27
33
|
//# sourceMappingURL=PromiseWrapper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PromiseWrapper.d.ts","sourceRoot":"","sources":["../../src/core/PromiseWrapper.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC;AAE3B,eAAO,MAAM,OAAO,eAAoB,CAAC;AACzC,MAAM,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC;AAEpC,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IACnB;IACE,IAAI,EAAE,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"PromiseWrapper.d.ts","sourceRoot":"","sources":["../../src/core/PromiseWrapper.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC;AAE3B,eAAO,MAAM,OAAO,eAAoB,CAAC;AACzC,MAAM,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC;AAEpC,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IACnB;IACE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB,CAAC;AAEN;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;CAChD,CAAC;AAEF,MAAM,WAAW,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAE,SAAQ,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,MAAM,EAAE;QACN,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;QACpB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;KACpC,CAAC;CACH;AAED,wBAAgB,WAAW,CAAC,CAAC,EAC3B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GACnC,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,CAW5B;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,GACxB,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,CAQ5B;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAY5D;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,IACzB;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CAC9B,GACD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEjB,wBAAgB,eAAe,CAAC,CAAC,EAAE,CAAC,EAClC,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GACtB,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAQpB"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type NormalizationAst } from './entrypoint';
|
|
2
2
|
import { IsographEnvironment, type StoreLink } from './IsographEnvironment';
|
|
3
|
+
import { type PromiseWrapper, type PromiseWrapperOk } from './PromiseWrapper';
|
|
3
4
|
export type RetainedQuery = {
|
|
4
|
-
readonly normalizationAst:
|
|
5
|
+
readonly normalizationAst: PromiseWrapper<NormalizationAst>;
|
|
5
6
|
readonly variables: {};
|
|
6
7
|
readonly root: StoreLink;
|
|
7
8
|
};
|
|
9
|
+
export interface RetainedQueryWithNormalizationAst extends RetainedQuery {
|
|
10
|
+
readonly normalizationAst: PromiseWrapperOk<NormalizationAst>;
|
|
11
|
+
}
|
|
8
12
|
export type DidUnretainSomeQuery = boolean;
|
|
9
13
|
export declare function unretainQuery(environment: IsographEnvironment, retainedQuery: RetainedQuery): DidUnretainSomeQuery;
|
|
10
14
|
export declare function retainQuery(environment: IsographEnvironment, queryToRetain: RetainedQuery): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../../src/core/garbageCollection.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../../src/core/garbageCollection.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,EAGL,mBAAmB,EAGnB,KAAK,SAAS,EAEf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC5D,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAC1B,CAAC;AAEF,MAAM,WAAW,iCAAkC,SAAQ,aAAa;IACtE,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;CAC/D;AAWD,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAC3C,wBAAgB,aAAa,CAC3B,WAAW,EAAE,mBAAmB,EAChC,aAAa,EAAE,aAAa,GAC3B,oBAAoB,CAUtB;AAED,wBAAgB,WAAW,CACzB,WAAW,EAAE,mBAAmB,EAChC,aAAa,EAAE,aAAa,QAM7B;AAED,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,mBAAmB,QA2CzE"}
|
|
@@ -5,6 +5,11 @@ exports.retainQuery = retainQuery;
|
|
|
5
5
|
exports.garbageCollectEnvironment = garbageCollectEnvironment;
|
|
6
6
|
const cache_1 = require("./cache");
|
|
7
7
|
const IsographEnvironment_1 = require("./IsographEnvironment");
|
|
8
|
+
const PromiseWrapper_1 = require("./PromiseWrapper");
|
|
9
|
+
function isRetainedQueryWithNormalizationAst(query) {
|
|
10
|
+
return (query.normalizationAst.result !== PromiseWrapper_1.NOT_SET &&
|
|
11
|
+
query.normalizationAst.result.kind === 'Ok');
|
|
12
|
+
}
|
|
8
13
|
function unretainQuery(environment, retainedQuery) {
|
|
9
14
|
environment.retainedQueries.delete(retainedQuery);
|
|
10
15
|
environment.gcBuffer.push(retainedQuery);
|
|
@@ -22,10 +27,20 @@ function retainQuery(environment, queryToRetain) {
|
|
|
22
27
|
}
|
|
23
28
|
function garbageCollectEnvironment(environment) {
|
|
24
29
|
const retainedIds = {};
|
|
30
|
+
const retainedQueries = [];
|
|
25
31
|
for (const query of environment.retainedQueries) {
|
|
26
|
-
|
|
32
|
+
if (!isRetainedQueryWithNormalizationAst(query)) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
retainedQueries.push(query);
|
|
27
36
|
}
|
|
28
37
|
for (const query of environment.gcBuffer) {
|
|
38
|
+
if (!isRetainedQueryWithNormalizationAst(query)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
retainedQueries.push(query);
|
|
42
|
+
}
|
|
43
|
+
for (const query of retainedQueries) {
|
|
29
44
|
recordReachableIds(environment.store, query, retainedIds);
|
|
30
45
|
}
|
|
31
46
|
for (const typeName in environment.store) {
|
|
@@ -55,7 +70,7 @@ function recordReachableIds(store, retainedQuery, mutableRetainedIds) {
|
|
|
55
70
|
const retainedRecordsIds = ((_b = mutableRetainedIds[_c = retainedQuery.root.__typename]) !== null && _b !== void 0 ? _b : (mutableRetainedIds[_c] = new Set()));
|
|
56
71
|
retainedRecordsIds.add(retainedQuery.root.__link);
|
|
57
72
|
if (record) {
|
|
58
|
-
recordReachableIdsFromRecord(store, record, mutableRetainedIds, retainedQuery.normalizationAst, retainedQuery.variables);
|
|
73
|
+
recordReachableIdsFromRecord(store, record, mutableRetainedIds, retainedQuery.normalizationAst.result.value.selections, retainedQuery.variables);
|
|
59
74
|
}
|
|
60
75
|
}
|
|
61
76
|
function recordReachableIdsFromRecord(store, currentRecord, mutableRetainedIds, selections, variables) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makeNetworkRequest.d.ts","sourceRoot":"","sources":["../../src/core/makeNetworkRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAqC,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1E,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,iCAAiC,EACjC,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC5B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EAEjB,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAE,mBAAmB,EAAsB,MAAM,uBAAuB,CAAC;AAEhF,OAAO,EACL,QAAQ,EACR,cAAc,EAGf,MAAM,kBAAkB,CAAC;AAM1B,wBAAgB,uBAAuB,CACrC,cAAc,SAAS,qBAAqB,EAC5C,iBAAiB,EACjB,SAAS,SACL,iCAAiC,GACjC,kBAAkB,CAAC,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,EAC5E,iBAAiB,SAAS,gBAAgB,GAAG,sBAAsB,EAEnE,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAC5C,wBAAwB,EAAE,cAAc,CACtC,wBAAwB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAC5D,GAAG,IAAI,EACR,YAAY,EAAE,YAAY,CAAC,iBAAiB,CAAC,GAAG,IAAI,GACnD,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"makeNetworkRequest.d.ts","sourceRoot":"","sources":["../../src/core/makeNetworkRequest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAqC,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1E,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,iCAAiC,EACjC,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC5B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,iBAAiB,EAEjB,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAE,mBAAmB,EAAsB,MAAM,uBAAuB,CAAC;AAEhF,OAAO,EACL,QAAQ,EACR,cAAc,EAGf,MAAM,kBAAkB,CAAC;AAM1B,wBAAgB,uBAAuB,CACrC,cAAc,SAAS,qBAAqB,EAC5C,iBAAiB,EACjB,SAAS,SACL,iCAAiC,GACjC,kBAAkB,CAAC,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,EAC5E,iBAAiB,SAAS,gBAAgB,GAAG,sBAAsB,EAEnE,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAC5C,wBAAwB,EAAE,cAAc,CACtC,wBAAwB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAC5D,GAAG,IAAI,EACR,YAAY,EAAE,YAAY,CAAC,iBAAiB,CAAC,GAAG,IAAI,GACnD,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAsDjD;AAqCD,wBAAgB,kBAAkB,CAChC,cAAc,SAAS,qBAAqB,EAC5C,iBAAiB,EACjB,SAAS,SACL,iCAAiC,GACjC,kBAAkB,CAAC,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,EAC5E,iBAAiB,SAAS,gBAAgB,GAAG,sBAAsB,EAEnE,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAC5C,wBAAwB,EAAE,cAAc,CACtC,wBAAwB,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAC5D,GAAG,IAAI,EACR,YAAY,EAAE,YAAY,CAAC,iBAAiB,CAAC,GAAG,IAAI,GACnD,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAqGjD"}
|
|
@@ -19,7 +19,7 @@ function maybeMakeNetworkRequest(environment, artifact, variables, readerWithRef
|
|
|
19
19
|
return makeNetworkRequest(environment, artifact, variables, readerWithRefetchQueries, fetchOptions);
|
|
20
20
|
}
|
|
21
21
|
case 'No': {
|
|
22
|
-
return
|
|
22
|
+
return retainQueryWithoutMakingNetworkRequest(environment, artifact, variables);
|
|
23
23
|
}
|
|
24
24
|
case 'IfNecessary': {
|
|
25
25
|
if (artifact.networkRequestInfo.normalizationAst.kind ===
|
|
@@ -31,7 +31,7 @@ function maybeMakeNetworkRequest(environment, artifact, variables, readerWithRef
|
|
|
31
31
|
__typename: artifact.concreteType,
|
|
32
32
|
});
|
|
33
33
|
if (result.kind === 'EnoughData') {
|
|
34
|
-
return
|
|
34
|
+
return retainQueryWithoutMakingNetworkRequest(environment, artifact, variables);
|
|
35
35
|
}
|
|
36
36
|
else {
|
|
37
37
|
return makeNetworkRequest(environment, artifact, variables, readerWithRefetchQueries, fetchOptions);
|
|
@@ -39,33 +39,41 @@ function maybeMakeNetworkRequest(environment, artifact, variables, readerWithRef
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
-
function
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
42
|
+
function retainQueryWithoutMakingNetworkRequest(environment, artifact, variables) {
|
|
43
|
+
let status = {
|
|
44
|
+
kind: 'Undisposed',
|
|
45
|
+
retainedQuery: fetchNormalizationAstAndRetainArtifact(environment, artifact, variables),
|
|
46
|
+
};
|
|
47
|
+
return [
|
|
48
|
+
(0, PromiseWrapper_1.wrapResolvedValue)(undefined),
|
|
49
|
+
() => {
|
|
50
|
+
if (status.kind === 'Undisposed') {
|
|
51
|
+
unretainAndGarbageCollect(environment, status);
|
|
52
|
+
}
|
|
53
|
+
status = {
|
|
54
|
+
kind: 'Disposed',
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
];
|
|
51
58
|
}
|
|
52
59
|
function makeNetworkRequest(environment, artifact, variables, readerWithRefetchQueries, fetchOptions) {
|
|
53
60
|
// TODO this should be a DataId and stored in the store
|
|
54
61
|
const myNetworkRequestId = networkRequestId + '';
|
|
55
62
|
networkRequestId++;
|
|
63
|
+
let status = {
|
|
64
|
+
kind: 'Undisposed',
|
|
65
|
+
retainedQuery: fetchNormalizationAstAndRetainArtifact(environment, artifact, variables),
|
|
66
|
+
};
|
|
56
67
|
(0, logging_1.logMessage)(environment, () => ({
|
|
57
68
|
kind: 'MakeNetworkRequest',
|
|
58
69
|
artifact,
|
|
59
70
|
variables,
|
|
60
71
|
networkRequestId: myNetworkRequestId,
|
|
61
72
|
}));
|
|
62
|
-
let status = {
|
|
63
|
-
kind: 'UndisposedIncomplete',
|
|
64
|
-
};
|
|
65
73
|
// This should be an observable, not a promise
|
|
66
74
|
const promise = Promise.all([
|
|
67
75
|
environment.networkFunction(artifact.networkRequestInfo.operation, variables),
|
|
68
|
-
|
|
76
|
+
status.retainedQuery.normalizationAst.promise,
|
|
69
77
|
readerWithRefetchQueries === null || readerWithRefetchQueries === void 0 ? void 0 : readerWithRefetchQueries.promise,
|
|
70
78
|
])
|
|
71
79
|
.then(([networkResponse, normalizationAst, readerWithRefetchQueries]) => {
|
|
@@ -85,18 +93,8 @@ function makeNetworkRequest(environment, artifact, variables, readerWithRefetchQ
|
|
|
85
93
|
});
|
|
86
94
|
}
|
|
87
95
|
const root = { __link: IsographEnvironment_1.ROOT_ID, __typename: artifact.concreteType };
|
|
88
|
-
if (status.kind === '
|
|
96
|
+
if (status.kind === 'Undisposed') {
|
|
89
97
|
(0, cache_1.normalizeData)(environment, normalizationAst.selections, (_b = networkResponse.data) !== null && _b !== void 0 ? _b : {}, variables, root);
|
|
90
|
-
const retainedQuery = {
|
|
91
|
-
normalizationAst: normalizationAst.selections,
|
|
92
|
-
variables,
|
|
93
|
-
root,
|
|
94
|
-
};
|
|
95
|
-
status = {
|
|
96
|
-
kind: 'UndisposedComplete',
|
|
97
|
-
retainedQuery,
|
|
98
|
-
};
|
|
99
|
-
(0, garbageCollection_1.retainQuery)(environment, retainedQuery);
|
|
100
98
|
}
|
|
101
99
|
const onComplete = fetchOptions === null || fetchOptions === void 0 ? void 0 : fetchOptions.onComplete;
|
|
102
100
|
if (onComplete != null) {
|
|
@@ -128,11 +126,8 @@ function makeNetworkRequest(environment, artifact, variables, readerWithRefetchQ
|
|
|
128
126
|
const response = [
|
|
129
127
|
wrapper,
|
|
130
128
|
() => {
|
|
131
|
-
if (status.kind === '
|
|
132
|
-
|
|
133
|
-
if (didUnretainSomeQuery) {
|
|
134
|
-
(0, garbageCollection_1.garbageCollectEnvironment)(environment);
|
|
135
|
-
}
|
|
129
|
+
if (status.kind === 'Undisposed') {
|
|
130
|
+
unretainAndGarbageCollect(environment, status);
|
|
136
131
|
}
|
|
137
132
|
status = {
|
|
138
133
|
kind: 'Disposed',
|
|
@@ -201,3 +196,22 @@ function readDataForOnComplete(artifact, environment, root, variables, readerWit
|
|
|
201
196
|
}
|
|
202
197
|
return null;
|
|
203
198
|
}
|
|
199
|
+
function fetchNormalizationAstAndRetainArtifact(environment, artifact, variables) {
|
|
200
|
+
const normalizationAst = artifact.networkRequestInfo.normalizationAst.kind === 'NormalizationAst'
|
|
201
|
+
? (0, PromiseWrapper_1.wrapResolvedValue)(artifact.networkRequestInfo.normalizationAst)
|
|
202
|
+
: (0, PromiseWrapper_1.wrapPromise)(artifact.networkRequestInfo.normalizationAst.loader());
|
|
203
|
+
const root = { __link: IsographEnvironment_1.ROOT_ID, __typename: artifact.concreteType };
|
|
204
|
+
const retainedQuery = {
|
|
205
|
+
normalizationAst: normalizationAst,
|
|
206
|
+
variables,
|
|
207
|
+
root,
|
|
208
|
+
};
|
|
209
|
+
(0, garbageCollection_1.retainQuery)(environment, retainedQuery);
|
|
210
|
+
return retainedQuery;
|
|
211
|
+
}
|
|
212
|
+
function unretainAndGarbageCollect(environment, status) {
|
|
213
|
+
const didUnretainSomeQuery = (0, garbageCollection_1.unretainQuery)(environment, status.retainedQuery);
|
|
214
|
+
if (didUnretainSomeQuery) {
|
|
215
|
+
(0, garbageCollection_1.garbageCollectEnvironment)(environment);
|
|
216
|
+
}
|
|
217
|
+
}
|
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-30cd2de5",
|
|
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": "cross-env ISO_PRINT_ABSOLUTE_FILEPATH=1 ../../target/debug/isograph_cli --config ./isograph.config.json"
|
|
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-30cd2de5",
|
|
23
|
+
"@isograph/react-disposable-state": "0.0.0-main-30cd2de5",
|
|
24
|
+
"@isograph/reference-counted-pointer": "0.0.0-main-30cd2de5"
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
27
|
"react": "^18.0.0 || ^19.0.0"
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
type StableIdForFragmentReference,
|
|
11
11
|
type UnknownTReadFromStore,
|
|
12
12
|
} from './FragmentReference';
|
|
13
|
-
import { RetainedQuery } from './garbageCollection';
|
|
13
|
+
import type { RetainedQuery } from './garbageCollection';
|
|
14
14
|
import { LogFunction, WrappedLogFunction } from './logging';
|
|
15
15
|
import { PromiseWrapper, wrapPromise } from './PromiseWrapper';
|
|
16
16
|
import { WithEncounteredRecords } from './read';
|
|
@@ -5,12 +5,12 @@ export type NotSet = typeof NOT_SET;
|
|
|
5
5
|
|
|
6
6
|
export type Result<T, E> =
|
|
7
7
|
| {
|
|
8
|
-
kind: 'Ok';
|
|
9
|
-
value: T;
|
|
8
|
+
readonly kind: 'Ok';
|
|
9
|
+
readonly value: T;
|
|
10
10
|
}
|
|
11
11
|
| {
|
|
12
|
-
kind: 'Err';
|
|
13
|
-
error: E;
|
|
12
|
+
readonly kind: 'Err';
|
|
13
|
+
readonly error: E;
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
/**
|
|
@@ -22,6 +22,13 @@ export type PromiseWrapper<T, E = any> = {
|
|
|
22
22
|
result: Result<Exclude<T, NotSet>, E> | NotSet;
|
|
23
23
|
};
|
|
24
24
|
|
|
25
|
+
export interface PromiseWrapperOk<T, E = any> extends PromiseWrapper<T, E> {
|
|
26
|
+
result: {
|
|
27
|
+
readonly kind: 'Ok';
|
|
28
|
+
readonly value: Exclude<T, NotSet>;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
25
32
|
export function wrapPromise<T>(
|
|
26
33
|
promise: Promise<Exclude<T, NotSet>>,
|
|
27
34
|
): PromiseWrapper<T, unknown> {
|
|
@@ -39,7 +46,7 @@ export function wrapPromise<T>(
|
|
|
39
46
|
|
|
40
47
|
export function wrapResolvedValue<T>(
|
|
41
48
|
value: Exclude<T, NotSet>,
|
|
42
|
-
):
|
|
49
|
+
): PromiseWrapperOk<T, never> {
|
|
43
50
|
return {
|
|
44
51
|
promise: Promise.resolve(value),
|
|
45
52
|
result: {
|
|
@@ -65,8 +72,8 @@ export function readPromise<T, E>(p: PromiseWrapper<T, E>): T {
|
|
|
65
72
|
|
|
66
73
|
export type PromiseState<T, E> =
|
|
67
74
|
| {
|
|
68
|
-
kind: 'Pending';
|
|
69
|
-
promise: Promise<T>;
|
|
75
|
+
readonly kind: 'Pending';
|
|
76
|
+
readonly promise: Promise<T>;
|
|
70
77
|
}
|
|
71
78
|
| Result<T, E>;
|
|
72
79
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getParentRecordKey } from './cache';
|
|
2
|
-
import { NormalizationAstNodes } from './entrypoint';
|
|
2
|
+
import { NormalizationAstNodes, type NormalizationAst } from './entrypoint';
|
|
3
3
|
import { Variables } from './FragmentReference';
|
|
4
4
|
import {
|
|
5
5
|
assertLink,
|
|
@@ -10,13 +10,31 @@ import {
|
|
|
10
10
|
type StoreLink,
|
|
11
11
|
type TypeName,
|
|
12
12
|
} from './IsographEnvironment';
|
|
13
|
+
import {
|
|
14
|
+
NOT_SET,
|
|
15
|
+
type PromiseWrapper,
|
|
16
|
+
type PromiseWrapperOk,
|
|
17
|
+
} from './PromiseWrapper';
|
|
13
18
|
|
|
14
19
|
export type RetainedQuery = {
|
|
15
|
-
readonly normalizationAst:
|
|
20
|
+
readonly normalizationAst: PromiseWrapper<NormalizationAst>;
|
|
16
21
|
readonly variables: {};
|
|
17
22
|
readonly root: StoreLink;
|
|
18
23
|
};
|
|
19
24
|
|
|
25
|
+
export interface RetainedQueryWithNormalizationAst extends RetainedQuery {
|
|
26
|
+
readonly normalizationAst: PromiseWrapperOk<NormalizationAst>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function isRetainedQueryWithNormalizationAst(
|
|
30
|
+
query: RetainedQuery,
|
|
31
|
+
): query is RetainedQueryWithNormalizationAst {
|
|
32
|
+
return (
|
|
33
|
+
query.normalizationAst.result !== NOT_SET &&
|
|
34
|
+
query.normalizationAst.result.kind === 'Ok'
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
20
38
|
export type DidUnretainSomeQuery = boolean;
|
|
21
39
|
export function unretainQuery(
|
|
22
40
|
environment: IsographEnvironment,
|
|
@@ -46,10 +64,22 @@ export function retainQuery(
|
|
|
46
64
|
export function garbageCollectEnvironment(environment: IsographEnvironment) {
|
|
47
65
|
const retainedIds: RetainedIds = {};
|
|
48
66
|
|
|
67
|
+
const retainedQueries: RetainedQueryWithNormalizationAst[] = [];
|
|
49
68
|
for (const query of environment.retainedQueries) {
|
|
50
|
-
|
|
69
|
+
if (!isRetainedQueryWithNormalizationAst(query)) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
retainedQueries.push(query);
|
|
51
73
|
}
|
|
74
|
+
|
|
52
75
|
for (const query of environment.gcBuffer) {
|
|
76
|
+
if (!isRetainedQueryWithNormalizationAst(query)) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
retainedQueries.push(query);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
for (const query of retainedQueries) {
|
|
53
83
|
recordReachableIds(environment.store, query, retainedIds);
|
|
54
84
|
}
|
|
55
85
|
|
|
@@ -82,7 +112,7 @@ interface RetainedIds {
|
|
|
82
112
|
|
|
83
113
|
function recordReachableIds(
|
|
84
114
|
store: IsographStore,
|
|
85
|
-
retainedQuery:
|
|
115
|
+
retainedQuery: RetainedQueryWithNormalizationAst,
|
|
86
116
|
mutableRetainedIds: RetainedIds,
|
|
87
117
|
) {
|
|
88
118
|
const record =
|
|
@@ -98,7 +128,7 @@ function recordReachableIds(
|
|
|
98
128
|
store,
|
|
99
129
|
record,
|
|
100
130
|
mutableRetainedIds,
|
|
101
|
-
retainedQuery.normalizationAst,
|
|
131
|
+
retainedQuery.normalizationAst.result.value.selections,
|
|
102
132
|
retainedQuery.variables,
|
|
103
133
|
);
|
|
104
134
|
}
|
|
@@ -60,7 +60,11 @@ export function maybeMakeNetworkRequest<
|
|
|
60
60
|
);
|
|
61
61
|
}
|
|
62
62
|
case 'No': {
|
|
63
|
-
return
|
|
63
|
+
return retainQueryWithoutMakingNetworkRequest(
|
|
64
|
+
environment,
|
|
65
|
+
artifact,
|
|
66
|
+
variables,
|
|
67
|
+
);
|
|
64
68
|
}
|
|
65
69
|
case 'IfNecessary': {
|
|
66
70
|
if (
|
|
@@ -82,7 +86,11 @@ export function maybeMakeNetworkRequest<
|
|
|
82
86
|
);
|
|
83
87
|
|
|
84
88
|
if (result.kind === 'EnoughData') {
|
|
85
|
-
return
|
|
89
|
+
return retainQueryWithoutMakingNetworkRequest(
|
|
90
|
+
environment,
|
|
91
|
+
artifact,
|
|
92
|
+
variables,
|
|
93
|
+
);
|
|
86
94
|
} else {
|
|
87
95
|
return makeNetworkRequest(
|
|
88
96
|
environment,
|
|
@@ -96,17 +104,39 @@ export function maybeMakeNetworkRequest<
|
|
|
96
104
|
}
|
|
97
105
|
}
|
|
98
106
|
|
|
99
|
-
function
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
107
|
+
function retainQueryWithoutMakingNetworkRequest<
|
|
108
|
+
TReadFromStore extends UnknownTReadFromStore,
|
|
109
|
+
TClientFieldValue,
|
|
110
|
+
>(
|
|
111
|
+
environment: IsographEnvironment,
|
|
112
|
+
artifact:
|
|
113
|
+
| RefetchQueryNormalizationArtifact
|
|
114
|
+
| IsographEntrypoint<
|
|
115
|
+
TReadFromStore,
|
|
116
|
+
TClientFieldValue,
|
|
117
|
+
NormalizationAst | NormalizationAstLoader
|
|
118
|
+
>,
|
|
119
|
+
variables: ExtractParameters<TReadFromStore>,
|
|
120
|
+
): ItemCleanupPair<PromiseWrapper<void, AnyError>> {
|
|
121
|
+
let status: NetworkRequestStatus = {
|
|
122
|
+
kind: 'Undisposed',
|
|
123
|
+
retainedQuery: fetchNormalizationAstAndRetainArtifact(
|
|
124
|
+
environment,
|
|
125
|
+
artifact,
|
|
126
|
+
variables,
|
|
127
|
+
),
|
|
128
|
+
};
|
|
129
|
+
return [
|
|
130
|
+
wrapResolvedValue(undefined),
|
|
131
|
+
() => {
|
|
132
|
+
if (status.kind === 'Undisposed') {
|
|
133
|
+
unretainAndGarbageCollect(environment, status);
|
|
134
|
+
}
|
|
135
|
+
status = {
|
|
136
|
+
kind: 'Disposed',
|
|
137
|
+
};
|
|
138
|
+
},
|
|
139
|
+
];
|
|
110
140
|
}
|
|
111
141
|
|
|
112
142
|
export function makeNetworkRequest<
|
|
@@ -128,6 +158,14 @@ export function makeNetworkRequest<
|
|
|
128
158
|
// TODO this should be a DataId and stored in the store
|
|
129
159
|
const myNetworkRequestId = networkRequestId + '';
|
|
130
160
|
networkRequestId++;
|
|
161
|
+
let status: NetworkRequestStatus = {
|
|
162
|
+
kind: 'Undisposed',
|
|
163
|
+
retainedQuery: fetchNormalizationAstAndRetainArtifact(
|
|
164
|
+
environment,
|
|
165
|
+
artifact,
|
|
166
|
+
variables,
|
|
167
|
+
),
|
|
168
|
+
};
|
|
131
169
|
|
|
132
170
|
logMessage(environment, () => ({
|
|
133
171
|
kind: 'MakeNetworkRequest',
|
|
@@ -136,16 +174,13 @@ export function makeNetworkRequest<
|
|
|
136
174
|
networkRequestId: myNetworkRequestId,
|
|
137
175
|
}));
|
|
138
176
|
|
|
139
|
-
let status: NetworkRequestStatus = {
|
|
140
|
-
kind: 'UndisposedIncomplete',
|
|
141
|
-
};
|
|
142
177
|
// This should be an observable, not a promise
|
|
143
178
|
const promise = Promise.all([
|
|
144
179
|
environment.networkFunction(
|
|
145
180
|
artifact.networkRequestInfo.operation,
|
|
146
181
|
variables,
|
|
147
182
|
),
|
|
148
|
-
|
|
183
|
+
status.retainedQuery.normalizationAst.promise,
|
|
149
184
|
readerWithRefetchQueries?.promise,
|
|
150
185
|
])
|
|
151
186
|
.then(([networkResponse, normalizationAst, readerWithRefetchQueries]) => {
|
|
@@ -165,7 +200,7 @@ export function makeNetworkRequest<
|
|
|
165
200
|
}
|
|
166
201
|
|
|
167
202
|
const root = { __link: ROOT_ID, __typename: artifact.concreteType };
|
|
168
|
-
if (status.kind === '
|
|
203
|
+
if (status.kind === 'Undisposed') {
|
|
169
204
|
normalizeData(
|
|
170
205
|
environment,
|
|
171
206
|
normalizationAst.selections,
|
|
@@ -173,16 +208,6 @@ export function makeNetworkRequest<
|
|
|
173
208
|
variables,
|
|
174
209
|
root,
|
|
175
210
|
);
|
|
176
|
-
const retainedQuery = {
|
|
177
|
-
normalizationAst: normalizationAst.selections,
|
|
178
|
-
variables,
|
|
179
|
-
root,
|
|
180
|
-
};
|
|
181
|
-
status = {
|
|
182
|
-
kind: 'UndisposedComplete',
|
|
183
|
-
retainedQuery,
|
|
184
|
-
};
|
|
185
|
-
retainQuery(environment, retainedQuery);
|
|
186
211
|
}
|
|
187
212
|
|
|
188
213
|
const onComplete = fetchOptions?.onComplete;
|
|
@@ -221,14 +246,8 @@ export function makeNetworkRequest<
|
|
|
221
246
|
const response: ItemCleanupPair<PromiseWrapper<void, AnyError>> = [
|
|
222
247
|
wrapper,
|
|
223
248
|
() => {
|
|
224
|
-
if (status.kind === '
|
|
225
|
-
|
|
226
|
-
environment,
|
|
227
|
-
status.retainedQuery,
|
|
228
|
-
);
|
|
229
|
-
if (didUnretainSomeQuery) {
|
|
230
|
-
garbageCollectEnvironment(environment);
|
|
231
|
-
}
|
|
249
|
+
if (status.kind === 'Undisposed') {
|
|
250
|
+
unretainAndGarbageCollect(environment, status);
|
|
232
251
|
}
|
|
233
252
|
status = {
|
|
234
253
|
kind: 'Disposed',
|
|
@@ -238,16 +257,15 @@ export function makeNetworkRequest<
|
|
|
238
257
|
return response;
|
|
239
258
|
}
|
|
240
259
|
|
|
260
|
+
type NetworkRequestStatusUndisposed = {
|
|
261
|
+
readonly kind: 'Undisposed';
|
|
262
|
+
readonly retainedQuery: RetainedQuery;
|
|
263
|
+
};
|
|
264
|
+
|
|
241
265
|
type NetworkRequestStatus =
|
|
242
|
-
|
|
|
243
|
-
readonly kind: 'UndisposedIncomplete';
|
|
244
|
-
}
|
|
266
|
+
| NetworkRequestStatusUndisposed
|
|
245
267
|
| {
|
|
246
268
|
readonly kind: 'Disposed';
|
|
247
|
-
}
|
|
248
|
-
| {
|
|
249
|
-
readonly kind: 'UndisposedComplete';
|
|
250
|
-
readonly retainedQuery: RetainedQuery;
|
|
251
269
|
};
|
|
252
270
|
|
|
253
271
|
function readDataForOnComplete<
|
|
@@ -351,3 +369,42 @@ function readDataForOnComplete<
|
|
|
351
369
|
}
|
|
352
370
|
return null;
|
|
353
371
|
}
|
|
372
|
+
|
|
373
|
+
function fetchNormalizationAstAndRetainArtifact<
|
|
374
|
+
TReadFromStore extends UnknownTReadFromStore,
|
|
375
|
+
TClientFieldValue,
|
|
376
|
+
>(
|
|
377
|
+
environment: IsographEnvironment,
|
|
378
|
+
artifact:
|
|
379
|
+
| RefetchQueryNormalizationArtifact
|
|
380
|
+
| IsographEntrypoint<
|
|
381
|
+
TReadFromStore,
|
|
382
|
+
TClientFieldValue,
|
|
383
|
+
NormalizationAst | NormalizationAstLoader
|
|
384
|
+
>,
|
|
385
|
+
variables: ExtractParameters<TReadFromStore>,
|
|
386
|
+
): RetainedQuery {
|
|
387
|
+
const normalizationAst =
|
|
388
|
+
artifact.networkRequestInfo.normalizationAst.kind === 'NormalizationAst'
|
|
389
|
+
? wrapResolvedValue(artifact.networkRequestInfo.normalizationAst)
|
|
390
|
+
: wrapPromise(artifact.networkRequestInfo.normalizationAst.loader());
|
|
391
|
+
|
|
392
|
+
const root = { __link: ROOT_ID, __typename: artifact.concreteType };
|
|
393
|
+
const retainedQuery: RetainedQuery = {
|
|
394
|
+
normalizationAst: normalizationAst,
|
|
395
|
+
variables,
|
|
396
|
+
root,
|
|
397
|
+
};
|
|
398
|
+
retainQuery(environment, retainedQuery);
|
|
399
|
+
return retainedQuery;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
function unretainAndGarbageCollect(
|
|
403
|
+
environment: IsographEnvironment,
|
|
404
|
+
status: NetworkRequestStatusUndisposed,
|
|
405
|
+
) {
|
|
406
|
+
const didUnretainSomeQuery = unretainQuery(environment, status.retainedQuery);
|
|
407
|
+
if (didUnretainSomeQuery) {
|
|
408
|
+
garbageCollectEnvironment(environment);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
@@ -2,12 +2,14 @@ import { describe, expect, test } from 'vitest';
|
|
|
2
2
|
import {
|
|
3
3
|
garbageCollectEnvironment,
|
|
4
4
|
retainQuery,
|
|
5
|
+
type RetainedQuery,
|
|
5
6
|
} from '../core/garbageCollection';
|
|
6
7
|
import {
|
|
7
8
|
createIsographEnvironment,
|
|
8
9
|
ROOT_ID,
|
|
9
10
|
type IsographStore,
|
|
10
11
|
} from '../core/IsographEnvironment';
|
|
12
|
+
import { wrapResolvedValue } from '../core/PromiseWrapper';
|
|
11
13
|
import { iso } from './__isograph/iso';
|
|
12
14
|
import { meNameSuccessorRetainedQuery } from './meNameSuccessor';
|
|
13
15
|
import { nodeFieldRetainedQuery } from './nodeQuery';
|
|
@@ -55,9 +57,10 @@ export const meNameField = iso(`
|
|
|
55
57
|
`)(() => {});
|
|
56
58
|
|
|
57
59
|
const meNameEntrypoint = iso(`entrypoint Query.meName`);
|
|
58
|
-
const meNameRetainedQuery = {
|
|
59
|
-
normalizationAst:
|
|
60
|
-
meNameEntrypoint.networkRequestInfo.normalizationAst
|
|
60
|
+
const meNameRetainedQuery: RetainedQuery = {
|
|
61
|
+
normalizationAst: wrapResolvedValue(
|
|
62
|
+
meNameEntrypoint.networkRequestInfo.normalizationAst,
|
|
63
|
+
),
|
|
61
64
|
variables: {},
|
|
62
65
|
root: { __link: ROOT_ID, __typename: 'Query' },
|
|
63
66
|
};
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import type { RetainedQuery } from '../core/garbageCollection';
|
|
1
2
|
import { ROOT_ID } from '../core/IsographEnvironment';
|
|
3
|
+
import { wrapResolvedValue } from '../core/PromiseWrapper';
|
|
2
4
|
import { iso } from './__isograph/iso';
|
|
3
5
|
|
|
4
6
|
export const meNameField = iso(`
|
|
@@ -14,9 +16,10 @@ export const meNameField = iso(`
|
|
|
14
16
|
}
|
|
15
17
|
`)(() => {});
|
|
16
18
|
const meNameSuccessorEntrypoint = iso(`entrypoint Query.meNameSuccessor`);
|
|
17
|
-
export const meNameSuccessorRetainedQuery = {
|
|
18
|
-
normalizationAst:
|
|
19
|
-
meNameSuccessorEntrypoint.networkRequestInfo.normalizationAst
|
|
19
|
+
export const meNameSuccessorRetainedQuery: RetainedQuery = {
|
|
20
|
+
normalizationAst: wrapResolvedValue(
|
|
21
|
+
meNameSuccessorEntrypoint.networkRequestInfo.normalizationAst,
|
|
22
|
+
),
|
|
20
23
|
variables: {},
|
|
21
24
|
root: {
|
|
22
25
|
__link: ROOT_ID,
|
package/src/tests/nodeQuery.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RetainedQuery } from '../core/garbageCollection';
|
|
2
2
|
import { ROOT_ID } from '../core/IsographEnvironment';
|
|
3
|
+
import { wrapResolvedValue } from '../core/PromiseWrapper';
|
|
3
4
|
import { iso } from './__isograph/iso';
|
|
4
5
|
|
|
5
6
|
// TODO investigate why this can't be in garbageCollection.test.ts without
|
|
@@ -13,8 +14,9 @@ export const nodeField = iso(`
|
|
|
13
14
|
`)(() => {});
|
|
14
15
|
const nodeFieldEntrypoint = iso(`entrypoint Query.nodeField`);
|
|
15
16
|
export const nodeFieldRetainedQuery: RetainedQuery = {
|
|
16
|
-
normalizationAst:
|
|
17
|
-
nodeFieldEntrypoint.networkRequestInfo.normalizationAst
|
|
17
|
+
normalizationAst: wrapResolvedValue(
|
|
18
|
+
nodeFieldEntrypoint.networkRequestInfo.normalizationAst,
|
|
19
|
+
),
|
|
18
20
|
variables: { id: 0 },
|
|
19
21
|
root: { __link: ROOT_ID, __typename: 'Query' },
|
|
20
22
|
};
|